simulator · v2 · robot-framework / letter-sim · calibrated from real runs 2026-06-10

# Dash letter-sim — differential-drive tracer (real-run constants)

A 2-wheel differential-drive model of Dash tracing letters, driven by the SAME verb set as the real robot (`forward · backward · turn_left · turn_right`). marker = rear pen (writes), eraser = front pen (lifts when reversing). v2 defaults come from the 2026-06-10 butcher-paper runs (`letters/runs/*/log.md`): 0.6× effective distance @speed 150, stable ~8°-CCW drift per long stroke, closed-loop turns ±2° (post turn-bug fix). Headless twin with the full noise model: `sim-runs/run-sim.mjs`.
"make a simulator, and then calibrate the simulator … tighten the iteration, that's the task for the robot. Think about the dynamics of the wheels and how it turns to make letters, the loop in the simulator, calibrating to the real thing, camera above the whiteboard." — Jake (2026-06-05T17:38:00Z voice memo 17-38)
Whiteboard is `40 × 40 cm` (camera-above frame). Grid = 5 cm. Blue trail = marker ink. The triangle is Dash: nose (front/eraser) points the heading, tail dot is the rear marker. All four edges are off-board hazards (see calibration-notes).
drive — same verbs as the robot
pen-down on `forward` (marker draws as it drives) · front eraser engages on `backward` (trail lifts). Toggle: backward erases
calibration knobs — defaults = measured 2026-06-10
wheelbase (cm) 8.5 turn rate (deg/s @ spin 200) 43 effective distance × commanded (speed 150) 0.6 forward drift (deg/cm — measured: stable CCW) -0.3 closed-loop turns (move 0x23, ±2° — post turn-bug fix)
Measured (head-marker rig, `letters/01`/`02`): forward delivers 0.6× commanded @speed 150 and drifts ~8° CCW per long stroke (≈ −0.3°/cm, direction STABLE — the old "unstable direction" note was the caster rig). Uncheck closed-loop for the legacy open-loop truth: turn_right delivers ~0.35× commanded (wildly variable), turn_left ≈ zero rotation (the driver bug, fixed 2026-06-10 — see [[dash-turn-bug]]).
state
x=20.0 y=20.0 cm · heading=0° · pen=up

maps to robot verb | sim → physics (real-run grounded)
--- | ---
`forward(cm)` | 0.6× effective distance; −0.3°/cm CCW drift (stable)
`backward(cm)` | heading-relative retrace, same 0.6×; eraser pen
`turn_left(deg)` | closed-loop: ±2° · open-loop legacy: ≈0° (the bug)
`turn_right(deg)` | closed-loop: ±2° · open-loop legacy: ~0.35× ± a lot