This is the repository for the Real-time programming with ROS 2
workshop for
ROScon 2023.
Thank you to Shuhao Wu, Jan Staschlat, Stephanie Eng and Oren Bell for putting together the excellent workshop. Slides available here (backup link). Thank you all for attending!
To get the most out of the workshop, please complete the setup instructions for your laptop ahead of time. This will take about 10-20 minutes of your time and hopefully will make the workshop go significantly smoother. If you run into any problems, please file an issue in this repository.
The workshop code only supports Linux. Officially, we only test Ubuntu 22.04 as the laptop/development operating system. However, with the Docker setup described below, it may be possible to run this on other Linux variants, although this is untested.
A real-time kernel is not necessary, although you may see decreased maximum latency numbers if you have a real-time kernel. For reference, the workshop code is developed on regular Ubuntu kernels.
Docker for Mac and Docker for Windows are not supported. Please try to bring a Linux laptop to the workshop for best results.. It is possible that a virtual machine running on Linux may work for you, although this is also not supported.
Podman is not supported. It might work, but we have not tested the Docker setup below with Podman.
The code is tested on both amd64
and arm64
(via the Raspberry Pi 4). No
tests are made against the M1/M2 Macbooks.
The simplest way to run the workshop code is to use the workshop-specific Docker image. To get the Docker image, there are two options: (1) getting the image before the workshop (highly recommended), or (2) getting the image during the workshop (we cannot guarantee this experience will be good due to constraints of networking during a conference).
Before getting the image, you must install Docker Engine on your Linux machine. Please follow the Docker Engine installation instructions. Ensure you do not use Docker Desktop as that is not supported due to its use of a virtual machine. At the end, you should confirm that you see the following output when running the following commands:
$ docker version | grep -A2 Client
Client: Docker Engine - Community
Version: 24.0.6
API version: 1.43
$ docker version | grep -A2 Server
Server: Docker Engine - Community
Engine:
Version: 24.0.6
The exact version of Docker may be different than the above output.
You must also install Docker such that you can manage docker without root. See the instruction here for details.
- Download the image file from the latest release. The file is called
docker-image.tar.gz
. - Clone the roscon-2023-realtime-workshop repository with
--recursive
option:git clone --recursive https://github.com/ros-realtime/roscon-2023-realtime-workshop.git
. cd
into theroscon-2023-realtime-workshop
repository.docker/fetch ~/Downloads/docker-image.tar.gz
.
This should import the Docker image with a name of roscon-2023-realtime-workshop
.
Note: do NOT use docker import
or docker load
. Please use the
docker/fetch
script above.
If you would like to use VS Code and its dev container system, you can skip this section and go directly to Using Visual Studio Code.
After importing the Docker image, you can start the Docker container via the
special shell file docker/start
:
cd
into this repository.docker/start
This should start the Docker container and it will mount this repository into the
/code
directory inside the container. As a result, changes to the repository
in the host will be reflected in the container.
This should start the Docker container with all of the appropriate privileges to run real-time-scheduled applications. It also setup the container with everything needed to run GUI programs.
After starting the Docker container, you can login to the Docker container using
the special docker/shell
script:
cd
into this repository.docker/shell
You should be greeted with something like the following:
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
user@6896a5d8dd84:/code$
This script logs you into an user named user
which has the same UID and GID as
your host user. This eliminates some of the permission errors you may encounter
with using Docker. It also allows you to run GUI programs.
After logging into the Docker container, you should check everything works:
Check the trace viewer tools are available
- After starting the Docker container, open a browser.
- Navigate to http://localhost:3100.
- Ensure a webpage like the following screenshot loads up.
Make sure all exercises compile and exercise 1 runs
After logging into the Docker container:
$ cd /code/exercise1 && colcon build
$ cd /code/exercise2-1 && colcon build
$ cd /code/exercise2-2 && colcon build
$ cd /code/exercise3-1 && colcon build
$ cd /code/exercise3-2 && ./build.sh
$ cd /code/exercise4-1 && colcon build
$ cd /code/exercise4-2 && colcon build
Make sure these all build. Then make sure at least exercise 1 runs (which takes 10 seconds):
$ cd /code/exercise1
$ install/latency_tester/bin/latency_tester
Testing latency for 10 seconds with 2 threads...
Latency testing complete. Trace file available at: exercise1.perfetto
You can load the exercise1.perfetto
file in the trace viewer that you checked
above and see some data being plotted.
Check rviz2 is working
After logging into the Docker container, run:
$ rviz2
The usual rviz2 GUI window should show up if all is well.
If you like to use VS code for development, you must install the Remote Development Extension Pack, which enables the dev container system.
This repository contains a .devcontainer
setup. This setup
relies on the image imported above using the docker/fetch
script. So if you
haven't performed the image import
step, launching VS
code with dev containers will not work as it will fail to find the image.
Once you imported the image, you can simply open VS code with dev containers in this repository. You can use the VS code terminal or use the .devcontainer/shell
script to login to the container. All above features should work and you should check.
Getting IntelliSense to work
To get IntelliSense to work with the C++ extension, you must select the appropriate build configuration for each exercise with the button on the bottom right side of your status bar, as indicated by the following screenshot:
You also have to build the code for that exercise at least once via colcon build
. Sometimes, a Reload Window command is needed (CTRL+P -> Developer: Reload Window
) to make IntelliSense work fully.
We will have a limited number of Raspberry Pi 4s to loan to attendees. We expect people to form groups of 3-5 to work on problems together. That said, we welcome you to bring your own Raspberry Pi 4s as well. We recommend the following hardware:
- A Raspberry Pi 4 (4GB+ is recommended, 2GB may be OK)
- An Ethernet cable and any necessary USB Ethernet adapters to connect the Raspberry Pi directly to your laptop
- A microSD card with greater than 8GB
- The Raspberry Pi 4 power supply with USA power plugs
A specially-crafted image designed for the workshop must be flashed to the SD card. This image contains an Ubuntu 22.04 installation with ROS 2 humble and a real-time kernel which is based on the Raspberry Pi 4 image maintained by the ROS 2 real-time working group. It has the code of the exercises builtin and has all of the dependencies installed, to ensure the experience can be had entirely offline. It also contains a number of helper utilities designed to make it easier for attendees for the workshop.
To download the image, go to the latest
release.
Download the roscon2023-rt-workshop-rpi4-ubuntu-22.04.1-ros2-humble.img.zst
.
This is a zstd-compressed file to save
space. You should be able to double click it and extract the image file.
Alternatively, you can use the command:
$ unzstd roscon2023-rt-workshop-rpi4-ubuntu-22.04.1-ros2-humble.img.zst
Locate a microSD card with greater than 16GB of storage and use Etcher to flash the resulting image file to your microSD card.
Alternatively, you can also use the command:
$ unzstd roscon2023-rt-workshop-rpi4-ubuntu-22.04.1-ros2-humble.img.zst --stdout | sudo dd of=/dev/sdX bs=16M conv=fdatasync oflag=direct
Please replace the /dev/sdX
with the appropriate device.
Start the Raspberry Pi normally. You do not need to attach a monitor or a keyboard. To connect to the Raspberry Pi:
- Connect the Ethernet to the Raspberry Pi 4's only Ethernet port.
- Connect the other end of the Ethernet to your laptop. You may have to do this via an USB Ethernet adapter if you do not have an Ethernet port directly on your laptop.
- Wait briefly for the Raspberry Pi 4 to boot up and your laptop to connect to the network. This may take a few minutes on first boot.
- Once connected, the Raspberry Pi 4 is accessible at the IP address
192.168.10.1
. - You can
ssh ubuntu@192.168.10.1
. The password isubuntu
. - The code for the exercises is located in the
/code
path.`
The image contains not only the source code, but also pre-built binaries for all the exercises. This is to reduce the amount of time needed to build during the workshop. Please check this is working by running exercise 1:
- Log in to the Raspberry Pi using the instructions above.
cd /code/exercise1
./run.sh
You may see warnings about loop overruns. This is expected as part of the exercise is to resolve this.
This program will generate a trace file located at
/code/exercise1/exercise1.perfetto
. You can download it via scp
or use the
browser as documented below.
The image contains a built-in HTTP server where you can browse the /code
directory located on the Pi. This allows you to more easily download trace
files, which we will do during the workshop. Please check this is working ahead
of time:
- With Ethernet connected to the Raspberry Pi, go to http://192.168.10.1/repo/.
- Click into
exercise1
and downloadexercise1.perfetto
(this will only exists if you ran exercise 1 as instructed in the above section). - Go to http://192.168.10.1/perfetto/
- On the top left of the screen, click
Open trace file
and open theexercise1.perfetto
file you just downloaded. - A timeline view should show up. You can press
W
on your keyboard to zoom in. Press?
to get help on how to use the interface if you would like to explore further.