ROS中的定频神器

57 篇文章 48 订阅
27 篇文章 31 订阅

本系列教程作者:小鱼
公众号:鱼香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()休眠的时间,再试一次

休眠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
完整测试代码: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+(比赛奖金)
目前在输出机器人学习指南、论文注解、工作经验,欢迎大家关注小鱼,一起交流技术,学习机器人

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值