В этом примере показано, как использовать MATLAB ® для управления моделируемым роботом, работающим на отдельном симуляторе на основе ROS по сети ROS. В показанном здесь примере используются ROS и MATLAB. Для других примеров с ROS 2 или Simulink ® смотрите:
В этом примере вы запускаете скрипт MATLAB, который реализует алгоритм следования знаков и управляет моделируемым роботом, чтобы следовать пути, основанного на знаках в окружении. Алгоритм получает информацию о местоположении и информацию о камере от моделируемого робота, который работает в отдельном симуляторе на основе ROS. Алгоритм обнаруживает цвет знака и отправляет команды скорости, чтобы повернуть робота на основе цвета. В этом примере алгоритм разработан, чтобы повернуть налево, когда робот сталкивается с синим знаком и поворачивает направо, когда робот сталкивается с зеленым знаком. Наконец робот останавливается, когда сталкивается с красным знаком.
Запустите симулятор на основе ROS для робота с дифференциальным приводом и сконфигурируйте соединение MATLAB ® с симулятором робота .
Чтобы следовать этому примеру, загрузите виртуальную машину с помощью инструкций в Запуск с Gazebo и Моделируемый TurtleBot.
Запустите рабочий стол виртуальной машины Ubuntu ®.
На рабочем столе Ubuntu щелкните значок Gazebo Sign Follower ROS, чтобы запустить мир Gazebo, созданный для этого примера.
Укажите IP-адрес и номер порта ведущего ROS в Gazebo, чтобы MATLAB ® мог общаться с симулятором робота. В данном примере мастер ROS в Gazebo http://192.168.203.131:11311
и ваш хост-компьютер адрес 192.168.31.1
.
Запустите сеть ROS 1 с помощью rosinit
.
masterIP = '192.168.203.131'; setenv('ROS_IP','192.168.31.1'); setenv('ROS_MASTER_URI',['http://' masterIP ':11311']); rosinit(masterIP,11311)
The value of the ROS_IP environment variable, 192.168.31.1, will be used to set the advertised address for the ROS node. Initializing global node /matlab_global_node_46296 with NodeURI http://192.168.31.1:57058/
Создайте издателей и подписчиков, чтобы ретранслировать сообщения с симулятора робота по сети ROS. Вам нужны подписчики на изображение и данные одометрии. Чтобы управлять роботом, настройте издателя, чтобы отправлять команды скорости с помощью /cmd_vel
.
imgSub = rossubscriber("/camera/rgb/image_raw"); odomSub = rossubscriber("/odom"); [velPub, velMsg] = rospublisher("/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] = ExampleHelperSignFollowingROSProcessMsg(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, как показано ниже.