今天加班晚了,把鱼粉的问题拿出来水一下~

大家好,我是加班加到天亮的小鱼,今天加班晚了,没来得及更新公众号。晚上回来路上刚好看到一个鱼粉在群里问关于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.总结

只要小鱼足够努力,老板就能过上更幸福的生活。

开句玩笑哈,最后欢迎各位鱼粉加入鱼群,一起交流学习机器人技术~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值