Rospy的官方教程代码讲解(二)消息头和用户数据
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()
这个发布器发布的消息通过普通的订阅我们会看到
和没有Header时基本上是一样的,但如果我们通过rostopic echo来查看这个消息的完整的状态的话会看到:
我们会发现每个信息其实由两部分组成: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则是完全没有被用到(•ิ_•ิ)?
今天就到这里吧。。。
今天得锻炼。。。
怼高第街n号餐厅,周六去吃的,服务差态度差不干净死慢,点了6个招牌菜没有一个好吃的。进门直接领到厨房外小道边的两人小桌,餐具桌子都不干净,然后一直没人招呼,自己换了桌子叫来服务员,好不容易点完菜等好久饿的走不出去换一家,上菜间隔奇久,而且大菜最后上,最最重要的是,每个菜都好难吃,品相也不好,感觉就是拿剩下的菜端出来一样,味道奇咸,油腻不堪,更有一股恶心的怪味。。。整的我一直到现在都没有胃口吃饭。。。所以有助于减肥??Σ(っ°Д°;)っ
最后剩了一半的饭菜死活是没法下咽。。。真不知道大众上的好评都是哪来的(・`ω´・)
上一篇: LA 5007 Detector Placement 模拟
下一篇: 小程序中神秘的用户数据