Changelog
All notable changes to the Molly robot stack. Format: Keep a Changelog, versions follow SemVer.
[Unreleased]
Added
- Documentation site:
docs/site(the kit from the Dharma template, VitePress) builds the README, the docs, the package READMEs and the protocols into a site with search and dark mode, published to GitHub Pages by.github/workflows/docs.yml; the Markdown stays the one source. - One clock for every stamp:
scripts/setup.sh install timesync ptp(scripts/timesync.sh, from the Dharma template). chrony makes the clock followTIME_SERVERSand serves the robot's other computers (TIME_ALLOW, e.g. the Lite3's network);ptp4las PTP master on the LiDAR's interface (the route toLIVOX_IP, orPTP_IFACE) makes the Mid-360 stamp its points with the same clock. Both are in the default install (PTP onceLIVOX_IPis set); health watches the offset on the robot (clock.enabledinstack.yaml, off in the simulator). - Docs: docs/time.md, which clock is kept by what on a Lite3, the setup, the checks and the symptoms.
Fixed
- Dharma pinned to
main 2026-10-30(molly.repos): nodes stop cleanly on Ctrl-C (notake_messageRuntimeError, no publication afterdestroy_node),planner/go_towaits up topose_wait_sec(2 s) for the robot pose right after localization, dharma_rviz builds with GCC 15. Later on the same day:navigation/startwaits for the pose too, and a node still alive 8 s after a stop signal prints every thread's stack and exits with 1 instead of being SIGKILLed without a trace.
[2.0.0] - 2026-10-28
Molly on Dharma 0.2 (ROS 2 Humble). The packages follow the Dharma layout and the bringup is molly_bringup; settings, launch commands and some services changed (see Changed).
Added
molly_bringup(from the Dharma hub'srobot_bringup): the Lite3 robot profile (config/robot.yaml,robot.*shared by every node),config/stack.yaml(Molly's overrides of the Dharma defaults, the field-tested values of 1.x),config/site.example.yaml,robot.launch.pyandsim.launch.pywith every argument validated, the parameter files merged into one, the started nodes added to the health monitor, unknown node sections reported.- POIs and tours are Molly's own:
molly_interfacesPoi,Tour,SavePoi,SaveTour,DeleteById,GoToPoi;site_content_node(molly_guide) keeps<site>/pois.jsonandtours.jsonnext to the Dharma site and archives them with a mapping reset;guide/go_to_poiwalks to one POI. - The visitor tracker moved into
molly_interaction(visitor_tracker_node,Visitors): the band above the floor fromrobot.base_height, the robot's own body fromrobot.footprint. - Typed status for the operators:
SpeechStatus,GreeterStatus,TourStatewith anactivity(walking, gesture, narrating, dwelling, waiting for visitors). - Docking through
dharma_navigation's docking node (handhelddock,undock,dock_cancel; the dock tagcharging_dock); see the open items in the bringup'sstack.yaml: the Lite3 driver does not report charging yet. - Handheld protocol (still
molly-1, wire format unchanged):dock,undock,dock_cancel,nav_pause/nav_resumeon the Dharma services,state.pause,state.estop_reasons,state.site.routes,state.health.speed_scaleand the docking state;nav_speedsetspath_follower_nodespeed.cruise. See "Changes in Molly 2.0" inPROTOCOL.md. - Repository: the Humble dev container with a VNC desktop (
compose.yaml,docker/,.devcontainer/),scripts/start_tmux.shwith yaml layouts (scripts/tmux/robot.yaml,sim.yaml), pre-commit with the hub's ruff, prettier and clang-format settings, CI that builds the whole stack frommolly.reposon Humble and runs the simulator tour. - End-to-end test (
molly_bringup/test/e2e): the simulator localizes, walks the demo tour to its end, the handheld takes over through the control mux in the middle and hands back to AUTO.
Changed
- Packages: the bringup
mollyis nowmolly_bringup(ros2 launch molly_bringup robot.launch.py,sim.launch.py); WebRTC video moved intomolly_bridge. - Settings (
/etc/molly/molly.env):ROBOT_BRINGUPisROBOT_DRIVER,MODE=mappingisSTART_MAPPING=true,ROUTEloads a route at start;scripts/setup.sh install configadds the new keys. The directoryscript/isscripts/. - Site file (
/etc/molly/site.yaml): the robot's body and limits are no longer set per node (field.front,max_vx,footprint.*,robot_radius,self_filter_*, the teleopmax_*): they come from the robot profile. Renamed:path_follower_node.target_linear_velocityisspeed.cruise,low_battery_percentageislow_battery,planner_node.inflation_radiusiscostmap.inflation_radius,obstacle_avoidance_node.emergency_distanceisshared.emergency_distance,localization_node.tag_framesistag.frames,lidar_sector_node.obstacle_z_minisfilter.height_*(above the floor). Compare yours withconfig/site.example.yaml. - Driving: the control mux is the only publisher of
/robot/cmd_vel; the handheld publishescontrol/remote/handheld/cmd_vel, the dashboardcontrol/remote/dashboard/cmd_vel. Mode and e-stop:control/set_mode(dharma_interfaces/srv/SetMode,modeandsource),control/estop/engageandcontrol/estop/release(std_srvs/srv/Trigger) instead of the bridge's services. - Navigation: the guide walks with
planner/go_toand follows the typedplanner/statusandnavigation/status; it pauses with navigation (REMOTE, e-stop) and resumes at the same stop. - Every node is a
DharmaNode(typed parameters checked at start and onros2 param set, the robot profile); pure logic incore/, ROS adapters inutils/, thin*_node.py; ruff replaces flake8 and pep257. lite3_ros2submodule at itsmain(3c4e66e).
Removed
- The handheld's
people_set,peopleandmissionmessages andMissionStatus: the people layer and the mission status are gone from Dharma 0.2; the tour state carries what the handheld shows. docker-compose.yaml(nowcompose.yaml),.flake8and the ament lint tests.
[1.0.0] - 2026-10-18
First release of the Lite3 tour guide.
Added
- Tour guide stack on the Dharma packages (pinned in
molly.repos,script/setup.sh install dharma): odometry, localization, mapping and sites, the path finder and navigation, LiDAR perception, the control mux, the health monitor, RViz panels and the simulator. Molly keepsmolly(bringup, configs, simulation launch and end-to-end tests),molly_bridge,molly_guide,molly_interactionandmolly_interfaces(tour and speech types). - Mapping (
dharma_mapping): an occupancy grid built live from the FAST-LIO scan (log-odds, ray-cast free space, saved as a map_server map) and the site manager: one directory per place with its map, AprilTags, POIs, tours and routes;/map,site/*andmapping/*services; sites switched at runtime;mode:=mapping site:=<name>maps a new site from the start. - Localization per site:
localization/load_tags,localization/assume_originfor a new map,localization/reset,localization/pose. - Path finder (
planner_node): A* on the map inflated by the robot footprint, start and goal snapping, line-of-sight shortcuts, replanning around the safety scan when the follower is blocked;planner/go_toto a POI or a pose,navigation/set_pathon the path loader. molly_guide: tours from POI to POI with gestures, narration and dwell, intro and outro, pause, resume, skip, stop, retry or skip of unreachable POIs, waiting for visitors who fall behind;/tour/control,/tour/state,/tour/get_state.molly_interaction: speech with Piper voices or eSpeak NG, robot gestures, a greeter for visitors who stop in front, questions answered by a local LLM (Ollama) from the site's POIs.- Visitor tracker: people around the robot from the 360° LiDAR, walls and pillars of the map filtered out, front and rear counts for the guide and the greeter.
- Handheld protocol Molly v1 (UDP 9880,
MLY1): sites, mapping, POIs, tours, go-to and interaction commands, the map (PNG) and site streams. - Web: rosbridge with a whitelist of names and web_video_server for the dashboard (
web:=true),script/setup.sh install web;install speech(Piper pinned by checksum, the Indonesian and English voices),install ollamafor the conversation model. - The Lite3 robot package
lite3_ros2as a submodule, its site file values insite.example.yaml. - Simulation (
ros2 launch molly sim.launch.pyondharma_sim): a ready site drawn from the world with a demo tour; end-to-end tests of a tour, mapping a new site, the path finder and a taught route.
Docs
- Verified every README against the code; fixed stale references (Leg-KILO is not a submodule, the person detector feeds the visitor tracker, not a crowd heatmap, PRs target
main, route looping is optional). - One layout for the package READMEs (purpose, Nodes, Topics and services, Parameters, Launch, Test), a quick start in the README and an index of all docs in
docs/README.md.
Changed
- The camera person detector is gone (it was off by default); visitors come from the LiDAR.
- Modes are
guideandmapping(patrolandteachstill accepted); routes are no longer looped by default; the AprilTags file comes from the active site instead ofTAGS.