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

®

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

Введение

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

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

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

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

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

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

  • В модели используются массивы переменного размера. Чтобы включить генерацию кода сигналов переменного размера, проверяйте сигналы переменного размера по пути Code Generation > Interface > Software environment. Если опция сигналов переменного размера не видна, проверьте опцию «Использовать функции Embedded Coder в аппаратной реализации > Продвинутые параметры» .

  • На панели Решателя диалогового окна Параметров конфигурации убедитесь, что для параметра Решателя Type задано значение Fixed-step, и установите для параметра Fixed-step значение 0.05. В сгенерированном коде размер Fixed-step определяет фактический временной шаг, в секундах, который используется для цикла обновления модели (см. Выполнение кода, сгенерированного из модели (Simulink Coder)). Он может быть сделан меньшим (например, 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).

  • На панели Аппаратная реализация диалогового окна Параметры конфигурации выберите действие Сборка в разделе Настройки аппаратной платы > Целевые аппаратные ресурсы > Группы > Опции сборки. Выбранное действие сборки влияет на поведение Simulink при построении модели. None (настройка по умолчанию) только генерирует код для узла ROS, не строя его на внешнем устройстве ROS. Сборка и загрузка генерирует код, переносит его на внешнее устройство и создает исполняемый файл узла ROS. Если вы выбираете Build и запускаете, полученный исполняемый файл узла запускается автоматически в конце сборки.

  • Установите действие Build на Build и запустите.

  • Сконфигурируйте подключение к внешнему устройству ROS. На вкладке ROS в раскрывающемся списке Развертывание на щелкните Управление удаленным устройством. Это открывает диалоговое окно Подключение к устройству ROS. В этом диалоговом окне можно ввести всю информацию, необходимую Simulink для развертывания узла ROS. Сюда входят IP-адрес или имя хоста устройства ROS, учетные данные входа и рабочая область Catkin. Измените рабочую область Catkin на ~/catkin_ws_test.

ROS Folder - расположение установки ROS на устройстве ROS. Если вы не задаете эту папку, тест настроек (см. следующий шаг) пытается определить правильную папку для вас.

  • Если устройство ROS включено и доступно с компьютера, можно проверить параметры подключения, нажав на Test.Тест проверяет каждую настройку устройства и отображает предупреждения и ошибки в Simulink Diagnostic Viewer, если обнаружены проблемы. Если это возможно, тест также предполагает, как можно исправить проблемы. Нажмите «Тестировать сейчас».

  • Скорее всего, рабочая область Catkin ~/catkin_ws_test не существует на целевом устройстве. Тест обнаруживает эту проблему и предлагает создать папку и инициализировать рабочую область. Нажмите Исправить, чтобы автоматически применить это действие. Через несколько секунд вы увидите зеленое уведомление о том, что папка успешно создана. На следующем рисунке можно увидеть пример успешного создания папки. Чтобы убедиться, что рабочая область Catkin теперь доступна, снова нажмите кнопку «» Тестировать «» в диалоговом окне параметров подключения. Предупреждение исчезло, и рабочая область Catkin готова создать ваш узел ROS.

  • Измените настройки подключения устройства и протестируйте их до тех пор, пока не отобразятся другие предупреждения или ошибки. Если автоматическое исправление настроек возможно, Simulink предлагает его, отобразив кнопку Fix. После того, как у вас будет хороший набор настроек, нажмите OK в диалоговом окне настроек подключения, чтобы сохранить настройки.

Настройки соединения не специфичны для одной модели, но применяются ко всем моделям ROS в Simulink.

Сгенерируйте узел C++ ROS

Сгенерируйте код для автономного узла 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 на Default.

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

5. На вкладке ROS щелкните Развернуть > Создать и Запуск. Если вы получите какие-либо ошибки о несоответствии типов шины, закройте модель, очистите все переменные из базового рабочего пространства MATLAB и повторно откройте модель.

Щелкните ссылку View Diagnostics в нижней части панели инструментов модели, чтобы увидеть выходы процесса сборки.

6. После завершения генерации кода узел ROS переносится в рабочую область Catkin на устройстве 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. Щелкните Сброс симуляции, чтобы сбросить положение робота на [0, 0]. Робот начинает двигаться сразу к положению цели.

4. В MATLAB можно управлять узлами ROS, сгенерированными Simulink с rosdevice объект. После развертывания модели Simulink можно использовать rosdevice чтобы запустить и остановить узел в любой точке, без необходимости перестраивать его в Simulink.

The AvailableNodes свойство показывает развернутый узел robotcontroller. Можно проверить, что узел работает, позвонив в isNodeRunning функция.

d = rosdevice

isNodeRunning(d, 'robotcontroller')

5. Остановите работу узла ROS.

stopNode(d, 'robotcontroller')
isNodeRunning(d, 'robotcontroller')

6. Нажмите кнопку Сбросить симуляцию в окне симуляции. Робот остается в местоположении [0,0] и не перемещается.

  • Теперь перезапустите узел.

runNode(d, 'robotcontroller')
  • Робот должен снова начать движение к положению цели.

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

  • Остановите узел, работающий на целевом устройстве

stopNode(d, 'robotcontroller')
  • На хост-компьютер закройте Робота окна рисунка Simulator и введите 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, можно передать файлы вручную и собрать их туда.

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

Запуск ROS Master в MATLAB: В примере выше вы подключились к ROS master, работающему на устройстве ROS. Также можно создать мастер ROS в MATLAB. Использовать rosinit в командной строке MATLAB:

rosinit('NodeHost', <IP address of your computer>)

Для примера, если IP-адрес вашего хоста-компьютера 172.28.194.92, используйте следующую команду:

rosinit('NodeHost', '172.28.194.92')

The NodeHost параметр важен для обеспечения возможности связи сгенерированного узла ROS с ведущим узлом в MATLAB. Примечание. Сгенерированный узел ROS будет использовать NodeHost IP-адрес для связи с глобальным узлом ROS в MATLAB, так что убедитесь, что указанный IP-адрес доступен с устройства ROS (для примера, использования ping). Смотрите пример подключения к сети ROS для получения дополнительной информации о значении NodeHost настройка.

Режим задачи: Simulink может сгенерировать код для многозадачных или однозадачных режимов (см. «Расписание на основе времени» и «Генерация кода» (Simulink Coder)). По умолчанию сгенерированный код ROS использует однозадачный режим (один поток для всех скоростей) без планирования в реальном времени. Это позволяет сгенерированному коду выполняться без sudo привилегии, но могут привести к снижению предсказуемой эффективности.

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

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

Похожие темы