В этом примере показано, как использовать блоки 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
Вы будете использовать Simulink, чтобы опубликовать X
и Y
местоположение робота. Вы также подпишетесь на ту же тему местоположения и отобразите полученный X
Y
местоположение .
Введите следующую команду, чтобы открыть завершенную модель, созданную в примере.
open_system('robotROSGetStartedExample');
Каждая сеть ROS имеет ведущее устройство ROS, которое координирует все части сети ROS. В данном примере используйте MATLAB®, чтобы создать ведущее устройство ROS в вашей локальной системе. Simulink автоматически обнаруживает и использует локальное ведущее устройство ROS.
На командной строке MATLAB выполните следующее:
rosinit
Сконфигурируйте блок, чтобы отправить geometry_msgs/Point
обменивайтесь сообщениями к теме под названием /location
("/
"стандартный синтаксис ROS).
От Панели инструментов MATLAB выберите Home> New> Simulink Model, чтобы открыть новую модель Simulink.
От Панели инструментов Simulink выберите Simulation> Library Browser, чтобы открыть Браузер Библиотеки Simulink. Нажмите на вкладку ROS Toolbox (можно также ввести roslib
в окне команды MATLAB). Выберите ROS 1 Library.
Перетащите блок Publish к модели. Дважды кликните на блоке, чтобы сконфигурировать тему и тип сообщения.
Выберите Specify ваше собственное для источника Темы и введите /location
в Теме.
Нажмите Select next to Message type. Всплывающее окно появится. Выберите geometry_msgs/Point
и нажмите ОК, чтобы закрыть всплывающее окно.
Создайте пустое сообщение ROS и заполните его с X
и Y
местоположение для пути к роботу. Затем опубликуйте обновленное сообщение ROS к сети ROS.
Сообщение ROS представлено как сигнал шины в Simulink. Сигнал шины является пакетом Сигналов Simulink и может также включать другие сигналы шины (см. Сигналы Шины Simulink (Simulink) пример для обзора). Блок ROS Blank Message выводит соответствие сигнала шины Simulink сообщению ROS.
Кликните по вкладке ROS Toolbox в Браузере Библиотеки или введите roslib
в командной строке MATLAB. Выберите ROS 1 Library.
Перетащите блок 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
и Y
сигналы в левом поле списка и нажимают Select. Нажмите ОК, чтобы применить изменения.
ПРИМЕЧАНИЕ: Если вы не видите X
Y
и Z
перечисленный, закройте маску блока для блока Bus Assignment, и под вкладкой Modeling, нажмите Update Model, чтобы гарантировать, что информация о шине правильно распространена. Если вы видите ошибку, "Выбранный сигнал 'signal1' в блоке Bus Assignment не может быть найден", указывает это, что информация о шине не была распространена. Закройте Диагностическое Средство просмотра и повторите перечисленный выше шаг.
Можно теперь заполнить сигнал шины с местоположением робота.
От вкладки Simulink> Sources в Браузере Библиотеки перетащите два блока Sine wave в модель.
Соедините выходные порты каждого блока Sine Wave к входным портам присвоения X
и Y
из блока Bus Assignment.
Дважды кликните на блоке Sine Wave, который соединяется с входным портом X
. Установите параметр Фазы на -pi/2
и нажмите ОК. Оставьте блок Sine Wave соединенным с входным портом Y
как значение по умолчанию.
Ваш издатель должен выглядеть так:
На данном этапе модель настраивается, чтобы опубликовать сообщения к сети ROS. Можно проверить это можно следующим образом:
Под вкладкой Simulation, набор время остановки симуляции к inf
.
Нажмите Run, чтобы запустить симуляцию. 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 ваше собственное в исходном поле Темы и введите /location
в поле Topic.
Нажмите Select рядом с полем Типа сообщения и выберите geometry_msgs/Point
от всплывающего окна. Нажмите ОК, чтобы закрыть маску блока.
Блок Subscribe выводит сигнал шины Simulink, таким образом, необходимо извлечь X
и Y
сигналы от него.
От вкладки Simulink> Signal Routing в Браузере Библиотеки перетащите блок Селектора Шины к модели.
Соедините сообщение выход блока Subscribe к входному порту блока Селектора Шины.
От вкладки Modeling выберите Update Model, чтобы гарантировать, что информация о шине распространена. Можно получить ошибку, "Выбранный сигнал 'signal1' в блоке Селектора Шины, 'неназванном Селекторный / Шина, Селекторная', не может быть найден в сигнале входной шины". Эта ошибка ожидается и будет разрешена следующим шагом.
Дважды кликните на блоке Селектора Шины. Выберите ??? signal1
и ??? signal2
в правильном поле списка и нажимают Remove. Выберите X
и Y
сигналы в левом поле списка и нажимают Select. Нажать ОК.
Блок Subscribe выведет последний раз полученное сообщение для темы на каждом временном шаге. Выход IsNew указывает, было ли сообщение получено во время предшествующего временного шага. Для текущей задачи IsNew выход не нужен, сделайте следующее:
От вкладки Simulink> Sinks в Браузере Библиотеки перетащите блок Terminator к модели.
Соедините IsNew выход блока Subscribe к входу блока Terminator.
Остающиеся шаги конфигурируют отображение извлеченного X
и Y
сигналы.
От вкладки Simulink> Sinks в Браузере Библиотеки перетащите блок XY Graph к модели. Соедините выходные порты блока Селектора Шины к входным портам блока XY Graph.
От вкладки Simulink> Sinks в Браузере Библиотеки перетащите два блока Отображения к модели. Соедините каждый выход блока Селектора Шины с каждым блоком Display.
Сохраните свою модель.
Ваша целая модель должна выглядеть так:
От вкладки Modeling выберите Model Settings. В панели Решателя, Типе набора к размеру Фиксированного шага и Фиксированного шага к 0.01
.
Установите время остановки симуляции на 10.0
.
Нажмите Run, чтобы запустить симуляцию. XY
график появится.
В первый раз вы запускаете модель в Simulink, XY
график может выглядеть более нервным, чем тот выше должного к задержкам, вызванным путем загрузки библиотек ROS. Если вы повторно выполняете симуляцию несколько раз, график должен выглядеть более сглаженным.
Обратите внимание на то, что симуляция не работает в фактическое или "действительное" время. Блоки в модели оценены в цикле, который только симулирует прогрессию времени и не предназначается, чтобы отследить фактическое время часов (для получения дополнительной информации смотрите Фазу Цикла Симуляции (Simulink)).
В вышеупомянутой модели блок Subscribe выводит сообщение (сигнал шины) на каждом временном шаге; если никакие сообщения не были получены вообще, это выводит пустое сообщение (т.е. сообщение с нулевыми значениями). Следовательно, XY
координаты первоначально построены в (0,0)
.
В этой задаче вы измените модель, чтобы использовать Enabled Подсистему, так, чтобы это построило местоположение только, когда новое сообщение получено (для получения дополнительной информации, смотрите Используя Enabled Подсистемы (Simulink)). Предварительно сконфигурированная модель включена для вашего удобства.
В модели перетащите, чтобы выбрать блок Селектора Шины и блоки Графика XY. Щелкните правой кнопкой по выбору и выберите Create Subsystem from Selection.
От вкладки Simulink> Ports & Subsystems в Браузере Библиотеки перетащите блок Enable в недавно созданную подсистему.
Соедините IsNew выход блока Subscribe к активированному входу подсистемы как показано в изображении ниже. Удалите блок Terminator. Обратите внимание на то, что выход IsNew верен, только если новое сообщение было получено во время предыдущего временного шага.
Сохраните свою модель.
Нажмите Run, чтобы запустить симуляцию. Необходимо видеть следующий XY
график.
Блоки в активированной подсистеме только выполняются, когда новое сообщение ROS получено блоком Subscribe. Следовательно, начальный (0,0)
значение не будет отображено в XY
график.