kendama_combo_simulate — DRIVE kendama op

• 数据种类:table → table

• 调用: 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'(要直接调用实现,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';从台账取用则 opsdrive.get("kendama_combo_simulate"))

用法

连续技:从球停在 sequence[0] 皿上的状态开始,重复"放出 → 在飞行中换持 → 把下一个皿移到落点正下方,匹配速度接住" n_catch 次或直到首次失败(moshikame = ("ozara", "chuzara"),3 皿 = ("ozara", "kozara", "chuzara"))。手端 hand0 = 皿胴中心(换持只用手腕改变朝向,不重新握持:假定)。第一个皿用 kendama_simulate 的上摆接住,并以 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。

参考(示例数据、文献)

• 示例数据目录(下载 URL / 许可证) —— 2-D 用 skimage.data(BSD/公有领域)加合成图,3-D 给出真实数据源(Stanford/PDS 等)的下载 URL。

• 算子来历与参考文献 —— 该算子族所依据的研究/方法出处。

• 算法的正典(作者、年份)与用途见上面的族使用指南。

可运行的示例(实际调用该算子并已验证的样例)

• poc_kendama — py -3.11 examples/poc_kendama.py

类型可衔接的下一个算子(可接受 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 算子登记表。本条目由 tools/opdocs.py md 自动生成(请勿手工编辑)。*

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