Dimos supports three visualization backends: Rerun (web or native) and Foxglove.
Choose your viewer backend via the CLI (preferred):
# Rerun web viewer (default) - Full vis dashboard and teleop panel in browser
dimos run unitree-go2
# Explicitly select the viewer backend:
dimos --viewer-backend rerun run unitree-go2
dimos --viewer-backend rerun-web run unitree-go2
dimos --viewer-backend foxglove run unitree-go2Alternative (environment variable):
# Rerun web viewer - Full dashboard in browser
VIEWER_BACKEND=rerun-web dimos run unitree-go2
# Rerun native viewer - native Rerun window + teleop panel at http://localhost:7779
VIEWER_BACKEND=rerun dimos run unitree-go2
# Foxglove - Use Foxglove Studio instead of Rerun
VIEWER_BACKEND=foxglove dimos run unitree-go2What you get:
- Full dashboard at http://localhost:7779
- Rerun 3D viewer + command center sidebar in one page
- Works in browser, no display required (headless-friendly)
What you get:
- Native Rerun application (separate window opens automatically)
- Command center at http://localhost:7779
- Better performance with larger maps/higher resolution
What you get:
- Foxglove bridge on ws://localhost:8765
- No Rerun (saves resources)
- Better performance with larger maps/higher resolution
- Open layout:
assets/foxglove_dashboards/old/foxglove_unitree_lcm_dashboard.json
To enable rerun within your own blueprint simply include RerunBridgeModule:
from dimos.visualization.rerun.bridge import RerunBridgeModule
from dimos.hardware.sensors.camera.module import CameraModule
from dimos.protocol.pubsub.impl.lcmpubsub import LCM
camera_demo = autoconnect(
CameraModule.blueprint(),
RerunBridgeModule.blueprint(
viewer_mode="native", # native (desktop), web (browser), none (headless)
),
)
if __name__ == "__main__":
camera_demo.build().loop()Every LCM stream, such as color_image (output by CameraModule), that uses a data type (like Image) that has a .to_rerun method will get rendered (rr.log) using the LCM topic as the rerun entity path. In other words: to render something, simply log it to a stream and it will automatically be available in rerun.
If you notice:
- Robot appears to "walk across empty space"
- Costmap updates lag behind the robot
- Visualization stutters or freezes
This happens on lower-end hardware (NUC, older laptops) with large maps.
Edit dimos/robot/unitree/go2/blueprints/__init__.py line 82:
# Before (high detail, slower on large maps)
voxel_mapper(voxel_size=0.05), # 5cm voxels
# After (lower detail, 8x faster)
voxel_mapper(voxel_size=0.1), # 10cm voxelsTrade-off:
- Larger voxels = fewer voxels = faster updates
- But slightly less detail in the map
Rerun on dev is module-driven: modules decide what to log, and Blueprint.build() sets up the shared viewer + default layout.