Setting Up a New Node
Bootstrap and deploy ROS 2 to a new robot, Pi, or VM.
Setting Up a New Node
Bringing a new machine onto the fleet is a five-step flow. It’s the same whether the
node is a physical robot, a Raspberry Pi, or an Ubuntu VM (including the macvm
UTM VM on a Mac) — there is no host-specific special-casing.
Prerequisites
- The node runs a supported Ubuntu: 22.04 (→ ROS 2 Humble) or 24.04 (→ ROS 2 Kilted).
- It’s reachable on the LAN and you can SSH in with your own account.
- You have the Ansible collections installed and the service key loaded:
ansible-galaxy collection install community.general community.docker ansible.posix dotconfig key load ansible
Steps
1. Add the host to the inventory. Put an entry under the right group in
inventory/hosts.ini.
2. (Optional) Per-host overrides. Create inventory/host_vars/<hostname>.yml to
override things like the ROS version:
ros_version: kilted
ros_package_variant: ros-base
3. (Optional) Pin a static IP:
./scripts/set-static-ip.sh -u <user> -i <ip> <hostname>
4. Bootstrap the service account. A fresh host has no ansible user yet. This
one-time step creates it using your credentials:
./scripts/bootstrap-ansible-user.sh -u <your_user> -K <hostname>
5. Deploy. From here on every run connects as the ansible user automatically:
ansible-playbook playbooks/site.yml --limit <hostname>
Networking note
All nodes share DDS domain 42 and discover each other via multicast — but
multicast does not cross between WiFi SSIDs. Every wireless ROS node must be on
the Busboom Mesh SSID, or it won’t see the rest of the fleet. The wifi role
(playbooks/wifi.yml) configures this on Raspberry Pis.
Running ROS on a Mac
The Mac node (macvm) is an Ubuntu 24.04 VM in UTM with bridged networking —
bridging gives it a real LAN IP so it joins the DDS domain like any physical host.
Create the VM once via UTM’s GUI, then onboard it with the exact same
bootstrap → site.yml flow above. For GUI tools (rviz/rqt) over X11:
./scripts/ros-mac-shell.sh.