主要内容

提高性能的ROS使用消息的结构

这个例子演示了ROS消息结构的使用,从消息对象和他们的福利和差异。

消息结构有更好的性能对象执行初始创建时,阅读他们从rosbag文件,访问嵌套属性,和执行通信操作ROS网络。同时,消息结构是唯一支持的消息格式生成代码时通过MATLAB编码器™。万博1manbetx

消息结构基础知识

ROS消息对象是类的实例定义专门为每个消息类型。

msgObj = rosmessage (“nav_msgs /路径”);类(msgObj)
ans = ' ros.msggen.nav_msgs.Path '

对象属性包含消息的数据,和每个对象类型都有函数定义特定于ROS消息。

showdetails (msgObj)
头戳秒:0 Nsec: 0 Seq: 0 FrameId:姿势

介绍了ROS消息结构提高使用ROS消息的性能。每个消息是一个MATLAB®结构数据类型相同的字段ROS消息对象的属性。

msgStruct = rosmessage (“nav_msgs /路径”,“DataFormat”,“结构”)
msgStruct =结构体字段:MessageType:“nav_msgs /路径”标题:[1 x1 struct]姿势:[0 x1 struct]
类(msgStruct)
ans =“结构”

更新现有的代码使用的结构

更新现有的代码,使用对象,两个常见的工作流是提供所需的步骤更新它们。

沟通工作流程

此示例代码显示了如何通过网络发送和接收消息的活性氧。

%设置ROS网络rosinit
启动ROS核心……在0.54471秒内完成。初始化ROS主在http://172.29.207.151:49575上。初始化全局节点/ matlab_global_node_72819 NodeURI http://dcc345885glnxa64:41089和http://localhost MasterURI: 49575。
stringPub = rospublisher (“/喋喋不休”,“std_msgs /字符串”);stringSub = rossubscriber (“/喋喋不休”,“std_msgs /字符串”);%设置消息字段和发送信息stringMsg = rosmessage (“std_msgs /字符串”);stringMsg。Data =“Hello World !”;发送(stringPub stringMsg)%等待接收消息,然后检查价值(2)暂停showdetails (stringSub.LatestMessage)
数据:Hello World !

如何更新

设置数据格式名称发布者和订阅者的论点。

stringPub = rospublisher (“/喋喋不休”,“std_msgs /字符串”,“DataFormat”,“结构”);stringSub = rossubscriber (“/喋喋不休”,“std_msgs /字符串”,“DataFormat”,“结构”);

更新的数据格式rosmessage函数。

stringMsg = rosmessage (“std_msgs /字符串”,“DataFormat”,“结构”);stringMsg。Data =“Hello World !”;发送(stringPub stringMsg)

或者,rosmessage可以使用目标函数的出版商。这个语法产生一个消息格式中设置的出版商,是最有效的方式来确保消息和出版商之间的兼容性。

stringMsg = rosmessage (stringPub);stringMsg。Data =“Hello World !”;发送(stringPub stringMsg)

因为结构没有对象的功能,提供了新的功能来处理常见的ROS消息任务。显示细节的结构信息,使用rosShowDetails函数。看到所有提供的新功能,去消息处理函数

%等待接收消息,然后检查价值(2)暂停rosShowDetails (stringSub.LatestMessage)
ans = ' MessageType: std_msgs /字符串数据:Hello World !”

读rosbag工作流

例如,从一个读取消息rosbag,越多DataFormat名称-值参数的readMessages功能和任何出版商使用发送这些消息。

%从rosbag提取信息msgType =“nav_msgs /测程法”;袋= rosbag (“ex_multiple_topics.bag”);bagSelect =选择(包,“MessageType”,msgType);odomMsgs = readMessages (bagSelect,“DataFormat”,“结构”);odomMsg = odomMsgs {1}
odomMsg =结构体字段:MessageType:“nav_msgs /测程法”标题:[1 x1 struct] ChildFrameId: base_footprint的姿势:[1 x1 struct]: [1 x1 struct]
%创建发布者和发送的第一个消息odomPub = rospublisher (“/”奥多姆msgType,“DataFormat”,“结构”);发送(odomPub odomMsg)

消息处理函数

因为函数在ROS消息对象不使用的消息结构,介绍了新功能来处理消息。这个列表包括函数读取数据或写数据到专门的消息。

行为变化

处理类和结构的行为

转换过程中的重要考虑因素是ROS消息对象处理代码,这意味着消息对象作为输入提供给函数时以引用的方式传递。如果消息被修改在一个函数,在MATLAB®工作区中修改适用于消息。

msgObj = rosmessage (“geometry_msgs / Pose2D”);构成= (1 2 3);exampleHelperWritePoseToMsgObj (msgObj姿势)disp (msgObj)
ROS Pose2D消息与属性:MessageType:“geometry_msgs / Pose2D”X: 1 Y: 2θ:3使用showdetails显示消息的内容
函数exampleHelperWritePoseToMsgObj pointMsg (pointMsg,姿势)。X =姿势(1);pointMsg。Y =姿势(2);pointMsg。θ=构成(3);结束

消息结构只有通过它们的价值当输入功能。如果一个函数内修改消息结构,修改将只适用于结构函数的范围内。外提供修改的功能,必须返回的消息结构。

msgStruct = rosmessage (“geometry_msgs / Pose2D”,“DataFormat”,“结构”);构成= (1 2 3);%,没有回报,消息结构不会改变exampleHelperWritePoseToMsgObj (msgStruct姿势)disp (msgStruct)
MessageType: ' geometry_msgs / Pose2D ' X: 0 Y: 0θ:0
%从函数返回时,消息可以被覆盖。msgStruct = exampleHelperWritePoseToMsgStruct (msgStruct,姿势);disp (msgStruct)
MessageType: ' geometry_msgs / Pose2D ' X: 1 Y: 2θ:3
函数pointMsg pointMsg = exampleHelperWritePoseToMsgStruct (pointMsg,姿势)。X =姿势(1);pointMsg。Y =姿势(2);pointMsg。θ=构成(3);结束

这适用于专业的消息处理功能。写函数更新消息值现在有输出参数提供更新的消息结构。

形象= imread (“imageMap.png”);%消息对象味精= rosmessage (“sensor_msgs /形象”);味精。编码=“rgb8”;writeImage(味精、图像)imshow (readImage(味精))

图包含一个坐标轴对象。坐标轴对象包含一个类型的对象的形象。

%消息结构味精= rosmessage (“sensor_msgs /形象”,“DataFormat”,“结构”);味精。编码=“rgb8”;味精= rosWriteImage(味精、图像);imshow (rosReadImage(味精))

时间和持续时间算术

ROS时间和持续时间消息结构无法支持操作符重载的时间和持续时间对象一样。万博1manbetx算术和比较操作应由转换时间和期限结构数值秒值,执行操作,然后在必要时重新创建时间或期限结构。

%定期更新消息的时间戳与对象味精= rosmessage (“std_msgs /头”);runFor = rosduration (2);tNow = rostime (“现在”);往往= tNow + runFor;tNow <往往味精。邮票= tNow;%时发送消息暂停(1)tNow = rostime (“现在”);结束%定期更新消息的时间戳与结构味精= rosmessage (“std_msgs /头”,“DataFormat”,“结构”);runFor = 2;tNow = rostime (“现在”,“DataFormat”,“结构”);tNowSec = tNow。秒+ tNow.Nsec * 1 e-9;tEndSec = tNowSec + runFor;tNowSec < tEndSec味精。邮票= tNow;%时发送消息暂停(1)tNow = rostime (“现在”,“DataFormat”,“结构”);tNowSec = tNow。秒+ tNow.Nsec * 1 e-9;结束

数据字段胁迫

ROS消息对象,数据字段有特定的类型。当一个数据字段值设置,输入转换为正确的类型。否则,如果转换是不可能的,会返回一个错误。

味精= rosmessage (“std_msgs / Int8”);味精。数据= 20;类(msg.Data)
ans = ' int8 '

ROS消息结构本质上接受任何数据类型或字段名没有错误。

味精= rosmessage (“std_msgs / Int8”,“DataFormat”,“结构”);味精。Data =“测试”
味精=结构体字段:MessageType:“std_msgs / Int8”数据:“测试”
味精。数据= 20;类(msg.Data)
ans =“双”

相反,无效的数据类型错误当试图通过网络发送消息的活性氧。

酒吧= rospublisher (“/ int_topic”,“std_msgs / Int8”,“DataFormat”,“结构”);发送(酒吧、味精)
错误使用ros。出版商/发送(第290行)错误发布消息std_msgs型/ Int8主题名称/ int_topic。造成的:错误使用ros.internal.Node /出版领域的数据是错误的类型;预计int8。

为了防止错误,确保使用正确的消息从消息定义数据类型。

rosmsg显示std_msgs / Int8
int8数据

其他性能技巧

使用消息结构是一个很好的第一步加速ROS消息的发送和检索。结构设置和访问数据也提高了性能的嵌套的刑期。下面的代码演示了发送多条消息与嵌套的字段。

%建立网络(重用出版商所有例子)酒吧= rospublisher (“/ goal_path”,“nav_msgs /路径”,“DataFormat”,“结构”);%将机器人的新路径nPtsOnPath = 100;ipath = 1:15 pathMsg = rosmessage(酒吧);进行= 1:nPtsOnPath pathMsg.Poses(进行)= rosmessage (“geometry_msgs / PoseStamped”,“DataFormat”,“结构”);pathMsg.Poses .Pose.Position(进行)。X = ipath +进行;pathMsg.Poses .Pose.Position(进行)。Y = iPaths-iPts;pathMsg.Poses .Pose.Position(进行)。进行Z = (ipath +) / 10;结束发送(酒吧,pathMsg)结束

重用的消息

如果消息被创建和修改在一个循环,和相同的数据字段被设置每个迭代,它是快来创建消息只有一次。移动的创建消息外循环,和重用相同的消息在每个迭代的循环。

%设置消息使用pathMsg = rosmessage(酒吧);poseMsg = rosmessage (“geometry_msgs / PoseStamped”,“DataFormat”,“结构”);%将机器人的新路径nPtsOnPath = 100;ipath = 1:15进行= 1:nPtsOnPath pathMsg.Poses(进行)= poseMsg;pathMsg.Poses .Pose.Position(进行)。X = ipath +进行;pathMsg.Poses .Pose.Position(进行)。Y = iPaths-iPts;pathMsg.Poses .Pose.Position(进行)。进行Z = (ipath +) / 10;结束发送(酒吧,pathMsg)结束

提取操作嵌套消息

当阅读或者设置在一个嵌套多个字段信息,提取嵌套消息之前读取或设置字段。

%设置消息使用pathMsg = rosmessage(酒吧);poseMsg = rosmessage (“geometry_msgs / PoseStamped”,“DataFormat”,“结构”);ptMsg = poseMsg.Pose.Position;%提取嵌套的消息%将机器人的新路径nPtsOnPath = 100;ipath = 1:15进行= 1:nPtsOnPath%之前设置字段设置嵌套消息ptMsg。X = ipath +进行;ptMsg。Y = iPaths-iPts;ptMsg。进行Z = (ipath +) / 10;poseMsg.Pose。位置= ptMsg;pathMsg.Poses(进行)= poseMsg;结束发送(酒吧,pathMsg)结束

Preallocate消息结构体数组

相对较大的数组的消息,preallocating结构数组可以在一个循环中设置值时提高性能。使用这种方法时,数组是一个固定长度的每个迭代。

%设置消息使用pathMsg = rosmessage(酒吧);poseMsg = rosmessage (“geometry_msgs / PoseStamped”,“DataFormat”,“结构”);ptMsg = poseMsg.Pose.Position;%提取嵌套的消息% Preallocate路径数组nPtsOnPath = 100;pathMsg.Poses (nPtsOnPath) = poseMsg;%将机器人的新路径ipath = 1:15进行= 1:nPtsOnPath%之前设置字段设置嵌套消息ptMsg。X = ipath +进行;ptMsg。Y = iPaths-iPts;ptMsg。进行Z = (ipath +) / 10;poseMsg.Pose。位置= ptMsg;pathMsg.Poses(进行)= poseMsg;结束发送(酒吧,pathMsg)结束

ROS网络现在可以关闭。

rosshutdown
关闭全局节点/ matlab_global_node_72819 NodeURI http://dcc345885glnxa64:41089和http://localhost MasterURI: 49575。在http://172.29.207.151:49575上关闭ROS的主人。