exponenta event banner

Использование моста АФК для установления связи между АФК и АФК 2

ROS 2 - это более новая версия ROS с различной архитектурой. Обе сети являются раздельными, и прямая связь между узлами в ROS и ROS 2 отсутствует. ros1_bridge пакет обеспечивает сетевой мост, который обеспечивает обмен сообщениями между ROS и ROS 2. Мост управляет всеми необходимыми преобразованиями и отправляет сообщения по обеим сетям. Дополнительные сведения см. в разделе ros1_bridge. В этом примере используется виртуальная машина, которую можно загрузить, следуя инструкциям в разделе Начало работы с беседкой и смоделированным TurtleBot. ros1_bridge на этой виртуальной машине установлен пакет.

В этом примере показано, как управлять TurtleBot3 в Gazebo с помощью команд клавиатуры из MATLAB ®. Тренажер беседки доступен только в сетях ROS 1. Вы можете использоватьros1_bridge для обмена темами «Беседки», такими как '/odom' или '/cmd_vel' на АФК 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-файл на виртуальной машине с именем DEFAULT_FASTRTPS_PROFILE.xml для настройки IP-адресов для связи в разных подсетях (см. раздел «Связь с внешней подсетью» в разделе «Подключение к сети ROS 2»). В примере XML-файл заменяет записи < address > IP-адресами хоста и виртуальной машины и заменяет запись < startId > указанным доменом. Создайте тот же файл с тем же содержимым на главном компьютере в текущей рабочей папке 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 Empty. Этот мир Gazebo содержит робота Turtlebot, который публикует и подписывается на сообщения в сети ROS 1.

Запуск моста

Щелкните на ярлыке ROS Bridge. Этот мост устанавливает издателей и подписчиков для всех тем ROS 1 в сети ROS 2.

В окне «Терминал» обратите внимание, что мост находится в рабочем состоянии.

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

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

Теперь проверьте, что темы беседки присутствуют в ROS 2.

ros2 topic list

Эхо /odom для просмотра публикуемых сообщений.

ros2 topic echo /odom

Управление TurtleBot3 из АФК 2

В MATLAB на хост-машине установите правильный идентификатор домена для сети ROS 2 с помощью 'ROS_DOMAIN_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 на основе входных сигналов клавиатуры. Мост передает эти сообщения в сеть АФК 1 для тренажера «Беседка».

poses = exampleHelperROS2TurtleBotKeyboardControl(handles);

Открывшийся рисунок прослушивает вводы клавиатуры для управления роботом в Беседке. Бей по клавишам и смотри, как двигается робот. Нажмите Q для выхода.

Данные графика, полученные от ROS

Постройте график результатов, чтобы показать, как TurtleBot3 двигались в Беседке. 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