ros spin spinonce

publisher和subscriber 的处理流程:

  • 消息发布器在一个while里面一直循环发送“hello world”到话题(topic)chatter上。
  • 消息订阅器一旦知道chatter上面有data【订阅的话题上来了数据】,就会将这data作为参数传入callback函数中,但是此时还没有执行Callback函数,而是把Callback函数放到了一个回调函数队列中
  • 所以当发布器不断发送data到chatter上面时,就会有相应的callback函数进入队列中,它们函数名一样,只是实参不一样

问题:那什么时候处理回调函数队列中的回调函数了?这就是 ros::spin() 需要做的工作了

  • 对于spin函数,一旦进入spin函数,它就不会返回了,也不继续往后执行了,相当于它在自己的函数里面死循环了(直到ctrl+c 或者程序终止的时候才退出)。
  • 主要的工作,就是不断的检查回调函数队列里面是否有callback函数存在,如果有的话,它就会马上去执行callback函数。如果没有的话,它就会阻塞,不会占用CPU。

ros::spinOnce() 功能

回调函数的队列的创建和上面的分析是一样的,这里讲一讲ros::spinOnce() 的处理流程:

  • 当spinOnce函数被调用时,spinOnce就会调用回调函数队列中第一个callback函数,此时callback函数被执行。
  • spinOnce函数执行一次后,接着执行下面的语句。不像spin函数,进入到自己的内部循环,不往下执行。
  • 等到下次spinOnce函数又被调用时,回调函数队列中第二个callback函数就会被调用,以此类推。

问题: 那我们如何控制执行的速度了,也就是执行的频率。从上面的实例中,我们看到多了:

结合ros::Rate一起使用

ros::Rate loop_rate(5); 设置执行频率
loop_rate.sleep(); 配合执行频率,sleep一段时间,然后进入下一个循环。
通过这样的设置,我们就可以设计自己的监听频率了,而不用完全被动的接收topic了。

————————————————
版权声明:本文为CSDN博主「默_存」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40215443/article/details/103793316

posted @ 2022-11-03 10:29  DNGG  阅读(176)  评论(0)    收藏  举报