当前位置:   article > 正文

【ROS2】Rate定频函数_ros python rate sleep

ros python rate sleep

【ROS2】Rate定频函数

简介

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

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

    rate.sleep()  # 控制循环频率
  • 1
  • 2
  • 3
  • 4
  • 5

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
情形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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

可以看到,当执行时间为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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/540580
推荐阅读
相关标签
  

闽ICP备14008679号