ROS2与Matlab入门教程-使用ROS Bridge建立ROS和ROS2之间的通信
说明:
- 介绍如何使用MATLAB中的键盘命令控制Gazebo中的TurtleBot3
介绍:
ROS 2 是具有不同架构的更新版本的 ROS。两个网络都是独立的,ROS 和 ROS 2 中的节点之间没有直接通信
该ros1_bridge软件包提供了一个网桥,可以在 ROS 和 ROS 2 之间交换消息,该网桥管理所有所需的转换并在两者之间发送消息网络
下图描述了 ROS 1 和 ROS 2 网络之间使用ros1_bridge。. 该'/odom'主题包含nav_msgs/Odometry从带有 Gazebo 的 ROS 1 网络发送的消息。ROS 2 节点订阅/odom已从 ROS 1 桥接的主题,并'/cmd_vel'根据机器人姿势发布消息。然后,网桥接收'/cmd_vel'消息并将其发布到 ROS 1 网络上
设置虚拟机,与子网外通信
打开VM 主目录中的DEFAULT_FASTRTPS_PROFILE.xml
文件,并将条目替换为主机和 VM IP 地址。在不同子网下进行通信
- 启动Gazebo,在 VM 桌面上,单击Gazebo Empty。这个 Gazebo 世界包含一个 Turtlebot 机器人,它在 ROS 1 网络上发布和订阅消息
- 启动Bridge,单击ROS 桥快捷方式。该桥为 ROS 2 网络上的所有 ROS 1 主题设置发布者和订阅者
- 在终端窗口中,请注意网桥已启动并正在运行
- 再打开一个终端,输入以下命令
export ROS_DOMAIN_ID=25
source /opt/ros/foxy/setup.bash
- 现在检查 Gazebo 主题是否存在于 ROS 2 中
ros2 topic list
- 打印/odom主题以查看正在发布的消息
ros2 topic echo /odom
从 ROS 2 控制 TurtleBot3
在主机上的 MATLAB 中,使用'ROS_DOMAIN_ID'环境变量为ROS 2 网络设置正确的域 ID,25以匹配机器人模拟器 ROS 桥设置并运行ros2 topic list以验证机器人模拟器中的主题在 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;
- 创建用于控制机器人速度的发布者。网桥接收这些消息并将它们发送到 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 网络上发送控制命令。桥将这些消息传输到 Gazebo 模拟器的 ROS 1 网络
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
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号