通过以固定的间隔执行代码,您可以准确地计时和安排任务。使用一个rateControl
对象允许您控制代码执行的速率。的不同应用程序rateControl
对象,包括它与ROS的使用和发送机器人控制命令。
创建一个运行在1hz的速率对象。
r = rateControl(1);
方法开始循环rateControl
对象内部来控制循环执行。在循环执行之前重置对象以重置计时器。打印迭代和时间消耗。
重置(右)为i = 1:10 time = r.TotalElapsedTime;流('迭代:%d -时间流逝:%f\n',我等待,时间)(r);结束
迭代:1 -时间流逝:0.003428迭代:2 -时间流逝:1.008492迭代:3 -时间流逝:2.001464迭代:4 -时间流逝:3.001801迭代:5 -时间流逝:4.003319迭代:6 -时间流逝:5.001040迭代:7 -时间流逝:6.002202迭代:8 -时间流逝:7.000384迭代:9 -时间流逝:8.001155迭代:10 -时间流逝:9.001238
每次迭代以1秒的间隔执行。
的rateControl
对象使用OverrunAction
属性决定如何处理操作时间超过所需时间的代码。选项有“滑”
(默认)或“下降”
.这个例子展示了如何OverrunAction
影响代码执行。
设置所需的速率和循环时间。slowFrames
循环停顿时间应长于所需速率的次数数组。
desiredRate = 1;loopTime = 20;slowFrames = [3 7 12 18];
创建率
对象,并指定OverrunAction
财产。“滑”
指示等待
函数将立即返回,如果时间为LastPeriod
大于DesiredRate
财产。
rate = rateControl(desiredRate);率。OverrunAction =“滑”;
重置率
对象并开始循环。此循环将以所需的速率执行,直到达到循环时间。当TotalElapsedTime
达到一个缓慢的帧时间,它将失速比所需的时间更长。
重置(率);而率。TotalElapsedTime < loopTime如果~isempty(find(slowFrames == floor(rate.TotalElapsedTime))) pause(desredrate + 0.1)结束等待(率);结束
查看相关统计信息。率
对象。注意周期的数量。
统计(率)
统计=带字段的结构:周期:[1.0007 1.0000 0.9999 1.1056 0.9986 0.9999 1.0002…][NumPeriods: 20 AveragePeriod: 1.0207 StandardDeviation: 0.0429 nummoverruns: 4 .
改变OverrunAction
来“下降”
.“下降”
指示等待
函数将在下一个时间步返回,即使LastPeriod
大于DesiredRate
财产。这有效地减少了由于较慢的代码执行而错过的迭代。
率。OverrunAction =“下降”;
重置率
对象并开始循环。
重置(率);而率。TotalElapsedTime < loopTime如果~isempty(find(slowFrames == floor(rate.TotalElapsedTime)))暂停(1.1)结束等待(率);结束Stats2 =统计(率)
stats2 =带字段的结构:周期:[1.0004 1.0007 0.9992 2.0044 0.9961 1.0003 2.0001…][NumPeriods: 16 AveragePeriod: 1.2501 StandardDeviation: 0.4482 NumOverruns: 4 .
使用“下降”
超过运行操作导致16个周期“滑”
结果是20个周期。这种差异是因为“滑”
没有等到基于期望速率的下一个间隔。从本质上讲,使用“滑”
试图保持AveragePeriod
属性,以接近所需的速率。使用“下降”
确保代码以相对于的均匀间隔执行DesiredRate
跳过一些迭代。
rateControl
|rosrate
(ROS工具箱)|等待