fit_spin_aero — DRIVE ball op

• Data kinds: signal × points × table → table

• Call: import fullseye as fs; fs.ledger.fit_spin_aero(t, p, bp: 'dict', *, omega0=None, fit_cl: 'bool' = False, omega_max: 'float' = 1000.0, iters: 'int' = 25, dt: 'float' = 0.001) -> 'dict' (implementation को सीधे call करना हो तो import ballistics; ballistics.fit_spin_aero(t, p, bp: 'dict', *, omega0=None, fit_cl: 'bool' = False, omega_max: 'float' = 1000.0, iters: 'int' = 25, dt: 'float' = 0.001) -> 'dict', registry से लेना हो तो opsdrive.get("fit_spin_aero"))

• GPU: नहीं (केवल CPU reference implementation)

उपयोग

drag और spin को एक साथ पढ़ता है (fit_spin का C_d-मुक्त रूप): trajectory (t_i, p_i) (बिना उछाल वाला अंतराल) पर drag + Magnus के गति समीकरणों को (p₀, v₀, ω, C_d) के 10 parameters से Levenberg–Marquardt द्वारा fit करता है (fit_cl=True से lift coefficient का scale κ भी मुक्त हो जाता है, कुल 11 parameters)।

fit model का C_d स्थिरांक है (Re-निर्भरता fit नहीं की जाती); lift, spin ratio के अनुभवजन्य सूत्र C_L = κ·S/(1 + 2S) (S = rω/|v|) से लिया जाता है और scale κ का डिफ़ॉल्ट 1 है। ★संख्यात्मक (स्थिर) C_L वाला bp अस्वीकार किया जाता है (ValueError): स्थिर C_L के Magnus बल का परिमाण ω पर निर्भर नहीं करता, इसलिए |ω| का स्तंभ शून्य हो जाता है और spin का परिमाण पढ़ा नहीं जा सकता (मापा गया: स्थिर C_L वाला fit_spin, सच्चे 150 rad/s की trajectory पर भी |ω| को केवल 10.3 rad/s तक ले जाता है)।

जो पढ़ा नहीं जा सकता, वह return value में बताया जाता है: drag −v की दिशा में और Magnus ω × v (v के लंबवत) की दिशा में होता है, इसलिए बल की दिशाएँ लंबवत अलग हो जाती हैं, पर (a) छोटी उड़ान में, जहाँ गति मुश्किल से घटती है, C_d, v₀ से उलझ जाता है, (b) उड़ान में spin ratio S का परिवर्तन कम होने पर ω और lift scale κ को अलग नहीं किया जा सकता (जहाँ S छोटा है वहाँ C_L ≈ κS, इसलिए बल गुणनफल κ·ω के निकट रहता है, और धीमी गेंद S = 0.49–0.56 में, जहाँ S केवल 14 % हिलता है, C_L(S) व्यवहार में एक ही बिंदु पर देखा जाता है), और (c) v के समानांतर ω का घटक कोई बल नहीं बनाता। यह cond (scaled Jacobian की condition number), corr (अनुमानों का correlation matrix, param_names के क्रम में), cov_unit (प्रति 1 m स्थिति-शोर अनुमानों का covariance = रैखिकृत Cramér–Rao bound; शोर σ [m] हो तो σ² से गुणा करें), corr_cd_omega (C_d और ω⊥ के परिमाण का correlation), corr_cd_v0 (C_d और प्रारंभिक वेग के परिमाण का correlation), omega_axial_std_unit (v के समानांतर ω घटक का मानक विचलन, प्रति 1 m शोर) और omega_perp_std_unit (ω के दो लंबवत घटकों में से प्रत्येक का मानक विचलन) से पता चलता है। कब पढ़ा जा सकता है: उसी model के रैखिकीकरण में fit_cl=True के ω⊥ का मानक विचलन (शोर 1.5 mm) v₀ = 6 m/s पर 628 rad/s (419 %), 15 m/s पर 76 (50 %), और 25 m/s व ω = 300 rad/s पर 35 (12 %) है: degeneracy उन स्थितियों का निष्कर्ष है जहाँ S मुश्किल से हिलता है, 'trajectory से सिद्धांत रूप में नहीं पढ़ा जा सकता' नहीं; तेज़ गेंदें और बहुत धीमी होती उड़ानें पढ़ी जा सकती हैं। Jacobian का rank गिरने पर (जैसे निर्वात में) cond inf नहीं बल्कि None होता है और rank_deficient True होता है। ω⊥ = 0 होने पर दिशा तय नहीं होती और corr_cd_omega None होता है (NaN कभी नहीं लौटाया जाता)। Return value {"p0", "v0", "omega", "omega_perp", "cd", "cl_scale", "rms", "cond", "rank_deficient", "corr", "param_names", "cov_unit", "corr_cd_omega", "corr_cd_v0", "omega_axial_std_unit", "omega_perp_std_unit", "iters", "t0", "at_bound"}। उसी model से बनी trajectory 1e-6 तक वापस मिलती है (gate)। ★यदि दुनिया कोई और model है (C_d, Re पर निर्भर; C_L में घाटी), तो स्थिरांक मानकर fit किए गए C_d, ω और C_L उस अंतराल के प्रभावी मान बन जाते हैं और पक्षपाती होते हैं (पक्षपात PoC में मापकर दिया गया है)। पक्षपात घाटी तक सीमित नहीं है: fit किया गया C_L model जब दुनिया के गुणांक से चूकता है तो ω खिंच जाता है, गुणांक की त्रुटि का 1.5 से 2.7 गुना बढ़कर (घाटी-रहित दुनिया में गुणांक को 0.6 / 0.8 / 1.2 गुना करने पर κ = 1 का fit ω से 58 / 34 / +53 % चूकता है)। fit चूक रहा है या नहीं, यह rms में दिखता है। omega_max वही है जो fit_spin में है (spin परिमाण की ऊपरी सीमा)। omega0 के सत्य से दूर होने, trajectory के छोटी होने या fit_cl=True होने पर अभिसरण धीमा होता है, और समतल घाटी में कुछ नमूने iters तक नहीं पहुँचते (लौटाया गया iters यदि argument के बराबर है तो run बीच में रोका गया)।

सीमाएँ: उड़ान में spin ratio S का परिवर्तन कम हो तो fit_cl=True के साथ |ω| और κ के स्तंभ लगभग समानांतर होते हैं (cond बड़ा, corr ≈ ±1; S = 0.49–0.56 की धीमी गेंद में ω⊥ का मानक विचलन ω का 419 %, v₀ = 25 m/s की तेज़ गेंद में 12 %) — तब ω को गेंद के pattern से पढ़ें (balltrack.spin_from_markers) और lift scale को trajectory से लें (ω ज्ञात हो तो fit_aero)। स्थिर C_L वाला bp और 12 से कम नमूने ValueError उठाते हैं; Jacobian का rank गिरने पर cond None होता है (कभी inf नहीं), और ω⊥ = 0 पर corr_cd_omega None होता है।

संदर्भ (sample data, साहित्य)

• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।

• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।

• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• poc_cd_spin_joint — py -3.11 examples/poc_cd_spin_joint.py

वे अगले ops जिनसे type जुड़ता है (table को input के रूप में लेते हैं)

course_layout · course_occupancy · course_contains · world_build · world_camera · world_move · lidar_scan · rss_longitudinal_same

इसी category के (ball)

ball_params · impact_params · flight_vacuum · flight_ode · flight_simulate · flight_state_at · magnus_lift_coefficient · drag_coefficient_sphere


*Provenance: ballistics.py — DRIVE operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.