2021SC@SDUSC
ROS源代码阅读(5)
在这一部分我们接着看ros_tutorials功能包的后面几个重要功能
三.listener_with_userdata
首先我们看一下位于相同位置的第三个tutorial
在这里只有一个listener的代码完成了对订阅者的实现,其中主要是展示了一些小技巧
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)))
首先就是callback函数,实现了一个回调函数对不同topic的处理,所以对应的就是在接受topic信息时定的参数来区别不同的topic
rospy.Subscriber("chatter1", String, callback, 1)
在生成subscriber的过程中主要是把callback函数注册在案,然后每次得到内容时就可以直接调用了
四.listener_subscribe_notify
在这里实现了多个订阅者对一个topic的订阅。
首先我们看listener_subscribe_notify.py中出现了一个类定义
class ChatterListener(rospy.SubscribeListener):
这个类中有两个函数,这个类实现的是作为参数传入生成publisher的函数中,然后对有新的订阅者订阅或者断开连接时的回调,就是在有新的订阅者订阅时,或者断开订阅时,都会调用到这里的回调函数
pub = rospy.Publisher("chatter", String, subscriber_listener=ChatterListener(), queue_size=10)
后面的publisher注册的时候参数增加subscriber_listener这个options
可以看一下下面的输出结果,在开始的时候调用回调函数,然后后面正常输出helloworld
五.add_two_ints
这个tutorials主要完成的是对服务的定义和调用
先看定义服务,在add_two_ints_server.py中
s = rospy.Service('add_two_ints', AddTwoInts, add_two_ints)
在服务器里通过启动一个常活跃节点来作为服务器接收request信息,通过上面这行代码注册服务,并提供服务的详细信息
在服务被调用时会返回来调用服务器的回调函数,在回调函数中输入一个req的参数作为请求内容,然后回调函数就可以对这部分进行处理。
然后再看client,client并不需要是一个节点,因为他可以像调用函数一样直接调用服务
rospy.wait_for_service('add_two_ints')
这一行是在等待服务器的启动,当服务器启动以后,就可以调用服务了
add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)
这一步生成了一个handle,来保持和服务器的连接
# simplified style
resp1 = add_two_ints(x, y)
# formal style
resp2 = add_two_ints.call(AddTwoIntsRequest(x, y))
这是两种调用服务的方式
这样就完成了定义服务器和调用服务的过程。