diabolo_dynamics_step — DRIVE diabolo op

• Data kinds: table × matrix × matrix × scalar × table → table

• Call: import fullseye as fs; fs.ledger.diabolo_dynamics_step(state: 'dict', sticks_prev, sticks_now, dt: 'float', params: 'dict', *, plane_rule: 'str' = 'paper', rotation: 'str' = 'paper', flying_rule: 'str' = 'paper') -> 'dict' (to call the implementation directly, import diabolo; diabolo.diabolo_dynamics_step(state: 'dict', sticks_prev, sticks_now, dt: 'float', params: 'dict', *, plane_rule: 'str' = 'paper', rotation: 'str' = 'paper', flying_rule: 'str' = 'paper') -> 'dict'; from the registry, opsdrive.get("diabolo_dynamics_step"))

Usage

Advances the paper's analytic model by 1 step (diabolo = point mass + auxiliary spheroid + gravity).

state = {"x", "v", "omega", "mode"} (mode is DIABOLO_STATES). Stick pair = matrix (2, 3). Procedure (1–4 in the paper):

forward Euler x += v dt, v += g dt → new ellipsoid → state transition → if on the string and outside, return to the nearest point, cap v_pull (inward normal component of displacement/dt) at v_origin + v_edge (eq. 3); near tautness (separation > l − 5 cm) apply the plane rule (eq. 4); remove the outward normal velocity (not stated in the paper, aligned with the public implementation) → rotation (eq. 2: ω_t = ω_{t−1} + μ Δ_string, Δ_string = increment of d_R, μ = μ_acc / μ_dec). All damping coefficients are 1 (default of the public implementation).

Selectable forms (for comparison with the public implementation): plane_rule = "paper" (eq. 4: keep only the direction of n_plane = x̂ × (x_L − x_R)) / "code" (remove only the fore–aft component); rotation = "paper" (eq. 2, a telescoping sum independent of step size) / "code" (Δω = k (Δd_R/dt − ω r), k = 0.01; halving the step doubles ω); flying_rule = "paper" (figure: s > c_F) / "code" (above the plane joining the sticks).

Returns {"x", "v", "omega", "mode", "s", "pulled", "v_pull_raw"}. Raises ValueError: misspelled option, unknown mode, dt ≤ 0, missing state key, stick-pair shape.

References (sample data, literature)

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

Runnable examples (verified samples that actually call this op)

• poc_diabolo_model_and_vision — py -3.11 examples/poc_diabolo_model_and_vision.py

Ops the type connects to (they accept table as input)

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

Same category (diabolo)

diabolo_params · diabolo_spheroid · spheroid_closest · diabolo_simulate · diabolo_state_sequence · diabolo_throw_catch_truth · string_tension_static · string_tension_from_sag


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