Объезд препятствий с TurtleBot

Этот пример демонстрирует реализацию VFH + алгоритм предотвращения препятствия с TurtleBot®. Использование таймеров исследуется, чтобы представить их степень в автономных алгоритмах.

VFH + алгоритм является простым, локальным методом, чтобы помочь роботу переместиться по пробелу, не поражая препятствия. Поскольку алгоритм включает только локальную информацию, робот, как гарантируют, не достигнет целевой точки. Это может застрять в углах (локальный минимум). Это может врезаться в стены, если усиление предназначения цели является слишком большим по сравнению с тем из предотвращения препятствия. Это может переместиться бесцельно, если усиление предназначения цели является слишком низким по сравнению с тем из предотвращения препятствия. Экспериментируйте с усилениями и параметрами алгоритма, чтобы исследовать различные типы поведений для робота.

Этот пример показывает вам, как разработать и протестировать простое предотвращение препятствия на TurtleBot. Robotics System Toolbox™ содержит более мощную реализацию VFH + алгоритм предотвращения препятствия в robotics.VectorFieldHistogram. Производительность алгоритма предотвращения препятствия подвергается ограничениям датчика Kinect®, а именно, его минимальная область значений и его ограниченное поле зрения.

Предпосылки: свяжитесь с TurtleBot, исследуйте основное поведение TurtleBot, управляйте TurtleBot с дистанционным управлением

Пакет аппаратной поддержки для TurtleBot

Этот пример дает обзор работы с TurtleBot с помощью его нативного интерфейса ROS. Пакет Поддержки Robotics System Toolbox™ для Роботов TurtleBot®-Based обеспечивает более оптимизированный интерфейс к TurtleBot. Это позволяет вам:

  • Получите данные о датчике и отправьте команды управления, явным образом не вызывая команды ROS

  • Свяжитесь прозрачно с моделируемым роботом в Gazebo или с физическим TurtleBot

Чтобы установить пакет поддержки, откройтесь, Дополнения> Получают Пакеты Аппаратной поддержки на вкладке Home MATLAB® и выбирают "TurtleBot-Based Robots". Также используйте roboticsAddons команду.

Соединитесь с TurtleBot

Убедитесь, что у вас есть TurtleBot, запускающийся или в симуляции через Gazebo® или на действительном оборудовании. Обратитесь к Запуску с Gazebo и Моделируемым TurtleBot или Запуску с Действительным TurtleBot для процедуры запуска. В данном примере использование Gazebo® TurtleBot World обеспечивает самую интересную среду.

Инициализируйте ROS. Соединитесь с TurtleBot, заменив ipaddress на IP-адрес TurtleBot

ipaddress = '192.168.203.129';
rosinit(ipaddress)
Initializing global node /matlab_global_node_17598 with NodeURI http://192.168.203.1:50399/

Убедитесь, что вы запустили камеру Kinect, если вы работаете с действительным оборудованием TurtleBot. Команда, чтобы запустить камеру: roslaunch turtlebot_bringup 3dsensor.launch. Запустите эту команду в терминале на TurtleBot.

Инициализируйте алгоритм предотвращения препятствия

Сгенерируйте struct, который содержит усиления, используемые в VFH + алгоритм. Чтобы изменить поведение робота, измените эти усиления прежде, чем инициализировать таймер. Усиления управляют четырьмя поведениями: предназначайтесь для цели, перемещения в прямой линии, пройдите непрерывный путь и постарайтесь не сталкиваться с препятствиями. Различные усиления вызывают различные поведения. Например, если obstaclesAvoid = 0, робот пытается пахать через препятствие независимо от расстояния. Если goalTargeting = 0, робот блуждает бесцельно при предотвращении препятствий. Выбор соответствующих параметров является трудным и зависит от среды робота. Этот пример предоставляет больше информации, чтобы помочь вам выбрать соответствующие параметры. Эти усиления пытаются сбалансировать предназначение цели с предотвращения препятствия справедливо.

gains.goalTargeting = 100;          % Gain for desire to reach goal
gains.forwardPath = 0;            % Gain for moving forward 
gains.continuousPath = 0;         % Gain for maintaining continuous path
gains.obstacleAvoid = 5;        % Gain for avoiding obstacles

Примечание: сканирование лазера Kinect имеет минимальную область значений. Из-за этой минимальной области значений TurtleBot может избежать некоторых препятствий хорошо и затем повернуть и управлять в них, когда они очень близки. Это поведение состоит в том, потому что лазер не видит их. Это перемещение может часто происходить в дверных проемах, где TurtleBot не делает полностью перекрестный порог прежде, чем повернуться к целевому местоположению. Кадр двери может быть слишком близким, чтобы видеть в этой точке и дисках TurtleBot в нее, не зная, что это там. Этой проблемой является недостаток локальных алгоритмов планирования, объединенных с ограниченным диапазоном лазерного сканера. С действительным оборудованием датчик удара должен быть активирован в этом случае, но в симуляции не будет работать датчик удара, таким образом, робот сможет застрять против дверной рамы.

Создайте издателей и подписчиков и сделайте их частью struct (timerHandles), который вы передаете в таймер, когда это создается. Издатель для скорости, и подписчики для лазерного сканера, одометрии и датчика удара.

timerHandles.pub = rospublisher('/mobile_base/commands/velocity'); % Set up publisher
timerHandles.pubmsg = rosmessage('geometry_msgs/Twist');

timerHandles.sublaser = rossubscriber('/scan');  % Set up subscribers
timerHandles.subodom = rossubscriber('/odom');
timerHandles.subbump = rossubscriber('/mobile_base/sensors/bumper_pointcloud');

Если вы хотите сбросить одометрию перед продолжением, необходимо подписаться на тему reset_odometry и отправить пустое сообщение в нее:

odomresetpub = rospublisher('/mobile_base/commands/reset_odometry');  % Reset odometry 
odomresetmsg = rosmessage('std_msgs/Empty');
send(odomresetpub,odomresetmsg)
pause(2);     % Wait until odometry is reset

Добавьте усиления в struct timerHandles.

timerHandles.gains = gains;

Протестируйте предотвращение препятствия

Инициализируйте таймер. Таймерная функция берет серию Аргументов пары "имя-значение". Первая пара является функцией обратного вызова для таймера, который также включает struct, ранее заданный. Второе задает период таймера (в этом случае, это - 0,1 секунды на цикл). Третья и итоговая Пара "имя-значение" задает режим выполнения, которое фиксируется, располагая с интервалами. Можно также задать функцию остановки для таймера, который в этом случае закрывает ROS, когда таймер останавливается.

timer1 = timer('TimerFcn',{@exampleHelperTurtleBotObstacleTimer,timerHandles},'Period',0.1,'ExecutionMode','fixedSpacing');
timer1.StopFcn = {@exampleHelperTurtleBotStopCallback};

Прежде, чем запустить таймер, можно визуализировать некоторые шаги алгоритма в командной строке. Вы видите основной путь VFH +, алгоритм работает с помощью функции exampleHelperTurtleBotShowGrid. Отображены три графика. Рисунок 1 показывает необработанные лазерные данные после того, как это было отсортировано в 2D гистограмму. Рисунок 2 показывает гистограмму после того, как это сглаживалось, чтобы составлять ширину робота. Рисунок 3 показывает угловую гистограмму, которая создается раскладыванием препятствия в группы согласно направлениям, робот может переместиться. VFH + алгоритм использует эти шаги, чтобы определить, как избежать препятствий при предназначении для целевой точки.

exampleHelperTurtleBotShowGrid(timerHandles.sublaser);

"Угловой график" интервала визуально инвертируется из двух x-y графиков сетки. Сетки представляют действительную 2D плоскость и фактические оси X и Y (хотя координаты не соответствуют реальному миру, потому что они представляют интервалы). На угловом графике угловые интервалы перечислены слева направо в увеличивающемся порядке, но на 2D плоскости эти углы соответствуют пробелу путем перемещения справа налево, условно.

Запустите робота

Введите следующие команды, чтобы запустить таймер. Выберите точку, чтобы отправить TurtleBot. TurtleBot начнет перемещать и избегать любых обнаруженных препятствий. Таймер будет остановлен автоматически, если робот достигает своей цели.

start(timer1);
while strcmp(timer1.Running, 'on')
    exampleHelperTurtleBotShowGrid(timerHandles.sublaser);
    pause(0.5);    
end

Чтобы остановить таймер в то время как посреди цикла, закройте окно рисунка. Если таймер не очищается, безопасный способ очистить все таймеры состоит в том, чтобы использовать следующую команду:

delete(timerfindall)

При запуске симуляция Gazebo с мировым графическим выводом может выглядеть так фигура:

После выбора точки в следующей комнате, которая будет предназначаться, вы видите, что что-то вроде этого фигурирует:

Завершите работу сети ROS

Когда вы будете закончены, очистите издателей и подписчиков. Завершите работу сети ROS, чтобы отключиться от Turtlebot.

clear
rosshutdown
Shutting down global node /matlab_global_node_17598 with NodeURI http://192.168.203.1:50399/

Больше информации

ПРИМЕЧАНИЕ: Код в этом разделе не для выполнения командной строки MATLAB

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

Этот скрипт использует timer, который можно использовать многими различными способами. В этом примере вы используете коллбэки TimerFcn и StopFcn.

Коллбэк таймера и базовое рабочее пространство делятся информацией через struct timerHandles, который содержит усиления, издателей и подписчиков. Если вам нужна дополнительная информация от базового рабочего пространства, включенного в коллбэк таймера, добавьте его в struct timerHandles.

Если таймер запустился, выполнения коллбэка таймера согласно параметрам. В этом примере коллбэк таймера (exampleHelperTurtleBotObstacleTimer) вызывает две первичных функции, которые выполняют основные функции алгоритма. Вот базовая структура (исключая объявления, инициализации и функции обратного вызова):

function exampleHelperTurtleBotObstacleTimer(mTimer, event, handles)
   % Declarations and Initializations would be here
   % Determine current time
   currentTime = datetime(event.Data.time);
   % Execute the VFH+ algorithm to determine the desired angle trajectory
   angleTarget = exampleHelperTurtleBotComputeTargetAngle(goal, data, pose, anglePrev, handles.gains);
   % Execute the main control loop        
   [linV, angV] = turtlebotController(currentTime,angleTarget,bumper);
   % Set the velocities
   handles.pubmsg.Linear.X = linV;
   handles.pubmsg.Angular.Z = angV;
   send(handles.pub,handles.pubmsg);
   % Set the previous angle
   anglePrev = angleTarget;
   % Callback functions would be here

Первой главной функцией является exampleHelperTurtleBotComputeTargetAngle, который возвращает угол, для которого робот будет предназначаться, чтобы повернуться к (относительно его текущей ориентации). В этом примере computeTargetAngle является реализацией VFH + алгоритм. Функция computeTargetAngle может быть заменена любой пользовательской функцией, которая возвращает целевой угол. Можно исследовать много потенциальных алгоритмов. Основные шаги VFH + алгоритм сделаны из статьи Ульриха и Боренштайна [1]. Это решающие шаги в алгоритме:

Если вы хотите настроить размеры интервала для гистограмм и максимальные и минимальные значения для лазерного сканирования и угловых гистограмм, обратитесь к локальной функции в exampleHelperTurtleBotComputeTargetAngle, названном setBin. Можно настроить любой из параметров, включая минимум X и Y и максимум и размер шага. Знайте о физических ограничениях робота (например, y минимум никогда не должен быть отрицательным, потому что робот не видит позади себя).

Вторым первичным методом коллбэка таймера является turtlebotController, который возвращает линейные и угловые скорости когда данный аргументы, такие как целевое положение, текущее положение и целевой угол. Этот контроллер может быть заменен любым пользовательским контроллером, который возвращает линейные и угловые скорости (в m/s). В turtlebotController функция является классом ExampleHelperPIDControl. Как в настоящее время реализовано, turtlebotController использует только пропорциональное управление. Однако класс управления ПИДом имеет опции для пропорционального, производного, и интегрального управления, которое может использоваться следующим образом: linGains.pgain = 0.2; linGains.dgain = 0; linGains.igain = 0; linGains.maxwindup = 0; linGains.setpoint = 0; linPID = ExampleHelperPIDControl (linGains);

Более быстрый способ установить усиления: linGains = struct ('pgain', 0.2, 'dgain', 0, 'igain', 0, 'maxwindup', 0', 'заданное значение', 0);

Обязательно протестируйте и настройте усиления, которые вы выбираете, когда они могут привести к совсем другим поведениям робота. setpoint является точкой, что вы хотите управлять вокруг. Другие элементы struct ясно называют. Чтобы обновить контроллер и возвратить значение управления, используйте функцию обновления.

       controlvalue = update(linPID,currentpoint);

Функции обратного вызова для подписчиков заданы как вложенные функции в функции обратного вызова таймера. Важные переменные, такие как pose, goal и bumper заданы в тех коллбэках. В целом модульный принцип функции обратного вызова таймера и поддерживающих функций допускает большую гибкость в индивидуальной настройке.

Следующие шаги

Ссылки

[1] Я. Ульрих, Дж. Боренштайн, "VFH +: надежное предотвращение препятствия для быстрых мобильных роботов", В Продолжениях Международной конференции IEEE® по вопросам Робототехники и Автоматизации (ICRA), 1998, издание 2, стр 1572-1577