
消息的格式
开学仪式-环保教育
2023年3月17日发(作者:energyplus)ROS学习(四):消息格式
消息(message)是⽤于节点之间的数据交换的⼀种数据形式。前述的话题、服务和动作都使⽤消息。消息可以是简单的数据结构,如
整数(integer)、浮点(floatingpoint)和布尔值(boolean),或者是像“geometry_msgs/PoseStamped”31⼀样消息包含消息
的简单的数据结构,或者也可以是像“float32[]ranges”或“Point32[10]points”之类的消息数组结构。另外,ROS中常⽤的头
(header、std_msgs/Header)也可以作为消息来使⽤。这些消息由两种类型组成:字段类型(fieldtype)和字段名称(fieldname)。
字段类型应填⼊ROS数据类型,如下表所⽰。字段名称要填⼊指⽰数据的名称。例如,您可以按照下⾯两⾏填⼊。这只是最简单的消息
形式,如果要添加更多的消息,则可以将字段类型作为如下表所⽰的数组,并且常常使⽤消息包含消息的形式。
前⾯讲到ROS中常⽤的头(header、std_msgs/Header)可以作为消息来使⽤。更具体来说,正如std_msgs32的⽂件中
描述,会记录序列号、时间戳和框架ID,利⽤它们在消息中记录消息的计数以及时间的计算。
消息在程序中的实际⽤法如下。ROS操作测试中执⾏的turtlesim功能包的teleop_turtle_key节点的例⼦中,根据⽅向键(←、→、↑、
↓)将turtlesim节点的转速(meter/sec)和旋转速度(radian/sec)⽤消息发送给turtlesim_node节点。乌龟机器⼈使⽤接收到的速
度值在屏幕上移动。此时使⽤的消息是geometry_msgs中的Twist33消息,是如下形式。
它以Vector3消息的形式声明了linear和angular。它是消息包含消息的形式,其中,Vector3消息是geometry_msgs34之⼀。这个
Vector335具有以下形式。
换句话说,从teleop_turtle_key节点发布的话题是linear.x、linear.y、linear.z、angular.x、angular.y和angular.z。所有这些都是
float64格式,这是上⾯描述的ROS基本类型之⼀。利⽤它,键盘的箭头以平移速度(meter/sec)和旋转速度(radian/sec)消息传
送,从⽽驱动TurtleBot。
前⼀篇博⽂中描述的基于消息的话题、服务和动作都使⽤消息,这些消息在形式和概念上都是相似的,但根据其⽤法分为三类。这将在
接下更详细地讨论。
⽂件
msg⽂件是⽤于话题的消息⽂件,扩展名为*.msg。例如,上述geometry_msgs中的Twist36消息是有代表性的。这种msg⽂件只包含⼀
个字段类型和⼀个字段名称。
⽂件
srv⽂件是服务使⽤的消息⽂件,扩展名为*.srv。例如,sensor_msgs的SetCameraInfo37消息是典型的srv⽂件。与msg⽂件的主
要区别在于三个连字符(---)作为分隔符,上层消息是服务请求消息,下层消息是服务响应消息。
⽂件
action消息38⽂件是动作39中使⽤的消息⽂件,它使⽤*.action扩展名。与msg和srv不同,它不是⼀个⽐较常见的消息⽂件,所以没
有典型的官⽅消息⽂件,但是可以像下⾯的例⼦⼀样使⽤它。与msg和srv⽂件的主要区别在于,三个连字符(---)在两个地⽅⽤作分隔
符,第⼀部分是goal消息,第⼆部分是result消息,第三部分是feedback消息。最⼤的区别是来⾃action⽂件的feedback信息。action⽂
件的goal消息和result消息与上述srv⽂件的请求消息和响应消息⾓⾊相同,但action⽂件的feedback消息⽤于传输指定进程执⾏过程中
的中途值。在下⾯的例⼦中,当机器⼈的出发点start_pose和⽬标点goal_pose的位置和姿态作为请求值被传送时,机器⼈移动到预定的
⽬标位置并且将发送最终到达的result_pose的位置和姿态。另外,⽤percent_complete消息,周期性地发送到达⽬标地点进程的百分
⽐。