kendama op• Data kinds: table → any
• Call: import fullseye as fs; fs.ledger.catch_plan_staged(kp: 'dict', *, v_max: 'float' = 2.0, a_max: 'float' = 20.0, g: 'float' = None, margin: 'float' = 0.005, absorb_time: 'float' = None, absorb_depth: 'float' = 0.02) (to call the implementation directly, import kendama; kendama.catch_plan_staged(kp: 'dict', *, v_max: 'float' = 2.0, a_max: 'float' = 20.0, g: 'float' = None, margin: 'float' = 0.005, absorb_time: 'float' = None, absorb_depth: 'float' = 0.02); from the registry, opsdrive.get("catch_plan_staged"))
Catch control with explicit stages (the same plan serves the big cup, small cup, base cup and candle: the cup orientation comes from the trick pose in kp). Returns plan(t, p, v, cup_state) → dict (the catch_plan of kendama_simulate).
Stages (copying the human knack "pull up straight with the knees, once the string slackens carry the cup horizontally right under the ball, lower it on landing to absorb the impact (wait rather than scoop)"):
0. lift / wait (on the kendama_simulate side): the plan is not called during the swing-up or before slack = move only after slack.
1. hold: do not move the cup until the bottom of the ball rises above the highest point of the kendama (hand + kp["top_offset"], + margin) (the ken cannot push the ball, so do not bring the ken toward a rising ball. If the trajectory never gets the ball that high, it stays in hold = no catch).
2. carry: carry the cup horizontally at its current height to directly below the point where the ball lands on the rim: the ball's xy at the time τ when the ball centre comes down to "cup centre + h_c·axis" (later root of z(τ) = cup height + h_c·a_z = past the apex and descending), minus h_c·(a_x, a_y).
3. absorb: from absorb_time before landing (default √(absorb_depth / a_max) = the turnaround time of a bang-bang lowering motion), lower the target by absorb_depth: at the moment of landing the cup is moving downward at its top speed √(a_max·absorb_depth) (0.63 m/s at 20 m/s² and 2 cm) = reduces the relative speed. If absorb_time is made long, the cup finishes lowering and stops before landing, and the ball falls that much deeper and faster (at 0.06 s all 4 tricks bounced off the rim —— measured and rejected).
Return value {"target" (皿の中心の目標), "stage", "landing" (玉が縁に乗る点の真下の皿の中心), "t_land", "wait" (hold の残り), "feasible", "apex", "travel"}. Trajectories whose apex does not reach the height of landing on the rim are feasible=False and hold. Limitations (honestly): the cup's pose is fixed per trick (the wrist is not turned to meet the ball), and drag is not included in the prediction (redone from perception every time).
Empty input (kp as an empty dict) raises ValueError.
• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).
• Operator provenance and references — the sources of the research/methods this op family came from.
• The canonical algorithm (author, year) and its uses are named in the family usage guide above.
• poc_kendama — py -3.11 examples/poc_kendama.py
any as input)course_crank · course_s_curve · course_turnaround · course_slope · course_intersection · course_parallel_parking · course_crossing · course_road
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. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.