0. 简介

众所周知,ROS 2是具有不同架构的ROS的更新版本。这两个网络是分开的,在ROS和ROS 2的节点之间没有直接的通信。而ros1_bridge包则是提供了一个网桥,可以在ROS和ROS 2之间交换消息。桥接器管理所需的所有转换,并在两个网络之间发送消息。

1. ros1_bridge使用

这个例子展示了如何使用MATLAB®的键盘命令控制Gazebo中的TurtleBot3。凉亭模拟器仅在ROS 1网络中可用。您可以使用ros1_bridge将Gazebo主题(如’/odom’或’/cmd_vel’)交换为ROS 2。

下图描述了使用ros1_bridge在ROS 1和ROS 2网络之间的消息交换。“/odom”主题包含从ROS 1网络和Gazebo发送的nav_msgs/Odometry消息。ROS 2节点订阅了从ROS 1桥接过来的/odom主题,并发布了一个基于机器人姿态的’/cmd_vel’消息。然后网桥接收’/cmd_vel’消息并将其发布到ROS 1网络上。

2. 使用ROS2来控制TurtleBot3

在虚拟机桌面,单击Gazebo Empty.。这个Gazebo World 包含一个Turtlebot机器人,它在ROS 1网络上发布和订阅消息。


单击“ROS Bridge”快捷方式。这个桥接为ROS 2网络上的所有ROS 1主题设置发布者和订阅者。

在终端窗口中,其中ros1_bridge桥接已经启动并正在运行。


打开另一个终端并输入以下命令

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

现在检查一下Gazebo主题是否出现在ROS 2中

ros2 topic list


/odom主题以查看正在发布的消息

ros2 topic echo /odom


下面我们就可以在主机上的MATLAB中,使用’ROS_DOMAIN_ID’环境变量将ROS 2网络的正确域ID设置为25,以匹配机器人模拟器ROS桥设置,并运行ros2主题列表,以验证来自机器人模拟器的主题在MATLAB中可见。

setenv("ROS_DOMAIN_ID","25");
ros2 topic list

/clock
/gazebo/link_states
/gazebo/model_states
/gazebo/performance_metrics
/imu
/joint_states
/odom
/parameter_events
/rosout
/rosout_agg
/scan
/tf

创建一个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
10-3 ×
-0.0256 0.0374 0.5800

handles.poses = poseStart;

创建一个publisher来控制机器人的速度。网桥接收这些消息并将它们发送到ROS 1网络上

handles.velPub = ros2publisher(ros2Node,'/cmd_vel','geometry_msgs/Twist')

handles = struct with fields:
odomSub: [1×1 ros2subscriber]
poses: [-2.5609e-05 3.7370e-05 5.7996e-04]
velPub: [1×1 ros2publisher]

运行exampleHelperROS2TurtleBotKeyboardControl函数,该函数允许您用键盘控制TurtleBot3。handles 输入包含ROS 2订阅者、ROS 2发布者和构成结构。该功能根据键盘输入向ROS 2网络发送控制命令。桥接器将这些消息传输到凉亭模拟器的ROS 1网络。

poses = exampleHelperROS2TurtleBotKeyboardControl(handles);

3. 参考链接

https://ww2.mathworks.cn/help/ros/ug/communicate-between-ros-and-ros-2-networks-using-ros-bridge.html