Используя РОС-Бридж, чтобы установить связь между ROS и ROS 2

ROS 2 является более новой версией ROS с различной архитектурой. И сети являются отдельными и нет никакой непосредственной связи между узлами в ROS и ROS 2. ros1_bridge пакет обеспечивает сетевой мост, который включает обмен сообщениями между ROS и ROS 2. Мост управляет всем требуемым преобразованием и отправляет сообщения через обоих сети. Для получения дополнительной информации смотрите ros1_bridge. Этот пример использует виртуальную машину, которая может быть загружена путем следования инструкциям в Начало работы с Gazebo и Симулированным TurtleBot. 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.

Необходимые условия:

Настройте виртуальную машину

Передайте внешнюю подсеть

Вы, возможно, должны создать 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>
            <metatrafficUnicastLocatorList>
               <locator/>
            </metatrafficUnicastLocatorList>
            <domainId>25</domainId>
            <initialPeersList>
               <locator>
                  <udpv4>
                     <address>192.168.2.147</address>
                  </udpv4>
               </locator>
               <locator>
                  <udpv4>
                     <address>192.168.2.1</address>
                  </udpv4>
               </locator>
            </initialPeersList>
         </builtin>
      </rtps>
   </participant>
</profiles>

Запустите Gazebo

На рабочем столе VM нажмите Gazebo Empty. Этот мир Gazebo содержит робота Turtlebot, который публикует и подписывается на сообщения в сети ROS 1.

Запустите мост

Кликните по ярлыку РОС-Бридж. Этот мост устанавливает издателей и подписчиков для всего ROS 1 тема в сети ROS 2.

В Окне терминала заметьте, что мост в порядке.

Откройте еще один терминал и введите следующие команды

export ROS_DOMAIN_ID=25
source /opt/ros/dashing/setup.bash

Теперь проверяйте, что темы Gazebo присутствуют в ROS 2.

ros2 topic list

Повторите /odom тема, чтобы видеть, что сообщения опубликованы.

ros2 topic echo /odom

Управляйте TurtleBot3 от ROS 2

В MATLAB на вашей хост-машине, набор соответствующий доменный ID для сети ROS 2 с помощью 'ROS_DOMAIN_ID' переменная окружения. ID должен быть вектором символов.

setenv("ROS_DOMAIN_ID","25");

Создайте узел ROS 2. Подпишитесь на тему одометрии, которая соединена от ROS 1.

ros2Node = ros2node("/example_node");
handles.odomSub = ros2subscriber(ros2Node,"/odom","nav_msgs/Odometry")
handles = struct with fields:
    odomSub: [1×1 ros2subscriber]

Получите сообщения одометрии от моста и используйте exampleHelperGet2DPose функция, чтобы распаковать сообщение в 2D положение. Получите положение запуска робота.

odomMsg = receive(handles.odomSub);
poseStart = exampleHelperGet2DPose(odomMsg)
poseStart = 1×3

    0.2038    0.0140   -0.8517

handles.poses = poseStart;

Создайте издателя для управления скоростью робота. Мост берет эти сообщения и отправляет их в сети ROS 1.

handles.velPub = ros2publisher(ros2Node,'/cmd_vel','geometry_msgs/Twist')
handles = struct with fields:
    odomSub: [1×1 ros2subscriber]
      poses: [0.2038 0.0140 -0.8517]
     velPub: [1×1 ros2publisher]

Запустите exampleHelperROS2TurtleBotKeyboardControl функция, которая позволяет вам управлять TurtleBot3 с клавиатурой. handles введите содержит подписчика ROS 2, издателя ROS 2, и изображает из себя структуру. Функция отправляет команды управления в сети ROS 2 на основе вводов с клавиатуры. Мост передает те сообщения сети ROS 1 для средства моделирования Gazebo.

poses = exampleHelperROS2TurtleBotKeyboardControl(handles);

Фигура, которая открывается, слушает вводы с клавиатуры для управления роботом в Gazebo. Нажмите клавиши и см., что робот перемещается. Нажмите Q, чтобы выйти.

Отобразите на графике данные, полученные от ROS

Постройте результаты показать как TurtleBot3, перемещенный в Gazebo. poses переменная сохранила весь обновленный /odom сообщения, которые были получены от сети ROS 1.

odomMsg = receive(handles.odomSub);
poseEnd = exampleHelperGet2DPose(odomMsg)
poseEnd = 1×3

    0.8522    0.1618   -1.6255

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