fullseye

kendama_simulate — DRIVE kendama op

使い方

けん玉の 2 段シミュレーション: ひもが張っている間は支点(皿胴の糸穴 = 手元 + kp[“tie_offset”])に繋がれた玉 (射影法、:func:ballistics.tether_simulate と同じ: 支点固定・真空なら同じ軌跡、ひもの長さ = kp[“pendulum_length”])、 弛んだら自由落下(重力 + 抗力、kp[“bp”]; rho = 0 で真空)。毎 step :func:kendama_catch_check(大皿 = 手元 + kp[“cup_offset”]、 軸 kp[“cup_axis”])で捕球を判定し、捕ったら終わる。

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:

玉を動かすのは重力(+ 抗力、rho > 0 のとき)とひもの張力(≥ 0 の片側拘束)だけ。けんは玉を押さない: contact(hand, p) → 隙間 [m] (:func:kendamaworld.kendama_clearance など)を渡すと、捕球の前に隙間 < −contact_tol になった step で “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"}(配列は終わった step まで。 stage = 各 step の制御の段階 (“lift” 振り上げ / “wait” 弛んだが計画前 / 計画の “stage”(hold / carry / absorb)or “plan”)。slack_t = ひもが 張った後で初めて弛んだ時刻、初めから弛んでいれば 0.0、一度も弛まなければ None。energy = ½mv² + mgz。n_estimates = 計画に 渡した知覚の数)。初期状態が |p₀ − 支点(0)| > L、t_end < 0、dt ≤ 0、上限 ≤ 0 は ValueError。

空の入力(kp が空の dict)は ValueError。

参考(サンプルデータ・文献)

実行できる例(この op を実際に呼ぶ検証済みサンプル)

型が繋がる次の op(table を入力に取れる)

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 ノートは tools/opdocs.py md が自動生成(手編集しない)。

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