Back

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

  1. Draw a map, search itA*, Theta*, RRT, SMAC, Hybrid
  2. Chase your cursorA* + DWA, 10 Hz
  3. Race five controllersPure Pursuit, Stanley, DWA, TEB, MPPI
  4. Reach into the celldetect, preempt, replan

Copied in, because the repository is private

  1. Send a Go2 anywhereclick the course, four cost functions race
  2. 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