< >
Home » ROS2与Matlab入门教程 » ROS2与Matlab入门教程-与ROS2发布者和订阅者交换数据

ROS2与Matlab入门教程-与ROS2发布者和订阅者交换数据

说明:

  • 介绍如何在ROS2网络中发布和订阅主题

介绍:

  • ROS2节点交换数据的主要机制是发送和接收消息

  • 消息在一个主题上传输,每个主题在ROS2网络中都有一个唯一的名称

  • 如果一个节点想要共享信息,它必须使用发布者将数据发送到一个主题。想要接收该信息的节点必须使用同一主题的订阅者

  • 每个主题除了其唯一的名称外,还有一个消息类型,它决定了在特定主题中允许传输的消息类型

  • 这种发布者-订阅者通信具有以下特点:主题用于多对多通信。多个发布者可以向同一个主题发送消息,多个订阅者可以接收它们。发布者和订阅者通过主题解耦,可以任意顺序创建和销毁。即使没有活动订阅者,也可以将消息发布到主题

请输入图片描述

步骤:

  • 订阅并等待消息,创建一个包含多个发布者和订阅者的示例 ROS 2 网络
exampleHelperROS2CreateSampleNetwork 
  • 用于ros2 topic list查看可用的主题
ros2 topic list

/parameter_events
/pose
/rosout
/scan
  • 要订阅该/scan主题。用于ros2subscriber订阅/scan主题。指定具有订阅者的节点的名称。如果主题已存在于 ROS 2 网络中,则ros2subscriber自动检测其消息类型,因此您无需指定
detectNode = ros2node("/detection");
pause(2)
laserSub = ros2subscriber(detectNode,"/scan");
pause(2)    
  • 用于receive等待新消息。指定 10 秒的超时。输出scanData包含接收到的消息数据。status指示是否成功接收到消息并statustext提供有关status
[scanData,status,statustext] = 接收(laserSub,10);
  • 可以删除订阅者laserSub和与其关联的节点
clear laserSub
clear detectNode
  • 使用回调函数订阅

  • receive您可以指定在收到新消息时调用的函数,而不是用于获取数据。这允许在订阅者等待新消息时执行其他 MATLAB 代码。如果您想使用多个订阅者,回调是必不可少的

  • /pose使用回调函数订阅主题,该函数exampleHelperROS2PoseCallback将接收到的消息作为输入。在主工作区和回调函数之间共享数据的一种方法是使用全局变量。定义两个全局变量pos和orient

controlNode = ros2node("/base_station");
poseSub = ros2subscriber(controlNode,"/pose",@exampleHelperROS2PoseCallback);
global pos
global orient
  • 当接收到有关主题的新消息数据时,将在函数中分配 全局变量pos和。orientexampleHelperROS2PoseCallback/pose
function exampleHelperROS2PoseCallback(message)    
    % Declare global variables to store position and orientation
    global pos
    global orient

    % Extract position and orientation from the ROS message and assign the
    % data to the global variables.
    pos = [message.linear.x message.linear.y message.linear.z];
    orient = [message.angular.x message.angular.y message.angular.z];
end
  • 等待网络发布另/pose一条消息。显示更新的值
pause(3)
disp(pos)

 -0.0409    0.0076    0.0183


disp(orient)

0.0047   -0.0074    0.0144
  • 如果您在命令行中输入pos并orient输入几次,您可以看到这些值不断更新。

  • 通过清除订阅者变量来停止姿势订阅者

clear poseSub
clear controlNode
  • 注意:除了使用全局变量之外,还有其他方法可以从回调函数中提取信息。例如,您可以将句柄对象作为附加参数传递给回调函数

  • 发布消息

  • 创建一个向主题发送 ROS 2 字符串消息的发布者/chatter

chatterPub = ros2publisher(node_1, "/chatter" , "std_msgs/String" );
  • 创建并填充 ROS 2 消息以发送到/chatter主题
chatterMsg = ros2message(chatterPub);
chatterMsg.data = 'hello world';
  • 用于ros2 topic list验证/chatter主题在 ROS 2 网络中是否可用
ros2 topic list

/chatter
/parameter_events
/pose
/rosout
/scan
  • 定义主题的订阅者/chatter。 exampleHelperROS2ChatterCallback收到新消息时调用,并在消息中显示字符串内容
chatterSub = ros2subscriber(node_2,"/chatter",@exampleHelperROS2ChatterCallback)

chatterSub = 
  ros2subscriber with properties:

    TopicName: '/chatter'
LatestMessage: []
  MessageType: 'std_msgs/String'
NewMessageFcn: @exampleHelperROS2ChatterCallback
      History: 'keeplast'
        Depth: 10
  Reliability: 'reliable'
   Durability: 'volatile'
  • 向/chatter主题发布消息。观察订阅者回调显示的字符串
send(chatterPub,chatterMsg)
pause(3)

ans = 
'hello world'
  • exampleHelperROS2ChatterCallback当订阅者收到字符串消息时调用该函数

  • 断开与ROS2网络的连接,从 ROS 2 网络中删除示例节点、发布者和订阅者。同时清除全局变量pos和orient

clear global  pos  orient 
clear

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

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


标签: ros2与matlab入门教程