Home

Awesome

<h1 align="center"> <img src="./images/Picto+STEREOLABS_Black.jpg" alt="Stereolabs" title="Stereolabs" /><br \> ROS 2 wrapper </h1> <p align="center"> ROS 2 packages for using Stereolabs ZED Camera cameras.<br> ROS 2 Foxy Fitzroy (Ubuntu 20.04) - ROS 2 Humble Hawksbill (Ubuntu 22.04) </p> <hr>

This package enables the use of ZED cameras with ROS 2, providing access to a variety of data types, including:

More information

Point_cloud

Installation

Prerequisites

Build the package

The zed_ros2_wrapper is a colcon package.

:pushpin: Note: If you haven’t set up your colcon workspace yet, please follow this short tutorial.

To install the zed_ros2_wrapper, open a bash terminal, clone the package from Github, and build it:

mkdir -p ~/ros2_ws/src/ # create your workspace if it does not exist
cd ~/ros2_ws/src/ #use your current ros2 workspace folder
git clone  --recursive https://github.com/stereolabs/zed-ros2-wrapper.git
cd ..
sudo apt update
rosdep update
rosdep install --from-paths src --ignore-src -r -y # install dependencies
colcon build --symlink-install --cmake-args=-DCMAKE_BUILD_TYPE=Release --parallel-workers $(nproc) # build the workspace
echo source $(pwd)/install/local_setup.bash >> ~/.bashrc # automatically source the installation in every new bash (optional)
source ~/.bashrc

:pushpin: Note: If rosdep is missing you can install it with:

sudo apt-get install python3-rosdep python3-rosinstall-generator python3-vcstool python3-rosinstall build-essential

:pushpin: Note: When using the ZED ROS 2 Wrapper on an NVIDIA Jetson with JP6, it is possible that you get the following error when building the package for the first time

  Specify CUDA_TOOLKIT_ROOT_DIR
Call Stack (most recent call first):
 /usr/local/zed/zed-config.cmake:72 (find_package)
 CMakeLists.txt:81 (find_package)

You can fix the problem by installing the missing nvidia-cuda-dev package:

sudo apt install nvidia-cuda-dev

:pushpin: Note: The option --symlink-install is very important, it allows to use symlinks instead of copying files to the ROS 2 folders during the installation, where possible. Each package in ROS 2 must be installed and all the files used by the nodes must be copied into the installation folders. Using symlinks allows you to modify them in your workspace, reflecting the modification during the next executions without needing to issue a new colcon build command. This is true only for all the files that don't need to be compiled (Python scripts, configurations, etc.). :pushpin: Note: If you are using a different console interface like zsh, you have to change the source command as follows: echo source $(pwd)/install/local_setup.zsh >> ~/.zshrc and source ~/.zshrc.

Starting the ZED node

:pushpin: Note: we recommend reading this ROS 2 tuning guide to improve the ROS 2 experience with ZED.

To start the ZED node, open a bash terminal and use the CLI command ros2 launch:

ros2 launch zed_wrapper zed_camera.launch.py camera_model:=<camera_model>

Replace <camera_model> with the model of the camera that you are using: 'zed', 'zedm', 'zed2', 'zed2i', 'zedx', 'zedxm', 'virtual','zedxonegs','zedxone4k'.

The zed_camera.launch.py is Python launch scripts that automatically start the ZED node using "manual composition". The parameters for the indicated camera model are loaded from the relative "YAML files". A Robot State Publisher node is started to publish the camera static links and joints loaded from the URDF model associated with the camera model.

:pushpin: Note: You can set your own configurations by modifying the parameters in the files common_stereo.yaml, zed.yaml zedm.yaml, zed2.yaml, zed2i.yaml, zedx.yaml, zedxm.yaml, common_mono.yaml, zedxonegs.yaml, and zedxone4k.yaml available in the folder zed_wrapper/config.

You can get the list of all the available launch parameters by using the -s launch option:

ros2 launch zed_wrapper zed_camera.launch.py -s
ros2 launch zed_display_rviz2 display_zed_cam.launch.py -s

For full descriptions of each parameter, follow the complete guide here.

Rviz visualization

To start a pre-configured Rviz environment and visualize the data of all ZED cameras, we provide in the zed-ros2-examples repository. You'll see there more advanced examples and visualization that demonstrate depth, point clouds, odometry, object detection, etc.

You can also quickly check that your depth data is correctly retrieved in rviz with rviz2 -d ./zed_wrapper/config/rviz2/<your camera model>.rviz. Be aware that rviz subscribes to numerous ROS topics, which can potentially impact the performance of your application compared to when it runs without rviz.

Simulation mode

:pushpin: Note: This feature is incompatible with the ZED X One and the older first-generation ZED cameras.

Launch a standalone ZED ROS 2 node with simulated ZED data as input by using the following command:

ros2 launch zed_wrapper zed_camera.launch.py camera_model:=zedx sim_mode:=true

Launch options:

You can also start a preconfigured instance of rviz2 to visualize all the information available in the simulation by using the command:

ros2 launch zed_display_rviz2 display_zed_cam.launch.py camera_model:=zedx sim_mode:=true

the display_zed_cam.launch.py launch file includes the zed_camera.launch.py launch file, so it provides the same parameters.

Here's an example of rviz2 running with the simulated information obtained by placing the ZED camera on a shelf of a simulated warehouse:

Sim RVIZ2

Shelves

Supported simulation environments:

More features

SVO recording

SVO recording can be started and stopped while the ZED node is running using the service start_svo_recording and the service stop_svo_recording. More information

Object Detection

:pushpin: Note: This feature is incompatible with the ZED X One and the older first-generation ZED cameras.

Object Detection can be enabled automatically when the node starts by setting the parameter object_detection/od_enabled to true in the file common_stereo.yaml. The Object Detection can be enabled/disabled manually by calling the services enable_obj_det.

Custom Object Detection with YOLO-like ONNX model file

:pushpin: Note: This feature is incompatible with the ZED X One and the older first-generation ZED cameras.

Object Detection inference can be performed using a custom inference engine in YOLO-like ONNX format.

You can generate your ONNX model by using Ultralytics YOLO tools.

Install Ultralytics YOLO tools:

python -m pip install ultralytics

if you already installed the ultralytics package, we recommend updating it to the latest version:

pip install -U ultralytics

Export an ONNX file from a YOLO model (more info here), for example:

yolo export model=yolo11n.pt format=onnx simplify=True dynamic=False imgsz=640

For a custom-trained YOLO model, the weight file can be changed, for example:

yolo export model=yolov8l_custom_model.pt format=onnx simplify=True dynamic=False imgsz=512

Please refer to the Ultralytics documentation for details.

Modify the common_stereo.yaml parameters to match your configuration:

:pushpin: Note: The first time the custom model is used, the ZED SDK optimizes it to get the best performance from the GPU installed on the host. Please wait for the optimization to complete. When using Docker, we recommend using a shared volume to store the optimized file on the host and perform the optimization only once.

Console log while optimization is running:

[zed_wrapper-3] [INFO] [1729184874.634985183] [zed.zed_node]: *** Starting Object Detection ***
[zed_wrapper-3] [2024-10-17 17:07:55 UTC][ZED][INFO] Please wait while the AI model is being optimized for your graphics card
[zed_wrapper-3]  This operation will be run only once and may take a few minutes 

Body Tracking

:pushpin: Note: This feature is incompatible with the ZED X One and the older first-generation ZED cameras.

The Body Tracking can be enabled automatically when the node starts by setting the parameter body_tracking/bt_enabled to true in the file common_stereo.yaml.

Spatial Mapping

:pushpin: Note: This feature is incompatible with the ZED X One camera.

The Spatial Mapping can be enabled automatically when the node starts setting the parameter mapping/mapping_enabled to true in the file common_stereo.yaml. The Spatial Mapping can be enabled/disabled manually by calling the service enable_mapping.

GNSS fusion

:pushpin: Note: This feature is incompatible with the ZED X One camera.

The ZED ROS 2 Wrapper can subscribe to a NavSatFix topic and fuse GNSS data information with Positional Tracking information to obtain a precise robot localization referred to Earth coordinates. To enable GNSS fusion set the parameter gnss_fusion.gnss_fusion_enabled to true. You must set the correct gnss_frame parameter when launching the node, e.g. gnss_frame:='gnss_link'. The services toLL and fromLL can be used to convert Latitude/Longitude coordinates to robot map coordinates.

2D mode

:pushpin: Note: This feature is incompatible with the ZED X One camera.

For robots moving on a planar surface, activating the "2D mode" (parameter pos_tracking/two_d_mode in common_stereo.yaml) is possible. The value of the coordinate Z for odometry and pose will have a fixed value (parameter pos_tracking/fixed_z_value in common_stereo.yaml). Roll, Pitch, and the relative velocities will be fixed to zero.

Examples and Tutorials

Examples and tutorials are provided to better understand how to use the ZED wrapper and how to integrate it into the ROS 2 framework. See the zed-ros2-examples repository

RVIZ2 visualization examples

Tutorials

A series of tutorials are provided to better understand how to use the ZED nodes in the ROS2 environment :

Examples

How to use the ZED ROS 2 nodes alongside other ROS 2 packages or advanced features.

Update the local repository

To update the repository to the latest release, use the following command that will retrieve the latest commits of zed-ros2-wrapper and of all the submodules:

git checkout master # if you are not on the main branch  
git pull --recurse-submodules # update recursively all the submodules

Clean the cache of your colcon workspace before compiling with the colcon build command to be sure that everything will work as expected:

cd <ros2_workspace_root> # replace with your workspace folder, for example ~/ros2_ws/src/
rm -r install
rm -r build
rm -r log
colcon build --symlink-install --cmake-args=-DCMAKE_BUILD_TYPE=Release --parallel-workers $(nproc)

Known issues