欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-07 19:46:37
...

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

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

消息头

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

#!/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的官方教程代码讲解(二)消息头和用户数据
和没有Header时基本上是一样的,但如果我们通过rostopic echo来查看这个消息的完整的状态的话会看到:
Rospy的官方教程代码讲解(二)消息头和用户数据
我们会发现每个信息其实由两部分组成: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文件,把<node name="talker_1" pkg="rospy_tutorials" type="talker" args="chatter:=chatter1"/>中的chatter1改为chatter才能有效,否则只会订阅到chatter2的消息,而chatter3则是完全没有被用到(•ิ_•ิ)?
Rospy的官方教程代码讲解(二)消息头和用户数据

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

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

相关标签: ROS Python rospy