Подпишите следующего робота с ROS 2 в MATLAB

Этот пример показывает вам, как использовать MATLAB®, чтобы управлять симулированным роботом, работающим на отдельном ОСНОВАННОМ НА ROS средстве моделирования по сети ROS 2. Это затем показывает, как сгенерировать узел ROS 2 для алгоритма управления и развернуть его в удаленное устройство. Пример, показанный здесь, использует ROS 2 и MATLAB для симуляции и MATLAB Coder™ для генерации кода и развертывания.

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

Чтобы видеть, что этот пример использует ROS 1 или Simulink®, смотрите Знак Следовать за Роботом с ROS в MATLAB.

Свяжите со средством моделирования робота

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

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

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

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

  • В командном окне MATLAB, набор ROS_DOMAIN_ID переменная окружения к 25 совпадать со средством моделирования робота настройки РОС-Бридж и запускать 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 с помощью заданного доменного ID.

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

Робот следует за знаками и остановками в итоговом Знаке Стоп. Сбросьте сцену Gazebo после симуляции с помощью /reset_simulation сервис. Создайте ros2svcclient объект для обслуживания и использования call возразите функции, чтобы вызвать сервис и сбросить сцену симуляции Gazebo.

gazeboResetClient = ros2svcclient(n,'/reset_simulation','std_srvs/Empty');
call(gazeboResetClient);

Сгенерируйте и разверните узел ROS 2

После того, как контроллер проверяется, следующий шаг должен сгенерировать узел ROS 2 для знака в соответствии с алгоритмом робота с помощью MATLAB Coder™ и развернуть его на удаленной Виртуальной машине под управлением Gazebo. Развертывание позволяет узлам ROS работать на удаленных машинах непосредственно, приводя к более быстрому выполнению. Создайте объект настройки MATLAB Coder, который использует "Robot Operating System 2 (ROS 2)" оборудование. Для виртуальной машины Linux для ROS Toolbox, набор следующие параметры конфигурации перед удаленным развертыванием. Обратите внимание на то, что фактические значения могут отличаться для вашего удаленного устройства. Проверьте их перед развертыванием. Установите действие сборки на 'Build and Run' так, чтобы развернутый узел ROS начал выполняться после генерации кода.

cfg = coder.config("exe");
cfg.Hardware = coder.hardware("Robot Operating System 2 (ROS 2)");
cfg.Hardware.DeployTo = 'Remote Device';
cfg.Hardware.RemoteDeviceAddress = '192.168.192.129';
cfg.Hardware.RemoteDeviceUsername = 'user';
cfg.Hardware.RemoteDevicePassword = 'password';
cfg.Hardware.BuildAction = "Build and run";

Используйте DeploySignFollowingRobotROS2 функция, которая содержит код алгоритма регулятора, проверенный в предыдущем разделе. Запустите следующую команду, чтобы сгенерировать узел ROS и развернуть контроллер. Необходимо видеть, что робот перемещается в мир Gazebo.

codegen DeploySignFollowingRobotROS2 -config cfg
Connecting to ROS 2 device at '192.168.192.129'.
Using ROS 2 workspace '~/ros2_ws' to build ROS 2 node.
---
Transferring generated code for 'DeploySignFollowingRobotROS2' to ROS device.
Starting build for ROS node.
---
ROS 2 project directory: /home/user/ros2_ws/src
tar: Ignoring unknown extended header keyword 'SCHILY.fflags'
tar: Ignoring unknown extended header keyword 'SCHILY.fflags'
tar: Ignoring unknown extended header keyword 'SCHILY.fflags'
tar: Ignoring unknown extended header keyword 'SCHILY.fflags'


Starting >>> deploysignfollowingrobotros2

Finished <<< deploysignfollowingrobotros2 [20.5s]

Summary: 1 package finished [20.7s]

---
Running ROS 2 node.
---
Use the 'ros2device' object to stop or start the generated node.
Code generation successful.

Робот следует за знаками и остановками в итоговом Знаке Стоп. Сбросьте сцену Gazebo после того, как узел выполнится путем вызова rossvcclient объект, gazeboResetClient.

call(gazeboResetClient);

Повторно выполните развернутый узел с помощью ros2device

Чтобы повторно выполнить развернутый узел ROS из MATLAB, создайте ros2device объект, задающий deviceAddress, username, и password значения Виртуальной машины под управлением Gazebo. Это устанавливает связь SSH между устройством ROS и MATLAB. Проверяйте доступные узлы на соединенном удаленном устройстве. Проверьте что развернутый узел ROS, DeploySignFollowingRobotROS2\exists.

gazeboVMDevice = ros2device('192.168.192.129','user','password');
gazeboVMDevice.AvailableNodes
ans = 1×3 cell
    {'DeploySignFollowingRobotROS2'}    {'gazebo_ros_paths.py'}    {'spawn_entity.py'}

Запустите узел ROS, развернутый на удаленном устройстве с помощью runNode функция.

runNode(gazeboVMDevice,'DeploySignFollowingRobotROS2')
The node 'DeploySignFollowingRobotROS2' is already running on the ROS device. Use the 'stopNode' function to stop it.