Выполняя код с постоянными интервалами, можно точно времени и планирования задач. Использование rateControl
объект позволяет вам контролировать скорость выполнения кода. Эти примеры показывают различные приложения для rateControl
объект, включая его использование с ROS и отправку команд для управления роботом.
Создайте объект скорости, который работает с частотой 1 Гц.
r = rateControl(1);
Запустите цикл с помощью rateControl
объект внутри для управления выполнением цикла. Сбросьте объект перед выполнением цикла, чтобы сбросить таймер. Печать итерации и истекшее время.
reset(r) for i = 1:10 time = r.TotalElapsedTime; fprintf('Iteration: %d - Time Elapsed: %f\n',i,time) waitfor(r); end
Iteration: 1 - Time Elapsed: 0.002655 Iteration: 2 - Time Elapsed: 1.001775 Iteration: 3 - Time Elapsed: 2.000507 Iteration: 4 - Time Elapsed: 3.001433 Iteration: 5 - Time Elapsed: 4.001127 Iteration: 6 - Time Elapsed: 5.001328 Iteration: 7 - Time Elapsed: 6.000218 Iteration: 8 - Time Elapsed: 7.000240 Iteration: 9 - Time Elapsed: 8.000945 Iteration: 10 - Time Elapsed: 9.000661
Каждая итерация выполняется с интервалом в 1 секунду.
The rateControl
объект использует OverrunAction
свойство, чтобы решить, как обрабатывать код, который занимает больше необходимого периода для работы. Опции 'slip'
(по умолчанию) или 'drop'
. Этот пример показывает, как OverrunAction
влияет на выполнение кода.
Setup требуемой скорости и времени цикла. slowFrames
массив раз, когда цикл должен застопориться дольше, чем требуемая скорость.
desiredRate = 1; loopTime = 20; slowFrames = [3 7 12 18];
Создайте Rate
и задайте OverrunAction
свойство. 'slip'
указывает, что waitfor
функция вернется немедленно, если время для LastPeriod
больше, чем DesiredRate
свойство.
rate = rateControl(desiredRate);
rate.OverrunAction = 'slip';
Сброс Rate
объект и начальный цикл. Этот цикл будет выполняться с желаемой скоростью до тех пор, пока не будет достигнуто время цикла. Когда TotalElapsedTime
достигает медленного времени системы координат, застопорится дольше желаемого периода.
reset(rate); while rate.TotalElapsedTime < loopTime if ~isempty(find(slowFrames == floor(rate.TotalElapsedTime))) pause(desiredRate + 0.1) end waitfor(rate); end
Просмотр статистики по Rate
объект. Обратите внимание на количество периодов.
stats = statistics(rate)
stats = struct with fields:
Periods: [1x20 double]
NumPeriods: 20
AveragePeriod: 1.0205
StandardDeviation: 0.0421
NumOverruns: 4
Измените OverrunAction
на 'drop'
. 'drop'
указывает, что waitfor
функция вернется в следующий временной шаг, даже если LastPeriod
больше, чем DesiredRate
свойство. Это эффективно отбрасывает итерацию, которая была пропущена медленным выполнением кода.
rate.OverrunAction = 'drop';
Сброс Rate
объект и начальный цикл.
reset(rate); while rate.TotalElapsedTime < loopTime if ~isempty(find(slowFrames == floor(rate.TotalElapsedTime))) pause(1.1) end waitfor(rate); end stats2 = statistics(rate)
stats2 = struct with fields:
Periods: [1x16 double]
NumPeriods: 16
AveragePeriod: 1.2501
StandardDeviation: 0.4480
NumOverruns: 4
Использование 'drop'
действие над выполнением привело к 16 периодам, когда 'slip'
в результате 20 периодов. Это различие связано с тем, что 'slip'
не ждал следующего интервала на основе желаемой скорости. По существу, использование 'slip'
пытается сохранить AveragePeriod
свойство как близкое к желаемой скорости. Использование 'drop'
обеспечивает выполнение кода через четный интервал относительно DesiredRate
с пропущенными некоторыми итерациями.
rateControl
| waitfor
| rosrate
(ROS Toolbox)