大家好,我是加班加到天亮的小鱼,今天加班晚了,没来得及更新公众号。晚上回来路上刚好看到一个鱼粉在群里问关于ROS中一些常用但不好理解的小问题,小鱼今天就和大家分享一下,临时根据经验写的,不对之处欢迎大家指出。
1.原问题
1.ros C++编程,有一个 sleep函数。这个函数说的是,用来休眠,和发布频率有关。这二者是怎么联系上的,可以用具体的数字举例吗?2.在ros编程中的, 那个 spinonce函数,是用来干什么的,应该放在哪个位置?我看官方代码放在while循环里面。是只能放在循环里面吗?3.关于话题通信,消息队列的问题。我没有搞懂里面的通信。假设我发布10个队列,那么订阅者怎么知道我订阅的是十个队列中的那一个?4.消息队列和发布频率,以及sleep,spinonce这四个之间有联系吗?
2.问题1小解答
ros中的rate.sleep很聪明,它会自动记录这一次sleep和上一次sleep的间隔,并且和你所设置的rate速率匹配。
比如:当你使用
rate=Rate(1)
for(int i=0;i<10;i++)
{
time.sleep(0.5)
rate.sleep()
}
如果你认为执行耗时是 (1+0.5)*10=15s
结果应该是0.5+1*10=10.5s(口算的,可以试试哈)
因为rate根据你设置的1s一次,尽量配合循环内其他程序,将整个循环变成1s循环一次。
3.问题2小解答
关于spinonce()
当一个节点收到数据的时候,并不会直接进行回调函数,而是等待spin()或者spinonce时集中处理。
单次spinonce()只是检查一次数据。当我们有死循环的时候,最好使用spinonce()进行检查,防止数据发不出去和接收不到。
4.问题3小解答
关于话题发布的queue_size问题,这个和一个鱼粉讨论过。
Publisher的消息队列是为了缓存发布节点发布的消息,比如现在网络差,消息发不出去,这时候有两个选择,一个丢掉一个存着等会发,存着存少呢?这就是队列大小的用处。
一旦队列中消息的数量超过了queue_size,那么最先进入队列的(最老的)消息被舍弃。
订阅者的大小就有所不同,当我们来不及spin的时候,有两种选择,一个是先存起来,一个是丢掉。系统接收的缓冲区有多大呢?这就是订阅者队列大小的用处。
所以发布者队列大小和订阅者队列大小没啥直接关系,具体设置要根据你的网络环境,消息类型来操作。
5.问题4小解答
spinonce()和rate.sleep()一般是在一个循环里用,保证既可以收到spinonce()确保可以接收到外部消息和发送出去,rate.sleep()用于保证整个循环的时间,如果我们rate设置成1,那就意味着一秒中spinonce()一次,这样可能会造成你的消息有所滞后。
还是要根据具体情况进行设置。
6.总结
只要小鱼足够努力,老板就能过上更幸福的生活。
开句玩笑哈,最后欢迎各位鱼粉加入鱼群,一起交流学习机器人技术~