В этом примере показано, как создать и построить автономный узел ROS из модели Simulink.
В этом примере модель настраивается для создания кода C++ для автономного узла ROS. Затем выполняется сборка и запуск узла ROS в системе Ubuntu ® Linux ®.
В этом примере требуется Simulink Coder™ и Embedded Coder™.
Система Ubuntu Linux с установленным сервером ROS и SSH необходима для построения и запуска сгенерированного кода C++. Вы можете использовать собственную систему Ubuntu ROS или виртуальную машину Linux, используемую для Robotics System Toolbox™ примеры (инструкции см. в разделе Начало работы с Gazebo и Simulated TurtleBot).
Просмотрите пример управления обратной связью робота с поддержкой ROS.
Настройте модель для создания кода C++ для автономного узла ROS. Модель представляет собой пропорциональный контроллер, представленный в примере управления обратной связью робота с поддержкой ROS.
Откройте файл RobotController.slx. Щелкните ссылку или выполните команду RobotController в окне команд.
В разделе Подготовка на вкладке ROS щелкните Hardware Settings, чтобы открыть панель Hardware Implementation диалогового окна Configuration Parameters. Раздел Hardware board settings содержит настройки, относящиеся к сгенерированному пакету ROS, например, информацию для включения в package.xml файл. Изменить имя сопровождающего на ROS Example User.
Модель использует массивы переменного размера. Чтобы включить кодовую генерацию сигналов переменного размера, проверьте сигналы переменного размера в разделе «Кодовая генерация» > «Интерфейс» > «Программная среда». Если опция сигналов переменного размера не видна, установите флажок Использовать встроенные функции кодера в аппаратной реализации > Дополнительные параметры.
На панели «Решатель» диалогового окна «Параметры конфигурации» убедитесь, что для параметра «Тип решателя» задано значение «Фиксированный шаг», а для параметра «Фиксированный размер шага» - 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).
На панели «Внедрение оборудования» диалогового окна «Параметры конфигурации» выберите действие построения в разделе «Параметры платы оборудования» > «Целевые аппаратные ресурсы» > «Группы» > «Параметры построения». Выбранное действие построения влияет на поведение Simulink при построении модели. None (установка по умолчанию) генерирует код только для узла ROS, не создавая его на внешнем устройстве ROS. Build и load генерирует код, передает его на внешнее устройство и создает исполняемый файл узла ROS. Если выбрать Компоновка и выполнить, результирующий исполняемый файл узла запускается автоматически в конце компоновки.
Задайте действие Построить (Build) как Построить (Build) и выполнить (Run).
Настройте подключение к внешнему устройству ROS. На вкладке ROS в раскрывающемся списке Deploy to щелкните Manage Remote Device (Управление удаленным устройством). Откроется диалоговое окно «Подключение к устройству ROS». В этом диалоговом окне можно ввести всю информацию, необходимую Simulink для развертывания узла ROS. Сюда входят IP-адрес или имя хоста устройства ROS, учетные данные для входа в систему и рабочая область Catkin. Изменение рабочего пространства Catkin на ~/catkin_ws_test.
Папка АФК - место установки АФК на устройстве АФК. Если эта папка не указана, тест настроек (см. следующий шаг) попытается определить правильную папку для вас.

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

Измените настройки подключения устройства и протестируйте их до тех пор, пока не появятся другие предупреждения или ошибки. Если автоматическое исправление настроек возможно, Simulink предлагает его, отображая кнопку «Исправить». После получения правильного набора параметров нажмите кнопку «ОК» в диалоговом окне параметров подключения для сохранения параметров.
Настройки соединения не относятся к одной модели, но применяются ко всем моделям ROS в Simulink.
Создание кода для автономного узла ROS и его автоматическая передача, сборка и запуск на устройстве ROS. Выполните упражнение для созданного узла ROS, используя мастер ROS, выполняющийся на устройстве ROS.
1. В MATLAB ® измените текущую папку на временную папку с разрешением на запись.
2. Процесс создания кода сначала подготавливает модель к моделированию для обеспечения правильной инициализации всех блоков. Для этой подготовки требуется действительное подключение к основной записи ROS.
В MATLAB можно использовать rosdevice объект для запуска хозяина АФК на устройстве АФК. Если аргументы отсутствуют, rosdevice использует настройки подключения устройства, введенные в диалоговом окне Simulink, для подключения к устройству ROS.
d = rosdevice runCore(d);

3. Использовать rosinit для подключения MATLAB к ведущему устройству ROS, работающему на устройстве ROS:
rosinit(d.DeviceAddress)
4. Сообщите Simulink использовать те же настройки соединения ROS, что и MATLAB. На вкладке Моделирование в разделе Подготовка выберите Сеть ROS. Установите для основных адресов ROS (ROS 1) и сетевых адресов узла по умолчанию.

Шаги 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 и проверьте его поведение с помощью робота-симулятора на основе 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 свойство показывает развернутый узел роботконтроллера. Чтобы убедиться, что узел запущен, вызовите isNodeRunning функция.
d = rosdevice

isNodeRunning(d, 'robotcontroller')
5. Остановите работу узла ROS.
stopNode(d, 'robotcontroller') isNodeRunning(d, 'robotcontroller')
6. Нажмите кнопку «Сброс моделирования» в окне моделирования. Робот остается в месте [0,0] и не перемещается.
Теперь перезапустите узел.
runNode(d, 'robotcontroller')
Робот должен снова начать движение к позиции цели.
7. После завершения проверки можно очистить состояние системы следующим образом.
Остановить узел, запущенный на целевом устройстве
stopNode(d, 'robotcontroller')
На главном компьютере закройте окно фигуры Robot Simulator и введите rosshutdown в командной строке MATLAB.
rosshutdown
Укажите параметры сети ROS в Simulink: По умолчанию Simulink использует параметры подключения ROS из rosinit в MATLAB. Чтобы переопределить эти параметры, укажите параметры подключения ROS в Simulink. На вкладке Моделирование в разделе Подготовка выберите Сеть ROS и задайте сетевые адреса главного узла и узла ROS:

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

Созданный код для конкретного процессора: Если вы используете блоки из других продуктов (например, Computer Vision System Toolbox™), созданный код может включать оптимизацию для конкретного процессора, которая приводит к проблемам компиляции при построении узла ROS в Linux. В этих случаях необходимо сообщить Simulink платформу, на которой компилируется сгенерированный код. Это можно сделать с помощью панели «Hardware Implementation» диалогового окна «Model Configuration Parameters».
Запуск мастера ROS в MATLAB: В приведенном выше примере соединение с ведущим ROS выполняется на устройстве ROS. Кроме того, в MATLAB можно создать основную запись ROS. Использовать 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). Для получения дополнительной информации о значении NodeHost установка.
Режим задания: Simulink может генерировать код для многозадачного или однозадачного режимов (см. Планирование по времени и создание кода (Simulink Coder)). По умолчанию сгенерированный код ROS использует одинарный режим (один поток для всех скоростей) без планирования в реальном времени. Это позволяет выполнять сгенерированный код ROS без sudo привилегий, но может привести к менее предсказуемой производительности.
Если требуется более предсказуемая производительность, можно настроить модель на использование многозадачности. На панели Решатель (Solver) диалогового окна Параметры конфигурации (Configuration Parameters) включите функцию Рассматривать каждую дискретную скорость как отдельную задачу для включения многозадачности. В сгенерированном коде это создает отдельный поток для каждой скорости в модели и использует приоритизированное планирование для потоков.
Для запуска узла ROS необходимы права администратора на устройстве ROS. Simulink автоматически определяет, являются ли ваши привилегии недостаточными при развертывании модели на целевом устройстве.