exponenta event banner

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

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

Для других приложений, основанных на системном времени, рассмотрим rateControl(Панель инструментов навигации).

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

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

Настройка сети 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/

Установочный издатель и сообщение для отправки 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

Завершение работы сети АФК

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 функция. rosrate функция создает Rate объект для регулярного доступа к /camera/rgb/image_raw раздел в сети ROS с использованием абонента. Изображение rgb преобразуется в градации серого с помощью rgb2gray и переиздавался с регулярным интервалом. Параметры, такие как IP-адрес и названия тем, зависят от робота и настройки.

Подключение к сети ROS. Настройка подписчика, издателя и сообщения данных.

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/

См. также

| | (Панель инструментов навигации)