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 के रूप में दी जाती हैं।

> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।

段階(毎回): absorb(受けた皿を上限つきで止める: 玉は皿と一緒)→ toss(皿を a_toss で上へ加速し、速さ v_toss に達したら a_max(> g)で止める: 止め始めた歩で皿の抗力が負になり玉が離れる。離れた瞬間の玉の速度 = 皿の速度 → 頂点 = 離れた高さ + v²/2g)→ flight(知覚した放物線から着地の時刻 τ と点を出し、手元を「位置 = 着地点の真下(高さ z_home)、速度 = k_match × 玉の着地の速度」へ _move_pos_vel で運ぶ。持ち替えは玉が皿胴の中心から 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"}。

संदर्भ (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.