Skip to content

Web contract (MollyDashboard) ​

How MollyDashboard talks to the robot. Every name and type is defined in interfaces.md; this page lists what the dashboard uses and how.

Connections ​

DefaultStarted by
rosbridge WebSocketws://<robot>:9090molly_bringup robot.launch.py (web:=true, WEB=true in the env file), molly_bridge web.launch.py
Camera (MJPEG)http://<robot>:8080/stream?topic=/camera/camera/color/image_raw&type=mjpeg&quality=60&width=960web_video_server, same switch
Camera snapshothttp://<robot>:8080/snapshot?topic=/camera/camera/color/image_rawsame

rosbridge only exposes the names below (the whitelist in molly_bridge/core/web.py, given to rosbridge as topics_glob, services_glob, params_glob): the dashboard can never publish on the driver's /<robot_ns>/cmd_vel, only on /control/remote/dashboard/cmd_vel through the control mux (e-stop, speed envelope, protective field, health speed scale). Keep the robot's web ports on the robot's own network.

Read (subscribe) ​

TopicTypeUse
/mapnav_msgs/msg/OccupancyGridmap canvas (latched; live while mapping, throttle 1000 ms)
/localization/posegeometry_msgs/msg/PoseWithCovarianceStampedrobot on the map (throttle 100 ms)
/localization/statusdharma_interfaces/msg/LocalizationStatuslocalized or not, source
/site/statusdharma_interfaces/msg/SiteStatusactive site, site list, counts
/site/poismolly_interfaces/msg/PoiArrayPOIs on the map and in the editor
/site/toursmolly_interfaces/msg/TourArraytours
/mapping/statusdharma_interfaces/msg/MappingStatusmapping session
/planner/statusdharma_interfaces/msg/PlannerStatuswalking to a goal
/planner/pathnav_msgs/msg/Pathplanned path on the map
/navigation/statusdharma_interfaces/msg/NavigationStatusfollower state, pause reasons
/navigation/pathnav_msgs/msg/Paththe loaded route
/docking/statusdharma_interfaces/msg/DockingStatusdocking state
/tour/statemolly_interfaces/msg/TourStatetour progress, the authority for the tour UI
/interaction/speech_statusmolly_interfaces/msg/SpeechStatuswhat the robot is saying
/interaction/greetermolly_interfaces/msg/GreeterStatusgreeter state, last greeting
/interaction/conversationmolly_interfaces/msg/Conversationquestion, answer, latency, success
/perception/visitorsmolly_interfaces/msg/Visitorsvisitors around the robot (throttle 500 ms)
/control/statusdharma_interfaces/msg/ControlStatusmode (auto / remote, source), e-stop and its reasons, protective field, speed scale
/health/statusdharma_interfaces/msg/HealthStatuslevel, issues, sensors, CPU / GPU / RAM, temperature
/odometry/statusdharma_interfaces/msg/OdometryStatusodometry state
/robot/batterysensor_msgs/msg/BatteryStatebattery (percentage 0–1)
/robot/imusensor_msgs/msg/Imuattitude (throttle 200 ms)
/robot/statelite3_interfaces/msg/RobotStateLite3 state: basic state, gait, ultrasound (robot specific, optional)
/robot/diagnosticsdiagnostic_msgs/msg/DiagnosticArraydriver diagnostics
/rosoutrcl_interfaces/msg/Loglog viewer

Write (publish) ​

TopicTypeUse
/control/remote/dashboard/cmd_velgeometry_msgs/msg/Twistteleop at 10–20 Hz, only effective in remote mode with the source dashboard; send zero on release
/control/estop_requeststd_msgs/msg/Stringengage the e-stop with a reason
/tour/cmdmolly_interfaces/msg/TourCommandtour control without an answer (prefer /tour/control)
/interaction/say_textstd_msgs/msg/Stringquick phrases

Call (services) ​

ServiceTypeUse
/site/list, /site/loadListSites, LoadSitesite picker
/mapping/start, /mapping/stop, /mapping/saveStartMapping, std_srvs/srv/Triggermapping page
/localization/start, /localization/record_tagsstd_srvs/srv/Triggerlocalize, record tags
/site/save_poi, /site/delete_poiSavePoi, DeleteByIdPOI editor (map click: x, y; yaw from a drag)
/site/save_tour, /site/delete_tourSaveTour, DeleteByIdtour editor
/planner/planPlanPathpreview a path
/planner/go_to, /planner/cancelGoTo, std_srvs/srv/Triggerwalk to a POI / pose
/navigation/pause, /navigation/resumestd_srvs/srv/Triggerhold / continue
/navigation/start, /navigation/stop, /navigation/load_pathTrigger, LoadPathtaught routes
/route/start, /route/stop, /route/mark_stop_pointTrigger, MarkStopPointteach a route
/guide/go_to_poiGoToPoiwalk to one POI
/docking/dock, /docking/undock, /docking/cancelstd_srvs/srv/Triggerdocking
/tour/control, /tour/get_stateTourControl, GetTourStatetour control, state on (re)connect
/interaction/say, /interaction/stop_speechSay, std_srvs/srv/Triggerspeak
/interaction/gestureGesturegestures
/interaction/greet, /interaction/set_greeterstd_srvs/srv/Trigger, std_srvs/srv/SetBoolgreeter
/interaction/askAskconversation panel
/control/set_modeSetMode{mode: remote, source: dashboard} to drive, {mode: auto} to hand back
/control/estop/engage, /control/estop/releasestd_srvs/srv/Triggere-stop
/robot/stand_up, /robot/sit_down, /robot/emergency_stop, gaits, gesturesstd_srvs/srv/Triggerrobot actions
/path_follower_node/get_parameters, /path_follower_node/set_parametersrcl_interfaces/srv/GetParameters, SetParameterswalking speed and tuning
/rosapi/topics, /rosapi/nodesrosapisystem page

On the wire the types are <package>/msg/<Name> and <package>/srv/<Name>; the POI, tour, visitor, speech and greeter types are molly_interfaces (in Molly 1.x some were dharma_interfaces or JSON strings), the status types dharma_interfaces.

Flows ​

Map a place. /mapping/start {site, reset: true} → drive in REMOTE (teleop panel or the handheld) while /map grows → at each AprilTag /localization/record_tags → add POIs here (/site/save_poi {poi: {name, ...}, at_robot_pose: true}) or later by clicking the map → /mapping/save → /mapping/stop.

Edit POIs. Click on the map: x, y in the map frame from the canvas projection (origin, resolution, the grid row flip), drag for the heading → /site/save_poi {poi, at_robot_pose: false}. The robot answers with the saved POI (id assigned); /site/pois updates every client.

Run a tour. /tour/control {command: {kind: 0, tour_id}} (START) (or poi_ids), the robot must be localized and in auto. Follow /tour/state; PAUSE / RESUME / SKIP / STOP the same way. On (re)connect, /tour/get_state gives the current state before the first message.

Walk somewhere. /guide/go_to_poi {poi_id} or /planner/go_to {x, y, yaw}; /planner/status and /planner/path show the walk; /planner/cancel stops it.

Drive. /control/set_mode {mode: remote, source: dashboard}, then /control/remote/dashboard/cmd_vel at 10–20 Hz (zeros first: the mux arms a source on a neutral command), /control/set_mode {mode: auto} to hand back; a running tour goes on.