Снова с вами блог компаниии Tod, и сегодня мы продолжим знакомство с навигационным стеком операционной системы для роботов ROS. Напомним, что в предыдущей статье было дано общее описание навигационного стека, обозначены необходимые требования для его использованию на роботе, рассмотрены задачи управления перемещением робота, получения сенсорных данных одометрии и сонаров. В этой статье мы расскажет о самых «вкусных» возможностях навигационно стека: построение карты и планирование траектории движения с учетом встречающихся на пути робота препятствий. Под катом помимо всего прочего вы найдете видео с навигацией робота Tod в квартире.
Kinect
Для построения карты роботом можно использовать как профессиональный лазерный дальномер, так и менее дорогостоящую камеру глубины: Kinect или ASUS Xtion. Пожалуй, каждый из вас знает о Kinect как о игровом контроллере для приставки Xbox 360, расширяющим ее интерактивные возможности, но не все знают что именно благодаря Kinect профессиональная робототехника стала намного доступнее. Тогда как цена лазерного дальномера начального уровня составляет около 1000 $, покупка Kinect обойдется вам в 150-200 $.
Как видно из картинки выше, Kinect оснащен несколькими видами сенсоров, которые оказываются полезными для решения сразу нескольких задач в области робототехники:
- VGA камера с разрешением до 1280x1024 может быть использована в системе телеприсутсвия, навигации в помещении и совершения видеозвонков.
- На основе данных, получаемых с сенсора глубины, строятся 2-D и 3-D карты и выполняются другие задачи автономной навигации, а при наличии у робота манипулятора — осуществляется поиск и захват предметов.
- Массив 4-х микрофонов — для локализации источников звука (это интересная тема для отдельной статьи).
В ROS общение с Kinect происходит через узел пакета openni_launch путем публикации нескольких видов сообщений в соответствующие темы. В первую очередь, стоит обратить внимание на следующие темы:
- /camera/rgb/image_color — данные RGB-камеры в виде изображения;
- /camera/depth/image — данные сенсора глубины в виде изображения;
- /camera/depth/points — данные сенсора глубины в виде трехмерного облака точек.
Применение Kinect в навигационном стеке требует преобразования данных облака точек в данные фейкового лазерного 2-D дальномера, что означает получение горизонтального среза исходного облака точек. Для решения этой задачи мы воспользовались пакетом pointcloud_to_laserscan из стека робота Turtlebot. Вот так выглядит срез сенсорных данных Kinect в формате сообщения sensor_msgs/LaserScan.
Kinect по сравнению с дорогостоящими лазерными дальномерами, однако, имеет определенные недостатки. Их следует учитывать, в первую очередь, при решении вопроса о расположении Kinect на роботе. Один из главных недостатков — это большая слепая зона (около 50 см). После комментария пользователя ambikontur в предыдущей статье насчет этой проблемы и некоторых обсуждений, мы решили расположить Kinect ближе к задней части робота. Это позволило «спрятать» большую часть мертвой зоны внутрь корпуса.
Таким образом, на данном этапе робот Tod уже может выполнять следующие задачи, связанные с навигацией:
- получать данные одометрии для отслеживания траектории движения;
- принимать команды перемещения робота в формате линейной и угловой скорости;
- получать сенсорные данные сонаров в формате облака точек;
- получать сенсорные данные Kinect в формате лазерного 2-D дальномера.
На базе такой системы можно решать навигационные задачи более высокого уровня. В первую очередь, к таким задачам можно отнести SLAM (Simultaneous localization and mapping). SLAM решает проблему «курицы и яйца»: с одной стороны, достоверная оценка местоположения робота в пространстве требует точно построенной карты, с другой стороны, процесс построения карты нуждается в более точной оценки местоположения робота. Другой не менее важной навигационной задача — планирование траектории движения.
Навигационный стек ROS предоставляет 3 основных пакета, предназначенных для решения навигационных задач высокого уровня:
- gmapping создает карту помещения на основе алгоритма SLAM, данных лазерного дальномера и одометрии;
- amcl определяет местоположение робота уже на существующей карте;
- move_base позволяет перемещать робота в любую точку на карте с учетом препятствий.
Теперь давайте рассмотрим подробнее возможности каждого пакета.
gmapping
Сначала стоит сказать о том, что карта в ROS представляет собой обычный файл изображения в формате PGM, где каждый пиксель может быть:
- белым — пространство свободно;
- черным — пространство занято препятствием;
- серым — пространство еще не исследовано роботом.
Узел slam_gmapping в составе пакета gmapping предназначен для построения карты. Используемый в пакете алгоритм SLAM на основе собранных сенсорных данных формирует сеточную карту, в которой каждая ячейка задается определенной вероятностью нахождения в ней препятствия. Вероятность каждой ячейки корректируются по мере поступления новых сенсорных данных, и в итоге мы получаем наиболее достоверное представление карты. В качестве сенсорных данных gmapping использует данные лазерного дальномера, источником которых в роботе Tod служит Kinect, и данные одометрии.
Что бы создать карту, необходимо, управляя роботом с клавиатуры или джостика, объехать помещение и сохранить полученную карту в файл. Объезжать помещение лучше не очень быстро, при этом учитывая особенности используемого дальномера. Например, Kinect обладает слепой зоной спереди, поэтому при построении карты не стоит подъезжать к стенам слишком близко.
Мы испытали пакет gmapping и робота Tod в боевых домашних условиях, и вот что из этого получилось.
amcl
Алгоритм узла amcl (Adaptive Monte Carlo Localization ) работает с уже готовой картой, например, созданной с помощью пакета gmapping. Этот алгоритм предназначен для вероятностного определения местоположения робота на основе метода Монте-Карло и фильтра частиц (particle filter).
Робот Tod в качестве исходных данных в узле amcl использует сенсорные данные лазерного дальномера и одометрии. После старта узел ожидает задания начального положения робота. Это удобно, например, при старте робота с док-станции. Однако, если начальное положение не задано, то ему назначается точка в начале системы координат карты.
Как видно на картинке ниже, на карте отображаются текущие данные лазерного дальномера в виде красных точек на стенах и препятствиях, а сам робот находится в облаке из зеленых стрелок. Эти стрелки обозначают массив возможных положений робота в текущий момент времени, формируемый узлом amcl. По мере перемещения робота по карте и получения новых сенсорных данных неопределенность положения робота на карте уменьшается и это облако становится меньше.
В узле amcl можно задавать множество параметров работы алгоритма. Например, увеличение максимального количества частиц (particle) повышает точность определения положения робота, но при этом увеличивается нагрузка на CPU.
move_base
Можно перемещать робота по карте, управляя им с клавиатуры, но имеющийся в навигационном стеке ROS пакет move_base также позволяет осуществлять его автономное перемещение. Достаточно задать точку на карте, и робот самостоятельно проложит оптимальный маршрут до цели. Во время выполнения задания робот будет сообщать о своем текущем местоположении, а если цель по какой-то причине окажется недоступной, то он отменит ее, не нарушая работы системы.
Глобальный маршрут строится сразу после задания цели с учетом известных на данный момент препятствий. Во время движения к цели глобальный маршрут разбивается на сегменты — локальные маршруты. Каждый локальный маршрут строиться с учетом поступающих сенсорных данных путем задания подходящей линейной и угловой скорости робота.
Характер маршрута движения робота к цели определяется двумя составляющими:
- глобальная карта затрат (global cost map) — для построения глобального маршрута движения;
- локальная карта затрат (local cost map) — для построения ближайшего локального маршрута движения.
Карты затрат предоставляют навигационную информацию, необходимую для успешного выполнения текущего маршрута. В конфигурационных файлах карт затрат задаются размеры робота, скорость его движения по маршруту, длина сегментов, частота обновления маршрута и многое другое.
И на этом мы заканчиваем знакомство с навигационным стеком ROS. В следующий раз мы научим робота Tod понимать русскую речь и распознавать лица. Подписывайтесь на наш блог — будьте в курсе событий.
This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.
Комментариев нет:
Отправить комментарий