The first two simulators are direct ports of the committed control logic — the same if/else
ladder, the same integer map(), the same axis indices. That makes them useful for
more than illustration: the behaviour you see is the behaviour that was uploaded.
Ported exactly: the drive decision ladder, Arduino's map() truncation, the
PID class, the error terms, the pid() auto mixer and every PWM constant.
Modelled: how PWM becomes metres per second, and how flywheel PWM becomes exit velocity.
Those two constants are calibration sliders — nothing in the repository measures them.
Drag the stick. Each wheel shows the PWM the firmware would write and the direction bit that
accompanies it; the branch name above the robot is the exact else if that matched.
Try the rotation triggers at partial travel.
Triggers rest at +1.0 and travel to −1.0 when pressed.
The two rotation branches sit below all eight translation branches. Any non-zero stick deflection — after the 0.1 deadzone — wins, so you cannot strafe and spin at once. For a holonomic base that is a real capability left on the table.
On a pure +x move the firmware writes M2 = M4 = 0 and leaves their direction
pins untouched. The idle pair still contributes drag, which is part of why the robot
creeps off a straight line over a long run.
Click anywhere on the court to drop the robot there and watch the loop close. The cyan cone is the D455's ~69° horizontal field of view; the green arc is the distance setpoint the controller is actually chasing.
Leave it on As committed and the robot will centre itself and then sit at the wrong range indefinitely. Two committed details cause that, and you can toggle each one:
pid() tests axes[3] only after
axes[2] == 0 exactly (Drive_with_auto.ino:323), and a
float PID output is essentially never exactly zero.Switch to Corrected mapping to see the same gains converge cleanly.
The three PWM presets and the 55° launch angle come from the firmware. The conversion from PWM to ball speed does not exist anywhere in the repository, so it is exposed as a calibration constant — set it from one measured shot and the rest of the curve follows.
Buttons 11 and 12 add or subtract 10 PWM per press with no clamp
(_shoot_with_auto.ino:424). Eleven presses on bot 1's top preset
exceeds the 255 write limit and silently wraps the analogWrite argument.
Any preset button resets the trim to zero.
The tilt motor runs while a button is held with no encoder, limit switch or feedback of any kind, so the 55° in the vision node is an assumption about where the mechanism happens to be — not a commanded state the software can verify.