Распределенная система в 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
Спасибо за чтение.