This guide sets up a browser dashboard that runs on the robot's own network in about five minutes.
Your options
- RViz2 is built for engineers. It runs as a desktop app on the robot or over X11 forwarding, which doesn't suit an operator with a tablet.
- Foxglove is a strong tool for analyzing robot data. On its Free and Pro plans the desktop app needs an internet connection to sign in; fully offline use comes with its Enterprise plan.
- rosboard is a lightweight open-source web viewer that shows topics as cards. It's good for engineers exploring raw topics.
- Styri is an open-source operator panel. It gives a clear OK / WARNING / FAULT verdict, runs entirely on your local network and needs no account. The rest of this guide uses it.
Step 1: Run Styri
On the robot, or any Linux machine on the same network:
$ docker run --rm --network host ghcr.io/styri-dev/styri-core:v0.3.0Open http://localhost:8080 on that machine, or http://<machine-ip>:8080 from any phone, tablet or laptop on the same network.
--network host lets Styri see ROS 2 discovery on your LAN. If your robot uses a non-default ROS_DOMAIN_ID, add -e ROS_DOMAIN_ID=<id>.
Step 2: Map your robot's topics
Styri reads standard topics out of the box. To match your robot exactly, create a styri.yaml:
robot:
name: amr-01
battery:
topic: /battery_state
percentage: percentage
percentage_scale: 100
voltage: voltage
warn_below: 25
fault_below: 10
status:
topic: /robot_status
field: data
warn: [DEGRADED, LOW_POWER]
fault: [ERROR]Run it with the file mounted:
$ docker run --rm --network host -v "$PWD/styri.yaml:/etc/styri/styri.yaml:ro" ghcr.io/styri-dev/styri-core:v0.3.0Step 3: Check it before you rely on it
$ docker run --rm --network host -v "$PWD/styri.yaml:/etc/styri/styri.yaml:ro" ghcr.io/styri-dev/styri-core:v0.3.0 styri checkStyri listens for five seconds and prints PASS or FAIL for every mapped field. When a topic name is wrong it suggests the closest match, for example “Did you mean /robot_status?”.
What operators see
- A single robot verdict: OK, WARNING or FAULT, with the reason in plain words
- Large readouts for battery, voltage, CPU temperature and your own fields, readable on a touchscreen
- Every value is marked LIVE, and turns STALE, with how long ago it last updated, if it stops updating
- An activity log of connections, warnings and state changes
Styri Core is read-only: it subscribes to your topics and never publishes to the robot.
Troubleshooting
- No robot topics found: check
ROS_DOMAIN_IDmatches the robot, that you used--network host, and that the topic names match (ros2 topic list). - Works on the robot, not from another machine: check the site firewall and Wi-Fi allow ROS 2 discovery (multicast) and DDS traffic (UDP 7400 and up) between the machines.
- On a Mac: Docker on macOS can't see a robot on another machine. Run Styri on the robot or a Linux box, and open the panel from your Mac's browser.
docker compose upin the repo runs a full demo with a simulated robot.
More in the troubleshooting guide.
FAQ
- Does it need internet?
- No. Every asset is served locally, and Styri makes no outbound calls.
- Does it work with Nav2?
- Yes. Nav2 and robot status topics that use standard ROS message types, such as odometry (
nav_msgs) or poses (geometry_msgs), map as a field or status. Topics withnav2_msgstypes show in the Topics tab with their rate, but their contents can't be read yet, because that package isn't in the image. - Can it show more than one robot?
- The free Core shows one robot. The Pilot adds a fleet view for up to five.