kendama_simulate — DRIVE kendama op

• Datenarten: table → table

• Aufruf: import fullseye as fs; fs.ledger.kendama_simulate(kp: 'dict', handle, *, p0, v0, t_end: 'float', dt: 'float' = 0.001, perceive=None, catch_plan=None, g: 'float' = None, v_max: 'float' = 2.0, a_max: 'float' = 20.0, v_rel_max: 'float' = 1.0, plan_from: 'float' = 0.0, stop_on_miss: 'bool' = True, contact=None, contact_tol: 'float' = 0.0005) -> 'dict' (die Implementierung direkt: import kendama; kendama.kendama_simulate(kp: 'dict', handle, *, p0, v0, t_end: 'float', dt: 'float' = 0.001, perceive=None, catch_plan=None, g: 'float' = None, v_max: 'float' = 2.0, a_max: 'float' = 20.0, v_rel_max: 'float' = 1.0, plan_from: 'float' = 0.0, stop_on_miss: 'bool' = True, contact=None, contact_tol: 'float' = 0.0005) -> 'dict'; aus dem Register: opsdrive.get("kendama_simulate"))

Verwendung

Kendama-Simulation in 2 Phasen: Solange die Schnur gespannt ist, hängt die Kugel am Aufhängepunkt (Schnurloch des Querstücks = Hand + kp["tie_offset"]) (Projektionsmethode, wie ballistics.tether_simulate: bei festem Aufhängepunkt im Vakuum dieselbe Trajektorie; Schnurlänge = kp["pendulum_length"]); ist sie erschlafft, freier Fall (Schwerkraft + Luftwiderstand, kp["bp"]; rho = 0 für Vakuum). In jedem step prüft kendama_catch_check (große Schale = Hand + kp["cup_offset"], Achse kp["cup_axis"]) das Fangen; nach dem Fangen endet die Simulation.

handle = die Hand (Sarado-Mitte) als fester (3,)-Punkt oder als Funktion t → (3,) (Hochschwingen im offenen Regelkreis). Ist catch_plan gegeben, wird nach dem Erschlaffen des Fadens (und für t ≥ plan_from: bis zum Ende des Hochschwingens hat der offene Regelkreis Vorrang) in jedem Step das mit perceive wahrgenommene (p̂, v̂) an catch_plan(t, p̂, v̂, cup_state) → {"target": 大皿の縁の中心の目標 (3,), …} übergeben, und die Hand wird per Bang-Bang mit Geschwindigkeit ≤ v_max und Beschleunigung ≤ a_max nach „Ziel − cup_offset“ gebracht (bewegt sich die Hand, bewegt sich auch der Drehpunkt; fällt die Kugel und wird |p − Drehpunkt| = L, spannt sich der Faden wieder).

Wahrnehmung perceive:

• None → Ground Truth (p, v).

• perceive(t, p, v) → (p̂, v̂) (z. B. noisy_perceiver) wird nur in Steps aufgerufen, in denen der Plan aktiv ist.

• Eine Wahrnehmung mit dem Attribut observe_all = True (kendamaworld.camera_perceiver) wird in jedem Step als perceive(t, p, v, scene) aufgerufen (scene = {"t", "hand", "tie", "cup", "cup_axis", "taut"} = aus der Propriozeption der Hand bekannte Größen + taut zum Rendern der Welt (Render-Konvention für die Haltung der Kugel: solange gespannt, zeigt das Fadenloch zum Knoten; wenn schlaff, bleibt die letzte Haltung). Auch p wird nur zum Rendern der Welt übergeben). Liefert sie None, bleibt der Plan unverändert (bewegt weiter zum letzten Ziel; gibt es keines, hält die Hand an).

Die Kugel wird nur von der Schwerkraft (+ Luftwiderstand, wenn rho > 0) und der Fadenspannung (einseitige Zwangsbedingung ≥ 0) bewegt. Das Ken stößt die Kugel nicht: Wird contact(hand, p) → 隙間 [m] (z. B. kendamaworld.kendama_clearance) übergeben, endet der Lauf als "hit_ken" in dem Step, in dem vor einem Fang der Spalt < −contact_tol wird (die Kugel berührte Ken-Spitze, einen Schalenrand oder das Sarado = Fehlschlag). Der Fang wird mit kp["catch_window"] (Höhe, bei der die Kugel den Rand berührt) beurteilt.

Enden end_reason: "caught" (gefangen), "hit_ken" (Kendama berührt), "missed" (nach dem Erschlaffen beim Fallen nach unten 2 r_b oder mehr unter die Ebene der großen Schale gelangt; mit stop_on_miss=False wird nicht angehalten: für das Snap-Gate genutzt), "timeout" (t_end). Rückgabewert {"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"} (Arrays bis zum Step des Endes. stage = Regelungsphase in jedem Step ("lift" Hochschwingen / "wait" schlaff, aber vor dem Plan / "stage" des Plans (hold / carry / absorb) oder "plan"). slack_t = Zeitpunkt, an dem der Faden nach dem Spannen erstmals erschlafft, 0.0 wenn von Anfang an schlaff, None wenn er nie erschlafft. energy = ½mv² + mgz. n_estimates = Anzahl der an den Plan übergebenen Wahrnehmungen). Anfangszustand mit |p₀ − Drehpunkt(0)| > L, t_end < 0, dt ≤ 0 oder Grenze ≤ 0 → ValueError.

Leere Eingabe (kp ist ein leeres dict) löst ValueError aus.

Referenzen (Beispieldaten, Literatur)

• 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.

Ausführbare Beispiele (verifizierte Samples, die diesen Operator wirklich aufrufen)

• poc_kendama — py -3.11 examples/poc_kendama.py

Typkompatible Folge-Operatoren (nehmen table als Eingabe)

course_layout · course_occupancy · course_contains · world_build · world_camera · world_move · lidar_scan · rss_longitudinal_same

Gleiche Kategorie (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.