|
| 1 | +# Robotics AI Suite: Full ROS 2 Jazzy ISO Image Template |
| 2 | +# Ubuntu 24.04 LTS + ROS 2 Jazzy Desktop + Intel OpenVINO + Gazebo Harmonic + |
| 3 | +# Intel RealSense + Robotics SDK + Collab SLAM + Intel GPU/NPU support |
| 4 | +# |
| 5 | +# Bootable ISO installer image. Flash to USB, boot, and install to internal drive. |
| 6 | +# Includes ROS 2 Jazzy Desktop, Intel OpenVINO 2025, Gazebo Harmonic physics simulator, |
| 7 | +# Intel RealSense camera libraries, Intel NPU drivers, Mesa GPU stack, and more. |
| 8 | +# |
| 9 | +# Usage: |
| 10 | +# sudo -E ./os-image-composer build image-templates/ubuntu24-x86_64-robotics-jazzy-iso.yml |
| 11 | +# |
| 12 | +# Flash to USB: |
| 13 | +# sudo dd if=builds/robotics-jazzy-ubuntu24-24.04.iso of=/dev/sdX bs=4M status=progress conv=fsync |
| 14 | +# |
| 15 | +# Boot from USB, then the live-installer writes to the target drive. |
| 16 | +# |
| 17 | +# ROS 2 is auto-sourced on login. Run demos: |
| 18 | +# ros2 run turtlesim turtlesim_node & |
| 19 | +# ros2 run demo_nodes_cpp talker & |
| 20 | +# ros2 run demo_nodes_cpp listener & |
| 21 | +# |
| 22 | +# OpenVINO inference example: |
| 23 | +# ros2 launch openvino_node openvino_node.launch.py |
| 24 | +# |
| 25 | +# Gazebo Harmonic simulation: |
| 26 | +# gz sim shapes.sdf |
| 27 | + |
| 28 | +# AI-searchable metadata for template discovery |
| 29 | +metadata: |
| 30 | + description: Bootable ISO installer for ROS 2 Jazzy robotics image with Intel OpenVINO, Gazebo Harmonic, RealSense, and Intel GPU/NPU support |
| 31 | + use_cases: |
| 32 | + - Full robotics development environment |
| 33 | + - ROS 2 Jazzy Desktop with all tools |
| 34 | + - Intel OpenVINO AI inference on robots |
| 35 | + - Gazebo Harmonic physics simulation |
| 36 | + - Intel RealSense depth camera integration |
| 37 | + - Collaborative SLAM (collab-slam-lze) |
| 38 | + - Intel GPU acceleration (Xe/UHD Graphics) |
| 39 | + - Intel NPU inference offload |
| 40 | + - Edge robotics deployments |
| 41 | + - Bootable USB installation media |
| 42 | + - Bare metal provisioning |
| 43 | + keywords: |
| 44 | + - robotics |
| 45 | + - ros2 |
| 46 | + - jazzy |
| 47 | + - openvino |
| 48 | + - gazebo |
| 49 | + - harmonic |
| 50 | + - realsense |
| 51 | + - slam |
| 52 | + - intel |
| 53 | + - gpu |
| 54 | + - npu |
| 55 | + - level-zero |
| 56 | + - mesa |
| 57 | + - ubuntu |
| 58 | + - iso |
| 59 | + - bootable |
| 60 | + - installer |
| 61 | + |
| 62 | +image: |
| 63 | + name: robotics-jazzy-ubuntu24 |
| 64 | + version: "24.04" |
| 65 | + |
| 66 | +target: |
| 67 | + os: ubuntu |
| 68 | + dist: ubuntu24 |
| 69 | + arch: x86_64 |
| 70 | + imageType: iso |
| 71 | + |
| 72 | +packageRepositories: |
| 73 | + # ROS 2 Jazzy repository |
| 74 | + - codename: "noble" |
| 75 | + url: "http://packages.ros.org/ros2/ubuntu" |
| 76 | + pkey: "https://raw.githubusercontent.com/ros/rosdistro/master/ros.key" |
| 77 | + component: "main" |
| 78 | + |
| 79 | + # Intel Edge Controls for Industrial (ECI) repository |
| 80 | + # Priority 1000 ensures ECI packages (systemd+ETF/taprio, PCL+oneAPI, FLANN+oneAPI) |
| 81 | + # are preferred over Ubuntu defaults when version strings differ. |
| 82 | + # No allowPackages filter — ECI packages have deep transitive dependency chains |
| 83 | + # that require many ECI-only sub-packages to satisfy. |
| 84 | + - codename: "isar" |
| 85 | + url: "https://eci.intel.com/repos/noble" |
| 86 | + pkey: "https://eci.intel.com/repos/gpg-keys/GPG-PUB-KEY-INTEL-ECI.gpg" |
| 87 | + component: "main" |
| 88 | + priority: 1000 |
| 89 | + |
| 90 | + # Intel AMR (Autonomous Mobile Robots) repository (uses ECI GPG key) |
| 91 | + # Priority 1001 (above ECI) — AMR packages override ECI when both provide the same package. |
| 92 | + - codename: "amr" |
| 93 | + url: "https://amrdocs.intel.com/repos/noble" |
| 94 | + pkey: "https://eci.intel.com/repos/gpg-keys/GPG-PUB-KEY-INTEL-ECI.gpg" |
| 95 | + component: "main" |
| 96 | + priority: 1001 |
| 97 | + |
| 98 | + # Intel OneAPI runtime repository |
| 99 | + - codename: "all" |
| 100 | + url: "https://apt.repos.intel.com/oneapi" |
| 101 | + pkey: "https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB" |
| 102 | + component: "main" |
| 103 | + |
| 104 | + # Intel OpenVINO 2025 repository |
| 105 | + - codename: "ubuntu24" |
| 106 | + url: "https://apt.repos.intel.com/openvino/2025" |
| 107 | + pkey: "https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB" |
| 108 | + component: "main" |
| 109 | + |
| 110 | + # Kisak Mesa PPA (latest Mesa drivers) |
| 111 | + - codename: "noble" |
| 112 | + url: "https://ppa.launchpadcontent.net/kisak/kisak-mesa/ubuntu" |
| 113 | + pkey: "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xEB8B81E14DA65431D7504EA8F63F0F2B90935439" |
| 114 | + component: "main" |
| 115 | + |
| 116 | + # Kobuk Team Intel Graphics PPA |
| 117 | + - codename: "noble" |
| 118 | + url: "https://ppa.launchpadcontent.net/kobuk-team/intel-graphics/ubuntu" |
| 119 | + pkey: "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x0C0E6AF955CE463C03FC51574D098D70AFBE5E1F" |
| 120 | + component: "main" |
| 121 | + |
| 122 | + # Gazebo (OSRF) Harmonic stable repository |
| 123 | + - codename: "noble" |
| 124 | + url: "https://packages.osrfoundation.org/gazebo/ubuntu-stable" |
| 125 | + pkey: "https://packages.osrfoundation.org/gazebo.gpg" |
| 126 | + component: "main" |
| 127 | + |
| 128 | + # Intel RealSense repository — NOT needed at build time. |
| 129 | + # All RealSense packages are installed on first boot via systemd oneshot service |
| 130 | + # (see configurations section). The first-boot script sets up the repo itself. |
| 131 | + |
| 132 | +systemConfig: |
| 133 | + name: robotics-jazzy |
| 134 | + description: Intel Robotics AI Suite - Full ROS 2 Jazzy with OpenVINO, Gazebo, RealSense, and Intel GPU/NPU |
| 135 | + |
| 136 | + immutability: |
| 137 | + enabled: false |
| 138 | + |
| 139 | + packages: |
| 140 | + # ── Base system ────────────────────────────────────────────────── |
| 141 | + - ubuntu-minimal |
| 142 | + - ubuntu-desktop-minimal |
| 143 | + - systemd |
| 144 | + - systemd-resolved |
| 145 | + - systemd-boot |
| 146 | + - systemd-timesyncd |
| 147 | + - openssh-server |
| 148 | + - network-manager |
| 149 | + - sudo |
| 150 | + - curl |
| 151 | + - wget |
| 152 | + - vim |
| 153 | + - software-properties-common |
| 154 | + - gnupg |
| 155 | + - lsb-release |
| 156 | + - debconf-utils |
| 157 | + |
| 158 | + # Boot / initramfs (required for UKI) |
| 159 | + - dracut-core |
| 160 | + - cryptsetup-bin |
| 161 | + |
| 162 | + # ── ROS 2 Jazzy Desktop (full) ────────────────────────────────── |
| 163 | + - ros-jazzy-desktop |
| 164 | + |
| 165 | + # ── Intel OpenVINO 2025 (pinned to 2025.3.0) ───────────────────── |
| 166 | + - openvino_2025.3.0.19807 |
| 167 | + - ros-jazzy-openvino-wrapper-lib |
| 168 | + - ros-jazzy-openvino-node |
| 169 | + |
| 170 | + # ── Intel GPU / Level Zero ────────────────────────────────────── |
| 171 | + - libze1 |
| 172 | + - libze-intel-gpu1 |
| 173 | + |
| 174 | + # ── Gazebo Harmonic physics simulator ─────────────────────────── |
| 175 | + - gz-harmonic |
| 176 | + |
| 177 | + # ── Intel Robotics SDK ─────────────────────────────────────────── |
| 178 | + - ros-jazzy-robotics-sdk |
| 179 | + |
| 180 | + # ── Collaborative SLAM (Intel Xe / UHD GPU accelerated) ────────── |
| 181 | + - ros-jazzy-collab-slam-lze |
| 182 | + |
| 183 | + # ── Intel RealSense camera ────────────────────────────────────── |
| 184 | + # Installed on first boot via systemd oneshot service (see configurations). |
| 185 | + # librealsense2-dkms requires DKMS which needs a live kernel to build modules; |
| 186 | + # cannot be built inside chroot. All RealSense packages are installed together |
| 187 | + # on first boot to ensure DKMS + userspace SDK are in sync. |
| 188 | + |
| 189 | + # ── Mesa GPU stack (Intel Xe / UHD) ───────────────────────────── |
| 190 | + - libegl-mesa0 |
| 191 | + - libgl1-mesa-dri |
| 192 | + - libgbm1 |
| 193 | + - libglx-mesa0 |
| 194 | + - mesa-libgallium |
| 195 | + - mesa-va-drivers |
| 196 | + - mesa-vdpau-drivers |
| 197 | + - mesa-vulkan-drivers |
| 198 | + - xwayland |
| 199 | + |
| 200 | + # ── Firmware ──────────────────────────────────────────────────── |
| 201 | + - linux-firmware |
| 202 | + |
| 203 | + # ── Intel NPU (Neural Processing Unit) drivers ─────────────────── |
| 204 | + - intel-level-zero-npu |
| 205 | + - intel-driver-compiler-npu |
| 206 | + |
| 207 | + kernel: |
| 208 | + version: "6.17" |
| 209 | + cmdline: "console=ttyS0,115200 console=tty0 loglevel=7" |
| 210 | + packages: |
| 211 | + - linux-image-generic-hwe-24.04 |
| 212 | + |
| 213 | + configurations: |
| 214 | + # ── ROS 2 environment setup ──────────────────────────────────── |
| 215 | + - cmd: "echo 'source /opt/ros/jazzy/setup.bash' >> /etc/bash.bashrc" |
| 216 | + - cmd: "echo 'export ROS_DOMAIN_ID=45' >> /etc/bash.bashrc" |
| 217 | + |
| 218 | + # ── Post-deployment APT version pinning (protects against bad upgrades) ── |
| 219 | + # Note: Origin-based priority pins (ECI=1000, AMR=1001) are auto-generated |
| 220 | + # by the provider from packageRepositories.priority fields. |
| 221 | + # Only version-specific pins that the provider cannot generate are listed here. |
| 222 | + # |
| 223 | + # Block old FLANN 1.19.x from ECI (prefer Ubuntu's FLANN 1.9.2) |
| 224 | + - cmd: "printf 'Package: libflann*\\nPin: version 1.19.*\\nPin-Priority: -1\\n\\nPackage: flann*\\nPin: version 1.19.*\\nPin-Priority: -1\\n' > /etc/apt/preferences.d/eci-flann-block" |
| 225 | + # Pin OneAPI runtime deps to 2025.3.* |
| 226 | + - cmd: "printf 'Package: intel-oneapi-runtime-*\\nPin: version 2025.3.*\\nPin-Priority: 1001\\n' > /etc/apt/preferences.d/oneapi" |
| 227 | + # OpenVINO version pins (match init_jazzy.sh exactly) |
| 228 | + - cmd: "printf 'Package: openvino-libraries-dev\\nPin: version 2025.3.0*\\nPin-Priority: 1001\\n\\nPackage: openvino\\nPin: version 2025.3.0*\\nPin-Priority: 1001\\n\\nPackage: ros-jazzy-openvino-wrapper-lib\\nPin: version 2025.3.0*\\nPin-Priority: 1002\\n\\nPackage: ros-jazzy-openvino-node\\nPin: version 2025.3.0*\\nPin-Priority: 1002\\n' > /etc/apt/preferences.d/intel-openvino" |
| 229 | + # RealSense version pin |
| 230 | + - cmd: "printf 'Package: librealsense2*\\nPin: version 2.56.5-0~realsense.17055\\nPin-Priority: 1001\\n' > /etc/apt/preferences.d/librealsense" |
| 231 | + |
| 232 | + # ── debconf pre-selections for OpenVINO node ───────────────────── |
| 233 | + - cmd: "echo 'ros-jazzy-openvino-node openvino-node/pip-proxy select true' | debconf-set-selections" |
| 234 | + - cmd: "echo 'ros-jazzy-openvino-node openvino-node/models select true' | debconf-set-selections" |
| 235 | + |
| 236 | + # ── Intel NPU udev rules (render group access to /dev/accel/*) ── |
| 237 | + - cmd: "printf 'SUBSYSTEM==\"accel\", KERNEL==\"accel*\", GROUP=\"render\", MODE=\"0660\"\\n' > /etc/udev/rules.d/10-intel-vpu.rules" |
| 238 | + |
| 239 | + # ── Intel RealSense first-boot installation ──────────────────── |
| 240 | + # librealsense2-dkms requires DKMS (needs live kernel for module builds). |
| 241 | + # This creates a systemd oneshot that sets up the repo, installs all |
| 242 | + # RealSense packages (version-pinned via /etc/apt/preferences.d/librealsense), |
| 243 | + # then disables itself. |
| 244 | + - cmd: "printf '#!/bin/bash\\nset -euo pipefail\\nexport DEBIAN_FRONTEND=noninteractive\\nmkdir -p /etc/apt/keyrings\\ncurl -sSf https://librealsense.intel.com/Debian/librealsense.pgp -o /etc/apt/keyrings/librealsense.pgp\\necho \"deb [signed-by=/etc/apt/keyrings/librealsense.pgp] https://librealsense.intel.com/Debian/apt-repo noble main\" > /etc/apt/sources.list.d/librealsense.list\\napt-get update\\napt-get install -y librealsense2-dkms librealsense2\\nsystemctl disable install-librealsense.service\\nrm -f /usr/local/bin/install-librealsense.sh\\n' > /usr/local/bin/install-librealsense.sh" |
| 245 | + - cmd: "chmod 755 /usr/local/bin/install-librealsense.sh" |
| 246 | + - cmd: "printf '[Unit]\\nDescription=Install Intel RealSense packages (first boot)\\nAfter=network-online.target\\nWants=network-online.target\\nConditionPathExists=/usr/local/bin/install-librealsense.sh\\n\\n[Service]\\nType=oneshot\\nExecStart=/usr/local/bin/install-librealsense.sh\\nEnvironment=DEBIAN_FRONTEND=noninteractive\\nTimeoutStartSec=0\\n\\n[Install]\\nWantedBy=multi-user.target\\n' > /etc/systemd/system/install-librealsense.service" |
| 247 | + - cmd: "systemctl enable install-librealsense.service" |
| 248 | + |
| 249 | + # ── Enable required services ──────────────────────────────────── |
| 250 | + - cmd: "systemctl enable NetworkManager" |
| 251 | + - cmd: "systemctl enable ssh" |
| 252 | + |
| 253 | + # ── Set hostname ──────────────────────────────────────────────── |
| 254 | + - cmd: "echo 'robotics-jazzy' > /etc/hostname" |
0 commit comments