The ROS2 package that runs on the robot. Navigation, person detection, autonomous behaviors, and workflow execution - all coordinated through a collection of nodes that communicate over ROS2 topics.
The robot runs on a mini PC with Ubuntu 22.04 and ROS2 Humble. An Arduino Nano Every handles low-level motor control, flashed with micro-ROS firmware to communicate with the main system. Nodes communicate through topics and services, with the tablets connecting via ROSBridge WebSocket.
Navigation uses Nav2 with a custom lane-based planner. When navigating between waypoints, the robot follows predefined lanes rather than computing arbitrary paths. This ensures predictable behavior in complex spaces.
Handles all navigation commands including waypoint management, lane-based path planning, and Nav2 integration. Publishes navigation status and manages the robot's position on the map.
Executes multi-step workflows combining navigation and actions. Receives workflow definitions and steps through each task in sequence - navigate to a location, then speak or perform an action.
Flask HTTP server that controls ROS2 launch files. Starts and stops navigation, mapping, and manual modes. Also handles map saving/loading and system status queries.
Runs person detection on the OAK-D Lite camera. Publishes bounding boxes, confidence scores, and depth information for detected people. Feeds data to follower and tracker nodes.
Follows a detected person while maintaining a safe distance. Uses depth data to calculate position and publishes velocity commands to stay behind the target.
Random exploration behavior. Picks directions, moves until obstacles are detected, then chooses new paths. Used for ambient presence and patrol mode.
Rotates the robot to keep a detected person centered in the camera frame. Used for Track mode - maintains eye contact without moving closer.
Coordinates autonomous behaviors. Ensures only one mode (wander, follow, track, patrol) is active at a time. Handles mode transitions and conflicts.
Monitors depth camera for obstacles and modifies velocity commands to avoid collisions. Works alongside other nodes to ensure safe movement.
Low-level motor control. Translates velocity commands into wheel speeds for the differential drive base. Handles acceleration limits and emergency stops.
Tracks people using LiDAR data. Provides 360-degree awareness for following and tracking behaviors when targets move outside camera view.
Detects motion in the camera feed. Used to trigger awareness behaviors and wake the robot from idle states.
| Topic | Type | Description |
|---|---|---|
| /cmd_vel | geometry_msgs/Twist | Velocity commands for the robot base |
| /scan | sensor_msgs/LaserScan | 2D LiDAR scan data |
| /millie/nav/status | std_msgs/String | Navigation status (idle, navigating, succeeded, failed) |
| /millie/waypoints | std_msgs/String | JSON list of saved waypoints |
| /millie/waypoint/goto | std_msgs/String | Command to navigate to a waypoint by name |
| /millie/workflow/execute | std_msgs/String | JSON workflow definition to execute |
| /millie/mode | std_msgs/String | Set autonomous mode (wander, follow, track, patrol) |
| /oak/person_detections | vision_msgs/Detection2DArray | Detected people with bounding boxes |
Navigation stack for path planning and obstacle avoidance
Simultaneous localization and mapping
WebSocket bridge for tablet communication
OAK-D camera SDK for depth and detection
Communication with the motor controller
# Clone into your workspace
cd ~/ros2_ws/src
git clone https://github.com/DreamCloudClub/millie_bot.git
# Install dependencies
cd ~/ros2_ws
rosdep install --from-paths src --ignore-src -r -y
# Build
colcon build --packages-select millie_bot
# Source the workspace
source install/setup.bash
# Start the boot server
ros2 run millie_bot boot_server
# Or launch navigation directly
ros2 launch millie_bot navigation.launch.py
The Arduino Nano Every handles motor control via USB serial. Flash the firmware included in the package using Arduino CLI.
# Install Arduino CLI and megaAVR board
arduino-cli core install arduino:megaavr
# Compile and upload
cd ~/ros2_ws/src/millie_bot/firmware/arduino/millie_motor
arduino-cli compile --fqbn arduino:megaavr:nona4809 .
arduino-cli upload --fqbn arduino:megaavr:nona4809 -p /dev/ttyACM0 .
Full documentation and hardware setup guides available on GitHub.
View README →