ROS 2 является более новой версией ROS с различной архитектурой. И сети являются отдельными и нет никакой непосредственной связи между узлами в ROS и ROS 2. ros1_bridge
пакет обеспечивает сетевой мост, который включает обмен сообщениями между ROS и ROS 2. Мост управляет всем требуемым преобразованием и отправляет сообщения через обоих сети. Для получения дополнительной информации смотрите ros1_bridge
. Этот пример использует виртуальную машину доступную для скачивания в Виртуальной машине с Мелодичным ROS 2 и Gazebo. ros1_bridge
пакет установлен на этой виртуальной машине.
В этом примере показано, как управлять TurtleBot3 в Gazebo с помощью команд клавиатуры от MATLAB®. Средство моделирования Gazebo доступно в сетях ROS 1 только. Можно использовать ros1_bridge
обмениваться темами Gazebo, такими как '/odom'
или '/cmd_vel'
к ROS 2.
Ниже схемы изображает обмен сообщениями между ROS 1 и ROS 2 сети с помощью ros1_bridge
. '/odom'
тема содержит nav_msgs/Odometry
сообщения, отправленные от сети ROS 1 с Gazebo. Узел ROS 2 подписывается на /odom
тема, которая была соединена от ROS 1 и публикует '/cmd_vel'
обменивайтесь сообщениями на основе положения робота. Мост затем берет '/cmd_vel'
обменивайтесь сообщениями и публикует его в сети ROS 1.
Можно загрузить изображение виртуальной машины, которому уже установили ROS 2 и Gazebo. Эта виртуальная машина основана на Ubuntu® Linux® и предварительно сконфигурирована, чтобы поддержать ROS 2 примера в ROS Toolbox™.
Загрузите нашу Виртуальную машину Мелодичным ROS 2 и Gazebo.
Запустите виртуальную машину.
Вы, возможно, должны создать XML-файл на VM под названием DEFAULT_FASTRTPS_PROFILE.xml, чтобы сконфигурировать IP-адреса, чтобы связаться под различными подсетями (см. раздел Communicate Outside Subnet в Подключении к Сети ROS 2). В замене XML-файла в качестве примера <адрес> записи с хостом и IP-адресами VM и заменой <domainId> запись с вашей заданной областью. Создайте тот же файл, с тем же содержимым, на вашем хосте - компьютере в текущей рабочей директории MATLAB.
Файл в качестве примера:
<?xml version="1.0" encoding="UTF-8" ?> <profiles> <participant profile_name="participant_win" is_default_profile="true"> <rtps> <builtin> <domainId>0</domainId> <initialPeersList> <locator> <kind>UDPv4</kind> <address>192.34.17.36</address> </locator> <locator> <kind>UDPv4</kind> <address>182.30.45.12</address> </locator> <locator> <kind>UDPv4</kind> <address>194.158.78.29</address> </locator> </initialPeersList> </builtin> </rtps> </participant> </profiles>
На рабочем столе VM нажмите Gazebo Empty. Этот мир Gazebo содержит робота Turtlebot, который публикует и подписывается на сообщения в сети ROS 1.
Кликните по значку РОС-Бридж. Этот мост устанавливает издателей и подписчиков для всего ROS 1 тема в сети ROS 2.
В Окне терминала заметьте, что мост в порядке.
Можно теперь открыть еще один терминал и проверять, что темы Gazebo присутствуют в ROS 2.
ros2 topic list
Повторите /odom
тема, чтобы видеть, что сообщения опубликованы.
ros2 topic echo /odom
В MATLAB на вашей хост-машине, набор соответствующий доменный ID для сети ROS 2 с помощью 'ROS_DOMAIN_ID'
переменная окружения. ID должен быть вектором символов.
setenv('ROS_DOMAIN_ID', '25');
Создайте узел ROS 2. Подпишитесь на тему одометрии, которая соединена от ROS 1.
ros2Node = ros2node('exampleNode'); handles.odomSub = ros2subscriber(ros2Node,'/odom')
handles = struct with fields:
odomSub: [1×1 ros2subscriber]
Получите сообщения одометрии от моста и используйте exampleHelperGet2DPose
функция, чтобы распаковать сообщение в 2D положение. Получите положение запуска робота.
odomMsg = receive(handles.odomSub); poseStart = exampleHelperGet2DPose(odomMsg)
poseStart = 1×3
10-3 ×
-0.0275 0.0482 0.7504
handles.poses = poseStart;
Создайте издателя для управления скоростью робота. Мост берет эти сообщения и отправляет их в сети ROS 1.
handles.velPub = ros2publisher(ros2Node,'/cmd_vel','geometry_msgs/Twist')
handles = struct with fields:
odomSub: [1×1 ros2subscriber]
poses: [-2.7452e-05 4.8179e-05 7.5043e-04]
velPub: [1×1 ros2publisher]
Запустите exampleHelperROS2TurtleBotKeyboardControl
функция, которая позволяет вам управлять TurtleBot3 с клавиатурой. handles
введите содержит подписчика ROS 2, издателя ROS 2, и изображает из себя структуру. Функция отправляет команды управления в сети ROS 2 на основе вводов с клавиатуры. Мост передает те сообщения сети ROS 1 для средства моделирования Gazebo.
poses = exampleHelperROS2TurtleBotKeyboardControl(handles);
Фигура, которая открывается, слушает вводы с клавиатуры для управления роботом в Gazebo. Нажмите клавиши и см., что робот перемещается. Нажмите Q, чтобы выйти.
Постройте результаты показать как TurtleBot3, перемещенный в Gazebo. poses
переменная сохранила весь обновленный /odom
сообщения, которые были получены от сети ROS 1.
odomMsg = receive(handles.odomSub); poseEnd = exampleHelperGet2DPose(odomMsg)
poseEnd = 1×3
1.2983 -0.8356 -2.8089
poses = [poses;poseEnd]; figure plot(poses(:,1),poses(:,2),'b-', ... poseStart(1),poseStart(2),'go', ... poseEnd(1),poseEnd(2),'ro'); xlabel('X [m]'); ylabel('Y [m]'); legend('Trajectory','Start','End');
Очистите издателей и подписчиков на хосте.
clear