kendama op• Datenarten: table → table
• Aufruf: 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' (die Implementierung direkt: 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'; aus dem Register: opsdrive.get("kendama_combo_simulate"))
Trickfolge: Ausgehend von der Kugel auf der Schale sequence[0] wird "loslassen → während des Flugs umgreifen → die nächste Schale direkt unter den Landepunkt führen und mit angepasster Geschwindigkeit fangen" n_catch-mal oder bis zum ersten Fehlschlag wiederholt (Moshikame = ("ozara", "chuzara"), 3 Schalen = ("ozara", "kozara", "chuzara")). Hand hand0 = Mitte des Querstücks (Umgreifen dreht nur das Handgelenk, kein Nachgreifen: Annahme). Die erste Schale wird über das Hochschwingen von kendama_simulate gefangen; Position und Geschwindigkeit dieser Hand werden als hand0 / hand_v0 übergeben.
Phasen (jedes Mal): absorb (die fangende Schale innerhalb von Grenzen abbremsen: die Kugel bewegt sich mit der Schale) → toss (die Schale mit a_toss nach oben beschleunigen und bei Erreichen von v_toss mit a_max (> g) abbremsen: im Schritt, in dem das Abbremsen beginnt, wird die Normalkraft der Schale negativ und die Kugel löst sich. Geschwindigkeit der Kugel beim Ablösen = Geschwindigkeit der Schale → Scheitel = Ablösehöhe + v²/2g) → flight (aus der wahrgenommenen Parabel Landezeit τ und Landepunkt bestimmen und die Hand mit _move_pos_vel auf „Position = direkt unter dem Landepunkt (Höhe z_home), Geschwindigkeit = k_match × Landegeschwindigkeit der Kugel“ bringen. Der Griffwechsel beginnt erst, wenn die Kugel mindestens rot_clear (0.15 m: 0.12 m von der Sarado-Mitte bis zum Rand der Basisschale + Kugelradius) von der Sarado-Mitte entfernt ist (laut Wahrnehmung; kommt der letzte Zeitpunkt, der die Landung noch erreicht, ohne diese Entfernung, beginnt er dann = die 180°-Drehung große Schale → kleine Schale beim 3-Schalen-Trick kann hierunter fallen), und dreht mit einem dreieckigen Winkelgeschwindigkeitsprofil, begrenzt auf omega_max, in die nächste Haltung. Vor Ende der Drehung wird nicht gefangen) → nach einem Fang zurück zu absorb.
Physik: Auf der Schale bewegt sich die Kugel mit der Schale (solange die Normalkraft der Schale ∝ (a_Schale + g ẑ)·Achse ≥ 0; wird sie negativ, löst sie sich); im Flug wirken nur Schwerkraft (+ Luftwiderstand) und die Fadenspannung (einseitige Zwangsbedingung, dieselbe Projektionsmethode wie kendama_simulate). Das Ken stößt die Kugel nicht (fällt contact(hand, p, R) → 隙間 unter −contact_tol, → "hit_ken": R_ken von kendamaworld.kendama_clearance). Die Fangprüfung ist kendama_catch_check (Landefenster kp["catch_window"], Relativgeschwindigkeit ≤ v_rel_max: angenommen 1 m/s). Im Fenster, aber zu schnell → "too_fast". Im Moment des Fangs wird die Kugel auf die Position auf dem Rand gesetzt und ihre Geschwindigkeit auf die der Schale gesetzt (unelastisch, kein Abprallen: Annahme. Versetzungsweg ≤ die 3 mm des Fensters).
Abwurfhöhe (geschlossene Form): Den Scheitel apex_above_cup über die Höhe z_r legen, auf der der Kugelmittelpunkt bei der nächsten Landung aufliegt. Beschleunigt man aus der aktuellen Kugelhöhe z₀ mit a_toss, ist die Ablösehöhe z₀ + v²/(2 a_toss), also v_toss² = 2g (z_r + A − z₀) / (1 + g / a_toss) (ohne Luftwiderstand). controller="position": Vergleichsfall, der die Hand im Flug mit dem bisherigen _move_bounded (stoppt mit nur der Position als Ziel) bewegt. Wahrnehmung perceive: None = Ground Truth. Mit kendamaworld.camera_perceiver (flight_from="cup") wird in jedem Step perceive(t, p, v, scene) aufgerufen (scene = aus der Propriozeption der Hand bekannte Größen + die Haltung R_ken zum Rendern) und (p̂, v̂) oder None empfangen. Da der Fang über das Gefühl der Hand bekannt ist (Annahme: Tastsinn), wird perceive.reset(), falls vorhanden, im Fangschritt aufgerufen (die Parabel des vorigen Flugs wird verworfen).
Annahmen (keine veröffentlichten Werte): Winkelgeschwindigkeit des Handgelenks ≤ 30 rad/s, Handgeschwindigkeit ≤ 2.5 m/s, Beschleunigung ≤ 20 m/s², k_match = 0.8 (das Maß, in dem ein Mensch „die Geschwindigkeit mit den Knien anpasst“). Rückgabewert {"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"}.
Leere Eingabe (kp ist ein leeres dict) löst ValueError aus.
• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).
• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.
• Der kanonische Algorithmus (Autor, Jahr) und seine Anwendungen stehen im Familienleitfaden oben.
• poc_kendama — py -3.11 examples/poc_kendama.py
table als Eingabe)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. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.