ROS中的定频神器你会用吗

389 阅读5分钟

大家好,我是小鱼,今天周五,深圳天气非常的棒,可能因为靠海比较近,天非常的蓝,中午拍了一张照片,晚上就拿来当封面啦~

图片

今天和分享一个大家即熟悉又陌生的函数——rate.sleep()

1.可怜的Rate

很多小伙伴以为ros(2)中的rate休眠就真的只是休眠那么简单

其实不是(你这么想,ROS知道了该多伤心) 

小可怜Rate在背后其实做了很多的工作,以保证精准循环。

图片

2.动手做实验

图片

做实验

在使用Rate的时候,我们都会给定一个频率,比如像下面这样一段程序

rate = node.create_rate(1) #频率为1hz,周期:1/1=1s
start = time.time()
for i in range(10):    
    print(f"do some {i}")    
    time.sleep(1) #休眠1s    
    rclpy.spin_once(node)    
    rate.sleep() #调用一次rate.sleep()
end = time.time()
print(f'循环10次,耗时:{end-start}')

小鱼加了一个时间统计,记录循环开始的时间和结束的时间,并打印出时间差,即循环的耗时 阅读程序

现在让我们猜一猜最终的循环十次的耗时是多少?

小伙伴可能会想:

time.sleep(1)休眠了一秒,rate.sleep()也休眠1s,循环十次,最后的耗时应该是20s左右

我们运行代码看一下是不是20:

图片

运行结果

结果有点出乎意料,结果居然是10,这是为什么?小鱼改变一下time.sleep()休眠的时间,再试一次

图片

休眠0.1s

最终结果还是10,那么神奇吗

我们继续做实验,这次改变rate的频率,把它改成2再试试

图片

休眠10s

结果变成了5,好像循环的耗时跟time.sleep()的时间没关系,却跟rate的频率有关系。

到底是为什么?

图片

3.结果分析

将时间统计一下~

rate频率time.sleeprate.sleep循环周期(s)十次循环耗时循环频率Hz
1101101
10.10.91101
20.10.40.552

观察上表,我们可以发现,rate频率和循环频率是相同的,所以可以得出结论,rate可以控制整个循环的频率

那rate又是如何控制循环的频率呢

观察第三栏,rate.sleep()的时间,当time.sleep()时间改变时,rate.sleep()会动态改变自己的休眠时间来调整整个循环的周期, 是不是很智能的感觉。

4.总结

通过以上的分析,我们得出了rate的作用,那rate可以用来做什么呢?

当我们想让某个话题或者某个数据按照固定的频率hz发布的时候,我们就可以使用rate,来控制单次循环的时间

是不是要感叹一下ROS和ROS2设计时的优秀之处,当然rate还是有一些需要注意的地方,比如下面这种情况,留一个思考题给大家

图片 大家好,我是小鱼,今天周五,深圳天气非常的棒,可能因为靠海比较近,天非常的蓝,中午拍了一张照片,晚上就拿来当封面啦~

图片

今天和分享一个大家即熟悉又陌生的函数——rate.sleep()

1.可怜的Rate

很多小伙伴以为ros(2)中的rate休眠就真的只是休眠那么简单

其实不是(你这么想,ROS知道了该多伤心) 

小可怜Rate在背后其实做了很多的工作,以保证精准循环。

图片

2.动手做实验

图片

在使用Rate的时候,我们都会给定一个频率,比如像下面这样一段程序

rate = node.create_rate(1) #频率为1hz,周期:1/1=1sstart = time.time()for i in range(10):    print(f"do some {i}")    time.sleep(1) #休眠1s    rclpy.spin_once(node)    rate.sleep() #调用一次rate.sleep()end = time.time()print(f'循环10次,耗时:{end-start}')

小鱼加了一个时间统计,记录循环开始的时间和结束的时间,并打印出时间差,即循环的耗时 阅读程序

现在让我们猜一猜最终的循环十次的耗时是多少?

小伙伴可能会想:

time.sleep(1)休眠了一秒,rate.sleep()也休眠1s,循环十次,最后的耗时应该是20s左右

我们运行代码看一下是不是20:

图片

运行结果

结果有点出乎意料,结果居然是10,这是为什么?小鱼改变一下time.sleep()休眠的时间,再试一次

图片

休眠0.1s

最终结果还是10,那么神奇吗

我们继续做实验,这次改变rate的频率,把它改成2再试试

图片

休眠10s

结果变成了5,好像循环的耗时跟time.sleep()的时间没关系,却跟rate的频率有关系。

到底是为什么?

图片

3.结果分析

将时间统计一下~

rate频率time.sleeprate.sleep循环周期(s)十次循环耗时循环频率Hz
1101101
10.10.91101
20.10.40.552

观察上表,我们可以发现,rate频率和循环频率是相同的,所以可以得出结论,rate可以控制整个循环的频率

那rate又是如何控制循环的频率呢

观察第三栏,rate.sleep()的时间,当time.sleep()时间改变时,rate.sleep()会动态改变自己的休眠时间来调整整个循环的周期, 是不是很智能的感觉。

4.总结

通过以上的分析,我们得出了rate的作用,那rate可以用来做什么呢?

当我们想让某个话题或者某个数据按照固定的频率hz发布的时候,我们就可以使用rate,来控制单次循环的时间

是不是要感叹一下ROS和ROS2设计时的优秀之处,当然rate还是有一些需要注意的地方,比如下面这种情况,留一个思考题给大家

图片

为什么是10?