Interactive
Run my robots
Six things on this page, and none of them are a recording. Four of them download the Python straight from reactive_autonomous_nav and reactive-replanning-ur12e and execute it here, unmodified — ROS is stubbed at the import boundary and nothing below it is touched. Search a map you draw; drive a TurtleBot with your cursor and throw obstacles in its way; race all five of the package's local controllers over one plan; then reach into a UR12e's workspace, block the arm, and watch it cancel and replan around your hand.
The last two come from repositories that are private, so their modules are
copied into vendor/ rather than fetched — each with a
PROVENANCE.md naming the commit and a SHA-256 per file. They still execute: click
a point on a Go2 course and watch four cost functions drive to it, then put back the two
constants a physics cross-check refuted; or run a bimanual assembly controller against its own
analytic plant. Below those, a reference block reads a 32-dimensional action space out of the
model that defines it — structure rather than a demo, and labelled as such.
Fetched from GitHub as this page loads
- Draw a map, search itA*, Theta*, RRT, SMAC, Hybrid
- Chase your cursorA* + DWA, 10 Hz
- Race five controllersPure Pursuit, Stanley, DWA, TEB, MPPI
- Reach into the celldetect, preempt, replan
Copied in, because the repository is private
- Send a Go2 anywhereclick the course, four cost functions race
- Seat a connectoreight phases, two UR5s
wall explored path start goal
The whole stack, live
Chase
Your cursor is the goal. astar_planner.py plans to it, and
dwa_controller.py tracks that plan — sampling a velocity window, rolling
every candidate forward, scoring them on heading, clearance and speed, and committing to
one, ten times a second at the node's own dt. Both files are the ones fetched
above, running unmodified.
Click anywhere to drop an obstacle. The costmap is re-inflated, the global plan is thrown away and re-run, and the controller keeps tracking whatever comes back — which is the entire point of the repository.
Swap the controller and chase again. Same planner, same costmap, same cursor — only the thing following the plan changes, and they follow it differently enough to feel it. Each one draws what it is actually looking at: the point Pure Pursuit steers at, the point on the path nearest Stanley’s front axle — not its centre, which is the whole idea of the law — and the band TEB is deforming. Only DWA has a rollout fan, because only DWA scores a window of trajectories. MPPI is here too, but it runs in a worker: a tick costs about 580 ms and that is one indivisible call, so on the main thread it would freeze the cursor instead of chasing it. Off the main thread the page stays at 60 fps and the robot does what a real base does when its controller is slow — keeps moving on the last command until a new one arrives. Pick it and watch the lag in the readout; that number is the honest cost of 1000 samples a tick.
The last one is not from the repository — it was trained here.
Clone is a small network fitted to DWA's own output:
tools/train_clone.py drives the real
dwa_controller.py across generated maps, records what it saw and what twist it
committed to, and fits an MLP to that. Driving with it, the fan you see is the observation
the network actually got — range along a spread of bearings, plus the goal in the
robot's frame and its current speed. No velocity window, no rollouts: one forward pass.
The section below has the numbers, including the ones that are not flattering.
Controller
global plan rejected rollouts committed trajectory what the controller is looking at inflation layer
move the cursor over the field · click to drop an obstacle
Five controllers, one plan
Race
The package ships five local controllers. They all take the same job — here is a path,
follow it — and they disagree about how. So: one A* plan, one costmap, five identical
robots, and each controller running its own _control_loop at
its own dt, on the tuning the repo ships. Nothing is normalised.
Fairness is in simulated time. Every frame advances each controller by however many of its own ticks add up to the same simulated interval, which is why MPPI takes two where the rest take one. Watch the two turns: a straight run would tie, and it is coming off the end of one wall and then the other that separates a controller which cuts the corner from one that holds the line.
MPPI is off by default, and not because it loses — it lands third of four on both maps
of the package’s own controller suite, ahead of TEB and behind Pure Pursuit and Stanley.
It draws 1000
samples a tick and spends real time doing it: about 470 ms a tick in this
tab against roughly 2 ms for DWA, which is 18 seconds of driving that
takes three minutes to watch. The profile puts that cost in
_sample_controls and _path_angle_cost, not in marker building, so
there is nothing to trim without running something other than what the repo ships. A robot
with a real CPU makes its 20 Hz. Turn it on if you want to see it; the
ms/tick column is why it is off.
press run · five controllers, one plan
Different repo, same idea
Reach in
This is the UR12e cell from
reactive-replanning-ur12e,
seen down the RealSense. The arm runs the node's own cycle — open, PICK,
close, PLACE, open, then park while the baseline rebuilds — and its joints are
solved each frame rather than played back. The pick and place are not coordinates I picked:
_build_poses() offsets the home pose by pick_z_offset and
place_y_offset, and those two numbers are read out of the fetched source, so
retuning the node retunes this. _cloud_cb runs on every frame of
it: the depth gate, the workspace box, the colour mask that drops robot-coloured points, and
the geometric self-filter that erases the arm from its own view. Every count on the right is
read off the node's own filter calls.
Move your cursor to put a hand in the workspace. Put it on the dashed line
the tool is following and the node does what it does on the robot: injects a collision sphere
at SPHERE_RADIUS, notices a planned waypoint is inside
SPHERE_RADIUS + PATH_CLEARANCE, cancels the motion, waits
DECEL_WAIT for the arm to actually stop, and replans — lifting by
DETOUR_HEIGHT and going over, or stepping aside, whichever
plan_arc_detour picks for the direction it was travelling. Every threshold in
that sentence is read off the node.
The interesting part is where it stops seeing you. Walk the hand onto a link and it
vanishes into the self-filter — the repo's own test puts that edge at 11 cm, and
you can find it yourself. Chase the tool and the dashed circle turns: that is
PREEMPT_DIST, the radius inside which the node cancels the motion it is
executing and replans. Both are the cost of never reporting the robot as an obstacle.
move the cursor over the camera plate
A copy, not a fetch — vendor/qlc/
Cross the ice
Click anywhere on the course. Four cost functions for a Unitree Go2 plan and drive to the point you pick — default Nav2 inflation, a hand-tuned legged costmap, a supervised learned cost, and maximum-entropy IRL — over the same terrain, with the same A* and the same DWA. The only thing that differs between the four routes is the cost function. The dashed line is a privileged oracle handed the exact cost the simulator charges: a ceiling, not a competitor.
Course
Physics
Plate
nav2_inflation reactive learned irl oracle (ceiling)
click anywhere on the course · four cost functions will drive there
Then break the physics on purpose. The switch puts FALL_RATE
back to 0.5 and the ice drag back to 0.95 — the two constants the surrogate shipped with
before a MuJoCo cross-check measured them and found the sign backwards and no falls at all.
That one constant produced 20 of the 36 failures in the Nav2 row of the first results table.
Removing it moved Nav2 from 70.0% to 87.5% over 120 courses and the effect
the project was built to show disappeared.
How much of this is really running
The course comes from course_suite(5, seed=1234) and the loop is
qlc.eval.benchmark.run_episode, both the benchmark's own: replan every
replan_period ticks, DWA every tick, a stuck counter so a stack that paints
itself into a corner is recorded as a planning failure rather than a timeout. Setting the
goal is qlc-goto, which copies the recipe with a new Pose2D and
regenerates — so a goal inside a wall is refused rather than carved out.
Two of the four are torch, and there is no wasm build of it, so their forward pass cannot
run here — but their output can. A cost model's only input is the feature stack, and a
course's feature stack is a pure function of its TerrainConfig, so course
i at seed 1234 has one learned cost field and always will.
tools/bake_qlc_costs.py computes those ten fields against the repository's own
checkpoints and asserts per course that the episode a baked field produces is identical to
the episode the live model produces. A* the smoothing, the resampling, the DWA, the world
and the whole loop still run in this tab. If a goal you set regenerates the terrain, those
two rows drop out rather than use a field that no longer belongs to the course.
One course is not the table. Over the repository's 120: nav2_inflation 87.5%,
learned 86.7%, reactive 85.0%, irl 81.7%, oracle
93.3% — every interval overlapping every other. The four cost functions are
indistinguishable, and Nav2, the baseline the whole premise said had to lose, comes out
highest. That is the null result, and it is the finding.
A copy, not a fetch — vendor/oba/
Seat a connector
Two UR5s on a NIST Assembly Task Board. An eight-phase insertion controller picks up a D-sub
connector and presses it into a socket; a five-phase bimanual one threads a wire through three
clips, letting go and taking hold further along each time. Both are
oba.sim.expert, scored by the same detectors the simulator arm uses. Watch the
force bar: a connector resting on a socket and one seated in it are
millimetres apart in position and an order of magnitude apart in newtons.
Task
press run · the phase machine, not the physics
What this is not
The environment under it is not a simulator. oba.sim.plant
integrates commanded deltas, attaches an object when a gripper shuts near it, and develops
a reaction force when a body is pressed past a surface. No friction, no compliance, no
deformable wire mechanics. Its own docstring says it must never produce a reported number,
and the repository enforces that with a type rather than a convention:
IS_ANALYTIC is true, rollout refuses to record a phase gate when
this is the environment, and PhaseGate.measured_by has no member that could
describe it. Every success rate the project reports is read from Isaac Sim. There are none
on this page, and the scripted expert is a positive control — it is built not to
fail.
The arms are drawn as a two-link sketch to the end-effector position the plant integrates.
There are no joints in this fixture: ArmState.joint_positions_rad is
(0.0,) * 6 and the module says so. Rotations are not integrated either, so the
detector's angular tolerance is not exercised by anything you see — that is covered
by unit tests that build a misaligned state directly, and for real by Isaac Sim.
Worth knowing anyway: ALIGN and INSERT are separate phases because
a gripper-transition heuristic cannot tell them apart and the difference between them is
the whole task. The socket's mating axis is published rotated 180° about X, so a
controller assuming “insertion means descend” fails rather than passing by
luck. And the force band is ordered 1.5 < 8.0 < 30 < 45 N for a reason
that cost a debugging session: derived as a fraction of the maximum, the back-off landed
below the force a good insertion produces, so every successful seat was aborted one
step early and reported as NOT_GRASPED.
Reference, not a demo — vendor/rfm/
One action space, seven robots
No robot here: this is structure. Every embodiment in robot-foundation-model's mixture writes
into one 32-dimensional vector and a per-embodiment mask decides which dimensions are
meaningful. The strip is rfm.data.action_space.embodiment_mask's output. Compare
single_arm_7dof with single_arm_osc_pos: the same arm under a
Cartesian controller writes four dimensions, not fourteen, and running it under the wrong mask
left ten supervised against a constant zero and diluted the gradient by about 3.5×.
Embodiment
press a robot · the mask comes from the module, not from this page
The nine-mode failure watchlist
rfm.eval.ablations.FAILURE_MODES: nine named ways this can look healthy and be
dead, each with a metric, a threshold and a written consequence. They exist because the
project kept measuring healthy numbers over dead code paths — its own evidence index
opens by counting twelve. Move a slider and rfm.eval.metrics.check_alarms
scores the snapshot; what lights up is what that function returned. Two of the nine are
greyed because they are check_trace_alarms territory and no slider reaches
them.
press a robot or move a slider to load the module
Coverage, as describe_coverage() prints it
The one real result this project has is not on this page and is not a robot doing anything: prediction error separates failures at AUROC 0.946 ± 0.008 against controls at 0.11, and the repository still declines to call it a win because the same checkpoint predicts the next latent worse than copying the present one. The policy has never completed the task — 0 of 16.
describe_coverage() runs when the module loads
Console
booting…
All six run client-side via Pyodide
and send nothing anywhere. For the first four the source is fetched live from
raw.githubusercontent.com, so if the repo changes, so does this page. The last
three run in a second runtime that does not start until you press something in one of their
sections, and their modules are copies — the byte count in the log is the copy's, and
vendor/qlc/PROVENANCE.md, vendor/oba/PROVENANCE.md and
vendor/rfm/PROVENANCE.md record which commit each came from and a SHA-256 per file.
Read the source