kendama_simulate — DRIVE kendama op

• Data kinds: table → table

• Call: import fullseye as fs; fs.ledger.kendama_simulate(kp: 'dict', handle, *, p0, v0, t_end: 'float', dt: 'float' = 0.001, perceive=None, catch_plan=None, g: 'float' = None, v_max: 'float' = 2.0, a_max: 'float' = 20.0, v_rel_max: 'float' = 1.0, plan_from: 'float' = 0.0, stop_on_miss: 'bool' = True, contact=None, contact_tol: 'float' = 0.0005) -> 'dict' (implementation को सीधे call करना हो तो import kendama; kendama.kendama_simulate(kp: 'dict', handle, *, p0, v0, t_end: 'float', dt: 'float' = 0.001, perceive=None, catch_plan=None, g: 'float' = None, v_max: 'float' = 2.0, a_max: 'float' = 20.0, v_rel_max: 'float' = 1.0, plan_from: 'float' = 0.0, stop_on_miss: 'bool' = True, contact=None, contact_tol: 'float' = 0.0005) -> 'dict', registry से लेना हो तो opsdrive.get("kendama_simulate"))

उपयोग

kendama का 2-phase simulation: डोरी तनी रहने तक गेंद pivot (cross-piece का डोरी वाला छेद = हाथ + kp["tie_offset"]) से बँधी रहती है (projection method, ballistics.tether_simulate जैसा: स्थिर pivot और vacuum में वही trajectory, डोरी की लंबाई = kp["pendulum_length"]); ढीली होने पर free fall (gravity + drag, kp["bp"]; rho = 0 पर vacuum)। हर step में kendama_catch_check (बड़ा cup = हाथ + kp["cup_offset"], axis kp["cup_axis"]) से catch तय करता है, और पकड़ने पर समाप्त होता है।

handle = हाथ (सरादो का केंद्र) का (3,) स्थिर बिंदु या t → (3,) का फलन (खुले-लूप में ऊपर झुलाना)। catch_plan हो तो धागा ढीला होने के बाद (और t ≥ plan_from: ऊपर झुलाना पूरा होने तक खुला लूप प्राथमिक) हर step में perceive से अनुभूत (p̂, v̂) को catch_plan(t, p̂, v̂, cup_state) → {"target": 大皿の縁の中心の目標 (3,), …} को दिया जाता है, और हाथ को गति ≤ v_max, त्वरण ≤ a_max वाले bang-bang से "लक्ष्य − cup_offset" तक ले जाया जाता है (हाथ चलने पर धुरी भी चलती है, इसलिए गेंद गिरकर |p − धुरी| = L होने पर धागा फिर तन जाता है)।

अनुभूति perceive:

• None → वास्तविक मान (p, v)।

• perceive(t, p, v) → (p̂, v̂) (जैसे noisy_perceiver) केवल उन step में बुलाया जाता है जिनमें योजना सक्रिय है।

• observe_all = True गुण वाली अनुभूति (kendamaworld.camera_perceiver) हर step perceive(t, p, v, scene) के रूप में बुलाई जाती है (scene = {"t", "hand", "tie", "cup", "cup_axis", "taut"} = हाथ के स्वबोध से ज्ञात मात्राएँ + दुनिया रेंडर करने के लिए taut (गेंद की मुद्रा की रेंडरिंग परिपाटी: तना रहने पर धागा-छेद गाँठ की ओर, ढीला होने पर अंतिम मुद्रा)। p भी केवल दुनिया रेंडर करने के लिए दिया जाता है)। वापसी None हो तो योजना वैसी ही रहती है (अंतिम लक्ष्य की ओर ले जाना जारी, लक्ष्य न हो तो हाथ रुकता है)।

गेंद को केवल गुरुत्व (+ कर्षण, जब rho > 0) और धागे का तनाव (≥ 0 का एकपक्षीय बंधन) चलाते हैं। केन गेंद को नहीं धकेलता: contact(hand, p) → 隙間 [m] (जैसे kendamaworld.kendama_clearance) देने पर, पकड़ से पहले जिस step में अंतराल < −contact_tol हो जाए वहाँ "hit_ken" के रूप में समाप्त होता है (गेंद ने केन की नोक, कप के किनारे या सरादो को छुआ = विफलता)। पकड़ का निर्णय kp["catch_window"] (वह ऊँचाई जिस पर गेंद किनारे को छूती है) से होता है।

समाप्ति end_reason: "caught" (पकड़ी गई), "hit_ken" (केंडामा को छुआ), "missed" (ढीला होने के बाद नीचे गिरते हुए बड़े कप के तल से 2 r_b या अधिक नीचे आ गई; stop_on_miss=False हो तो नहीं रुकता: snap के गेट के लिए), "timeout" (t_end)। वापसी मान {"t", "p", "v", "hand", "anchor" (= 支点 = 糸穴), "cup", "cup_v", "taut", "tension", "energy", "snap_times", "snap_loss", "slack_t", "caught", "catch_t", "end_reason", "lateral", "plan_log", "n_estimates", "stage", "min_gap"} (arrays समाप्ति वाले step तक। stage = प्रत्येक step का नियंत्रण-चरण ("lift" ऊपर झुलाना / "wait" ढीला पर योजना से पहले / योजना का "stage" (hold / carry / absorb) या "plan")। slack_t = धागा तनने के बाद पहली बार ढीला होने का समय, शुरू से ढीला हो तो 0.0, कभी ढीला न हो तो None। energy = ½mv² + mgz। n_estimates = योजना को दी गई अनुभूतियों की संख्या)। प्रारंभिक अवस्था |p₀ − धुरी(0)| > L, t_end < 0, dt ≤ 0, सीमा ≤ 0 पर ValueError।

खाली इनपुट (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.