Dimos supports three visualization backends: Rerun (web or native) and Foxglove.
Choose your viewer via the CLI (preferred):
# Rerun native viewer (default) - dimos-viewer with built-in teleop + click-to-navigate
dimos run unitree-go2
# Explicitly select the viewer mode:
dimos --viewer rerun run unitree-go2
dimos --viewer rerun-web run unitree-go2
dimos --viewer foxglove run unitree-go2Alternative (environment variable):
# Rerun native viewer (default) - dimos-viewer with built-in teleop + click-to-navigate
VIEWER=rerun dimos run unitree-go2
# Rerun web viewer - browser dashboard + teleop at http://localhost:7779
VIEWER=rerun-web dimos run unitree-go2
# Foxglove - Use Foxglove Studio instead of Rerun
VIEWER=foxglove dimos run unitree-go2What you get:
- dimos-viewer, a custom Dimensional fork of Rerun with built-in keyboard teleop and click-to-navigate
- Native desktop application (opens automatically)
- Better performance with larger maps/higher resolution
- No browser or web server required
What you get:
- Browser-based dashboard at http://localhost:7779
- Rerun 3D viewer + command center sidebar in one page
- Teleop controls and goal setting via the web UI
- Works headless (no display required)
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.