在上一篇博文中了解了如何编写一个简单的ROS收发程序。但是上次只涉及到标准消息库std_msg中的string类型。如果我们需要传送更复杂的信息如包含多个数据的结构化信息或图像等,就需要设计自定义消息。
本文通过学习rospy中002-004三部分的代码学习如何设计自定义消息、编写launch文件以及更新package.xml文件
更新:20180726 增加007示例中涉及消息的部分
接下来我们逐一分析002-004三份代码,三份代码都附有launch文件。
利用$ roslaunch <launchfile>
进行实验能够加深对节点中具体操作的理解。
示例007中介绍了在消息和服务中加入字典形式的数据,这里将消息的部分并入本文档。
002_headers:学习rospy中的Header类
编写一个涉及自定义消息的收发程序主要有以下步骤:
- 新建msg文件夹并创建msg文件
$ touch msg/HeaderString.msg
- 编写节点代码 ‘listener_header.py’ ,’talker_header.py’
- 编写headers.launch文件
- 修改package.xml
HeaderString.msg
Header header
string data
listener_header.py
#!/usr/bin/env python
import sys
import rospy
from rospy_tutorials.msg import HeaderString
NAME = 'listener_header'
def callback(data):
chatter = data.data
header = data.header
timestamp = header.stamp.to_sec()
print rospy.get_caller_id(), header.seq, "I just heard that %s at %12f"%(chatter, timestamp)
def listener_header():
rospy.Subscriber("chatter_header", HeaderString, callback)
rospy.init_node(NAME, anonymous=True)
rospy.spin()
if __name__ == '__main__':
try:
listener_header()
except KeyboardInterrupt, e:
pass
print "exiting"
与001示例中的listener相比:
-
需要引用msg文件夹中的HeaderString类
-
自定义信息由(Header + string)组成
Header类是std_msg的继承类,包括seq,stamp,frame_id三个内容。其中stamp是创建类时传入参数或由genpy.Time生成的时间信息,通过stamp.sec 及 stamp.nsec(纳秒)可获得时间数据。
Header文件地址:/opt/ros/kinetic/lib/python2.7/dist-packages/std_msgs/msg/_Header.py 之前的listener是没有终止条件的
- 这里通过KeyboardInterrupt类实例e触发停止
talker_header.py
#! /usr/bin/env python
import sys
import rospy
from rospy_tutorials.msg import HeaderString
NAME =