В этом примере показано, как использовать блоки Simulink для ROS 2 для отправки и приема сообщений из локальной сети ROS 2.
Поддержка Simulink для операционной системы Robot Operating System 2 (ROS 2) позволяет создавать модели Simulink, работающие с сетью ROS 2. АФК 2 - коммуникационный уровень, позволяющий различным компонентам роботизированной системы обмениваться информацией в виде сообщений. Компонент отправляет сообщение, публикуя его в определенной теме, например /odometry. Другие компоненты получают сообщение, подписавшись на этот раздел.
Поддержка Simulink для ROS 2 включает в себя библиотеку блоков Simulink для отправки и приема сообщений для обозначенной темы. При моделировании модели Simulink подключается к сети ROS 2, которая может выполняться на том же компьютере, что и Simulink, или в удаленной системе. После установления этого соединения Simulink обменивается сообщениями с сетью ROS 2 до завершения моделирования. Если установлен Simulink Coder™, можно также создать код C++ для автономного узла ROS 2 из модели Simulink.
В этом примере показано, как:
Создание и запуск модели Simulink для отправки и получения сообщений ROS 2
Работа с данными в сообщениях ROS 2
Предпосылки: создание простой модели, начало работы с ROS 2
Вы будете использовать Simulink для публикации X и Y местоположение робота. Вы также подпишетесь на ту же тему местоположения и отобразите полученную X,Y местоположение.
Введите следующую команду, чтобы открыть законченную модель, созданную в примере.
open_system('ros2GetStartedExample');Настройка блока для отправки geometry_msgs/Point сообщение в раздел с именем /location ("/"является стандартным синтаксисом ROS).
На панели инструментов MATLAB выберите Главная > Создать > Модель Simulink, чтобы открыть новую модель Simulink.
На панели инструментов Simulink выберите «Моделирование» > «Обозреватель библиотек», чтобы открыть обозреватель библиотеки Simulink. Щелкните на вкладке «Панель инструментов ROS» (можно также ввести roslib в окне команд MATLAB). Выберите библиотеку ROS 2.
Перетащите блок публикации в модель. Дважды щелкните блок, чтобы настроить тему и тип сообщения.
Выберите Указать свой источник темы и введите /location в разделе.
Щелкните Выбрать рядом с типом сообщения. Появится всплывающее окно. Выбрать geometry_msgs/Point и нажмите кнопку ОК, чтобы закрыть всплывающее окно.


Создайте пустое сообщение ROS 2 и заполните его местоположением x и y для траектории робота. Затем опубликуйте обновленное сообщение ROS 2 в сети ROS 2.
Сообщение ROS 2 представляется как сигнал шины в Simulink. Сигнал шины представляет собой пучок сигналов Simulink, а также может включать другие сигналы шины (обзор см. в примере «Возможности шины Simulink (Simulink)»). Блок пустого сообщения ROS 2 выводит сигнал шины Simulink, соответствующий сообщению ROS 2.
Перейдите на вкладку «Панель инструментов ROS» в браузере библиотеки или введите roslib в командной строке MATLAB. Выберите библиотеку ROS 2.
Перетащите в модель блок «Пустое сообщение». Дважды щелкните по блоку, чтобы открыть маску блока.
Нажмите кнопку Выбрать рядом с полем Тип сообщения и выберите geometry_msgs/Point из появившегося всплывающего окна. установите для параметра Время выборки значение 0,01. Нажмите кнопку ОК, чтобы закрыть маску блока.
На вкладке «Simulink > Signal Routing» в браузере библиотеки перетащите блок назначения шины.
Подключите выходной порт блока пустых сообщений к входному порту шины блока назначения шины. Подключите выходной порт блока назначения шины к входному порту блока публикации.
Дважды щелкните по блоку «Назначение шины». Вы должны видеть x, y и z (сигналы, составляющие geometry_msgs/Point сообщение), указанный слева. Выбрать ??? signal1 в правом списке и нажмите кнопку Удалить. Выберите оба X и Y сигналы в левом списке и нажмите кнопку Выбрать. Нажмите кнопку ОК, чтобы применить изменения.

ПРИМЕЧАНИе.Если список x, y и z отсутствует, закройте маску блока «Назначение шины» и на вкладке «Моделирование» нажмите кнопку «Обновить модель» для обеспечения правильного распространения информации о шине. Если вы видите ошибку, «Выбранный сигнал 'signal1' в блоке назначения шины не может быть найден», это означает, что информация шины не была распространена. Закройте программу Diagnostic Viewer и повторите вышеуказанный шаг.
Теперь можно заполнить сигнал шины местоположением робота.
На вкладке «Симуляция» > «Источники» в браузере библиотеки перетащите в модель два блока синусоидальной волны.
Подключите выходные порты каждого блока синусоидальной волны к входным портам назначения x и y блока назначения шины.
Дважды щелкните по блоку синусоидальной волны, подключенному к входному порту X. Задайте для параметра «Фаза» значение -pi/2 и нажмите OK. Оставьте блок синусоидальной волны подключенным к входному порту Y по умолчанию.
Издатель должен выглядеть следующим образом:

На этом этапе модель настраивается для публикации сообщений в сети ROS 2. Проверить это можно следующим образом:
На вкладке Моделирование (Simulation) задайте время остановки моделирования равным inf.
Щелкните Выполнить (Run), чтобы начать моделирование. Simulink создает выделенный узел ROS 2 для модели и издатель ROS 2, соответствующий блоку публикации.
Во время выполнения моделирования введите ros2 node list в окне команды MATLAB. Здесь перечислены все узлы, доступные в сети ROS, а также узел с таким именем, как /untitled_90580 (имя модели вместе со случайным числом, чтобы сделать ее уникальной).
Во время выполнения моделирования введите ros2 topic list в окне команды MATLAB. Здесь перечислены все темы, доступные в сети ROS 2, и он включает /location.

Нажмите кнопку Остановить (Stop), чтобы остановить моделирование. Simulink удаляет узел ROS 2 и издателя. В общем случае узел АФК 2 для модели и любые связанные издатели и подписчики автоматически удаляются в конце моделирования; никаких дополнительных шагов очистки не требуется.
Используйте Simulink для получения сообщений, отправленных /location тема. Расположение x и y будет извлечено из сообщения и выведено на график в плоскости xy.
На вкладке «Панель инструментов ROS» в браузере библиотеки перетащите в модель блок «Подписаться». Дважды щелкните на блоке.
Выберите Указать свое в поле Источник темы и введите /location в поле Тема.
Щелкните Выбрать рядом с полем Тип сообщения и выберите geometry_msgs/Point во всплывающем окне. установите для параметра Время выборки значение 0,01. Нажмите кнопку ОК, чтобы закрыть маску блока.
Блок Subscribe выводит сигнал шины Simulink, поэтому необходимо извлечь из него сигналы x и y.
На вкладке «Simulink > Signal Routing» в браузере библиотеки перетащите в модель блок выбора шины.
Подключите выходной сигнал Msg блока Subscribe к входному порту блока выбора шины.
На вкладке Моделирование (Modeling) выберите Обновить модель (Update Model), чтобы обеспечить распространение информации о шине. Может возникнуть ошибка: «Выбранный сигнал» signal1 «в блоке селектора шины» без названия/селектор шины «не может быть найден во входном сигнале шины». Ожидается, что эта ошибка будет устранена к следующему шагу.
Дважды щелкните на блоке выбора шины. Выбрать ??? signal1 и ??? signal2 в правом списке и нажмите кнопку Удалить. Выберите оба сигнала x и y в левом списке и нажмите кнопку Выбрать. Нажмите кнопку ОК.
Блок Subscribe выводит последнее полученное сообщение для раздела на каждом шаге времени. Выходные данные IsNew указывают, было ли сообщение принято на предыдущем шаге времени. Для текущей задачи вывод IsNew не требуется, поэтому выполните следующие действия:
На вкладке «Симуляция» > «Раковины» в браузере библиотеки перетащите блок терминатора в модель.
Подключите выход IsNew блока Subscribe к входу блока Terminator.
Остальные шаги настраивают отображение извлеченного X и Y сигналы.
На вкладке «Симуляция» > «Раковины» в браузере библиотеки перетащите в модель блок графика XY. Подключите выходные порты блока выбора шины к входным портам блока графика XY.
На вкладке «Симуляция» > «Раковины» в браузере библиотеки перетащите два блока отображения в модель. Подключите каждый выход блока выбора шины к каждому блоку дисплея.
Сохраните модель.
Вся модель должна выглядеть следующим образом:

На вкладке Моделирование (Modeling) выберите Параметры модели (Model Settings). На панели решателя задайте для параметра Тип (Type) значение Фиксированный шаг (Fixed-step) и Фиксированный размер шага (Fixed-step size) значение 0.01.
Установить время остановки моделирования на 10.0.
Щелкните Выполнить (Run), чтобы начать моделирование. Один XY появится график.

При первом запуске модели в Simulink, XY график может выглядеть сильнее, чем приведенный выше, из-за задержек, вызванных загрузкой библиотек АФК. После повторного выполнения моделирования несколько раз график должен выглядеть более плавным.
Следует отметить, что моделирование не работает в реальном или реальном времени. Блоки в модели оценены в петле, которая только моделирует прогрессию времени и не предназначена, чтобы отследить фактическое время часов (для получения дополнительной информации посмотрите Фазу Петли Моделирования (Simulink)).
В вышеупомянутой модели блок Subscribe выводит сообщение (сигнал шины) на каждом временном шаге; если сообщения вообще не были приняты, выводится пустое сообщение (т.е. сообщение с нулевыми значениями). Следовательно, XY координаты первоначально выводятся на печать в точке (0,0).
В этой задаче модель будет изменена таким образом, чтобы она отображала местоположение только при получении нового сообщения (дополнительные сведения см. в разделе Использование включенных подсистем (Simulink)). Предварительно настроенная модель включена для вашего удобства.
В модели щелкните и перетащите, чтобы выбрать блок выбора шины и блоки графика XY. Щелкните правой кнопкой мыши по выделенной области и выберите «Создать подсистему из выделенной области».
На вкладке «Simulink > Ports & Subsystems» в браузере библиотеки перетащите блок Enable во вновь созданную подсистему.
Подключите выход IsNew блока Subscribe к входу подсистемы, как показано на рисунке ниже. Удалите блок терминатора. Обратите внимание, что вывод IsNew имеет значение true только в том случае, если новое сообщение было получено во время предыдущего шага времени.

Сохраните модель.
Щелкните Выполнить (Run), чтобы начать моделирование. Вы должны видеть следующее XY график.

Блоки в разрешенной подсистеме выполняются только при получении нового сообщения ROS 2 блоком Subscribe. Следовательно, начальный (0,0) значение не будет отображаться в XY график.