ROS入门(二):如何设计自定义消息

在上一篇博文中了解了如何编写一个简单的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 = 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值