camera_perceiver — DRIVE kendamaworld op

• Datenarten: table → any

• Aufruf: import fullseye as fs; fs.ledger.camera_perceiver(world: 'dict', rig: 'list', *, fps: 'float' = 100.0, pixel_noise: 'float' = 0.0, rng=None, slack_margin: 'float' = 0.005, min_frames: 'int' = 3, window: 'int' = 128, color_tol: 'float' = 0.12, g: 'float' = 9.81, keep_frames: 'bool' = False, slack_frames: 'int' = 2, min_fill: 'float' = 0.6, reject: 'float' = 0.004, render_fn=None, holes: 'bool' = True, flight_from: 'str' = 'tie', flight_margin: 'float' = 0.012) (die Implementierung direkt: import kendamaworld; kendamaworld.camera_perceiver(world: 'dict', rig: 'list', *, fps: 'float' = 100.0, pixel_noise: 'float' = 0.0, rng=None, slack_margin: 'float' = 0.005, min_frames: 'int' = 3, window: 'int' = 128, color_tol: 'float' = 0.12, g: 'float' = 9.81, keep_frames: 'bool' = False, slack_frames: 'int' = 2, min_fill: 'float' = 0.6, reject: 'float' = 0.004, render_fn=None, holes: 'bool' = True, flight_from: 'str' = 'tie', flight_margin: 'float' = 0.012); aus dem Register: opsdrive.get("camera_perceiver"))

Verwendung

Wahrnehmung, die (p̂, v̂) der Kugel allein aus Bildern bestimmt: perceive(t, p, v, scene) → (p̂, v̂) | None (für kendama.kendama_simulate; mit dem Attribut observe_all = True wird sie in jedem step aufgerufen). Die Ground Truth (p, v) dient nur zum Rendern der Welt; v wird nicht gelesen.

Zu jedem Frame-Zeitpunkt k / fps: (1) Mit kendama_pose wird die Welt platziert (Ken = scene["hand"], Kugel = p, Schnur) und mit jeder Kamera gerendert (nur ein Fenster von window Pixeln um die Kugel wird gerendert: Das Fenster wird aus der Detektion des vorigen Frames bestimmt (bzw. aus der Vorhersage, falls eine Parabel angepasst ist); fehlt eine Detektion oder berührt sie den Fensterrand, wird das ganze Bild neu gerendert — die Fensterpixel sind identisch mit dem Ausschnitt des Vollbilds), (2) mit balltrack.ball_detect (chroma, orange) wird die Kugel detektiert und den Pixeln Gaußsches Rauschen mit σ = pixel_noise hinzugefügt, (3) ist sie in 2 oder mehr Kameras sichtbar, wird sie mit balltrack.triangulate_dlt nach 3-D zurückgeführt,

(4) "erschlafft" = der Abstand zwischen der triangulierten Kugel und dem Schnurloch des Tellerkörpers (scene["tie"]: aus der Propriozeption der Hand bekannt) ist um mindestens slack_margin

kürzer als die effektive Schnurlänge, und zwar slack_frames Frames in Folge (bei 1 Frame gab es bei 2 px Pixelrauschen Fehldetektionen während die Schnur gespannt war — gemessen und verworfen); an die Punkte ab dem ersten solchen Frame wird eine Parabel mit bekannter Schwerkraft g (dieselbe Formel wie kendama.parabola_fit_g, 6 Unbekannte) per kleinsten Quadraten angepasst (mindestens min_frames Punkte). Rückgabe = (p̂, v̂) der auf t extrapolierten angepassten Parabel. Gibt es noch keine Parabel, None (der Plan bewegt sich nicht).

Lage der Kugel in der Welt (Rendering-Konvention, Wahrheitswert): Während scene["taut"] zeigt das Schnurloch zum Schnurloch des Tellerkörpers; nach dem Erschlaffen bleibt die letzte Lage (in R_ball aufgezeichnet). Aufzeichnung (Attribute): frames = [{"t", "p_hat" (3,) or NaN, "uv" [(col,row)…], "full" [bool…], "tie", "hole_uv", "hole_dir"}], R_ball = wahre Lage der Kugel pro Frame (wahre Richtung des Lochs = R_ball @ HOLE_AXIS_LOCAL: Wahrheitswert des Gates), slack_frame (Index des Frames, in dem das Erschlaffen detektiert wurde, or None), fits = [(t_frame, n_used, p_ref, v_ref, t_ref)], render_s (Gesamtsekunden für Rendering + Detektion), n_render (Anzahl gerenderter Fenster), images (bei keep_frames=True die Vollbilder jeder Kamera …… schwer, daher nur für Abbildungen). render_fn(world, cam) → (H, W, 3) float: Schnittstelle zum Austauschen des Renderers (Standard = Mesh-Rendering von driveworld.world_camera; z. B. 3DGS). Wird nur ein Fenster gerendert, wird ein dict übergeben, in dem K (mit verschobenem Hauptpunkt), width und height von cam an das Fenster angepasst sind. holes=True: Im Fenster der Kugel wird mit kendama.hole_detect das Loch gesucht (an den Pixeln vor dem Hinzufügen des Rauschens); in Frames, die 2 Kameras sehen, wird der Schwerpunkt des Lochs trianguliert und die Richtung vom Kugelmittelpunkt hole_dir (Einheitsvektor in der Welt) aufgezeichnet (bei Teller-Tricks nur berichtet, nicht für den Plan verwendet). flight_from="cup" (19. Runde, Trickfolgen): Der "Flugbeginn" wird nicht über das Erschlaffen der Schnur bestimmt, sondern dadurch, dass der Abstand zwischen der triangulierten Kugel und der Position der auf dem Teller liegenden Kugel (scene["rest"] = Mittelpunkt des Randes des auffangenden Tellers + h_c·Achse: aus der Propriozeption der Hand bekannt) flight_margin in slack_frames Frames in Folge überschreitet (Frames, während die Kugel auf dem Teller liegt, gehen nicht in die Anpassung ein). Ist scene["R_ken"] vorhanden, wird der Ken in dieser Lage gerendert (Umgreifen). perceive.reset() verwirft die aktuelle Parabel und wartet auf den nächsten Flugbeginn (Aufzeichnung flights = Liste der Frame-Indizes der Flugbeginne). Der Standard "tie" verhält sich wie bisher.

fail-closed: fps ≤ 0, pixel_noise < 0, min_frames < 2, window < 32, weniger als 2 Kameras, Welt ohne Kendama → ValueError.

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 any als Eingabe)

course_crank · course_s_curve · course_turnaround · course_slope · course_intersection · course_parallel_parking · course_crossing · course_road

Gleiche Kategorie (kendamaworld)

ken_mesh · add_ken · ken_set_pose · string_mesh · add_string · string_set · kendama_world · kendama_rig


*Provenance: kendamaworld.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.