Ripple

An always-on site engineer for deployed robots. It watches the robot, diagnoses failures, recovers within limits you set, and asks a person when software alone can't resolve what's happening on the floor.

Two-minute demo: a warehouse SMR300 in Gazebo with ROS 2 Nav2. Ripple runs on GLM 5.3 and talks to the engineer through Ambiguous. Scenes 1–4 are one continuous live run and scene 5 is an earlier one; the footage is unedited and sped up, and the captions are Ripple's own timeline entries.

What the demo shows

  1. Site control. A keepout drawn on the dashboard map is verified in the keepout mask and the global costmap. Nav2 plans around it, and Ripple verifies the arrival: stopped, within tolerance.
  2. Words become site state, then a failure. The walkway is reopened from a sentence. A pallet then blocks the Home dock and the trip home fails. Without being asked, Ripple reads diagnostics and logs, clears both costmaps and probes the route, then asks the engineer one specific question on Ambiguous.
  3. Human context. No one answered on Ambiguous in this run, so the reply was typed on the dashboard. Ripple locates the dock from the words, verifies a keepout over it (the dock becomes unavailable), reroutes to the Charger, and resolves the incident on a verified arrival.
  4. The record. Ripple files the incident report to the team's Ambiguous workspace.
  5. A real reply on Ambiguous. In an earlier live run the engineer answers on Ambiguous: "check sensor data then use teleop". Ripple reads the scans, teleops 0.32 m toward the clear side, and probes and retries the route home.

How it works

Edge — runs beside Nav2 on the robot. It observes safety, localization, lifecycle and motion, detects halts and names their cause, and owns every action: navigation with dispatch checks and a route probe, keepouts, costmap clears, lifecycle resets, bounded escape and teleop. Every action is policy-checked and journaled in PostgreSQL before it touches ROS.

Agent — GLM 5.3 on OpenRouter is the control plane. It reasons over typed tool results, never raw ROS, and runs the incident loop: detect, investigate, recover, escalate, take human context, verify.

People — engineers talk to Ripple on Ambiguous or the local dashboard. An operator's message is the approval for what it asks: "send the robot to B" just runs. Ripple writes reports, tasks and email back to the workspace.

Profiles — one YAML file describes a robot: its topics, safety controller, stations, triggers and recovery limits. A new robot is a new file, not new code.

Safety model

LevelExamplesWho
ObserveHealth, logs, diagnostics, route probesAlways
RecoverClear costmaps, retry, lifecycle reset, bounded escape/teleopAutomatic within per-incident budgets
CommandNavigate, keepouts, station availabilityAn operator's message is the approval
NeverRaw motor commands, shell, disabling collision checksNot exposed

Motion stays below the robot's own safety controller. The demo profile lets teleop override a safety hold because it is a simulation; the profile validator refuses that on real robots.

Run it

git clone https://github.com/00PrabalK00/ripple && cd ripple
bash scripts/start_sim.sh          # SMR300 in Gazebo (ROS 2 Humble)
bash scripts/start_navigation.sh   # Nav2, in another terminal
bash scripts/start_ripple.sh       # Ripple on http://127.0.0.1:8050

Setup — the simulator checkout, Python environment, PostgreSQL and OPENROUTER_API_KEY in .env — and the full run steps are in the README.