Запуск с ROS в Simulink

®

В этом примере показано, как использовать блоки Simulink для ROS для отправки и приема сообщений от локальной сети ROS.

Введение

Поддержка Simulink для операционной системы робота (ROS) позволяет вам создавать модели Simulink, которые работают с сетью ROS. ROS является слоем связи, который позволяет различным компонентам системы роботов обмениваться информацией в виде сообщений. Компонент отправляет сообщение, публикуя его в конкретный раздел, такой как /odometry. Другие компоненты получают сообщение, подписываясь на эту тему.

Поддержка Simulink для ROS включает библиотеку блоков Simulink для отправки и приема сообщений по обозначенной теме. Когда вы симулируете модель, Simulink соединяется с сетью ROS, которая может работать на той же машине, что и Simulink, или на удаленной системе. После установления этого соединения Simulink обменивается сообщениями с сетью ROS до тех пор, пока симуляция не будет завершена. Если Simulink Coder™ установлен, можно также сгенерировать код С++ для автономного компонента ROS или узла из модели Simulink.

В этом примере показано, как:

  • Настройка окружения ROS

  • Создайте и запустите модель Simulink, чтобы отправлять и получать сообщения ROS

  • Работа с данными в сообщениях ROS

Необходимые условия: создайте простую модель (Simulink), запуск с ROS

Модель

Для публикации X будет использоваться Simulink и Y расположение робота. Вы также подпишетесь на ту же тему местоположения и отобразите полученные X, Y расположение.

Введите следующую команду, чтобы открыть завершенную модель, созданную в примере.

open_system('robotROSGetStartedExample');

Инициализация ROS

Каждая сеть ROS имеет мастер ROS, который координирует все части сети ROS. В данном примере используйте MATLAB ®, чтобы создать мастер ROS в локальной системе. Simulink автоматически обнаруживает и использует локальный мастер ROS.

В командной строке MATLAB выполните следующее:

rosinit

Создание издателя

Сконфигурируйте блок для отправки geometry_msgs/Point сообщение в тему с именем /location (the "/"является стандартным синтаксисом ROS).

  • На панели инструментов MATLAB выберите Home > Simulink, чтобы открыть начальную страницу Simulink.

  • На начальной странице Simulink в разделе Simulink щелкните Пустая модель (Blank Model), чтобы создать и открыть новую модель Simulink.

  • На панели инструментов Simulink выберите Симуляцию > Library Browser, чтобы открыть браузер библиотеки Simulink. Щелкните на вкладке ROS Toolbox (можно также ввести roslib в командном окне MATLAB). Выберите библиотеку ROS.

  • Перетащите блок Publish в модель. Дважды кликните блок, чтобы сконфигурировать тему и тип сообщения.

  • Выберите Specify your own для источника темы и введите /location в разделе «Тема».

  • Щелкните Выбрать рядом с типом сообщения. Появится всплывающее окно. Выберите geometry_msgs/Point и нажмите кнопку ОК, чтобы закрыть всплывающее окно.

Создайте сообщение ROS

Создайте пустое сообщение ROS и заполните его X и Y местоположение пути робота. Затем опубликуйте обновленное сообщение ROS в сети ROS.

Сообщение ROS представлено в виде сигнала шины в Simulink. Сигнал шины является пакетом сигналов Simulink, и может также включать другие сигналы шины (см. Пример «Исследуйте возможности шины Simulink» (Simulink) для обзора). Блок ROS Blank Message выводит сигнал шины Simulink, соответствующий сообщению ROS.

  • Щелкните вкладку ROS Toolbox в браузере библиотек или введите roslib в командной строке MATLAB. Выберите библиотеку ROS.

  • Перетащите блок Blank Message в модель. Дважды кликните блок, чтобы открыть маску блока.

  • Нажмите Select рядом с полем Message type и выберите geometry_msgs/Point из получившегося всплывающего окна. Нажмите кнопку ОК, чтобы закрыть маску блока.

  • На вкладке Simulink > Signal Routing в браузере библиотек перетащите блок Bus Assignment.

  • Подключите выход порт блока Blank Message к порту Bus входа блока Bus Assignment. Подключите выход порт блока Bus Assignment к входу порту блока ROS Publish.

  • Дважды кликните блок «Назначение шины». Вы должны увидеть 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. Проверить это можно следующим образом:

  • На вкладке Simulation установите время остановки симуляции равным inf.

  • Нажмите Запуск, чтобы начать симуляцию. Simulink создает специальный узел ROS для модели и издатель ROS, соответствующий блоку Publish.

  • Пока симуляция выполняется, введите rosnode list в командном окне MATLAB. Здесь перечислены все узлы, доступные в сети ROS, и включен узел с таким именем, как /untitled_81473 (имя модели вместе со случайным числом, чтобы сделать ее уникальной).

  • Пока симуляция выполняется, введите rostopic list в командном окне MATLAB. Здесь перечислены все темы, доступные в сети ROS, и она включает /location.

Обратите внимание, что в базовом рабочем пространстве MATLAB есть одна или несколько переменных, имя которых начинается с SL_Bus_. Это временные объекты шины, созданные Simulink, которые не должны быть изменены. Однако безопасно удалить их из рабочей области, так как при необходимости они будут созданы заново.

  • Нажмите кнопку Остановить (Stop), чтобы остановить симуляцию. Simulink удаляет узел ROS и издатель ROS. В целом узел ROS для модели и любых связанных издателей и подписчиков автоматически удаляются в конце симуляции; дополнительные шаги по очистке не требуются.

Создание абонента

Используйте Simulink для получения сообщений, отправленных в /location тема. Вы извлекете X и Y расположение из сообщения и постройте график в XY-план.

  • На вкладке ROS Toolbox в браузере библиотек перетащите блок Subscribe в модель. Дважды кликните блок.

  • Выберите Specify your own в исходном поле Topic и введите /location в поле Topic.

  • Нажмите Select рядом с полем Message type и выберите geometry_msgs/Point из всплывающего окна. Нажмите кнопку ОК, чтобы закрыть маску блока.

Блок 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 принимается блоком Subscribe. Следовательно, начальная (0,0) значение не будет отображаться в XY график.