Этот пример показывает вам, как сгенерировать и создать автономный узел ROS из модели Simulink.
В этом примере вы конфигурируете модель, чтобы сгенерировать Код С++ для автономного узла ROS. Вы затем создаете и запускаете узел ROS в системе Ubuntu® Linux®.
Этот пример требует Simulink Coder™ и Embedded Coder™.
Система Linux Ubuntu с ROS и установленным сервером SSH необходима для создания и выполнения сгенерированного Кода С++. Можно использовать собственный Ubuntu система ROS, или можно использовать виртуальную машину Linux, используемую в примерах Robotics System Toolbox™ (см. Запуск с Gazebo и Симулированным TurtleBot для инструкций).
Рассмотрите Управление с обратной связью поддерживающего ROS примера Робота.
Сконфигурируйте модель, чтобы сгенерировать Код С++ для автономного узла ROS. Модель является пропорциональным контроллером, введенным в Управлении с обратной связью поддерживающего ROS примера Робота.
Открытый RobotController.slx. Щелкните по ссылке или запустите RobotController
в Командном окне.
В панели инструментов нажмите Modeling> Model Settings.
В панели Аппаратной реализации диалогового окна Параметров конфигурации, Аппаратной платы набора к Операционной системе робота (ROS), и нажимают Apply. Аппаратный раздел настроек платы содержит настройки, характерные для сгенерированного пакета ROS, такие как информация, которая будет включена в package.xml
файл. Поменяйте Обслуживающее имя на ROS Example User
.
Модель требует массивов переменного размера. Чтобы включить эту опцию, проверяйте сигналы переменного размера под Генерацией кода> Интерфейс> Программная среда. Если это не доступно, установите Системный конечный файл под Генерацией кода к ert.tlc.
В панели Решателя диалогового окна Параметров конфигурации гарантируйте, что Тип Решателя установлен в Фиксированный шаг и размер Фиксированного шага набора к 0.05
. В сгенерированном коде размер Фиксированного шага задает фактический временной шаг в секундах, который используется в цикле обновления модели (см. Подписание Кода, Сгенерированного из Модели (Simulink Coder)). Это может быть сделано меньшим (например, 0.001 или 0.0001), но в текущих целях 0.05 достаточно.
Устройство ROS является любой системой Linux, которой установили ROS и способна к созданию и выполнению узла ROS. Если у вас есть Simulink Coder, можно сгенерировать код для автономного узла ROS. Если ваша система соединяется с устройством ROS, Simulink может также передать сгенерированный код устройству ROS, создать исполняемый файл и запустить получившийся узел ROS (это упоминается как "развертывание" узла ROS).
В этой задаче вы решаете, хотите ли вы сгенерировать код для узла ROS или если вы хотите создать и запустить его на устройстве ROS. Если вы соединяетесь с устройством ROS, можно сконфигурировать Simulink, чтобы использовать его в качестве цели развертывания для узла ROS.
Под вкладкой Modeling нажмите Model Settings.
В панели Аппаратной реализации диалогового окна Параметров конфигурации выберите действие Build при Аппаратных настройках платы> ресурсы Целевого компьютера> Группы> Опции Сборки. Выбранное действие сборки влияет на поведение Simulink при создавании модели. Ни один (настройка по умолчанию) только не генерирует код для узла ROS, не создавая его на внешнем устройстве ROS. Создайте и загрузка генерирует код, передает его внешнему устройству и создает исполняемый файл узла ROS. Если вы выбираете Build и запуск, получившийся исполняемый файл узла запускается автоматически в конце сборки.
Установите действие Сборки Создавать и запускаться.
Сконфигурируйте связь со своим внешним устройством ROS. Под вкладкой Robot нажмите Connect to Robot, чтобы открыть Подключение к диалоговому окну устройства ROS. В этом диалоговом окне можно ввести всю информацию, что Simulink должен развернуть узел ROS. Это включает IP-адрес или имя хоста вашего устройства ROS, ваших учетных данных входа в систему и рабочей области Сережки. Измените рабочую область Сережки в ~/catkin_ws_test
.
Папка ROS является местоположением установки ROS на устройстве ROS. Если вы не задаете эту папку, тест настроек (см. следующий шаг), пытается определить правильную папку для вас.
Если устройство ROS включено и доступно от вашего компьютера, можно проверить настройки подключения путем нажатия на Test. Тест проверяет каждую настройку устройства, и выведите предупреждения и ошибки в Средстве просмотра Диагностики Simulink, если проблемы найдены. Если возможно, тест также предлагает, как проблемы могут быть решены. Нажмите Test теперь.
Скорее всего, рабочая область Сережки ~/catkin_ws_test
не существует на целевом устройстве. Тест обнаруживает эту проблему и предлагает создать папку и инициализировать рабочую область. Нажмите Fix, чтобы применить это действие автоматически. После нескольких секунд необходимо видеть зеленое уведомление, что папка была создана успешно. В следующем рисунке вы видите пример создания папки успешно. Чтобы проверить, что рабочая область Сережки теперь доступна, нажмите Test в диалоговом окне настроек подключения снова. Предупреждение исчезло, и рабочая область Сережки готова создать ваш узел ROS.
Измените настройки подключения устройства и протестируйте их ни до каких других предупреждений, или ошибки показывают. Если автоматическая фиксация к вашим настройкам возможна, Simulink предлагает его путем отображения кнопки Fix. Если вы имеете хороший набор настроек, нажимаете ОК в диалоговом окне настроек подключения, чтобы сохранить настройки.
Настройки подключения не характерны для одной модели, но применяются ко всем моделям ROS в Simulink.
Сгенерируйте код для автономного узла ROS, и автоматически передайте, создайте и запустите его на устройстве ROS. Осуществите сгенерированный узел ROS с помощью ведущей работы ROS устройства ROS.
1. В MATLAB®, превращаются текущая папка во временное местоположение, где у вас есть разрешение записи.
2. Процесс генерации кода сначала готовит модель к симуляции, чтобы гарантировать, что все блоки правильно инициализируются. Эта подготовка требует допустимой связи с ведущим устройством ROS.
В MATLAB можно использовать rosdevice
возразите, чтобы запустить ведущее устройство ROS на устройстве ROS. Если вы не обеспечиваете аргументов, rosdevice
использует настройки подключения устройства, которые вы ввели в диалоговое окно Simulink, чтобы связать с устройством ROS.
d = rosdevice runCore(d);
3. Использовать rosinit
соединять MATLAB с ведущей работой ROS устройства ROS:
rosinit(d.DeviceAddress)
4. Скажите Simulink использовать те же настройки подключения ROS в качестве MATLAB. Под вкладкой Simulation выберите ROS Toolbox> ROS Network. Установите адреса сети ROS Master (ROS 1) и Node Host Принимать значение по умолчанию.
Только необходимо выполнить шаги 2 - 4 однажды на сеанс работы с MATLAB, не каждый раз, когда вы генерируете узел ROS.
5. Под вкладкой Simulation нажмите Build & Run. Если вы получаете какие-либо ошибки о несоответствии типа шины, закрываете модель, очищаете все переменные из основного рабочего пространства MATLAB и вновь открыли модель.
Нажмите на ссылку Диагностики Представления в нижней части панели инструментов модели, чтобы видеть выход процесса сборки.
6. Если генерация кода завершается, узел ROS передается рабочей области Сережки на вашем устройстве ROS. Узел создает там и начинает запускаться автоматически.
Сгенерированный узел соединяется с ведущей работой ROS устройства ROS.
7. Использовать rosnode
перечислять все рабочие узлы - сеть ROS. "robotcontroller" должен быть в отображенном списке узлов.
rosnode list
Можно использовать rostopic
чтобы проверить, что развернутый узел публикует данные по теме ROS, чтобы управлять движением робота:
rostopic info /mobile_base/commands/velocity
Запустите недавно созданный узел ROS и проверьте его поведение с помощью основанного на MATLAB средства моделирования робота.
1. В MATLAB введите ExampleHelperSimulinkRobotROS
запускать Средство моделирования Робота. Средство моделирования автоматически соединяется с ведущей работой ROS устройства ROS. Если вы хотите соединиться с основанной на Gazebo симуляцией робота, смотрите Подключение к поддерживающему ROS Роботу от Simulink®.
sim = ExampleHelperSimulinkRobotROS
2. Проверьте, что симулированный робот перемещается к цели (Желаемое Положение, постоянное заданный в модели). Робот останавливается, если он достигает цели [-10, 10].
3. Нажмите Reset Simulation, чтобы сбросить положение робота к [0, 0]. Робот начинает перемещаться сразу к целевой позиции.
4. В MATLAB можно управлять узлами ROS, сгенерированными Simulink с rosdevice
объект. Если модель Simulink развертывается, можно использовать rosdevice
запустить и остановить узел в любой точке, не имея необходимость восстанавливать его в Simulink.
AvailableNodes
свойство показывает развернутый robotcontroller узел. Можно проверить, что узел запускается путем вызова isNodeRunning
функция.
d = rosdevice
isNodeRunning(d, 'robotcontroller')
5. Мешайте узлу ROS запуститься.
stopNode(d, 'robotcontroller') isNodeRunning(d, 'robotcontroller')
6. Нажмите кнопку Reset Simulation в окне симуляции. Робот остается в местоположении [0,0] и не перемещается.
Теперь перезапустите узел.
runNode(d, 'robotcontroller')
Робот должен начать двигать целевое положение снова.
7. Если вы сделаны, проверив, можно очистить системное состояние можно следующим образом.
Остановите узел, работающий на целевом устройстве
stopNode(d, 'robotcontroller')
На хосте - компьютере закройте окно рисунка Средства моделирования Робота и введите rosshutdown
в командной строке MATLAB.
rosshutdown
Задайте настройки сети ROS в Simulink: По умолчанию Simulink использует настройки подключения ROS от rosinit
в MATLAB. Чтобы заменить эти настройки, задайте настройки подключения ROS в Simulink. Под вкладкой Simulation выберите ROS Toolbox> ROS Network и установите адреса сети ROS Master и Node Host:
Сгенерированный архив Кода С++: Неважно, что действие Сборки вы выбираете (Ни один, Сборка и загрузка, Сборка и запуск), Simulink всегда генерирует два файла в вашей текущей папке: архив, содержащий исходный код C++ (RobotController.tgz в нашем примере) и сценарий оболочки для извлечения и создания Кода С++ вручную (build_ros_model.sh). Если ваш компьютер MATLAB не соединяется с устройством ROS, можно передать файлы вручную и создать их там.
Специфичный для процессора сгенерированный код: Если вы используете блоки из других продуктов (таких как Система Компьютерного зрения Toolbox™), сгенерированный код может включать специфичную для процессора оптимизацию, которая приводит к проблемам компиляции при создании узла ROS на Linux. В этих случаях необходимо позволить Simulink знать платформу, на которой скомпилирован сгенерированный код. Можно сделать это через панель Аппаратной реализации диалогового окна Параметров конфигурации Модели.
Установите дополнительные пакеты ROS: Robotics System Toolbox включает много типов сообщений ROS (например, для Baxter® или PR2®), которые не являются частью стандартного распределения ROS. Если ваша модель Simulink включает нестандартные или пользовательские типы сообщений, вы можете симулировать и сгенерировать код успешно. Однако для того, чтобы создать сгенерированный узел ROS, необходимо сначала загрузить и установить все необходимые пакеты. Вот один способ сделать это (примите, что необходимым пакетом является baxter_core_msgs
).
На посдказке MATLAB:
d = rosdevice; openShell(d);
На интерпретаторе Linux:
# Refresh the list of available packages sudo apt-get update # Search the list for ROS Baxter packages (e.g., ros-indigo-baxter-core-msgs) apt-cache search baxter # Download and install the required package sudo apt-get install ros-indigo-baxter-core-msgs
Обратите внимание на то, что эта команда может занять несколько минут, чтобы завершиться.
Выполнение Ведущего устройства ROS в MATLAB: В примере выше, вы соединились с ведущей работой ROS устройства ROS. В качестве альтернативы можно создать ведущее устройство ROS в MATLAB. Использование rosinit
в командной строке MATLAB:
rosinit('NodeHost', <IP address of your computer>)
Например, если IP-адрес вашего хоста - компьютера 172.28.194.92, используйте следующую команду:
rosinit('NodeHost', '172.28.194.92')
NodeHost
установка важна, чтобы гарантировать, что сгенерированный узел ROS может связаться с ведущим устройством на MATLAB. Примечание: сгенерированный узел ROS будет использовать NodeHost
IP-адрес, чтобы связаться с глобальным узлом ROS в MATLAB, поэтому гарантируйте, что заданный IP-адрес доступен от устройства ROS (например, с помощью ping
). Смотрите Подключение к примеру Сети ROS для получения дополнительной информации о значении NodeHost
установка.
Режим Tasking: Simulink может сгенерировать код или для многозадачности или для однозадачных режимов (см. Основанное на времени Планирование и Генерацию кода (Simulink Coder)). По умолчанию сгенерированный код ROS использует однозадачный режим (один поток для всех уровней) без планирования в реальном времени. Это позволяет сгенерированному коду ROS выполняться без sudo
привилегии, но может привести к менее предсказуемой производительности.
Если вы требуете более предсказуемой производительности, можно сконфигурировать модель, чтобы использовать многозадачность. В панели Решателя Параметров конфигурации диалоговое окно включают Обработке каждый дискретный уровень как отдельную задачу включить многозадачность. В сгенерированном коде это создает отдельный поток для каждого уровня в модели и использует приоритизированное планирование в потоках.
Чтобы запустить узел ROS, у вас должны быть административные привилегии на устройстве ROS. Simulink автоматически обнаруживает, если ваши привилегии недостаточны, когда модель развертывается на целевом устройстве.