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

®

В этом примере показано, как сгенерировать код С++ для автономного узла ROS из функции MATLAB. Затем показано, как создать и запустить узел ROS на компьютере с Windows ®.

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

  • Этот пример требует MATLAB Coder™.

  • Система Ubuntu Linux с установленными ROS и SSH сервером необходима для создания и выполнения сгенерированного кода С++. Можно использовать собственную систему Ubuntu ROS, или можно использовать примеры Linux-виртуальной машины для Toolbox™ Robotics System (для получения инструкций см. «Запуск с Gazebo и моделируемым TurtleBot»).

  • Вы должны иметь доступ к компилятору C/C + +, который настроен правильно. Можно использовать mex -setup cpp чтобы просмотреть и изменить компилятор по умолчанию. Для получения дополнительной информации см. раздел «Изменение компилятора по умолчанию».

Управление роботом с поддержкой ROS с функцией

Откройте функцию robotROSFeedbackControl, который содержит пропорциональный контроллер, введенный в пример управления с обратной связью робота с поддержкой ROS. Эта функция подписана на /odom topic, чтобы получить текущий статус одометрии робота, а затем публикует выход пропорционального контроллера как geometry_msgs/Twist сообщение в /cmd_vel тема. Это обеспечивает команды управления для робота двигаться к требуемому положению.

Скопируйте robotROSFeedbackControl переключиться на локальную директорию и изменить defaultDesiredPos переменная требуемых координат.

Запустите Gazebo Empty World с виртуальной машины Linux, запустив приложение Gazebo Empty на рабочем столе. В виртуальной машине Linux для Robotics System Toolbox™ робот расположен на [0,0] расположение по умолчанию.

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

d = rosdevice;
rosinit(d.DeviceAddress)
rosnode list

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

robotROSFeedbackControl

Вы можете изменить нужный пункт назначения, пока робот движется. Для этого откройте новый терминал из виртуальной машины, скопируйте репозиторий ROS и опубликуйте новые координаты назначения в виде std_msgs/Float64MultiArray сообщение в /dest тема.

~$ source /opt/ros/melodic/local_setup.bash
~$ rostopic pub -1 /dest std_msgs/Float64MultiArray "{data:[0,0]}"

Можно отключить контроллер в любое время с помощью Ctrl-C или ввода следующей команды в терминале от виртуальной машины. Обратите внимание, что если вы открываете новый терминал в виртуальной машине, необходимо исходить из репозитория ROS.

~$ rostopic pub -1 /stop std_msgs/Bool "1"

Можно также настроить distanceThre, linearVelocity, и rotationGain значения в robotROSFeedbackControl.m для получения желаемого поведения робота. Для пропорционального контроллера в этом примере следующие области значений параметров обеспечивают устойчивую эффективность. Также можно заменить пропорциональный контроллер на пользовательский для сравнения эффективности.

distanceThre: 0<x<1
linearVelocity: 0<x<3
rotationGain: 0<x<6

Чтобы наблюдать за поведением, сбросьте робота на виртуальной машине, нажав Ctrl-R в Gazebo.

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

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

  • Поскольку объекты не поддерживают генерацию кода, замените их структурами для rospublisher, rossubscriber, и rosmessage. Задайте пару "имя-значение" "DataFormat","struct" in the соответствующие вызовы функций, чтобы создать их как структуры.

  • Сохраните измененную функцию MATLAB в robotROSFeedbackControlCodegen.m. Убедитесь в любых других изменениях, которые вы сделали в robotROSFeedbackControl функция отражена в robotROSFeedbackControlCodegen.

Сгенерируйте исполняемый файл для robotROSFeedbackControlCodegen

Сгенерируйте исполняемый узел для robotROSFeedbackControlCodegen функция. Задайте оборудование следующим 'Robot Operating System (ROS)'. Установите действие сборки равным Build and run чтобы узел ROS начал запускаться после того, как вы сгенерируете его. Функции plotPath для построения графика траектории робота.

cfg = coder.config('exe');
cfg.Hardware = coder.hardware('Robot Operating System (ROS)');
cfg.Hardware.BuildAction = 'Build and run';
codegen robotROSFeedbackControlCodegen -args {} -config cfg
plotPath

По умолчанию строение генерирует и запускает узел ROS на локальном хосте-компьютере. Можно вместо этого развернуть и запустить узел ROS на удаленном устройстве (например, на виртуальной машине), изменив cfg. Оборудование. Например, если вы используете виртуальную машину Linux для Toolbox™ Robotics System, задайте следующие параметры конфигурации перед удаленным развертыванием. Обратите внимание, что фактические значения для удаленного устройства могут отличаться. Проверьте их перед развертыванием.

cfg.Hardware.RemoteDeviceAddress = '192.168.243.144';
cfg.Hardware.RemoteDeviceUsername = 'user';
cfg.Hardware.RemoteDevicePassword = 'password';
cfg.Hardware.DeployTo = 'RemoteDevice';

Проверьте сгенерированный узел ROS

После того, как сгенерированный исполняемый файл начнет выполняться, для тех же координат назначения проверьте, что траектория робота похожа на то, что вы наблюдаете во время выполнения MATLAB. Наблюдать за роботом, движущимся в Gazebo, можно и на виртуальной машине. Вы можете опубликовать другую координату назначения, пока робот находится в движении. См. раздел Управление роботом с поддержкой ROS с функцией, в котором показано, как опубликовать новый набор координат назначения через терминал виртуальной машины.

Завершите сгенерированный узел ROS нажатием Ctrl-C или отправкой сообщения в /stop тема.

Выключите систему ROS.

rosshutdown
Для просмотра документации необходимо авторизоваться на сайте