< >
Home » ROS2与Matlab入门教程 » ROS2与Matlab入门教程-使用ROS2消息

ROS2与Matlab入门教程-使用ROS2消息

说明

  • 介绍如何在matlab使用ROS2消息

介绍:

  • ROS消息是ROS2中交换数据的主要容器

  • 发布者和订阅者使用指定主题的消息交换数据,以在节点之间承载数据

  • 为了识别它的数据结构,每条消息都有一个消息类型

  • 例如,来自激光扫描仪的传感器数据通常以消息类型发送sensor_msgs/LaserScan。每种消息类型都标识了消息中包含的数据元素。每个消息类型名称都是包名称、后跟正斜杠 / 和类型名称的组合:

请输入图片描述

  • 查找消息类型,使用exampleHelperROS2CreateSampleNetwork三个节点填充ROS2网络,并针对特定主题设置示例发布者和订阅者
exampleHelperROS2CreateSampleNetwork
  • ros2 topic list -t 查找可用主题及其关联的消息类型
     主题消息类型           
_____________________    _________________________________

{'/parameter_events'} {'rcl_interfaces/ParameterEvent'}
{'/pose' } {'geometry_msgs/Twist' }
{'/rosout' } {'rcl_interfaces/Log' }
{'/scan' } {'sensor_msgs/LaserScan' }
  • 要了解有关主题消息类型的更多信息,请使用ros2message创建相同类型的空消息。ros2message支持消息类型的选项卡完成
scanData = ros2message( "sensor_msgs/LaserScan" )

scanData = struct with fields:
    MessageType: 'sensor_msgs/LaserScan'
         header: [1x1 struct]
      angle_min: 0
      angle_max: 0
angle_increment: 0
 time_increment: 0
      scan_time: 0
      range_min: 0
      range_max: 0
         ranges: 0
    intensities: 0
  • 创建的消息scanData具有许多与您通常从激光扫描仪接收的数据相关联的字段。例如,最小感应距离存储在range_min属性中,最大感应距离存储在range_max 属性中
clear scanData
  • 要查看可用于主题和服务的所有消息类型的完整列表,请使用ros2 msg list

  • 用于ros2 msg show查看消息类型的定义

ros2 msg show geometry_msgs/Twist

# This expresses velocity in free space broken into its linear and angular parts.

Vector3  linear
Vector3  angular
  • 如果您订阅该/pose主题,您可以接收和检查发送的消息
controlNode = ros2node( "/base_station" ); 
poseSub = ros2subscriber(controlNode, "/pose" , "geometry_msgs/Twist" )


poseSub = 
  ros2subscriber with properties:

    TopicName: '/pose'
LatestMessage: []
  MessageType: 'geometry_msgs/Twist'
NewMessageFcn: []
      History: 'keeplast'
        Depth: 10
  Reliability: 'reliable'
   Durability: 'volatile'
  • 用于receive从订阅者获取数据。收到新消息后,函数将其返回并将其存储在posedata变量中。指定接收消息的超时时间为10秒
poseData = receive(poseSub,10)

poseData = struct with fields:
MessageType: 'geometry_msgs/Twist'
     linear: [1x1 struct]
    angular: [1x1 struct]
  • 消息的类型为geometry_msgs/Twist。消息中还有另外两个字段:linear和angular。您可以通过直接访问这些消息字段来查看它们的值
poseData.linear

ans = struct with fields:
MessageType: 'geometry_msgs/Vector3'
          x: 0.0206
          y: -0.0468
          z: -0.0223

poseData.angular

ans = struct with fields:
MessageType: 'geometry_msgs/Vector3'
          x: -0.0454
          y: -0.0403
          z: 0.0323
  • 可以看到,这些消息字段的每个值实际上本身就是一条消息。geometry_msgs/Twist是由两条消息组成的复合消息geometry_msgs/Vector3。

  • 这些嵌套消息的数据访问与访问其他消息中的数据完全相同。使用以下命令访问消息的x组件:linear

xPose =poseData.linear.x

xPose = 0.0206
  • 设置消息数据,设置消息属性值。创建类型为 的消息geometry_msgs/Twist
twist = ros2message("geometry_msgs/Twist")

twist = struct with fields:
MessageType: 'geometry_msgs/Twist'
     linear: [1x1 struct]
    angular: [1x1 struct]
  • 此消息的数字属性0默认初始化。您可以修改此消息的任何属性。将 linear.y字段设置为5
twist.linear.y = 5;
  • 查看消息数据以确保您的更改生效
twist.linear

ans = struct with fields:
MessageType: 'geometry_msgs/Vector3'
          x: 0
          y: 5
          z: 0
  • 使用您的数据填充消息后,可以将其用于发布者和订阅者

  • 复制消息,ROS 2 消息是结构。它们可以直接复制以制作新消息。副本和原始消息各有自己的数据

  • 制作一个新的空消息来传达温度数据,然后制作一个副本以进行修改

tempMsgBlank = ros2message( "sensor_msgs/Temperature" ); 
tempMsgCopy = tempMsgBlank

tempMsgCopy = struct with fields:
MessageType: 'sensor_msgs/Temperature'
     header: [1x1 struct]
temperature: 0
   variance: 0
  • 修改 temperaturetempMsg 的属性,注意其内容tempMsgBlank保持不变
tempMsgCopy.temperature = 100

tempMsgCopy = struct with fields:
MessageType: 'sensor_msgs/Temperature'
     header: [1x1 struct]
temperature: 100
   variance: 0


tempMsgBlank

tempMsgBlank = struct with fields:
MessageType: 'sensor_msgs/Temperature'
     header: [1x1 struct]
temperature: 0
   variance: 0
  • 留一个空白的消息结构可能很有用,并且只有在有数据时才设置特定字段,然后再发送消息
thermometerNode = ros2node("/thermometer");
tempPub = ros2publisher(thermometerNode,"/temperature","sensor_msgs/Temperature");
tempMsgs(10) = tempMsgBlank;    % Pre-allocate message structure array
for iMeasure = 1:10
    % Copy blank message fields
    tempMsgs(iMeasure) = tempMsgBlank;

    % Record sample temperature
    tempMsgs(iMeasure).temperature = 20+randn*3;

    % Only calculate the variation once sufficient data observed
    if iMeasure >= 5
        tempMsgs(iMeasure).variance = var([tempMsgs(1:iMeasure).temperature]);
    end

    % Pass the data to subscribers
    send(tempPub,tempMsgs(iMeasure))
end
errorbar([tempMsgs.temperature],[tempMsgs.variance])

请输入图片描述

  • 保存和加载消息,保存消息并存储内容以供以后使用

  • 从订阅者那里获得一条新消息

poseData = receive(poseSub,10)

poseData = struct with fields:
MessageType: 'geometry_msgs/Twist'
     linear: [1x1 struct]
    angular: [1x1 struct]
  • save使用该函数将姿势数据保存到 MAT 文件中
save("poseFile.mat","poseData")
  • 在将文件加载回工作区之前,请清除该poseData变量
clear poseData
  • 通过调用该load函数来加载消息数据。这poseData将从上方加载到messageData结构中。poseData是结构的数据字段
messageData = load("poseFile.mat")

messageData = struct with fields:
poseData: [1x1 struct]
  • 检查messageData.poseData以查看消息内容
messageData.poseData

ans = struct with fields:
MessageType: 'geometry_msgs/Twist'
     linear: [1x1 struct]
    angular: [1x1 struct]
  • 现在可以删除 MAT 文件
delete("poseFile.mat")
  • 断开与ROS2网络的连接,从 ROS 2 网络中删除示例节点、发布者和订阅者
exampleHelperROS2ShutDownSampleNetwork

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

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


标签: ros2与matlab入门教程