Сгенерируйте автономный узел ROS из Simulink®

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

Введение

В этом примере вы конфигурируете модель, чтобы сгенерировать Код С++ для автономного узла ROS. Вы затем создаете и запускаете узел ROS в системе Ubuntu® Linux®.

Необходимые условия

Сконфигурируйте модель для генерации кода

Сконфигурируйте модель, чтобы сгенерировать Код С++ для автономного узла ROS. Модель является пропорциональным контроллером, введенным в Управлении с обратной связью поддерживающего ROS примера Робота.

  • Открытый RobotController.slx. Щелкните по ссылке или запустите RobotController в Командном окне.

  • В разделе Prepare под вкладкой ROS нажмите Hardware Settings, чтобы открыть панель Аппаратной реализации диалогового окна Параметров конфигурации. Аппаратный раздел настроек платы содержит настройки, характерные для сгенерированного пакета ROS, такие как информация, которая будет включена в package.xml файл. Поменяйте Обслуживающее имя на ROS Example User.

  • Модель использует массивы переменного размера. Чтобы включить генерацию кода сигналов переменного размера, проверяйте сигналы переменного размера под Генерацией кода> Интерфейс> Программная среда. Если опция сигналов переменного размера не отображается, проверяйте опцию, Используйте Функции Embedded Coder в Аппаратной реализации> Усовершенствованный parameters.

  • В панели Решателя диалогового окна Параметров конфигурации гарантируйте, что Тип Решателя установлен в Фиксированный шаг и размер Фиксированного шага набора к 0.05. В сгенерированном коде размер Фиксированного шага задает фактический временной шаг в секундах, который используется для цикла обновления модели (см. Подписание Кода, Сгенерированного из Модели (Simulink Coder)). Это может быть сделано меньшим (e.g., 0.001 или 0.0001), но в текущих целях 0.05 достаточно.

Сконфигурируйте связь с устройством ROS

Устройство 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. Под вкладкой ROS, от Развертывания до выпадающего, нажимают Manage Remote Device. Это открывает Подключение к диалоговому окну устройства 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 C++

Сгенерируйте код для автономного узла 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, в разделе Prepare, выбирают ROS Network. Установите адреса сети ROS Master (ROS 1) и Node Host Принимать значение по умолчанию.

Только необходимо выполнить шаги 2 - 4 однажды на сеанс работы с MATLAB, не каждый раз, когда вы генерируете узел ROS.

5. Под вкладкой ROS нажмите Deploy> Build & Run. Если вы получаете какие-либо ошибки о несоответствии типа шины, закрываете модель, очищаете все переменные из основного рабочего пространства MATLAB и вновь открыли модель.

Нажмите на ссылку Диагностики Представления в нижней части панели инструментов модели, чтобы видеть выход процесса сборки.

6. Если генерация кода завершается, узел ROS передается рабочей области Сережки на вашем устройстве ROS. Узел создает там и начинает запускаться автоматически.

Сгенерированный узел соединяется с ведущей работой ROS устройства ROS.

7. Использовать rosnode перечислять все рабочие узлы - сеть ROS. "robotcontroller" должен быть в отображенном списке узлов.

rosnode list

Можно использовать rostopic чтобы проверить, что развернутый узел публикует данные по теме ROS, чтобы управлять движением робота:

rostopic info /mobile_base/commands/velocity

Запустите и проверьте узел ROS

Запустите недавно созданный узел 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, в разделе Prepare, выбирают ROS Network и устанавливают адреса сети ROS Master и Node Host:

Сгенерированный архив Кода С++: Неважно, что действие Сборки вы выбираете (Ни один, Сборка и загрузка, Сборка и запуск), Simulink всегда генерирует два файла в вашей текущей папке: архив, содержащий исходный код C++ (RobotController.tgz в нашем примере) и сценарий оболочки для извлечения и создания Кода С++ вручную (build_ros_model.sh). Если ваш компьютер MATLAB не соединяется с устройством ROS, можно передать файлы вручную и создать их там.

Специфичный для процессора сгенерированный код: Если вы используете блоки из других продуктов (таких как Система Компьютерного зрения Toolbox™), сгенерированный код может включать специфичную для процессора оптимизацию, которая приводит к проблемам компиляции при создании узла ROS на Linux. В этих случаях необходимо позволить Simulink знать платформу, на которой скомпилирован сгенерированный код. Можно сделать это через панель Аппаратной реализации диалогового окна Параметров конфигурации Модели.

Выполнение Ведущего устройства 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 автоматически обнаруживает, если ваши привилегии недостаточны, когда модель развертывается на целевом устройстве.

Похожие темы