Запуск с ROS в Simulink®

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

Введение

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

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

В этом примере вы будете учиться как:

  • Настройте среду ROS

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

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

Предпосылки

Если вы плохо знакомы с Simulink или ROS, мы рекомендуем рассмотреть следующее:

Модель

Вы будете использовать Simulink, чтобы опубликовать (x, y) местоположение робота. Вы также подпишетесь на ту же тему местоположения и отобразите полученный (x, y) местоположение.

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

open_system('robotROSGetStartedExample');

Инициализируйте ROS

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

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

rosinit

Задача 1 - создает издателя

В этой задаче вы сконфигурируете блок, чтобы отправить сообщение "geometry_msgs/Point" в тему, названную "/, местоположение" ("/" стандартный синтаксис ROS).

  • От панели инструментов MATLAB выберите HOME> New> Simulink Model, чтобы открыть новую модель Simulink.

  • От окна модели выберите View> Library Browser, чтобы открыть Браузер Библиотеки Simulink. Нажмите на вкладку Robotics System Toolbox (можно также ввести robotlib в окне команды MATLAB).

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

  • Выберите Specify ваше собственное для исходного поля Темы и введите /location в поле Topic.

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

Задача 2 - создает сообщение ROS

В этой задаче вы создадите пустое сообщение ROS и заполните ее с (x, y) местоположение для пути к роботу. Вы затем опубликуете обновленное сообщение ROS к сети ROS.

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

  • Нажмите на вкладку Robotics System Toolbox в Браузере Библиотеки Simulink или введите robotlib в командной строке MATLAB.

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

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

  • От вкладки Simulink> Signal Routing в Браузере Библиотеки перетащите мышью блок Bus Assignment.

  • Соедините выходной порт блока Blank Message к входному порту Шины блока Bus Assignment. Соедините выходной порт блока Bus Assignment к входному порту блока ROS Publish.

  • Дважды кликните на блоке Bus Assignment. Необходимо видеть X, Y и Z (сигналы, включающие сообщение geometry_msgs/Point) перечисленный слева. Выберите"? signal1" в правильном поле списка и нажмите Remove. Выберите сигналы X and Y в левом поле списка и нажмите Select>>. Нажмите "OK", чтобы закрыть маску блока.

ПРИМЕЧАНИЕ: Если вы не видите X, Y и перечисленный Z, закрываете маску блока для блока Bus Assignment и нажимаете на Simulation> Update Diagram, чтобы гарантировать, что информация о шине правильно распространена. Если вы видите ошибку, "Выбранный сигнал 'signal1' в блоке Bus Assignment не может быть найден", указывает это, что информация о шине не была распространена. Закройте Диагностическое Средство просмотра и повторите перечисленный выше шаг.

Можно теперь заполнить сигнал шины с местоположением робота.

  • От вкладки Simulink> Sources в Браузере Библиотеки перетащите мышью два блока Синусоиды в модель.

  • Соедините выходные порты каждого блока Sine Wave к X и Y входных портов Присвоения блока Bus Assignment.

  • Дважды кликните на блоке Sine Wave, который соединяется с входным портом X. Установите параметр Фазы на -pi/2 и нажмите ОК.

Ваш издатель должен выглядеть так.

На данном этапе модель настраивается, чтобы опубликовать сообщения к сети ROS. Можно проверить это можно следующим образом:

  • На панели инструментов, набор время остановки симуляции к inf.

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

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

  • В то время как симуляция запускается, введите rostopic list в окне команды MATLAB. Это перечисляет все темы, доступные в сети ROS, и она должна включать "/местоположение".

Заметьте, что основное рабочее пространство MATLAB имеет одну или несколько переменных, имя которых запускается с "SL_Bus _". Они - временные объекты шины, созданные Simulink, и не должны быть изменены. Однако безопасно очистить их от рабочей области, когда они будут воссозданы в случае необходимости.

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

Задача 3 - создает подписчика

В этой задаче вы будете использовать Simulink, чтобы получить сообщения, отправленные в "/местоположение" тема. Вы извлечете (x, y) местоположение из сообщения и построите его в XY-плоскости.

  • От вкладки Robotics System Toolbox в Браузере Библиотеки перетащите мышью блок Subscribe к модели. Дважды кликните на блоке.

  • Выберите Specify ваше собственное для исходного поля Темы и введите /location в поле Topic.

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

Блок Subscribe выводит сигнал шины Simulink, таким образом, необходимо извлечь сигналы X и Y от него.

  • От вкладки Simulink> Signal Routing в Браузере Библиотеки перетащите мышью блок Селектора Шины к модели.

  • Соедините сообщение вывод блока Subscribe к входному порту блока Селектора Шины.

  • Нажмите на Simulation> Update Diagram, чтобы гарантировать, что информация о шине распространена. Можно получить ошибку, "Выбранный сигнал 'signal1' в блоке Селектора Шины, 'неназванном Селекторный / Шина, Селекторная', не может быть найден в сигнале входной шины". Эта ошибка ожидается и будет разрешена следующим шагом.

  • Дважды кликните на блоке Селектора Шины. Выбрать"? signal1" и"??? signal2" в правильном поле списка и нажимают Remove. Выберите сигналы X and Y в левом поле списка и нажмите Select>>. Нажать ОК.

Блок Subscribe выведет последний раз полученное сообщение для темы на каждом временном шаге. Вывод IsNew указывает, было ли сообщение получено во время предшествующего временного шага. Для текущей задачи IsNew вывод не нужен, сделайте следующее:

  • Нажмите на вкладку Simulink> Sinks в Браузере Библиотеки. Перетащите мышью блок Terminator к модели

  • Соедините IsNew вывод блока Subscribe к входу блока Terminator.

Остающиеся шаги конфигурируют отображение извлеченных сигналов X и Y.

  • От вкладки Simulink> Sinks в Браузере Библиотеки перетащите мышью блок XY Graph к модели. Соедините выходные порты блока Селектора Шины к входным портам блока XY Graph.

  • От вкладки Simulink> Sinks в Браузере Библиотеки перетащите мышью два блока Отображения к модели. Соедините каждый вывод блока Селектора Шины к каждому блоку Display.

Ваша целая модель должна выглядеть так.

  • Сохраните свою модель.

Задача 4 - конфигурирует и запускает модель

В этой задаче вы сконфигурируете и запустите свою модель.

  • Нажмите на Simulation> Model Configuration Parameters. В панели Решателя, Типе набора к размеру Фиксированного шага и Фиксированного шага к 0.01.

  • Установите Время остановки симуляции на 10,0.

  • Кликните по кнопке воспроизведения, чтобы запустить симуляцию. График XY появится.

В первый раз, когда вы запускаете модель в Simulink, график XY может выглядеть более нервным, чем тот выше должного к задержкам, вызванным путем загрузки библиотек ROS. Если вы повторно выполняете симуляцию несколько раз, график должен выглядеть более сглаженным.

Обратите внимание на то, что симуляция не работает в фактическое или "действительное" время. Блоки в модели оценены в цикле, который только моделирует прогрессию времени и не предназначается, чтобы отследить фактическое время часов (для получения дополнительной информации смотрите Фазу Цикла Симуляции (Simulink)).

Задача 5 - изменяет модель, чтобы реагировать только на новые сообщения

В вышеупомянутой модели блок Subscribe выводит сообщение (сигнал шины) на каждом временном шаге; если никакие сообщения не были получены вообще, это выводит пустое сообщение (т.е. сообщение с нулевыми значениями). Следовательно, (X, Y) координаты первоначально построены в (0,0).

В этой задаче вы измените модель, чтобы использовать Enabled Подсистему, так, чтобы это построило местоположение только, когда новое сообщение получено (для получения дополнительной информации, смотрите Используя Enabled Подсистемы (Simulink)). Предварительно сконфигурированная модель включена для вашего удобства.

  • В модели перетащите, чтобы выбрать блок Селектора Шины и блоки Графика XY. Щелкните правой кнопкой по выбору и выберите "Create Subsystem from Selection".

  • От вкладки Simulink> Ports & Subsystems в Браузере Библиотеки перетащите мышью блок Enable в недавно созданную подсистему.

  • Соедините IsNew вывод блока Subscribe к активированному входу подсистемы как показано в изображении ниже. Удалите блок Terminator. Обратите внимание на то, что вывод "IsNew" верен, только если новое сообщение было получено во время предыдущего временного шага.

  • Сохраните свою модель.

  • Кликните по кнопке воспроизведения, чтобы запустить симуляцию. Необходимо видеть следующий график XY.

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

Сводные данные

Этот пример ввел рабочий процесс для создания модели Simulink, которая отправляет сообщения в тему ROS и получает те те же сообщения. Вы создали и заполнили новое сообщение ROS, и также извлекли сигналы из сообщения ROS.