赞
踩
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}')
执行周期 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。
执行周期 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。
但在实际应用中,为了避免延迟影响节点的运行频率,需要确保节点操作在设定的循环周期内完成。如果节点操作的执行时间不稳定或者受到外部因素影响,可能需要考虑调整循环频率或者优化节点操作的实现。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。