kendama_combo_simulate — DRIVE kendama op

• Data kinds: table → table

• Call: import fullseye as fs; fs.ledger.kendama_combo_simulate(kp: 'dict', sequence=('ozara', 'chuzara'), *, n_catch: 'int' = 10, hand0=(0.0, 0.0, 1.0), hand_v0=(0.0, 0.0, 0.0), z_home: 'float' = None, apex_above_cup: 'float' = 0.2, k_match: 'float' = 0.8, v_max: 'float' = 2.5, a_max: 'float' = 20.0, a_toss: 'float' = 20.0, omega_max: 'float' = 30.0, rot_clear: 'float' = 0.15, v_rel_max: 'float' = 1.0, dt: 'float' = 0.001, perceive=None, contact=None, contact_tol: 'float' = 0.0005, controller: 'str' = 'pos_vel', t_max: 'float' = None, g: 'float' = None) -> 'dict' (implementation को सीधे call करना हो तो import kendama; kendama.kendama_combo_simulate(kp: 'dict', sequence=('ozara', 'chuzara'), *, n_catch: 'int' = 10, hand0=(0.0, 0.0, 1.0), hand_v0=(0.0, 0.0, 0.0), z_home: 'float' = None, apex_above_cup: 'float' = 0.2, k_match: 'float' = 0.8, v_max: 'float' = 2.5, a_max: 'float' = 20.0, a_toss: 'float' = 20.0, omega_max: 'float' = 30.0, rot_clear: 'float' = 0.15, v_rel_max: 'float' = 1.0, dt: 'float' = 0.001, perceive=None, contact=None, contact_tol: 'float' = 0.0005, controller: 'str' = 'pos_vel', t_max: 'float' = None, g: 'float' = None) -> 'dict', registry से लेना हो तो opsdrive.get("kendama_combo_simulate"))

उपयोग

combo: गेंद के sequence[0] cup पर टिकी होने की स्थिति से "छोड़ना → उड़ते समय पकड़ बदलना → अगले cup को landing बिंदु के ठीक नीचे ले जाकर, गति मिलाकर पकड़ना" n_catch बार या पहली विफलता तक दोहराता है (moshikame = ("ozara", "chuzara"), 3 cups = ("ozara", "kozara", "chuzara"))। हाथ hand0 = cross-piece का केंद्र (पकड़ बदलना केवल कलाई घुमाना है, फिर से पकड़ना नहीं: मान्यता)। पहला cup kendama_simulate के swing-up से पकड़ा जाता है, और उस हाथ की position और velocity hand0 / hand_v0 के रूप में दी जाती हैं।

चरण (हर बार): absorb (पकड़ने वाले कप को सीमा के भीतर रोकें: गेंद कप के साथ) → toss (कप को a_toss से ऊपर त्वरित करें, और गति v_toss तक पहुँचने पर a_max (> g) से रोकें: रोकना शुरू होने वाले कदम पर कप का अभिलंब बल ऋणात्मक हो जाता है और गेंद अलग हो जाती है। अलग होने के क्षण गेंद का वेग = कप का वेग → शीर्ष = अलग होने की ऊँचाई + v²/2g) → flight (अनुभूत परवलय से अवतरण-समय τ और बिंदु निकालें, और हाथ को _move_pos_vel से "स्थिति = अवतरण-बिंदु के ठीक नीचे (ऊँचाई z_home), वेग = k_match × गेंद का अवतरण-वेग" तक ले जाएँ। पकड़ बदलना तभी शुरू होता है जब गेंद सरादो के केंद्र से rot_clear (0.15 m: सरादो के केंद्र से आधार कप के किनारे तक 0.12 m + गेंद की त्रिज्या) या अधिक दूर हो जाए (अनुभूति से; यदि दूर हुए बिना अवतरण तक पहुँच पाने का अंतिम क्षण आ जाए तो तभी शुरू = 3-कप करतब का बड़ा कप → छोटा कप 180° कभी-कभी इसी स्थिति में आता है), और omega_max पर सीमित त्रिकोणीय कोणीय-वेग प्रोफ़ाइल से अगली मुद्रा में घुमाता है। घुमाव पूरा होने से पहले नहीं पकड़ता) → पकड़ने के बाद absorb पर लौटें।

भौतिकी: कप पर गेंद कप के साथ चलती है (जब तक कप का अभिलंब बल ∝ (a_कप + g ẑ)·अक्ष ≥ 0; ऋणात्मक होते ही अलग), उड़ान में केवल गुरुत्व (+ कर्षण) और धागे का तनाव (एकपक्षीय बंधन, kendama_simulate जैसी ही प्रक्षेपण विधि)। केन गेंद को नहीं धकेलता (contact(hand, p, R) → 隙間 −contact_tol से नीचे जाए तो "hit_ken": kendamaworld.kendama_clearance का R_ken)। पकड़ का निर्णय kendama_catch_check है (अवतरण-खिड़की kp["catch_window"], सापेक्ष गति ≤ v_rel_max: मान्यता 1 m/s)। खिड़की में आई पर बहुत तेज़ हो तो "too_fast"। पकड़ के क्षण गेंद को किनारे पर टिकी स्थिति में रखा जाता है और उसका वेग कप के वेग के बराबर किया जाता है (अप्रत्यास्थ, उछाल नहीं: मान्यता। पुनः रखने की दूरी ≤ खिड़की के 3 mm)।

छोड़ने की ऊँचाई (बंद रूप): अगले अवतरण पर गेंद का केंद्र जिस ऊँचाई z_r पर टिकेगा उससे apex_above_cup ऊपर शीर्ष रखें। गेंद की वर्तमान ऊँचाई z₀ से a_toss पर त्वरित करने पर अलग होने की ऊँचाई z₀ + v²/(2 a_toss) है, इसलिए v_toss² = 2g (z_r + A − z₀) / (1 + g / a_toss) (कर्षण शामिल नहीं)। controller="position": तुलना-स्थिति जो उड़ान के दौरान हाथ को पुराने _move_bounded (केवल स्थिति को लक्ष्य मानकर रुकता है) से ले जाती है। अनुभूति perceive: None = वास्तविक मान। kendamaworld.camera_perceiver (flight_from="cup") हो तो हर step perceive(t, p, v, scene) बुलाया जाता है (scene = हाथ के स्वबोध से ज्ञात मात्राएँ + रेंडरिंग के लिए मुद्रा R_ken), और (p̂, v̂) या None प्राप्त होता है। पकड़ हाथ की अनुभूति से ज्ञात होती है (मान्यता: स्पर्श), इसलिए perceive.reset() हो तो पकड़ वाले कदम पर बुलाया जाता है (पिछली उड़ान का परवलय छोड़ दिया जाता है)।

मान्यताएँ (कोई प्रकाशित मान नहीं): कलाई का कोणीय वेग ≤ 30 rad/s, हाथ की गति ≤ 2.5 m/s, त्वरण ≤ 20 m/s², k_match = 0.8 (मनुष्य के "घुटनों से गति मिलाने" की मात्रा)। वापसी मान {"count" (最初の失敗までに受けた回数), "catches" [{"t", "trick", "rel_speed", "lateral", "apex", "z_catch" (受けた瞬間の玉の中心の高さ), "z_release", "v_release", "apex_closed", "rose_then_fell", "energy_drift"}], "end_reason" ("done" | "too_fast" | "hit_ken" | "missed" | "timeout"), "t", "p", "v", "hand", "hand_v", "hand_a", "R", "on_cup", "taut", "stage", "min_gap", "grade" (もしかめの級相当), "max_omega"}।

खाली इनपुट (kp एक खाली dict) पर ValueError उठता है।

संदर्भ (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_kendama — py -3.11 examples/poc_kendama.py

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

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

इसी category के (kendama)

kendama_params · elliptic_k_agm · pendulum_period_exact · pendulum_launch_speed · pendulum_rod_simulate · tether_tension_fixed · tether_slack_angle · swing_up_plan


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

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