kendama op• Data kinds: none → table (an op determined by its arguments alone — it takes no image or data input)
• Call: import fullseye as fs; fs.ledger.kendama_params(preset: 'str' = 'jka_16_2', *, trick: 'str' = 'ozara', ball_radius: 'float' = None, mass: 'float' = 0.075, string: 'float' = 0.39, cup_radius_big: 'float' = None, cup_depth: 'float' = None, ken_length: 'float' = None, width: 'float' = None, rho: 'float' = 1.2, cd=0.4, cup_offset=None, tie_offset=None, cup_axis=None, g: 'float' = 9.81) -> 'dict' (to call the implementation directly, import kendama; kendama.kendama_params(preset: 'str' = 'jka_16_2', *, trick: 'str' = 'ozara', ball_radius: 'float' = None, mass: 'float' = 0.075, string: 'float' = 0.39, cup_radius_big: 'float' = None, cup_depth: 'float' = None, ken_length: 'float' = None, width: 'float' = None, rho: 'float' = 1.2, cd=0.4, cup_offset=None, tie_offset=None, cup_axis=None, g: 'float' = 9.81) -> 'dict'; from the registry, opsdrive.get("kendama_params"))
• GPU: none (CPU reference implementation only)
Kendama table. Default = preset="jka_16_2" (ball 60 mm, width 70 mm and overall length 180 mm are published values of the Japan Kendama Association (JKA); ken height 160 mm and cups 42 / 38 / 35 mm come from a user-provided description of the JKA 16-2 model (primary source not verified)). "recommended_large_cup" = big cup 49 mm, hole 24 mm.
Key: ball_radius 0.030, string 0.39 (thread = recommended 38-40 cm), pendulum_length = thread + ball radius (knot → ball center, Place the thread hole of the ball on the opposite side of the large hole), cup_radius_big / cup_radius_base / cup_radius_small(edge radius), cup_depth (Depth of the large plate. Default = sinking of the bottom edge of the ball on the rim r_b − √(r_b² − r_c²) + 1.5 mm = depth at which the ball does not touch the bottom), ken_length(height of the ken = tip → rim of the medium plate, 160 mm), width(rim of the large plate ~ rim of the small plate, 70 mm), hole_radius / hole_depth(Large hole in the ball. Depth = Ken + Ball − Total length = 40 mm), total_length(Assembled total length = Ken + Ball − Hole depth), cross_radius / ken_radius / spike_length / cross_from_tip (assumed), mass (ball, assumed 75 g), ken_mass (assumed 70 g). The trick trick(KENDAMA_TRICKS: "ozara" large plate / "kozara" small plate / "chuzara" medium plate / "candle" = "rousoku") determines the posture:
R_ken(local coordinates of ken → world: local is tip +x・large plate +z・origin = center of plate body), grip(place to hold, local), receiving plate catch_cup("big" / "small" / "base"). From there, cup_offset (center of the rim of the receiving plate), cup_axis to your hand (= place to hold) (axis of receiving plate, world), tie_offset(string hole in plate body: local (0, −cross_radius, 0)), top_offset(highest point of kendama), Calculate cup_radius (the radius of the edge of the receiving plate). The sword and the body are one rigid body (the posture is fixed for each technique, and the hand moves in translation). If you pass cup_offset / tie_offset / cup_axis, it will be overwritten with those values (if you pass 0, the point will be = fulcrum = plate = hand: gate of theorem). catch_window = 0.003 m: kendama_simulate considers the ball to be caught at the moment when the center of the ball falls within 3 mm from the height h_c at which it rests on the edge. (The ball touches the edge = lands. Just entering the window 1.5 r_b above the edge will not catch it: if the vertex is inside the window, it will be "caught" at the vertex -- I measured it and rejected it). rho/cd = air density/drag coefficient (vacuum when rho = 0: the theorem gate runs with this).
fail-closed: unknown preset, dimensions ≤ 0, edge of plate ≥ ball (cannot be received at edge = not kendama), width < diameter of plate, thread ≤ radius of ball, If the hole depth is outside (0, ball diameter) and the hole radius ≥ ball radius, ValueError. Do not compare the thickness of the tip and the hole. The returned values include the derived quantities "cup_rest_height" = √(r_b² − r_c²) (height of the center of the ball on the edge of the receiving plate), "bp"(ballistics.ball_params, solid ball).
• 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.
• gallery_drive_kendama_racket — py -3.11 examples/gallery_drive_kendama_racket.py
• gallery_drive_world_objects — py -3.11 examples/gallery_drive_world_objects.py
• poc_kendama — py -3.11 examples/poc_kendama.py
table as input)course_layout · course_occupancy · course_contains · world_build · world_camera · world_move · lidar_scan · rss_longitudinal_same
kendama)elliptic_k_agm · pendulum_period_exact · pendulum_launch_speed · pendulum_rod_simulate · tether_tension_fixed · tether_slack_angle · swing_up_plan · swing_up_apex
*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.