< >
Home » ROS2与Matlab入门教程 » ROS2与Matlab入门教程-使用ROS Bridge建立ROS和ROS2之间的通信

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

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros2与matlab入门教程