Распределенная система в ROS2

Когда вы запускаете приложение ROS2, часто требуется запускать узлы ROS2 в разных местах на разных машинах. Поскольку ROS2 использует абстрактный уровень DDS для связи между узлами, мы можем очень легко организовать связь.
Для полного понимания архитектуры ROS2 рекомендую ознакомиться с этой статьей.

Для целей этой статьи я связался с Nvidia Jetson Xavier и моим ПК. Оба устройства работают под управлением ROS2 Foxy. Я подключил камеру RGB к Jetso и запустил издатель (на C++ или Python). ПК запускает подписчиков (C++ или Python) для подписки на тему и отображает видеопоток.

Исходный код доступен на моем GitHub.

Архитектуру можно изобразить следующим образом.

Ниже я привожу команду ROS2 для запуска вашего приложения в соответствии с приведенным выше рисунком. Приложение можно запускать на той же машине или в других конфигурациях без изменений.

Однако наиболее важным является запуск приложения (издатель — подписчик на одном и том же ROS_DOMAIN_ID). Для выравнивания необходимо экспортировать один и тот же идентификатор.

//check the ROS environment (both on publisher and subscriber)

env | grep ROS

// you should recive similar

ROS_VERSION=2
ROS_PYTHON_VERSION=3
ROS_DOMAIN_ID=5
ROS_LOCALHOST_ONLY=0
ROS_DISTRO=foxy

// as you can see I adjhsted DOMAIN to 5

//run 

export ROS_DOMAIN_ID=5

Если вы запускаете свое приложение на C++,

mkdir -p open_dev_ws/src
cd open_dev_ws/src

//created ROS package
ros2 pkg create dev_opencv --dependencies rclcpp std_msgs sensor_msgs cv_bridge image_transport OpenCV

Измените свой CMakeList.txt (см. также мой Github). Здесь я показываю CMakeList.txt для создания издателя и подписчика. Вам нужно выбрать тип машины.

add_executable(pub_cam src/pub_cam.cpp)
ament_target_dependencies(pub_cam rclcpp std_msgs sensor_msgs cv_bridge image_transport OpenCV)

add_executable(sub_cam src/sub_cam.cpp)
ament_target_dependencies(sub_cam rclcpp std_msgs sensor_msgs cv_bridge image_transport OpenCV)

install(TARGETS
   pub_cam
   sub_cam
   DESTINATION lib/${PROJECT_NAME}
 )

Скопируйте pub_cam.cpp и sub_cam.cpp (из моего репозитория) в /dev_opencv/src.

cd open_dev_ws
colcon build
source ./install/setup.bash

// for publiser run
 ros2 run dev_opencv pub_cam

// for subscriber
 ros2 run dev_opencv sub_cam

Если вы запускаете свое приложение в Python,

mkdir -p /dev_opencv_py/src
cd dev_opencv_py/src


//create ROS package
ros2 pkg create --build-type ament_python dev_opencv_py --dependencies rclpy image_transport cv_bridge sensor_msgs std_msgs opencv2

Скопируйте скрипты Python в dev_opencv_py и измените setup.py,

    entry_points={
        'console_scripts': [
          'cam_pub = opencv_tools.cam_pub:main',
          'cam_sub = opencv_tools.cam_sub:main',
        ],
    },

В package.xml изменить

from
<depend>opencv2</depend>
to  
<depend>opencv-python</depend>

Запустите следующую команду,

cd dev_open_py
colcon build
source ./install/setup.bash

// for publiser run
 ros2 run dev_opencv_py cam_pub

// for subscriber
 ros2 run dev_opencv_py cam_sub

Спасибо за чтение.