Выполнение кода на основе времени ROS

Использование rosrate объект позволяет вам контролировать скорость выполнения кода на основе времени ROS /clock тема или системное время на вашем компьютере. Выполняя код с постоянными интервалами, можно точно времени и планирования задач. Эти примеры показывают различные приложения для rosrate объект, включающий его использование с сообщениями изображений ROS и отправку команд для управления роботом.

Для других приложений, основанных на системном времени, рассмотрите rateControl (Navigation Toolbox) объект.

Отправка команд управления с фиксированной скоростью роботу

Этот пример показывает, чтобы отправлять регулярные команды роботу с фиксированной скоростью. Он использует Rate объект для выполнения цикла, который публикует std_msgs/Twist сообщения в сеть с регулярным интервалом.

Setup сети ROS. Укажите IP-адрес, если сеть ROS уже существует.

rosinit
Launching ROS Core...
Done in 0.93859 seconds.
Initializing ROS master on http://192.168.0.10:53501.
Initializing global node /matlab_global_node_67541 with NodeURI http://bat6315glnxa64:45705/

Setup издателя и сообщение для отправки Twist команды.

[pub,msg] = rospublisher('/cmd_vel','geometry_msgs/Twist');
msg.Linear.X = 0.5;
msg.Angular.Z = -0.5;

Создание Rate объект с заданными параметрами цикла.

desiredRate = 10;
rate = robotics.Rate(desiredRate);
rate.OverrunAction = 'drop'
rate = 
  rateControl with properties:

         DesiredRate: 10
       DesiredPeriod: 0.1000
       OverrunAction: 'drop'
    TotalElapsedTime: 0.0596
          LastPeriod: NaN

Запустите цикл и удерживайте каждую итерацию, используя waitfor(rate). Отправить Twist сообщение внутри цикла. Сбросьте Rate объект перед циклом для сброса синхронизации.

reset(rate)

while rate.TotalElapsedTime < 10
   send(pub,msg)
   waitfor(rate);
end

Просмотр статистики выполнения с фиксированной частотой. Посмотрите на AveragePeriod для проверки требуемой скорости.

statistics(rate)
ans = struct with fields:
              Periods: [1x100 double]
           NumPeriods: 100
        AveragePeriod: 0.1000
    StandardDeviation: 2.7331e-04
          NumOverruns: 0

Завершите работу сети ROS

rosshutdown
Shutting down global node /matlab_global_node_67541 with NodeURI http://bat6315glnxa64:45705/
Shutting down ROS master on http://192.168.0.10:53501.

Публикация данных изображений ROS с фиксированной скоростью

В этом примере показано, как регулярно публиковать и получать изображения с помощью ROS и rosrate функция. The rosrate функция создает Rate объект для регулярного доступа к /camera/rgb/image_raw тема в сети ROS с использованием абонента. Изображение rgb преобразуется в полутоновое с помощью rgb2gray и переиздается через регулярный интервал. Параметры, такие как IP-адрес и имена тем, варьируются в зависимости от вашего робота и настройки.

Подключение к сети ROS. Setup подписчика, издателя и сообщения с данными.

ipaddress = '192.168.203.129'; % Replace with your network address
rosinit(ipaddress)
Initializing global node /matlab_global_node_10650 with NodeURI http://192.168.203.1:50899/
sub = rossubscriber('/camera/rgb/image_raw');
pub = rospublisher('/camera/gray/image_gray','sensor_msgs/Image');
msgGray = rosmessage('sensor_msgs/Image');
msgGray.Encoding = 'mono8';

Получите первое изображение сообщения. Извлеките изображение и преобразуйте в полутоновое изображение. Отобразите изображение в полутоновом цвете и опубликуйте сообщение.

msgImg = receive(sub);

img = readImage(msgImg);
grayImg = rgb2gray(img);
imshow(grayImg)

writeImage(msgGray,grayImg)
send(pub,msgGray)

Создайте ROS- Rate объект для выполнения с частотой 10 Гц. Установите время цикла и OverrunAction для обработки

desiredRate = 10;
loopTime = 5;
overrunAction = 'slip';
rate = rosrate(desiredRate);
r.OverrunAction = overrunAction;

Начните цикл, чтобы получать, обрабатывать и отправлять сообщения каждые 0,1 секунды (10 Гц). Сбросьте Rate объект перед началом.

reset(rate)

for i = 1:desiredRate*loopTime
    
    msgImg = receive(sub);

    img = readImage(msgImg);
    grayImg = rgb2gray(img);
    writeImage(msgGray,grayImg)

    send(pub,msgGray)
    
    waitfor(rate);
end

Просмотр статистики выполнения кода. AveragePeriod и StandardDeviation показать, насколько хорошо код поддерживал desiredRate. OverRuns происходит, когда обработка данных занимает больше необходимого периода.

statistics(rate)
ans = struct with fields:
              Periods: [1×50 double]
           NumPeriods: 50
        AveragePeriod: 0.1000
    StandardDeviation: 0.0083
          NumOverruns: 0

Завершите работу узла ROS

rosshutdown
Shutting down global node /matlab_global_node_10650 with NodeURI http://192.168.203.1:50899/

См. также

| | (Navigation Toolbox)