Rospy的官方教程代码讲解(二)消息头和用户数据

Rospy的官方教程代码讲解(二)消息头和用户数据

刚刚发现的重大事实是ROS wiki里的rospy教程和github里rospy_tutorials代码是完全不同的
Σ(っ°Д°;)っ男默女泪啊 щ(゚Д゚щ) 我整个人都方了有木有。。。
先讲rospy_tutorials的,因为这个好像没有相关教程,只有代码(´•ω•`)

  • Rospy的官方教程代码讲解二消息头和用户数据
    • 消息头
    • 用户数据

消息头

直接上代码,带消息头的发布者:

#!/usr/bin/env python
# Software License Agreement (BSD License)

import sys

import rospy
from rospy_tutorials.msg import HeaderString

NAME = 'talker_header'

def talker_header():
    #对比之前发布的String,这里的HeaderString类型就是String前面加了一个Header信息
    pub = rospy.Publisher("chatter_header", HeaderString, queue_size=10)
    rospy.init_node(NAME) #blocks until registered with master
    count = 0
    while not rospy.is_shutdown():
        str = 'hello world %s'%count
        print str
        # 如果Header信息中填None,ROS会自动填入消息头信息
        pub.publish(HeaderString(None, str))
        count += 1
        rospy.sleep(0.1)

if __name__ == '__main__':
    talker_header()

这个发布器发布的消息通过普通的订阅我们会看到
Rospy的官方教程代码讲解(二)消息头和用户数据_第1张图片
和没有Header时基本上是一样的,但如果我们通过rostopic echo来查看这个消息的完整的状态的话会看到:
Rospy的官方教程代码讲解(二)消息头和用户数据_第2张图片
我们会发现每个信息其实由两部分组成:header和data
header中多出的信息包括seq:自节点启动后的消息计数,stamp:时间戳,frame_id:帧ID
这些信息可以通过header对象进行读取,如下方订阅器代码:

#!/usr/bin/env python
# Software License Agreement (BSD License)

import sys 
import rospy
from rospy_tutorials.msg import HeaderString

NAME = 'listener_header'

def callback(data):
    chatter = data.data  #获取了data中的信息
    header = data.header #获取了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"

消息头的主要作用是提供metadata,例如时间戳,计数,ID之类的信息,还是很有用处的(虽然我是没怎么用过呢( ̄▽ ̄))

用户数据

通过在订阅器定义中添加用户数据/回调参数,我们可以重复利用callback来响应多个不同的主题,也可以在响应同一个主题时,根据参数不同而做出不同的响应。

#!/usr/bin/env python
# Software License Agreement (BSD License)

NAME = 'listener_with_user_data'

import sys
import rospy
from std_msgs.msg import *

def callback(data, args):
    if args == 1:
        print "#1: I heard [%s]"%data.data
    elif args == 2:
        print "#2: I heard [%s]"%data.data
    else:
        print "I heard [%s] with userdata [%s]"%(data.data, str(args)) 

def listener_with_user_data():
    # Callback arguments (aka user data) allow you to reuse the same
    # callback for different topics, or they can even allow you to use
    # the same callback for the same topic, but have it do something
    # different based on the arguments.
    rospy.Subscriber("chatter", String, callback, 1) #这3行展示同一topic下
    rospy.Subscriber("chatter", String, callback, 2) #不同参数带来的不同结果
    rospy.Subscriber("chatter", String, callback, ("chatter1", 4))    
    #这一行代码展示了重复利用callback响应不同的topic
    rospy.Subscriber("chatter2", String, callback, "This is from chatter2")
    rospy.init_node(NAME, anonymous=True)
    rospy.spin()

if __name__ == '__main__':
    try:
        listener_with_user_data()
    except KeyboardInterrupt, e:
        pass
    print "exiting"

启动一个chatter和一个chatter2的发布器后,我们可以看到效果
这里需要注意一下,教程自带的launch文件可能有误,我不是很理解作者的想法,可能我的理解还有问题。需要修改launch文件,把中的chatter1改为chatter才能有效,否则只会订阅到chatter2的消息,而chatter3则是完全没有被用到(•ิ_•ิ)?
Rospy的官方教程代码讲解(二)消息头和用户数据_第3张图片

今天就到这里吧。。。
今天得锻炼。。。
怼高第街n号餐厅,周六去吃的,服务差态度差不干净死慢,点了6个招牌菜没有一个好吃的。进门直接领到厨房外小道边的两人小桌,餐具桌子都不干净,然后一直没人招呼,自己换了桌子叫来服务员,好不容易点完菜等好久饿的走不出去换一家,上菜间隔奇久,而且大菜最后上,最最重要的是,每个菜都好难吃,品相也不好,感觉就是拿剩下的菜端出来一样,味道奇咸,油腻不堪,更有一股恶心的怪味。。。整的我一直到现在都没有胃口吃饭。。。所以有助于减肥??Σ(っ°Д°;)っ

最后剩了一半的饭菜死活是没法下咽。。。真不知道大众上的好评都是哪来的(・`ω´・)

你可能感兴趣的:(ROS)