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
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号