2021SC@SDUSC
ROS源码阅读(4)
接下来我们继续看ros的tutorials,这里一共包含几个大类,包含了ros的几大功能的演示
一.talker and listener
这个教程实现的是发布者、订阅者和topic的模型,首先注册topic,然后发布者发布topic内容,订阅者订阅topic获得内容。
首先来看位于“/home/username/ros_catkin_ws/install_isolated/share/rospy_tutorials/001_talker_listener”的talker.py
在这一部分实现了发布者的部分:
pub = rospy.Publisher()
首先注册发布者以及进入这个函数后,在生成了topic名等。
rospy.init_node()
然后启动节点,所以我们发现topic先于node发出去了,然后我就回到上一步的函数中继续看,发现了注释中有这么一句话“Topics and Services can be created before init_node is called.In general, this is okay”,所以topic和服务都是可以这么干的。然后这一部分进去之后启动了发布者节点。
while not rospy.is_shutdown():
hello_str = "hello world %s" % rospy.get_time()
rospy.loginfo(hello_str)
pub.publish(hello_str)
rate.sleep()
这一部分就是发布topic内容,那个publish不停的发布“helloworld+time”
然后就是看仍然位于这个文件夹下的listener.py文件了
rospy.init_node()
首先启动订阅者节点,启动节点的内部函数和上面的相同
rospy.Subscriber()
然后注册订阅者,需要写一个回调函数来保证每次收到topic的内容时订阅者可以做出一些反应,回调函数在上面的callback
rospy.spin()
最后的spin保证了node结束之前python不要退出
二.headers
这一部分实现的是对headers message的传输,仍然是使用topic为载体。根据官方注释,我们可以了解到“A message may include a special message type called ‘Header’”,所以,这只是一种特殊消息类型。
我们来看位于002_headers下的headers例程talk_headers.py
基本格式就是publisher的格式,只是在publish的位置改了一些内容
pub = rospy.Publisher("chatter_header", HeaderString, queue_size=10)
在注册publish的时候标记了传输的信息类型
pub.publish(HeaderString(None, str))
在发布的时候使用了HeaderString的格式类型,这个是rospy.msg中定义得类型,其他都没有改变
再看listener_headers.py
在这里仍然是注册的时候参数发生变化
rospy.Subscriber("chatter_header", HeaderString, callback)
然后就是在回调函数中,我们可以明显的看到数据类型的使用方法
chatter = data.data
header = data.header
timestamp = header.stamp.to_sec()
所以这个例程主要是实现了对其他特殊消息类型的使用,对我们使用其他消息类型提供了一个范例。
后面还有几个例程,我们可以去挑出几个来边了解他的使用机制,边看内部实现。对比较重要的实现我们就可以拿出来记录下来。