主要内容

以固定的速率执行代码

简介

通过以固定的间隔执行代码,您可以准确地计时和安排任务。使用一个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跳过一些迭代。

另请参阅

|(ROS工具箱)|