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

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

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

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

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

Сеть ROS Setup. Задайте IP-адрес, если ваша сеть ROS уже существует.

rosinit
Launching ROS Core...
..Done in 2.8961 seconds.
Initializing ROS master on http://192.168.88.1:51159.
Initializing global node /matlab_global_node_77310 with NodeURI http://ah-avijayar:50684/

Издатель 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.0304
          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: [0.1016 0.0996 0.0997 0.0999 0.1020 0.0974 0.0999 0.1018 0.0982 0.1000 0.1000 0.1002 0.0998 0.1052 0.0948 0.1000 0.1002 0.0998 0.1001 0.1068 0.0931 0.1001 0.1000 0.1131 0.0868 0.0999 0.1000 0.1001 0.1014 0.0986 0.1000 0.1000 … ]
           NumPeriods: 100
        AveragePeriod: 0.1000
    StandardDeviation: 0.0023
          NumOverruns: 0

Закройте сеть ROS.

rosshutdown
Shutting down global node /matlab_global_node_77310 with NodeURI http://ah-avijayar:50684/
Shutting down ROS master on http://192.168.88.1:51159.

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

В этом примере показано, как регулярно публиковать и получать сообщения изображений с помощью ROS и rosrate функция. 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) | |