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

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

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

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

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

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

rosinit
Launching ROS Core...
...............................Done in 1.2397 seconds.
Initializing ROS master on http://192.168.0.10:55733.
Initializing global node /matlab_global_node_99183 with NodeURI http://bat1072001glnxa64:33207/

Издатель 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.0403
          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: 0.0016
          NumOverruns: 0

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

rosshutdown
Shutting down global node /matlab_global_node_99183 with NodeURI http://bat1072001glnxa64:33207/
Shutting down ROS master on http://192.168.0.10:55733.
........

Публикация с фиксированной процентной ставкой данных изображения 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)