В этом примере показано, как использовать MATLAB ® для управления моделируемым роботом, работающим на отдельном симуляторе на основе ROS по сети ROS 2.
В этом примере запускается скрипт MATLAB, который реализует алгоритм следования знакам и управляет моделируемым роботом для следования по пути, основанному на знаках в среде. Алгоритм получает информацию о местоположении и информацию камеры от моделируемого робота, который работает в отдельном симуляторе на основе АФК. Алгоритм определяет цвет знака и посылает команды скорости для поворота робота на основе цвета. В этом примере алгоритм предназначен для поворота влево, когда робот сталкивается с синим знаком, и вправо, когда робот сталкивается с зеленым знаком. Наконец робот останавливается, когда сталкивается с красным знаком.
Для просмотра этого примера использования ROS 1 или Simulink ® см. раздел Подпись следующего робота с ROS в MATLAB.
Запустите имитатор на базе ROS для робота с дифференциальным приводом и настройте соединение MATLAB ® с имитатором робота.
Чтобы следовать этому примеру, загрузите виртуальную машину с помощью инструкций в разделе «Начало работы с беседкой» и «Смоделированный TurtleBot».
Запустите рабочий стол виртуальной машины Ubuntu ®.
На рабочем столе Ubuntu щелкните значок Gazebo ROS2 Maze, чтобы начать создание мира Gazebo для этого примера.
В окне команд MATLAB установите ROS_DOMAIN_ID переменная среды для 25 для соответствия настройкам моста ROS робота-имитатора и запуска 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, используя указанный идентификатор домена.
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.
Публикует команды управления скоростью в сети АФК.
Чтобы визуализировать маскированное изображение, которое видит робот, измените значение 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-симуляторе, как показано ниже.
