Этот пример показывает вам, как использовать MATLAB®, чтобы управлять симулированным роботом, работающим на отдельном ОСНОВАННОМ НА ROS средстве моделирования по сети ROS 2.
В этом примере вы запускаете скрипт MATLAB, который реализует следующий за знаком алгоритм и управляет симулированным роботом, чтобы следовать, путь на основе входит в систему среда. Алгоритм получает информацию о местоположении и информацию о камере от симулированного робота, который запускается в отдельном ОСНОВАННОМ НА ROS средстве моделирования. Алгоритм обнаруживает цвет знака и отправляет скоростные команды, чтобы повернуть робота на основе цвета. В этом примере алгоритм спроектирован, чтобы повернуть налево, когда робот сталкивается с синим знаком, и поверните направо, когда робот сталкивается с зеленым знаком. Наконец робот останавливается, когда он сталкивается с красным знаком.
Чтобы видеть, что этот пример использует ROS 1 или Simulink®, смотрите Знак Следовать за Роботом с ROS в MATLAB.
Запустите ОСНОВАННОЕ НА ROS средство моделирования для робота с дифференциальным приводом и сконфигурируйте связь MATLAB® со средством моделирования робота. Поскольку средство моделирования использует ROS 1 тема, запустите РОС-Бридж, чтобы совместно использовать темы с сетью ROS 2.
Этот пример использует виртуальную машину (VM) доступную для скачивания в Виртуальной машине с Мелодичным ROS 2 и Gazebo.
Запустите рабочий стол виртуальной машины Ubuntu®.
В рабочем столе Ubuntu кликните по Последователю Знака Gazebo значок ROS, чтобы запустить мир Gazebo, созданный для этого примера.
Кликните по РОС-Бридж (Подчеркивание штриховой линией) значок, чтобы запустить РОС-Бридж к релейным сообщениям между вашим узлом ROS 2 и поддерживающим ROS роботом Turtlebot3.
В командном окне MATLAB, набор ROS_DOMAIN_ID
переменная окружения к 25
совпадать со средством моделирования робота настройки РОС-Бридж и запускать ros2 topic list
проверять, что темы от средства моделирования робота отображаются в MATLAB.
setenv('ROS_DOMAIN_ID','25') ros2('topic','list')
/camera/rgb/camera_info /camera/rgb/image_raw /camera/rgb/image_raw/compressed /clock /gazebo/link_states /gazebo/model_states /imu /joint_states /odom /parameter_events /rosout /rosout_agg /scan /tf
Создайте узел ROS 2 с помощью заданного доменного ID.
domainID = 25;
n = ros2node("matlab_example_robot",domainID);
Создайте издателей и подписчиков на релейные сообщения к и от средства моделирования робота по сети ROS 2. Вам нужны подписчики для данных об одометрии и изображения. Чтобы управлять роботом, настройте издателя, чтобы отправить скоростные команды с помощью /cmd_vel
тема.
imgSub = ros2subscriber(n, "/camera/rgb/image_raw"); odomSub = ros2subscriber(n, "/odom"); [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 средство моделирования робота как показано ниже.