Power, software, GUI, mapping, and navigation
This guide assumes construction and setup are complete. The robot should be powered, on Wi‑Fi, and systems verified before proceeding.
Expand each layer to see components and wiring notes. Click any photo to enlarge.
Motor control PCB, drivetrain, environmental sensor, and motor power switch.
Batteries, Jetson, and microphone processing board.
Layers 3 and 4 are spacer layers with no fixed electronic components. They provide vertical clearance between the compute/battery stack (Layer 2) and the sensor tiers above (Layers 5 and 6).
These layers can be used for storage — for example, spare cables, tools, or other small items you want to keep with the robot during transport or operation.
The web GUI lets you monitor robots, control local Docker/DDS, and send navigation goals on the map.
Click a robot in the status panel to select it.
Start, stop, and monitor DDS/Docker on your machine.
Set Robot Goal — navigation target. Set Initial Position — localization seed.
Save robot IP, select from dropdown, click Start (or launch via SSH).
Stop — halt motion. Shutdown — kill ROS nodes.
Robots on the network appear in the status panel. Start via GUI or SSH launch file.
Select robot → Set Initial Position → adjust orientation slider → click map at robot location.
Switch to Set Robot Goal → click destination on map.
Select robot → Shutdown when finished.
sudo shutdown -h now) or through the touchscreen Ubuntu GUI. Unplugging power without a proper shutdown can corrupt the filesystem and damage the system.
sudo shutdown -h now
Power on the Jetson and microcontroller, then SSH in:
ssh jetson@<robot_ip_address>
Load spidev:
sudo modprobe spidev
spidev to /etc/modules-load.d/spidev.conf to load at boot.With GUI remote start (from downloaded startup script):
sudo docker run --runtime nvidia --network=host -v ~/workspaces/catkin_ws:/workspace/catkin_ws -v ~/gemini_api:/gemini_code -v /dev/bus/usb:/dev/bus/usb -v /dev/video0:/dev/video0 -v /dev/video1:/dev/video1 -it --device=/dev/ttyUSB0 --device=/dev/spidev0.0 --rm --privileged --name ros_noetic ghcr.io/satomm1/ml_ros:latest bash -lc 'python3 /workspace/catkin_ws/src/startup_script.py & exec bash'
Without GUI (RVIZ / development):
sudo docker run --runtime nvidia --network=host -v ~/workspaces/catkin_ws:/workspace/catkin_ws -v ~/gemini_api:/gemini_code -v /dev/bus/usb:/dev/bus/usb -v /dev/video0:/dev/video0 -v /dev/video1:/dev/video1 -it --device=/dev/ttyUSB0 --device=/dev/spidev0.0 --rm --privileged --name ros_noetic ghcr.io/satomm1/ml_ros:latest
Additional terminals:
docker exec -it ros_noetic bash
Optional Gemini container:
sudo docker run -v ~/gemini_api:/gemini_code -v ~/Desktop/audio:/audio -w /gemini_code -it --rm --privileged -p 5000:5000 --name gemini ghcr.io/satomm1/gemini:latest
Use VS Code Remote SSH, then attach to the running Docker container.
Add or select an SSH host (user jetson, default password jetson).
Remote Explorer → Attach to Running Container → select ros_noetic.
Power on the Jetson and microcontroller, then SSH in:
ssh jetson@<robot_ip_address>
Load spidev:
sudo modprobe spidev
spidev to /etc/modules-load.d/spidev.conf to load at boot.With GUI remote start (from downloaded startup script):
sudo docker run --runtime nvidia --network=host -v ~/workspaces/catkin_ws:/workspace/catkin_ws -v ~/gemini_api:/gemini_code -v /dev/bus/usb:/dev/bus/usb -v /dev/video0:/dev/video0 -v /dev/video1:/dev/video1 -it --device=/dev/ttyUSB0 --device=/dev/spidev0.0 --rm --privileged --name ros_noetic ghcr.io/satomm1/ml_ros:latest bash -lc 'python3 /workspace/catkin_ws/src/startup_script.py & exec bash'
Without GUI (RVIZ / development):
sudo docker run --runtime nvidia --network=host -v ~/workspaces/catkin_ws:/workspace/catkin_ws -v ~/gemini_api:/gemini_code -v /dev/bus/usb:/dev/bus/usb -v /dev/video0:/dev/video0 -v /dev/video1:/dev/video1 -it --device=/dev/ttyUSB0 --device=/dev/spidev0.0 --rm --privileged --name ros_noetic ghcr.io/satomm1/ml_ros:latest
Additional terminals:
docker exec -it ros_noetic bash
Optional Gemini container:
sudo docker run -v ~/gemini_api:/gemini_code -v ~/Desktop/audio:/audio -w /gemini_code -it --rm --privileged -p 5000:5000 --name gemini ghcr.io/satomm1/gemini:latest
Complete one-time setup in the Setup Guide → User GUI / communication (clone repo, dds_env.sh, docker compose pull). Then from the repo root:
cd dds_robot_platform docker compose up -d docker exec -d dds ./start_scripts.sh
To shut down DDS scripts:
docker exec dds ./stop_scripts.sh
To tear down the stack:
docker compose down
Run the installed executable, or with Node.js:
Windows users: Run the following commands from the Windows command line (not WSL).
cd dds_robot_platform/gui npm start
Open the installed GUI application to start the GUI.
In the Local Stack panel, enter the path to your dds_robot_platform directory in the path field, and your WSL distro name in the WSL field (WSL only). Click Verify for the GUI to confirm it can reach the path.
Once verified, the Start options become available:
Before starting Docker from the GUI: Make sure Docker Desktop is running on your machine.
Start Docker first by pressing its Start button, then start DDS by pressing its Start button.
minimal.launch — MCU connection onlyshort.launch — full stack (short robot)tall.launch — full stack (tall robot)sense_and_map.launch — SLAM mappingArguments: car:=true (rear-wheel config), patrol:=true (patrol path).
roslaunch mattbot_bringup <launch_file> [arguments:=arg_value]
roslaunch mattbot_bringup sense_and_map.launch
Second terminal — teleop:
roslaunch mattbot_teleop keyboard.launch
Drive through the entire space, then save:
rosrun map_server map_saver -f <map_name> map:=/map
Copy <map_name>.yaml, <map_name>.pgm, and edited <map_name>_mod.pgm to ~/workspace/catkin_ws/src/mattbot_mcl/maps.
python3 ./generate_dds_map.py --map_file <map_name>
Copy current_map.json to your GUI machine as dds_robot_platform/dds/user_map.json.
roslaunch mattbot_bringup tall.launch
Car configuration:
roslaunch mattbot_bringup tall.launch car:=true
Prefer the GUI Power Off button for graceful shutdown.
Manual: Ctrl+C in ROS terminals, or:
rosnode kill -a
Exit container: exit. Shut down Jetson:
sudo shutdown -h now
KAIST collaborators — deployment instructions & updates