ros中关于ros::Rate 和ros::spin()等的理解

1.关于ros::Rate rate()和rate.sleep()的使用和理解

这两个函数是用来控制发布频率的,控制的是循环的频率,不是消息和服务的发布频率,通过控制循环频率从而可以控制发布频率

ros::Rate rate(50)             //定义一个频率

rate.sleep()                        //休眠

往往ros::Rate rate(50)是写在循环外面的,而rate.sleep()是在循环内的,来控制话题发布的频率。

这个频率是指运行上一次loop.sleep()到下一次loop.sleep()之间保持的时间,通常情况下,代码运行速度比设定的频率要快,所以如果运行到下一次loop.sleep()后未达到0.02s(1/50Hz),则会开始休眠,等到0.02s后再执行下一句程序。

2.关于ros::spin()和ros::spinonce()的使用和理解

总的作用是集中处理这个节点内的所有回调函数

当我们要订阅一个话题,用subscribe的时候,我们必须要用ros::spin()或者ros::spinonce()来调用回调函数。在话题订阅通信中,当Publish发布话题时,sub会订阅到同一话题,同时subscribe函数中还有一个queue_size参数,这个参数是回调函数列表的长度,任何一个发布和订阅,都会有其对应的发布缓存区和订阅缓存区,正如publisher和subscriber函数中都有缓存数量的参数(队列长度)。为什么有这个参数呢?

这是因为在发布和订阅过程中,如果发布频率过快,而回调函数中处理时间很长,则后面发布的话题的callback就会入队列,这个队列就是订阅缓冲区,而等到上一次的callback结束后,subscribe会在回调函数队列中找到时间戳最早的那一个进行回调,这样可以防止漏掉

通常在使用时,如果对实时性要求高,想每次只处理这一时刻的发布信息,那么queue_size最好设置为1,这样每一次的回调函数,回调的都是当前发布的话题。

如果不想错过所有发布的话题,那么就可以将queue_size设置的稍微大一点

如果queue_size是0,则表明回调函数队列是无穷大,可以一直塞下后面传来的话题的callback

例如:rospy.Subscriber('usb_cam/image_raw', Image, callback,queue_size=1)

当节点中有订阅话题时,必须要用ros::spin()和ros::spinonce()函数,通俗来讲,这两个函数都是唤醒回调函数中。

那么这两个函数有什么区别呢?

ros::spin():

当处理到ros::spin()时,会一直去话题订阅缓冲区中查看有没有回调函数,如果有则去处理回调函数,如果没有则继续查看并且等待,所以处理到了ros::spin()就不会执行除了回调函数以外别的东西了,节点此时只会等待并且处理回调函数

ros::spinonce():

当处理到ros::spinonce()时,会去话题订阅缓冲区中查看有没有回调函数,如果有则去处理回调函数,如果没有则继续往下执行,这里就有不同了,spinonce不会一直卡在回调函数那里,他只是查看一下缓冲区中有没有回调函数,而不是在等待回调函数的到来

猜你喜欢

转载自blog.csdn.net/weixin_62705892/article/details/127678310
ROS
今日推荐