【ROS2】Rate定频函数

【ROS2】Rate定频函数

简介

rate.sleep() 是 ROS 中用于控制循环频率的方法之一。在 ROS 的节点中,通常会在循环中执行一些操作,例如读取传感器数据、执行控制指令等。为了控制节点的循环频率,可以使用 rate.sleep() 方法。

rate = rospy.Rate(1)  # 设置循环频率为1Hz
while not rospy.is_shutdown():
    # 在这里执行节点的操作

    rate.sleep()  # 控制循环频率

rate并不是简单的延时函数,个人理解为,它通过发送设置频率的方波,循环在上升沿触发进行执行,如下图:
在这里插入图片描述
但也就存在两个问题,当“执行”的时间小于或者大于rate设定周期时间。
先说结论:

  • “执行”时间 < 循环周期:程序会在当前循环中等待,直到下一个上升沿。
  • “执行”时间 > 循环周期:节点等待程序执行完成,然后继续执行下一个循环。

实验

在该实验中,使用延时函数模拟执行节点的操作。Rate相关代码:

    # Rate实验
    start = time.time()
    for i in range(5):
        t1 = time.time()
        print(f"执行周期 {i}")
        time.sleep(1.5) #休眠1s
        t2 = time.time()
        rclpy.spin_once(node)
        rate.sleep() #调用一次rate.sleep()
        t3 = time.time()
        print(f'time.sleep()耗时:{t2-t1};rate.sleep()耗时:{t3-t2};单次循环耗时:{t3-t1}')
    end = time.time()
    print(f'循环5次耗时:{end-start}')
情形1: “执行”时间 < 循环周期 :
执行周期 0
time.sleep()耗时:0.5012271404266357;rate.sleep()耗时:0.4996984004974365;单次循环耗时:1.0009255409240723
执行周期 1
time.sleep()耗时:0.5005989074707031;rate.sleep()耗时:0.4995696544647217;单次循环耗时:1.0001685619354248
执行周期 2
time.sleep()耗时:0.5006906986236572;rate.sleep()耗时:0.4988436698913574;单次循环耗时:0.9995343685150146
执行周期 3
time.sleep()耗时:0.5008957386016846;rate.sleep()耗时:0.4990847110748291;单次循环耗时:0.9999804496765137
执行周期 4
time.sleep()耗时:0.500617504119873;rate.sleep()耗时:0.49898624420166016;单次循环耗时:0.9996037483215332
循环5次耗时:5.000702857971191

可以看到,当执行时间为0.5s时,在该循环内会继续等待下一个上升沿的触发,rate.sleep()去填补剩下的0.5s保证一个周期时间为1s。


情形2: “执行”时间 > 循环周期 :
执行周期 0
time.sleep()耗时:1.5016310214996338;rate.sleep()耗时:0.0011265277862548828;单次循环耗时:1.5027575492858887
执行周期 1
time.sleep()耗时:1.5015594959259033;rate.sleep()耗时:0.0008554458618164062;单次循环耗时:1.5024149417877197
执行周期 2
time.sleep()耗时:1.5020825862884521;rate.sleep()耗时:0.002195596694946289;单次循环耗时:1.5042781829833984
执行周期 3
time.sleep()耗时:1.5017659664154053;rate.sleep()耗时:0.000698089599609375;单次循环耗时:1.5024640560150146
执行周期 4
time.sleep()耗时:1.5016288757324219;rate.sleep()耗时:0.0008542537689208984;单次循环耗时:1.5024831295013428
循环5次耗时:7.528472900390625

当执行时间为1.5s大于单个周期的1s,Rate将等待程序执行完成,在开始下一个周期,所以单次循环耗时1.5s。

但在实际应用中,为了避免延迟影响节点的运行频率,需要确保节点操作在设定的循环周期内完成。如果节点操作的执行时间不稳定或者受到外部因素影响,可能需要考虑调整循环频率或者优化节点操作的实现。

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值