主要内容

使用基本的ROS消息

消息是用于在ROS中交换数据的主容器。主题和服务使用消息来携带节点之间的数据。(看与ROS发布者和订阅者交换数据呼叫并提供ROS服务有关主题和服务的更多信息)

为了标识其数据结构,每个消息都有一个消息类型.例如,来自激光扫描仪的传感器数据通常以类型的消息发送sensor_msgs /提升.每个消息类型都标识消息中包含的数据元素。每个消息类型名称是包名称的组合,后跟正斜杠/,以及类型名称:

MATLAB®支金宝app持许多在机器人应用程序中常常遇到的ROS消息类型。此示例显示了在MATLAB中创建,探索和填充ROS消息的一些方法。

先决条件:从ROS开始连接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 / Vector3geometry_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网络

从ROS网络删除样本节点,发布者和订阅者。

exampleHelperROSShutDownSampleNetwork

关闭ROS主站并删除全局节点。

Rosshutdown.
使用nodeuri关闭全局节点/ matlab_global_node_55235 http:// bat1073817glnxa64:36827 /关闭ros master http://192.168.0.0.10:56046。

下一个步骤