ROS 2 - это более новая версия ROS с различной архитектурой. Обе сети являются отдельными, и нет прямой связи между узлами в ROS и ROS 2. The ros1_bridge
пакет обеспечивает сетевой мост, который позволяет обмениваться сообщениями между ROS и ROS 2. Мост управляет всеми необходимыми преобразованиями и отправляет сообщения по обеим сетям. Для получения дополнительной информации смотрите ros1_bridge
. Этот пример использует виртуальную машину, которую можно загрузить, следуя инструкциям в Запуск with Gazebo и Simulated TurtleBot. The ros1_bridge
пакет установлен на этой виртуальной машине.
В этом примере показано, как управлять TurtleBot3 в Gazebo с помощью команд клавиатуры от MATLAB ®. Gazebo Simulator доступен только в сетях ROS 1. Можно использовать ros1_bridge
для обмена темами Gazebo, такими как '/odom'
или '/cmd_vel'
к ROS 2.
Следующая схема изображает обмен сообщениями между сетями ROS 1 и ROS 2 с помощью ros1_bridge
. The '/odom'
тема содержит nav_msgs/Odometry
сообщения, отправленные из сети ROS 1 с Gazebo. Узел ROS 2 подписан на /odom
тема, которая была соединена между собой из ROS 1 и публикует '/cmd_vel'
сообщение на основе положения робота. Затем мост принимает '/cmd_vel'
сообщение и публикует его в сети ROS 1.
Загрузите виртуальную машину с помощью инструкции в Запуск с Gazebo и моделируемым TurtleBot
Возможно, потребуется создать XML- файл на виртуальной машине с именем DEFAULT_FASTRTPS_PROFILE.xml, чтобы настроить IP-адреса для связи в различных подсетях (см. раздел «Связь с внешней подсетью» в разделе «Подключение к сети ROS 2»). В примере XML-файл заменяет < address > записи IP-адресами хоста и виртуальной машины и заменяет запись < 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 Empty. Этот мир Gazebo содержит робота Turtlebot, который публикует и подписывается на сообщения в сети ROS 1.
Щелкните ярлык ROS Bridge. Этот мост настраивает издателей и подписчиков для всех тем ROS 1 в сети ROS 2.
В окне Terminal заметьте, что мост работает и работает.
Откройте еще один терминал и введите следующие команды
export ROS_DOMAIN_ID=25 source /opt/ros/dashing/setup.bash
Теперь проверяйте, что темы Gazebo присутствуют в ROS 2.
ros2 topic list
Эхо- /odom
для просмотра публикуемых сообщений.
ros2 topic echo /odom
В 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]
Запустите e xampleHelperROS2TurtleBotKeyboardControl
функция, которая позволяет управлять TurtleBot3 с помощью клавиатуры. The handles
вход содержит подписчика ROS 2, издателя ROS 2 и представляет собой структуру. Функция отправляет команды управления в сети ROS 2 на основе входных входов клавиатуры. Мост передает эти сообщения в сеть ROS 1 для симулятора Gazebo.
poses = exampleHelperROS2TurtleBotKeyboardControl(handles);
Рисунок, который открывает, слушает входные входы клавиатуры для управления роботом в Gazebo. Бей ключи и наблюдай, как робот двигается. Нажмите Q для выхода.
Постройте график результатов, чтобы показать, как TurtleBot3 двигался в Gazebo. The 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