本系列教程作者:小鱼
公众号:鱼香ROS
QQ交流群:139707339
教学视频地址:小鱼的B站
版权声明:如非允许禁止转载与商业用途。
大家好,我是小鱼,今天周五,深圳天气非常的棒,可能因为靠海比较近,天非常的蓝,中午拍了一张照片,晚上就拿来当封面啦~
今天和分享一个大家即熟悉又陌生的函数——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()休眠的时间,再试一次
最终结果还是10,那么神奇吗

我们继续做实验,这次改变rate的频率,把它改成2再试试
结果变成了5,好像循环的耗时跟time.sleep()的时间没关系,却跟rate的频率有关系。
到底是为什么?
3.结果分析
将时间统计一下~
rate频率 | time.sleep | rate.sleep | 循环周期(s) | 十次循环耗时 | 循环频率Hz |
---|---|---|---|---|---|
1 | 1 | 0 | 1 | 10 | 1 |
1 | 0.1 | 0.9 | 1 | 10 | 1 |
2 | 0.1 | 0.4 | 0.5 | 5 | 2 |
观察上表,我们可以发现,rate频率和循环频率是相同的,所以可以得出结论,rate可以控制整个循环的频率
那rate又是如何控制循环的频率呢,观察第三栏,rate.sleep()的时间,当time.sleep()时间改变时,rate.sleep()会动态改变自己的休眠时间来调整整个循环的周期,是不是很智能的感觉。
4.总结
通过以上的分析,我们得出了rate的作用,那rate可以用来做什么呢?
当我们想让某个话题或者某个数据按照固定的频率hz发布的时候,我们就可以使用rate,来控制单次循环的时间
是不是要感叹一下ROS和ROS2设计时的优秀之处,当然rate还是有一些需要注意的地方,比如下面这种情况,留一个思考题给大家
完整测试代码:csdn
from rclpy.node import Node
import rclpy
import time
rclpy.init()
node = rclpy.node.Node("rate_test")
rate = node.create_rate(2) #频率为1hz,周期:1/1=1s
start = time.time()
for i in range(10):
print(f"do some {i}")
time.sleep(1)#休眠0.1s
rclpy.spin_once(node)
rate.sleep() #调用一次rate.sleep()
end = time.time()
print(f'循环10次,耗时:{end-start}')
rclpy.shutdown()
技术交流&&问题求助:
- 微信公众号及交流群:鱼香ROS
- 小鱼微信:AiIotRobot
- QQ交流群:139707339
- 版权保护:已加入“维权骑士”(rightknights.com)的版权保护计划
作者介绍:
我是小鱼,机器人领域资深玩家,现深圳某独脚兽机器人算法工程师一枚
初中学习编程,高中开始接触机器人,大学期间打机器人相关比赛实现月入2W+(比赛奖金)
目前在输出机器人学习指南、论文注解、工作经验,欢迎大家关注小鱼,一起交流技术,学习机器人