Below is a copy-paste, beginner-proof install + test checklist for your students (Windows + VirtualBox) and also works for you (macOS + UTM). It ends with a Stage (2D) ROS2 Jazzy demo and verification commands to confirm everything is working.
A) VirtualBox on Windows (student setup)
A1) Install VirtualBox
Install VirtualBox (latest stable). (https://www.youtube.com/watch?v=s3BM4dgn_Is)
(Optional but recommended) Install the matching “Extension Pack”.
A2) Create Ubuntu VM (recommended settings)
CPU: 4 cores
RAM: 8 GB (minimum 4 GB)
Disk: 60 GB (minimum 40 GB)
Display:
Video Memory: 128 MB
Enable 3D Acceleration: ON (helps RViz)
Network: NAT (default)
A3) Install Ubuntu 24.04 Desktop in the VM
Download Ubuntu 24.04 Desktop ISO (amd64)
Boot VM from ISO → Install Ubuntu
After install, update Ubuntu:
sudo apt update
sudo apt upgrade -y
sudo reboot
B) UTM on macOS (Apple Silicon M1/M2/M3/M4)
B1) Install Ubuntu 24.04 Desktop (ARM64)
Download Ubuntu 24.04 Desktop ARM64 ISO
Create VM in UTM → Virtualize (not emulate)
Suggested: 4 cores, 8 GB RAM, 60 GB disk
Then update:
sudo apt update
sudo apt upgrade -y
sudo reboot
C) ROS 2 Jazzy installation (Ubuntu 24.04)
C1) Locale + apt prerequisites
sudo apt update
sudo apt install -y locales curl gnupg lsb-release software-properties-common
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
sudo add-apt-repository universe -y
sudo apt update
C2) Add ROS 2 apt repo (recommended method)
sudo apt install -y curl
export ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F\" '{print $4}')
curl -L -o /tmp/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb"
sudo apt install -y /tmp/ros2-apt-source.deb
sudo apt update
C3) Install ROS 2 Jazzy Desktop
sudo apt install -y ros-jazzy-desktop
echo "source /opt/ros/jazzy/setup.bash" >> ~/.bashrc
source ~/.bashrc
D) ROS 2 baseline tests (must pass)
D1) Confirm distro
echo $ROS_DISTROExpected: jazzy
D2) Talker/listener test
Open two terminals.
Terminal 1:
source /opt/ros/jazzy/setup.bash
ros2 run demo_nodes_cpp talkerTerminal 2:
source /opt/ros/jazzy/setup.bash
ros2 run demo_nodes_cpp listenerExpected: listener prints messages continuously.
E) Install Stage (2D simulator) + stage_ros2 (ROS2 wrapper)
Because Ubuntu 24.04 often doesn’t provide libstage-dev as an apt package, the most reliable approach is:
Build Stage from source (system install)
Build stage_ros2 in a colcon workspace
E1) Install build tools
sudo apt update
sudo apt install -y git cmake g++ pkg-config \
python3-colcon-common-extensions python3-rosdep build-essential \
libfltk1.3-dev libjpeg-dev libpng-dev libltdl-dev libglib2.0-devInitialize rosdep (first time only):
sudo rosdep init 2>/dev/null || true
rosdep update
E2) Build & install Stage (system-wide)
mkdir -p ~/third_party && cd ~/third_party
git clone https://github.com/rtv/Stage.git
cd Stage
mkdir -p build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local
make -j$(nproc)
sudo make install
sudo ldconfigVerify Stage cmake config exists:
sudo find /usr/local -name "stageConfig.cmake" -o -name "stage-config.cmake"Expected: it finds a file under /usr/local/...
E3) Build stage_ros2 (Jazzy branch) in workspace
mkdir -p ~/nav_class_ws/src
cd ~/nav_class_ws/src
git clone -b jazzy https://github.com/tuw-robotics/stage_ros2.git
cd ~/nav_class_ws
rosdep install --from-paths src --ignore-src -r -y
colcon build
source install/setup.bash
echo "source ~/nav_class_ws/install/setup.bash" >> ~/.bashrc
F) Stage ROS2 demo test (must pass)
F1) Launch Stage demo (IMPORTANT: publish standard /tf and /tf_static)
source /opt/ros/jazzy/setup.bash
source ~/nav_class_ws/install/setup.bash
ros2 launch stage_ros2 demo.launch.py one_tf_tree:=trueExpected:
A Stage window opens
RViz opens (depending on demo config)
F2) Verify key topics exist (robot_0)
source /opt/ros/jazzy/setup.bash
source ~/nav_class_ws/install/setup.bash
ros2 topic list | egrep "^/tf$|^/tf_static$|robot_0/base_scan|robot_0/odom|clock"Expected to see:
/tf
/tf_static
/robot_0/base_scan
/robot_0/odom
/clock (your demo provides it)
F3) Verify data is flowing
ros2 topic echo /tf --once
ros2 topic echo /robot_0/base_scan --once
ros2 topic echo /robot_0/odom --once
ros2 topic echo /clock --onceIf these print → your simulator pipeline is healthy.
G) Common VM performance fixes (recommended for students)
In RViz:
Turn off Camera/Image displays
Turn off TF display unless needed
Set Frame Rate to 10