В этом примере показано, как сгенерировать код С++ для автономного узла ROS из функции MATLAB. Затем показано, как создать и запустить узел ROS на компьютере с Windows ®.
Этот пример требует MATLAB Coder™.
Система Ubuntu Linux с установленными ROS и SSH сервером необходима для создания и выполнения сгенерированного кода С++. Можно использовать собственную систему Ubuntu ROS, или можно использовать примеры Linux-виртуальной машины для Toolbox™ Robotics System (для получения инструкций см. «Запуск с Gazebo и моделируемым TurtleBot»).
Вы должны иметь доступ к компилятору C/C + +, который настроен правильно. Можно использовать mex -setup cpp
чтобы просмотреть и изменить компилятор по умолчанию. Для получения дополнительной информации см. раздел «Изменение компилятора по умолчанию».
Откройте функцию 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';
После того, как сгенерированный исполняемый файл начнет выполняться, для тех же координат назначения проверьте, что траектория робота похожа на то, что вы наблюдаете во время выполнения MATLAB. Наблюдать за роботом, движущимся в Gazebo, можно и на виртуальной машине. Вы можете опубликовать другую координату назначения, пока робот находится в движении. См. раздел Управление роботом с поддержкой ROS с функцией, в котором показано, как опубликовать новый набор координат назначения через терминал виртуальной машины.
Завершите сгенерированный узел ROS нажатием Ctrl-C или отправкой сообщения в /stop
тема.
Выключите систему ROS.
rosshutdown