前言
ROS中,节点之间通过发布话题和订阅话题来通信,在程序中是通过消息发布器和订阅器来实现,数据流通过话题的发布和订阅在节点之间传播,而数据流的数据类型则称为消息,例如ros入门教程中的节点talker和listener之间通过话题”chatter”来传递数据流,而数据流的具体数据类型则是std_msgs/String。参见http://wiki.ros.org/cn/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29
使用命令行工具查看消息类型
教程中只介绍了std_msgs/String消息的发布和接收,但我们经常还需要传递其他类型比如整形,字符型等数据,这些类型的如何传递呢?实际上std_msgs中已经包含了所有的基本数据类型,我们可以rosmsg指令对我们不了解的数据类型进行详细的考察。
打开一个新终端,键入
|
|
可以看到
|
|
使用
|
|
ros会输出工作空间中已经存在的所有类型消息,我们在其中可以找到std_msg包含的所有消息类型
再用
可已看到
|
|
也就是说,std_msgs/Int8实际上是由一个int8 类型的对象data组成,知道这些信息,我们就能够正确的构造消息发布器和订阅了
发布接收消息参考示例
要发布一个消息,正确的做法应该是
1.包含相应的头文件
2.定义节点句柄和发布器,要指明发布的数据类型,话题和缓存队列大小
3.定义一个相应数据类型的对象并给其成员赋值
4.发布消息
参考下面代码片段
接收程序类似,也有几点需要注意
1.包含相应的头文件
2.定义节点句柄和订阅器,要指明订阅器订阅的话题,缓存队列大小和回调函数名
3.编写回调函数,回调函数的形参数据类型一定要对应正确的数据类型
4.进入循环
|
|
另外,std_msg下还包含了基本数据类型的向量,我们也可以很方便地传递向量,不过除了上面包含的步骤外,向量的赋值要格外注意,应该使用pushback()函数来填充数据。例如一个double类型向量,应该这样发布