exponenta event banner

Знак следующего робота с ROS в MATLAB

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

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

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

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

Чтобы следовать этому примеру, загрузите виртуальную машину с помощью инструкций в разделе «Начало работы с беседкой» и «Смоделированный TurtleBot».

  • Запустите рабочий стол виртуальной машины Ubuntu ®.

  • На рабочем столе Ubuntu щелкните значок Gazebo Sign Follower ROS, чтобы запустить мир Gazebo, построенный для этого примера.

  • Укажите IP-адрес и номер порта ведущего устройства ROS в Gazebo, чтобы MATLAB ® мог взаимодействовать с имитатором робота. Для этого примера мастер ROS в Беседке 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

Создание издателей и подписчиков для ретрансляции сообщений в имитатор робота и из него по сети 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

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

В этом примере приведен пример вспомогательной диаграммы 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] = 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-симуляторе, как показано ниже.