消息是用于在ROS中交换数据的主容器。主题和服务使用消息来携带节点之间的数据。(看与ROS发布者和订阅者交换数据和呼叫并提供ROS服务有关主题和服务的更多信息)
为了标识其数据结构,每个消息都有一个消息类型.例如,来自激光扫描仪的传感器数据通常以类型的消息发送sensor_msgs /提升
.每个消息类型都标识消息中包含的数据元素。每个消息类型名称是包名称的组合,后跟正斜杠/,以及类型名称:
MATLAB®支金宝app持许多在机器人应用程序中常常遇到的ROS消息类型。此示例显示了在MATLAB中创建,探索和填充ROS消息的一些方法。
初始化ROS主节点和全局节点。
rosinit
启动ROS核心......在0.67725秒内完成。初始化ROS Master http://192.168.0.10:56046。使用nodeUri初始化全局节点/ matlab_global_node_55235 http:// bat1073817glnxa64:36827 /
使用examplehelperroscreatesamplenetwork
用三个额外的节点以及示例发布者和订阅者填充ROS网络。
examplehelperroscreatesamplenetwork
网络上有各种节点,具有少数主题和附属发布商和订阅者。
您可以通过致电查看可用主题的完整列表rostopic
列表
.
rostopic列表
/姿势/ rosout / scan / tf
属性发送的数据类型的更多信息/扫描
主题,使用叛逆的信息
命令检查它。/扫描
有一个消息类型sensor_msgs /提升
.
rostopic信息/扫描
类型:Sensor_msgs / Laserscan发布商:* / node_3(http:// bat1073817glnxa64:33107 /)订阅者:* / node_1(http:// bat1073817glnxa64:33265 /)* / node_2(http:// bat1073817glnxa64:41767 /)
命令输出还会告诉您哪些节点正在发布和订阅主题。要了解出版商和订阅者,请参阅呼叫并提供ROS服务.
要了解有关主题的消息类型的更多信息,请使用“使用相同类型的空消息”Rosmessage.
功能。Rosmessage.
金宝app支持消息类型的TAB补全。要完成消息类型名称,请键入要完成的名称的前几个字符,然后按选项卡关键。
Scandata = Rosmessage(“sensor_msgs /提升”)
Scandata = ROS Laserscan带有属性的消息:messageType:'sensor_msgs / laserscan'标题:[1x1 header] angleemin:0 AngleMax:0 AnslIncrement:0临时扫描:0扫描:0 RangeMin:0 RangeMax:0范围:[0x1单个]强度:[0x1单个]使用ShowDetail来显示消息的内容
创建的消息scandata
具有与通常从激光扫描仪接收的数据相关联的许多属性。例如,最小感测距离存储在RangeMin
属性,最大感知距离在RangeMax
.
要查看可用于主题和服务的所有消息类型的完整列表,请使用rosmsg
列表
.
ROS消息是对象,消息数据存储在属性中。MATLAB提供方便的方法来查找和探索消息的内容。
如果你订阅/构成
主题,您可以接收和检查发送的消息。
Poseub = Rossubscriber('/姿势')
Poseub =具有属性的订阅者:主题名称:'/ pose'最新名:[0x1 twist] messageType:'geometry_msgs / twist'buffersize:1 newmessagefcn:[] dataformat:'对象'
使用收到
从订阅者获取数据。一旦接收到新消息,函数将返回该消息并将其存储在posedata
变量(第二个参数是以秒为单位的超时)。
Postata =接收(姿态,10)
Postata = ROS Twist Message具有属性:MessageType:'Geometry_msgs / Twist'线性:[1x1 Vector3] Angular:[1x1 Vector3]使用ShowDetail来显示消息的内容
该消息有一种类型geometry_msgs /扭
.消息中还有其他两个属性:线性
和角
.你可以通过直接访问这些消息属性来查看它们的值:
posedata.linear.linear.
ANS = ROS Vector3带有属性的消息:MessageType:'Geometry_msgs / Vector3'x:0.0315 Y:0.0406 z:-0.0373使用ShowDetail来显示消息的内容
postata.angular.angular.
ANS = ROS Vector3带有属性的消息:messageType:'Geometry_msgs / Vector3'x:0.0413 Y:0.0132 Z:-0.0402使用ShowDetail来显示消息的内容
这些消息字段的每个值实际上是自身的消息。这些消息类型是geometry_msgs / Vector3
.geometry_msgs /扭
是由两个组成的综合消息geometry_msgs / Vector3
消息。
这些嵌套消息的数据访问与访问其他消息中的数据完全相同。访问X
组件的线性
使用此命令的消息:
xpos = posedata.Linear.X
xpos = 0.0315
如果您想要快速摘要消息中包含的所有数据,请调用Rosshowdetails.
功能。显示详细资料
可处理任何类型的消息,并递归显示所有消息数据属性。
showdetails(posedata)
线性X:0.03147236863931789 Y:0.04057919370756193 Z:0.0.03730131837064939 Angular X:0.04113758561390194 Y:0.013235924622540959905
显示详细资料
在调试期间和希望快速浏览消息内容时提供帮助。
您还可以设置Message属性值。使用类型创建消息geometry_msgs /扭
.
twist = rosmessage('geometry_msgs / twist')
Twist = ROS Twist Message具有属性:MessageType:'Geometry_msgs / Twist'线性:[1x1 Vector3] Angular:[1x1 Vector3]使用ShowDetail来显示消息的内容
此消息的数值属性初始化为0.
默认。您可以修改此消息的任何属性。设定线性的。Y
条目相当于5.
.
twist.linear.y = 5;
查看消息数据以确保您的更改生效。
twist.linear.
ans = ROS Vector3 message with properties: MessageType: 'geometry_msgs/Vector3' X: 0 Y: 5 Z: 0使用showdetails显示消息的内容
填充数据后,您可以使用发布者,订阅者和服务使用它。看看与ROS发布者和订阅者交换数据和呼叫并提供ROS服务的例子。
复制消息内容有两种方法:
你可以创建一个参考副本原始信息共享相同的数据。
你可以创建一个深拷贝。深度副本,其中副本和原始邮件每个都有自己的数据。
如果想要在不同的函数或对象之间共享消息数据,引用副本是有用的,而如果想要消息的独立副本,则需要深度副本。
做一个参考副本通过使用的消息=
符号。这将创建一个可变的变量,将与原始变量相同的消息内容引用。
twistCopyRef =扭
Twist message with properties: MessageType: 'geometry_msgs/Twist' Linear: [1x1 Vector3] Angular: [1x1 Vector3]使用showdetails显示消息的内容
修改线性的。Z
现场Twistcopyref.
.这也改变了内容转折。
twistcopyref.linear.z = 7;twist.linear.
ans = ROS Vector3 message with properties: MessageType: 'geometry_msgs/Vector3' X: 0 Y: 5 Z: 7使用showdetails显示消息的内容
做一个深拷贝扭
这样您就可以在不影响原始数据的情况下更改其内容。制造一个新的信息,TwistcopyDeep.
, 使用复制
功能:
TwistcopyDeep = Copy(Twist)
TwistCopyDeep = ROS Twist Message具有属性:MessageType:'Geometry_msgs / Twist'线性:[1x1 Vector3] Angular:[1x1 Vector3]使用ShowDetail来显示消息的内容
修改线性的。X
财产TwistcopyDeep.
.内容扭
保持不变。
twistCopyDeep.Linear.X = 100;twistCopyDeep。线性
ANS = ROS Vector3带有属性的消息:messageType:'geometry_msgs / vector3'x:100 y:5 z:7使用showdetail来显示消息的内容
twist.linear.
ans = ROS Vector3 message with properties: MessageType: 'geometry_msgs/Vector3' X: 0 Y: 5 Z: 7使用showdetails显示消息的内容
您可以保存消息并存储内容以供以后使用。
从订阅者获取一条新消息。
Postata =接收(姿态,10)
Postata = ROS Twist Message具有属性:MessageType:'Geometry_msgs / Twist'线性:[1x1 Vector3] Angular:[1x1 Vector3]使用ShowDetail来显示消息的内容
使用MATLAB保存姿态数据到MAT文件保存
功能。
保存(“posedata.mat”那'postata')
在将文件加载回工作区之前,清除posedata
多变的。
清晰的posedata
现在您可以通过调用来加载消息数据加载
功能。这加载了posedata
从上面进入messageData
结构体。posedata
是结构的数据字段。
messageData =负载(“posedata.mat”)
Messageata =.结构体字段:Postata:[1x1扭曲]
检查messageData.posedata
查看消息内容。
messageData.posedata
ANS = ROS扭曲消息具有属性:messageType:'geometry_msgs / twist'线性:[1x1 vector3] Angular:[1x1 Vector3]使用ShowDetail来显示消息的内容
现在可以删除MAT文件。
删除(“posedata.mat”)
来自ROS的一些消息存储在对象数组.这些必须与典型的数据阵列不同地处理。
在您的工作区中,变量TF.
包含一个示例消息。(examplehelperroscreatesamplenetwork
脚本创建了变量。)在这种情况下,它是一种类型的消息tf / tfmessage
用于坐标转换。
TF.
tf = ROS tfMessage message with properties: MessageType: 'tf/tfMessage
TF.
有两个字段:MessageType.
包含标准数据阵列,和转换
包含一个对象数组。存储了53个对象转换
,所有这些都具有相同的结构。
扩张TF.
在转换
要看结构:
tf.transforms.
ans = 53x1 ROS TransformStamped消息数组的属性:MessageType Header Transform ChildFrameId
每个对象转换
有四个属性。你可以扩展到查看变换
现场转换
.
tformFields = tf.Transforms.Transform
笔记:命令输出返回53个单个答案,因为每个对象都被评估并返回其值变换
场地。此格式并不总是有用的,因此您可以使用以下命令将其转换为单元格数组:
cellTransforms = {tf.Transforms.Transform}
cellTransforms =1×53单元阵列列1到4 {1x1变换} {1x1变换} {1x1变换}列5到8 {1x1变换} {1x1变换} {1x1变换} {1x1变换}列9到12 {1x1变换} {1x1变换} {1x1变换} {1x1变换}列13到16 {1x1变换} {1x1变换} {1x1变换}列17到20 {1x1变换} {1x1变换} {1x1变换} {1x1变换} {1x1变换}列21到24 {1x1变换} {1x1变换} {1x1变换}列25到28 {1x1变换} {1x1变换} {1x1变换} {1x1变换} {1x1变换}列29到32 {1x1变换} {1x1变换} {1x1变换} {1x1变换}列33到36 {1x1变换} {1x1变换} {1x1变换}列37到40 {1x1变换} {1x1变换} {1x1变换} {1x1变换} {1x1变换}列41到44 {1x1变换} {1x1变换} {1x1变换}列45到48 {1x1变换} {1x1变换} {1x1变换} {1x1变换}列49到52 {1x1变换} {1x1变换} {1x1变换} {1x1变换}列53 {1x1变换}
这将所有53个对象条目放在单元格数组中,使您可以使用索引访问它们。
此外,您可以访问对象数组元素,同样访问标准MATLAB向量:
tf.transforms(5)
ANS = ROS转换器具有属性的消息:MessageType:'Geometry_msgs / transformsed'标题:[1x1标题]变换:[1x1变换] shinkframeID:'/ imu_link'使用showdetail来显示消息的内容
访问53列表中第五次转换的翻译组件:
tf.Transforms .Transform.Translation (5)
ans = ROS Vector3 message with properties: MessageType: 'geometry_msgs/Vector3' X: 0.0599 Y: 0 Z: -0.0141使用showdetails显示消息的内容
从ROS网络删除样本节点,发布者和订阅者。
exampleHelperROSShutDownSampleNetwork
关闭ROS主站并删除全局节点。
Rosshutdown.
使用nodeuri关闭全局节点/ matlab_global_node_55235 http:// bat1073817glnxa64:36827 /关闭ros master http://192.168.0.0.10:56046。
看处理专门的ROS信息有关处理图像,点云和激光扫描消息的示例。
对于应用程序示例,请参阅开始使用Gazebo和一个模拟乌龟机器人或开始使用真正的乌龟机器人的例子。