π€ Automated Ubuntu ISO builder with pre-configured ROS2 environment for robotics development
This project provides a complete automation pipeline using Ansible and GitHub Actions to create custom Ubuntu ISO images with ROS2 and robotics development tools pre-installed.
- Target: Desktop/laptop development machines
- OS: Ubuntu 24.04 LTS with ROS2 Jazzy
- Tools: Full desktop environment, development tools, ROS2 Desktop
- Workspace: Pre-configured
~/ros2_ws
- Target: Raspberry Pi 5 robotics projects
- OS: Ubuntu 24.04 LTS with ROS2 Jazzy
- Hardware: GPIO, I2C, SPI interfaces pre-configured
- Tools: Robotics libraries, hardware abstraction layers
- Workspace: Pre-configured
~/robot_ws
There are two setup paths: the AMD64 development machine is configured locally, while the Raspberry Pi 5 (ARM64) robot is provisioned remotely with Ansible from that development machine.
On an x86_64 machine running Ubuntu 24.04, run Ansible against localhost.
-
Install prerequisites
sudo apt update sudo apt install -y git ansible python3-vcstool
-
Clone the repository
git clone https://github.com/scramble-robot/questix.git cd questix -
Run the setup script (AMD64)
bash setup_dev.sh
This installs ROS 2 Jazzy Desktop, colcon, developer tooling, and creates
~/ros2_ws. -
Fetch workspace dependencies and build
mkdir -p src vcs import src < dependency.repos source /opt/ros/jazzy/setup.bash colcon build --symlink-install source install/setup.bash
-
Verify
ros2 --version ros2 topic list
Flash Ubuntu 24.04 (64-bit) onto the Raspberry Pi 5 and boot it. The setup is
performed on the Pi itself by running the bundled setup.sh, which invokes
the kit playbook against localhost.
-
Prepare the Raspberry Pi 5
- Use Raspberry Pi Imager (or similar) to flash Ubuntu 24.04 Server (arm64) to the microSD card / SSD.
- On first boot, create a user and connect to the network.
-
Install Git and Ansible on the Pi
sudo apt update sudo apt install -y git ansible
-
Clone the repository on the Pi
git clone https://github.com/scramble-robot/questix.git cd questix -
Run the setup script
bash setup.sh
This runs
ansible-playbook ansible/playbooks/setup_kit.yamllocally and installs ROS 2 Jazzy, enables GPIO/I2C/SPI, applies udev rules, and creates~/robot_ws. -
Reboot and verify
sudo reboot # After logging back in: source ~/.bashrc ros2 --version gpio_status rw # cd into ~/robot_ws
questix_core/
βββ .github/workflows/ # GitHub Actions CI/CD
β βββ build-iso.yml # Automated ISO building
βββ ansible/ # Ansible automation
β βββ roles/ros2/ # ROS2 installation role
β βββ playbooks/ # Environment setup playbooks
βββ scripts/ # ISO building scripts
β βββ prepare-base-system.sh
β βββ apply-ansible-config.sh
β βββ build-iso.sh
βββ docker/ # Docker support
βββ Makefile # Local development commands
The default build target is Ubuntu 24.04 + ROS 2 Jazzy. Normal builds do not require
setting ROS2_DISTRO or UBUNTU_VERSION.
# Advanced: override only the architecture when calling the internal target directly
make _build ARCHITECTURE=amd64Modify the Ansible playbooks in ansible/playbooks/:
setup_dev.yaml- Development environmentsetup_kit.yaml- Robotics kit environment
Add packages to the ros2_additional_packages variable in playbooks:
ros2_additional_packages:
- ros-jazzy-navigation2
- ros-jazzy-slam-toolbox
- ros-jazzy-moveitThe ISO build workflow is manual-only and runs when manually dispatched via GitHub Actions. When started, it:
- ποΈ Builds Ubuntu 24.04 + ROS 2 Jazzy ISOs for AMD64 and ARM64
- π§ͺ Tests the AMD64 ISO boot path in QEMU
- π¦ Uploads ISO artifacts
- π Generates checksums
Baseline upgrade note: the current workflow builds Ubuntu 24.04 + ROS 2 Jazzy for both AMD64 and ARM64. A future move to Ubuntu 26.04 + ROS 2 Lyrical should update the workflow matrix, ISO artifact names, release notes, dependency compatibility notes, and this README together. This PR does not change the baseline to Lyrical.
The release job is present but disabled; manual dispatch does not publish GitHub releases.
- Manual dispatch: Build and test ISO artifacts
# Trigger manual build via GitHub CLI
gh workflow run build-iso.yml# Validate Ansible
make test-ansible
# Test ISO boot (requires QEMU)
make test-iso-amd64
# Test GitHub Actions locally (requires act)
make github-testDevelopment Environment (AMD64):
# After installation
source ~/.bashrc
ros2 --version
ros2 topic list
cw # Navigate to workspaceRobotics Kit (ARM64):
# After installation and reboot
source ~/.bashrc
ros2 --version
gpio_status # Check GPIO
rw # Navigate to robot workspace- Fork the repository
- Create feature branch (
git checkout -b feature/amazing-feature) - Test changes (
make test-ansible) - Commit changes (
git commit -m 'Add amazing feature') - Push to branch (
git push origin feature/amazing-feature) - Open Pull Request
- Ubuntu 24.04 with ROS 2 Jazzy
- 20GB+ free disk space
- Internet connection for package downloads
- sudo privileges
Required for building packages:
libgpiod-dev- headers and libraries used bygpio_reader
Required when launching visualization or robot description flows:
ros-jazzy-xacroros-jazzy-joint-state-publisher
The launcher package expects the following packages to be available in the same colcon workspace. They are source/workspace dependencies, not apt packages:
ydlidar_ros2_driverservo_control_ros2esc_motor_controlddt_motor_control
For Jazzy operation, confirm that each selected branch or tag in dependency.repos
is compatible with ROS 2 Jazzy before using it. A successful vcs import only
confirms that the repositories were fetched; it does not guarantee runtime behavior.
- AMD64: Any x86_64 PC with 4GB+ RAM
- ARM64: Raspberry Pi 5 with 4GB+ RAM
- 16GB+ storage (SD card/USB/SSD)
Build fails with permission errors:
sudo chmod 777 /tmp/iso-build /tmp/iso-outputQEMU emulation issues:
sudo update-binfmts --enable qemu-aarch64Network issues in chroot:
# Check DNS resolution
cat /etc/resolv.confEnable verbose output:
make build-dev VERBOSE=1This project is licensed under the MIT License - see the LICENSE file for details.
- ROS2 Community for the excellent robotics framework
- Ubuntu for the solid foundation
- Ansible for infrastructure automation