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

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

Введение

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

Предпосылки

Задача 1 - конфигурирует модель для генерации кода

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

  • Откройте модель управления с обратной связью робота. Щелкните по ссылке или запустите robotROSFeedbackControlExample в Командном окне.

  • Выберите Edit> Select All, затем Редактирование> Копия.

  • Откройте новую модель Simulink. Выберите Edit> Paste.

  • Удалите Блок управления Уровня Симуляции.

  • Нажмите на Simulation> Model Configuration Parameters.

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

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

  • Затем перейдите к Генерации кода> Интерфейс> Программная среда> Поддержка и проверяйте сигналы переменного размера.

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

  • Нажмите ОК, чтобы закрыть диалоговое окно Параметров конфигурации. Сохраните модель как RobotController.slx.

Задача 2 - конфигурирует связь с устройством ROS

Устройство ROS является любой системой Linux, которой установили ROS и способна к созданию и выполнению узла ROS. Если у вас есть Simulink Coder, можно сгенерировать код для автономного узла ROS. Если ваша система соединяется с устройством ROS, Simulink может также передать сгенерированный код устройству ROS, создать исполняемый файл и запустить получившийся узел ROS (это упоминается как "развертывание" узла ROS).

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

  • Нажмите на Simulation> Model Configuration Parameters.

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

  • Установите действие Сборки Создавать и запускаться

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

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

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

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

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

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

Задача 3 - генерирует узел 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 выбор Tools> Robot Operating System> Configure Network Addresses и устанавливая адреса сети ROS Master и Node Host Принять значение по умолчанию.

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

5. Нажмите на Code> C/C ++ Code> Deploy to Hardware. Если вы получаете какие-либо ошибки о несоответствии типа шины, закрываете модель, очищаете все переменные из основного рабочего пространства MATLAB и вновь открыли модель.

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

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

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

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

rosnode list

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

rostopic info /mobile_base/commands/velocity

Задача 4 - запущенный и проверяет узел 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, выберите Tools> Robot Operating System> Configure Network Addresses и установите адреса сети 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 будет использовать IP-адрес NodeHost, чтобы связаться с глобальным узлом ROS в MATLAB, поэтому гарантировать, что заданный IP-адрес доступен от устройства ROS (например, с помощью ping). Смотрите Подключение к примеру Сети ROS для получения дополнительной информации о значении установки NodeHost.

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

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

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

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

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