В этом примере показано, как использовать блоки Simulink для ROS 2 для отправки и приема сообщений от локальной сети ROS 2.
Поддержка Simulink для Robot Operating System 2 (ROS 2) позволяет вам создавать модели Simulink, которые работают с сетью ROS 2. ROS 2 является слоем связи, который позволяет различным компонентам системы роботов обмениваться информацией в виде сообщений. Компонент отправляет сообщение, публикуя его в конкретный раздел, такой как /odometry
. Другие компоненты получают сообщение, подписываясь на эту тему.
Поддержка Simulink для ROS 2 включает библиотеку блоков Simulink для отправки и приема сообщений по обозначенной теме. Когда вы симулируете модель, Simulink соединяется с сетью ROS 2, которая может работать на той же машине, что и Simulink, или на удаленной системе. После установления этого соединения Simulink обменивается сообщениями с сетью ROS 2 до тех пор, пока симуляция не будет завершена. Если Simulink Coder™ установлен, можно также сгенерировать код С++ для автономного узла ROS 2 из модели Simulink.
В этом примере показано, как:
Создайте и запустите модель Simulink, чтобы отправлять и получать сообщения ROS 2
Работа с данными в сообщениях ROS 2
Необходимые условия: Создайте простую модель, Запуск с ROS 2
Для публикации X
будет использоваться Simulink и
Y
расположение робота. Вы также подпишетесь на ту же тему местоположения и отобразите полученные X
, Y
расположение.
Введите следующую команду, чтобы открыть завершенную модель, созданную в примере.
open_system('ros2GetStartedExample');
Сконфигурируйте блок для отправки geometry_msgs/Point
сообщение в тему с именем /location
(the "/
"является стандартным синтаксисом ROS).
На панели инструментов MATLAB выберите Home > New > Simulink Model, чтобы открыть новую модель Simulink.
На панели инструментов Simulink выберите Симуляцию > Library Browser, чтобы открыть браузер библиотеки Simulink. Щелкните на вкладке ROS Toolbox (можно также ввести roslib
в командном окне MATLAB). Выберите библиотеку ROS 2.
Перетащите блок Publish в модель. Дважды кликните блок, чтобы сконфигурировать тему и тип сообщения.
Выберите Specify your own для источника темы и введите /location
в разделе «Тема».
Щелкните Выбрать рядом с типом сообщения. Появится всплывающее окно. Выберите geometry_msgs/Point
и нажмите кнопку ОК, чтобы закрыть всплывающее окно.
Создайте пустое сообщение ROS 2 и заполните его местоположением x и y для пути робота. Затем опубликуйте обновленное сообщение ROS 2 в сеть ROS 2.
Сообщение ROS 2 представлено в виде сигнала шины в Simulink. Сигнал шины является пакетом сигналов Simulink, и может также включать другие сигналы шины (см. Пример «Исследуйте возможности шины Simulink» (Simulink) для обзора). Блок ROS 2 Blank Message выводит сигнал шины Simulink, соответствующий сообщению ROS 2.
Щелкните вкладку ROS Toolbox в браузере библиотек или введите roslib
в командной строке MATLAB. Выберите библиотеку ROS 2.
Перетащите блок Blank Message в модель. Дважды кликните блок, чтобы открыть маску блока.
Нажмите Select рядом с полем Message type и выберите geometry_msgs/Point
из получившегося всплывающего окна. Установите значение шага расчета 0,01. Нажмите кнопку ОК, чтобы закрыть маску блока.
На вкладке Simulink > Signal Routing в браузере библиотек перетащите блок Bus Assignment.
Подключите выход порт блока Blank Message к порту Bus входа блока Bus Assignment. Соедините выход порт блока «Назначение шины» с входом портом блока «Публикация».
Дважды кликните блок «Назначение шины». Вы должны увидеть x, y и z (сигналы, содержащие geometry_msgs/Point
сообщение) в списке слева. Выберите ??? signal1
в правом списке и нажмите кнопку Удалить. Выберите оба X
и Y
сигналы в левом списке и нажмите Select. Нажмите OK, чтобы применить изменения.
ПРИМЕЧАНИЕ. Если вы не видите x, y и z в списке, закройте маску блока «Назначение шины» и на вкладке « Моделировании» нажмите «Обновить модель», чтобы убедиться, что информация о шине правильно распространена. Если вы видите ошибку, «Selected signal1 'в блоке Bus Assignment не может быть найден», это указывает, что информация о шине не была распространена. Закройте Средство Просмотра и повторите вышеописанный шаг.
Теперь можно заполнить сигнал шины расположением робота.
На вкладке Simulink > Sources в браузере библиотек перетащите в модель два блока Sine Wave.
Соедините выходные порты каждого блока Sine Wave с входными портами x и y назначения шины.
Дважды кликните блок Sine Wave, который соединяется с входным портом X
. Установите параметр Phase равным -pi/2
и нажмите OK. Оставьте блок Sine Wave подключенным к входному порту Y
как по умолчанию.
Ваш издатель должен выглядеть следующим образом:
На данной точке модель настраивается на публикацию сообщений в сети ROS 2. Проверить это можно следующим образом:
На вкладке Simulation установите время остановки симуляции равным inf
.
Нажмите Запуск, чтобы начать симуляцию. Simulink создает специальный узел ROS 2 для модели и издатель ROS 2, соответствующий блоку Publish.
Пока симуляция выполняется, введите ros2 node
list
в командном окне MATLAB. Здесь перечислены все узлы, доступные в сети ROS, и включен узел с таким именем, как /untitled_90580
(имя модели вместе со случайным числом, чтобы сделать ее уникальной).
Пока симуляция выполняется, введите ros2 topic
list
в командном окне MATLAB. Здесь перечислены все темы, доступные в сети ROS 2, и она включает /location
.
Нажмите кнопку Остановить (Stop), чтобы остановить симуляцию. Simulink удаляет узел ROS 2 и издателя. В целом узел ROS 2 для модели и любых связанных издателей и подписчиков автоматически удаляются в конце симуляции; дополнительные шаги по очистке не требуются.
Используйте Simulink для получения сообщений, отправленных в /location
тема. Вы извлечете местоположение x и y из сообщения и постройте график в xy-плоскости.
На вкладке ROS Toolbox в браузере библиотек перетащите блок Subscribe в модель. Дважды кликните блок.
Выберите Specify your own в исходном поле Topic и введите /location
в поле Topic.
Нажмите Select рядом с полем Message type и выберите geometry_msgs/Point
из всплывающего окна. Установите значение шага расчета 0,01. Нажмите кнопку ОК, чтобы закрыть маску блока.
Блок Subscribe выводит сигнал шины Simulink, поэтому необходимо извлечь из него сигналы x и y.
На вкладке Simulink > Signal Routing в браузере библиотек перетащите блок Bus Selector в модель.
Подключите выход Msg блока Subscribe к входу порту блока Bus Selector.
На вкладке Моделирование (Modeling) выберите Обновить модель (Update Model), чтобы убедиться, что информация о шине распространяется. Вы можете получить ошибку: «Выбранный сигнал 'signal1' в блоке Bus Selector 'untitled/Bus Selector' не может быть найден в входном сигнале шины». Эта ошибка ожидается и будет устранена следующим шагом.
Дважды кликните на блоке Bus Selector. Выберите ??? signal1
и ??? signal2
в правом списке и нажмите кнопку Удалить. Выберите оба сигнала x и y в левом списке и нажмите Select. Нажмите OK.
Блок Subscribe выводит последнее полученное сообщение для темы на каждом временном шаге. IsNew выхода указывает, было ли сообщение получено в течение предыдущего временного шага. Для текущей задачи выход IsNew не нужен, поэтому выполните следующее:
На вкладке Simulink > Sinks в браузере библиотек перетащите блок Terminator в модель.
Подключите выход IsNew блока Subscribe к входу блока Terminator.
Оставшиеся шаги конфигурируют отображение извлеченных X
и Y
сигналы.
На вкладке «Simulink > Раковины» в браузере библиотек перетащите блок XY Graph в модель. Соедините выходные порты блока Bus Selector с входными портами блока XY Graph.
На вкладке Simulink > Sinks в браузере библиотек перетащите два блока Display в модель. Соедините каждый выход блока Bus Selector с каждым блоком Отображения.
Сохраните модель.
Вся ваша модель должна выглядеть так:
На вкладке Моделирование (Modeling) выберите Настройки модели (Model Settings). На панели Solver установите значение Type на Fixed-step и значение Fixed-step на 0.01
.
Установите время остановки симуляции равным 10.0
.
Нажмите Запуск, чтобы начать симуляцию. Система координат XY
отобразится график.
Первый раз, когда вы запускаете модель в Simulink, XY
график может выглядеть более джиттерным, чем выше, из-за задержек, вызванных загрузкой библиотек ROS. После повторного запуска симуляции несколько раз график должен выглядеть плавнее.
Обратите внимание, что симуляция не работает в фактическом или «реальном» времени. Блоки в модели оцениваются в цикле, который только имитирует прогрессию времени и не предназначен для отслеживания фактического времени синхроимпульса (для получения дополнительной информации смотрите Фазу цикла симуляции (Simulink)).
В вышеописанной модели блок Subscribe выводит сообщение (сигнал шины) на каждом временном шаге; если сообщения вообще не получены, это выводит пустое сообщение (т.е. сообщение с нулевыми значениями). Следовательно, XY
координаты первоначально нанесены на график в (0,0)
.
В этой задаче вы измените модель, чтобы использовать Enabled Subsystem, так что она строит график местоположения только при получении нового сообщения (для получения дополнительной информации см. Использование Enabled Subsystems (Simulink)). Предварительно сконфигурированная модель включена для вашего удобства.
В модели щелкните и перетащите мышью, чтобы выбрать блоки Bus Selector и XY Graph. Щелкните правой кнопкой мыши по выбору и выберите «Создать подсистему из выбора».
На вкладке Simulink > Ports & Subsystems в браузере библиотек перетащите блок Enable в вновь созданную подсистему.
Подключите выход IsNew блока Subscribe к включенному входу подсистемы, как показано на рисунке ниже. Удалите блок Terminator. Обратите внимание, что выход IsNew имеет значение true, только если новое сообщение было получено в течение предыдущего временного шага.
Сохраните модель.
Нажмите Запуск, чтобы начать симуляцию. Вы увидите следующее XY
график.
Блоки в включенной подсистеме выполняются только тогда, когда новое сообщение ROS 2 принимается блоком Subscribe. Следовательно, начальная (0,0)
значение не будет отображаться в XY
график.