Этот пример показывает вам, как использовать MATLAB®, чтобы управлять симулированным роботом, работающим на отдельном ОСНОВАННОМ НА ROS средстве моделирования по сети ROS 2. Это затем показывает, как сгенерировать узел ROS 2 для алгоритма управления и развернуть его в удаленное устройство. Пример, показанный здесь, использует ROS 2 и MATLAB для симуляции и MATLAB Coder™ для генерации кода и развертывания.
В этом примере вы запускаете скрипт MATLAB, который реализует следующий за знаком алгоритм и управляет симулированным роботом, чтобы следовать, путь на основе входит в систему среда. Алгоритм получает информацию о местоположении и информацию о камере от симулированного робота, который запускается в отдельном ОСНОВАННОМ НА ROS средстве моделирования. Алгоритм обнаруживает цвет знака и отправляет скоростные команды, чтобы повернуть робота на основе цвета. В этом примере алгоритм спроектирован, чтобы повернуть налево, когда робот сталкивается с синим знаком, и поверните направо, когда робот сталкивается с зеленым знаком. Наконец робот останавливается, когда он сталкивается с красным знаком.
Чтобы видеть, что этот пример использует ROS 1 или Simulink®, смотрите Знак Следовать за Роботом с ROS в MATLAB.
Запустите ОСНОВАННОЕ НА ROS средство моделирования для робота с дифференциальным приводом и сконфигурируйте связь MATLAB® со средством моделирования робота.
Чтобы следовать наряду с этим примером, загрузите виртуальную машину с помощью инструкций в Начало работы с Gazebo и Симулированным TurtleBot.
Запустите рабочий стол виртуальной машины Ubuntu®.
В рабочем столе Ubuntu кликните по значку лабиринта Gazebo ROS2, чтобы запустить мир Gazebo, созданный для этого примера.
В командном окне MATLAB, набор ROS_DOMAIN_ID
переменная окружения к 25
совпадать со средством моделирования робота настройки РОС-Бридж и запускать ros2 topic list
проверять, что темы от средства моделирования робота отображаются в MATLAB.
setenv('ROS_DOMAIN_ID','25') ros2('topic','list')
/camera/camera_info /camera/image_raw /clock /cmd_vel /imu /joint_states /odom /parameter_events /rosout /scan /tf
Создайте узел ROS 2 с помощью заданного доменного ID.
domainID = 25;
n = ros2node("matlab_example_robot",domainID);
Создайте издателей и подписчиков на релейные сообщения к и от средства моделирования робота по сети ROS 2. Вам нужны подписчики для данных об одометрии и изображения. Чтобы управлять роботом, настройте издателя, чтобы отправить скоростные команды с помощью /cmd_vel
тема.
imgSub = ros2subscriber(n, "/camera/image_raw","sensor_msgs/Image"); odomSub = ros2subscriber(n, "/odom","nav_msgs/Odometry"); [velPub, velMsg] = ros2publisher(n, "/cmd_vel", "geometry_msgs/Twist");
Задайте параметры цветового порога обработки изображений. Каждая строка задает пороговые значения для различных цветов.
colorThresholds = [100 255 0 55 0 50; ... % Red 0 50 50 255 0 50; ... % Green 0 40 0 55 50 255]'; % Blue
Этот пример предоставляет помощнику в качестве примера график MATLAB Stateflow®, который берет в размере изображения, координатах от обработанного изображения и положениях одометрии робота. График обеспечивает линейный и скорость вращения, чтобы управлять роботом на основе этих входных параметров.
controller = ExampleHelperSignFollowingControllerChart;
open('ExampleHelperSignFollowingControllerChart');
Этот раздел запускает контроллер, чтобы получить изображения и переместить робота, чтобы следовать за знаком. Контроллер делает следующие шаги:
Получает последнее изображение и сообщение одометрии от сети ROS.
Запускает алгоритм для обнаружения функций изображений (ExampleHelperSignFollowingProcessImg
).
Генерирует команды управления из графика Stateflow® с помощью step
.
Публикует скоростные команды управления к сети ROS.
Чтобы визуализировать изображение маскированное, робот видит, измените значение doVisualization
переменная к true
.
ExampleHelperSignFollowingSetupPreferences; % Control the visualization of the mask doVisualization = false; r = rateControl(10); receive(imgSub); % Wait to receive an image message before starting the loop receive(odomSub); while(~controller.done) % Get latest sensor messages and process them imgMsg = imgSub.LatestMessage; odomMsg = odomSub.LatestMessage; [img,pose] = ExampleHelperSignFollowingProcessMsg(imgMsg, odomMsg); % Run vision and control functions [mask,blobSize,blobX] = ExampleHelperSignFollowingProcessImg(img, colorThresholds); step(controller,'blobSize',blobSize,'blobX',blobX,'pose',pose); v = controller.v; w = controller.w; % Publish velocity commands velMsg.linear.x = v; velMsg.angular.z = w; send(velPub,velMsg); % Optionally visualize % NOTE: Visualizing data will slow down the execution loop. % If you have Computer Vision Toolbox, we recommend using % vision.DeployableVideoPlayer instead of imshow. if doVisualization imshow(mask); title(['Linear Vel: ' num2str(v) ' Angular Vel: ' num2str(w)]); drawnow('limitrate'); end % Pace the execution loop. waitfor(r); end
Необходимо видеть, что робот перемещается в ОСНОВАННОЕ НА ROS средство моделирования робота как показано ниже.
Робот следует за знаками и остановками в итоговом Знаке Стоп. Сбросьте сцену Gazebo после симуляции с помощью /reset_simulation
сервис. Создайте ros2svcclient
объект для обслуживания и использования call
возразите функции, чтобы вызвать сервис и сбросить сцену симуляции Gazebo.
gazeboResetClient = ros2svcclient(n,'/reset_simulation','std_srvs/Empty'); call(gazeboResetClient);
После того, как контроллер проверяется, следующий шаг должен сгенерировать узел ROS 2 для знака в соответствии с алгоритмом робота с помощью MATLAB Coder™ и развернуть его на удаленной Виртуальной машине под управлением Gazebo. Развертывание позволяет узлам ROS работать на удаленных машинах непосредственно, приводя к более быстрому выполнению. Создайте объект настройки MATLAB Coder, который использует "Robot Operating System 2 (ROS 2)"
оборудование. Для виртуальной машины Linux для ROS Toolbox, набор следующие параметры конфигурации перед удаленным развертыванием. Обратите внимание на то, что фактические значения могут отличаться для вашего удаленного устройства. Проверьте их перед развертыванием. Установите действие сборки на 'Build
and
Run'
так, чтобы развернутый узел ROS начал выполняться после генерации кода.
cfg = coder.config("exe"); cfg.Hardware = coder.hardware("Robot Operating System 2 (ROS 2)"); cfg.Hardware.DeployTo = 'Remote Device'; cfg.Hardware.RemoteDeviceAddress = '192.168.192.129'; cfg.Hardware.RemoteDeviceUsername = 'user'; cfg.Hardware.RemoteDevicePassword = 'password'; cfg.Hardware.BuildAction = "Build and run";
Используйте DeploySignFollowingRobotROS2
функция, которая содержит код алгоритма регулятора, проверенный в предыдущем разделе. Запустите следующую команду, чтобы сгенерировать узел ROS и развернуть контроллер. Необходимо видеть, что робот перемещается в мир Gazebo.
codegen DeploySignFollowingRobotROS2 -config cfg
Connecting to ROS 2 device at '192.168.192.129'. Using ROS 2 workspace '~/ros2_ws' to build ROS 2 node. --- Transferring generated code for 'DeploySignFollowingRobotROS2' to ROS device. Starting build for ROS node. --- ROS 2 project directory: /home/user/ros2_ws/src tar: Ignoring unknown extended header keyword 'SCHILY.fflags' tar: Ignoring unknown extended header keyword 'SCHILY.fflags' tar: Ignoring unknown extended header keyword 'SCHILY.fflags' tar: Ignoring unknown extended header keyword 'SCHILY.fflags' Starting >>> deploysignfollowingrobotros2 Finished <<< deploysignfollowingrobotros2 [20.5s] Summary: 1 package finished [20.7s] --- Running ROS 2 node. --- Use the 'ros2device' object to stop or start the generated node. Code generation successful.
Робот следует за знаками и остановками в итоговом Знаке Стоп. Сбросьте сцену Gazebo после того, как узел выполнится путем вызова rossvcclient
объект, gazeboResetClient
.
call(gazeboResetClient);
ros2device
Чтобы повторно выполнить развернутый узел ROS из MATLAB, создайте ros2device
объект, задающий deviceAddress,
username,
и password
значения Виртуальной машины под управлением Gazebo. Это устанавливает связь SSH между устройством ROS и MATLAB. Проверяйте доступные узлы на соединенном удаленном устройстве. Проверьте что развернутый узел ROS, DeploySignFollowingRobotROS2
\exists.
gazeboVMDevice = ros2device('192.168.192.129','user','password'); gazeboVMDevice.AvailableNodes
ans = 1×3 cell
{'DeploySignFollowingRobotROS2'} {'gazebo_ros_paths.py'} {'spawn_entity.py'}
Запустите узел ROS, развернутый на удаленном устройстве с помощью runNode
функция.
runNode(gazeboVMDevice,'DeploySignFollowingRobotROS2')
The node 'DeploySignFollowingRobotROS2' is already running on the ROS device. Use the 'stopNode' function to stop it.