由浅到深理解ROS(4)

消息和消息类型

节点能相互传递消息,节点之间通信也是基于消息。消息类型也就是数据类型数据类型,理解消息的类型很重要,因为它决定了消息的内容。也就是说,一个话题的消息类型能告诉你该话题中每个消息携带了哪些信息,以及这些信息是如何组织的。正如开篇提到的geometry_msg/Twist ,Twist就是消息类型。
利用rosmsg show geometry_msg/Twist 查看消息类型的详情如下:
 
geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z
 
该例中,linear 和 angular 都是复合域,其数据类型是 geometry_msgs/Vector3。缩进格式表示命名为x,y和z的域,是对应的上级两个域之一的成员。也就是说,geometry_msgs/Twist 消息包含六个成员,并且以两个向量的形式组织,分别为 linear 和 angular。其中每个数值都是基本数据类型 float64,即每个数值都
是 64位浮点型 数据。一般来说,一个复合域是由简单的一个或者多个子域组合而成,其中的每一个子域可能是另一个复合域或者独立的域,而且它们一般也都由基本数据类型组成。同样的思想也出现在 C++以及其他面向对象的编程语言中,即对象的数据成员可能是其他对象。
此外,上述复合域本身也可以作为消息类型。例如,一个具有消息类型 geometry_msgs/Vecotr3 的话题是完全符合语法的假如利用命令 rosmsg show geometry_msgs/Vecotr3 则类型的详情是:

  float64 x
  float64 y
  float64 z
 
每行一个元素,每个域由基本数据类型(float64)以及域名称(x、y和z)定义。该类型的消息包含三个顶层域,即x、y和z。这种嵌套组织方法有助于提高代码的复用率,尤其是在该系统中很多消息类型共享相同的数据类型。一个常见的例子是 std_msgs/Header 消息类型,其包含一些基本的序列号,时间戳以及坐标系等信息。这种类型将作为一个复合域(一般称作 header)出现在在上百个其他的消息类型中。幸运地是, rosmsg show 命令在显示消息类型时自动向下展开复合域直到基本类型为止,同时使用缩进的形式来展示这种嵌套结构,因此一般没有必要直接查看这些内层结构的消息类型。
消息类型同样可以包含固定或可变长度的数组(用中括号[]表示)和常量(一般用来解析其他非常量域)。比如在 3Dslam 中会用到点云,表示点云的消息 sensor_msgs/PointCloud  则类型的详情是:
 
Header header
geometry_msgs/Point32[]  points  
ChannelFloat32[]       channels           

这个消息包含3 d点的集合,加上可选的额外的每一点信息,在给定的帧头每个Point32应解释为一个3 d点。也许表示激光雷达数据的类型rosmsg show sensor_msgs/LaserScan会更好理解,但是这里不再熬述。

理解消息类型的命名:

和ROS里其他的程序一样,每条消息类型都属于一个特定的包。消息类型名总会包含一个斜杠"/",斜杠前面的名字是包含它的包,例如 geometry_msgs/Twist

功能包名:geometry_msgs  类型名称:Twist  消息类型:geometry_msgs/Twist

这种命名方式的好处是把包的名字包含在消息类型名里能避免命名冲突。

举个例子比如:geometry_msgs/Pose 和 turtlesim/Pose 是有区别的消息类型,它们包含了不同的(但概念上是类似的)数据。这也有助于猜测它的含义。例如,消息类型 ModelState 单独出现可能会让人产生迷惑,但是以 gazebo/ModelState 的形式出现后,就会指明这个消息类型是 Gazebo 仿真器中的一部分,而且很有可能包含了这个仿真器中某个模型的状态信息。

 

今后笔者会结合简单的开发程序继续讲解。

posted @ 2016-05-30 15:14  jason来自星星  阅读(7283)  评论(0编辑  收藏  举报