Этот пример демонстрирует реализацию VFH + алгоритм предотвращения препятствия с TurtleBot®. Использование таймеров исследуется, чтобы представить их степень в автономных алгоритмах.
VFH + алгоритм является простым, локальным методом, чтобы помочь роботу переместиться по пробелу, не поражая препятствия. Поскольку алгоритм включает только локальную информацию, робот, как гарантируют, не достигнет целевой точки. Это может застрять в углах (локальный минимум). Это может врезаться в стены, если усиление предназначения цели является слишком большим по сравнению с тем из предотвращения препятствия. Это может переместиться бесцельно, если усиление предназначения цели является слишком низким по сравнению с тем из предотвращения препятствия. Экспериментируйте с усилениями и параметрами алгоритма, чтобы исследовать различные типы поведений для робота.
Этот пример показывает вам, как разработать и протестировать простое предотвращение препятствия на TurtleBot. Robotics System Toolbox™ содержит более мощную реализацию VFH + алгоритм предотвращения препятствия в robotics.VectorFieldHistogram
. Производительность алгоритма предотвращения препятствия подвергается ограничениям датчика Kinect®, а именно, его минимальная область значений и его ограниченное поле зрения.
Предпосылки: свяжитесь с TurtleBot, исследуйте основное поведение TurtleBot, управляйте TurtleBot с дистанционным управлением
Этот пример дает обзор работы с TurtleBot с помощью его нативного интерфейса ROS. Пакет Поддержки Robotics System Toolbox™ для Роботов TurtleBot®-Based обеспечивает более оптимизированный интерфейс к TurtleBot. Это позволяет вам:
Получите данные о датчике и отправьте команды управления, явным образом не вызывая команды ROS
Свяжитесь прозрачно с моделируемым роботом в Gazebo или с физическим TurtleBot
Чтобы установить пакет поддержки, откройтесь, Дополнения> Получают Пакеты Аппаратной поддержки на вкладке Home MATLAB® и выбирают "TurtleBot-Based Robots". Также используйте roboticsAddons
команду.
Убедитесь, что у вас есть 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, чтобы отключиться от 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