Использование 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 и 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/
rosrate | waitfor | rateControl (Панель инструментов навигации)