Следите за роботом с ROS 2 в MATLAB

В этом примере показано, как использовать MATLAB ® для управления моделируемым роботом, работающим на отдельном симуляторе на основе ROS по сети ROS 2.

В этом примере вы запускаете скрипт MATLAB, который реализует алгоритм следования знаков и управляет моделируемым роботом, чтобы следовать по пути, основанному на знаках в окружении. Алгоритм получает информацию о местоположении и информацию о камере от моделируемого робота, который работает в отдельном симуляторе на основе ROS. Алгоритм обнаруживает цвет знака и отправляет команды скорости, чтобы повернуть робота на основе цвета. В этом примере алгоритм разработан, чтобы повернуть налево, когда робот сталкивается с синим знаком и поворачивает направо, когда робот сталкивается с зеленым знаком. Наконец робот останавливается, когда сталкивается с красным знаком.

Чтобы увидеть этот пример с использованием ROS 1 или Simulink ®, смотрите Sign Following Robot with ROS в MATLAB.

Подключение к симулятору робота

Запустите симулятор на основе ROS для робота с дифференциальным приводом и сконфигурируйте соединение MATLAB ® с симулятором робота.

Чтобы следовать этому примеру, загрузите виртуальную машину с помощью инструкций в Запуск с Gazebo и Моделируемый 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

Setup связи ROS 2

Создайте узел 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

Создайте знак после контроллера с помощью графика Stateflow ®

Этот пример предоставляет пример вспомогательного графика 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, как показано ниже.