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 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 में दिए गए हैं।
• poc_kendama — py -3.11 examples/poc_kendama.py
table को input के रूप में लेते हैं)course_layout · course_occupancy · course_contains · world_build · world_camera · world_move · lidar_scan · rss_longitudinal_same
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.