Как сделать локальную карту

Построение локальной карты проходимости робота

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

Эта статья рассчитана на тех, кто только входит в мир робототехники или пытается разобраться с построением карты проходимости. Я старалась изложить все максимально простым и понятным языком, понятным для большинства людей.

Что такое локальная карта проходимости

Итак, локальная карта проходимости — это то, что видит робот в данный момент времени.
Это та информация, которая приходит с «глаз» робота и впоследствии обрабатывается и выводится в удобном нам виде.

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

Если робот движется, то в каждый момент времени его окружающая обстановка разная, соответственно, локальная карта тоже меняется.

Локальная карта обычно имеет постоянные размеры. Размер высчитывается исходя из максимальной длины лучей, испускаемых дальномером. В моем случае эта длина составляет 6 метров.

Чтобы упростить себе задачу, карту решено было сделать квадратной.Также было решено, что условно дальномер будет находиться ровно по центру карты (это место будет точкой, где x = y = 0). Центр был выбран таким образом, потому что дальномер, который я использую, испускает лучи в плоскости более, чем на 180° (он испускает лучи на 240°, но об этом чуть позже), то есть какие-то лучи непременно уйдут за сканер и при неверном выборе центра их можно потерять. При грамотном выборе центра все лучи будут корректно отображены. Исходя из этого, размер карты я сделала в 2 раза больше, чем максимальная длина испускаемых лучей.
Размер моей карты равен 12 * 12 метров.

Как сделать локальную карту

Датчик, который я использовала

На самом деле для решения подобного рода задачи можно использовать любой дальномер.
Дальномер — это прибор для определения расстояния до чего-либо (в моем случае до потенциального препятствия).

В робототехнике применяются в основном 2 типа дальномеров: ультразвуковые и лазерные.
Ультразвуковые дальномеры значительно дешевле, но ультразвуковые лучи достаточно широки и для точных измерений не годятся.

Лазерные дальномеры дороже, но точнее, так как их лучи узконаправленны.

Для решения своей задачи я использовала лазерный сканер Hokuyo URG-04LX-UG01. Этот датчик способен испускать лучи на 240° и дает достаточно точную информацию о препятствиях, которые встали на пути лучей. Его максимальная дальность — примено 5 — 6 метров. Стоит отметить, что данный дальномер испускает лучи только в 2D плоскости. Этот факт обязывает ставить датчик на робота в определенное место, обычно спереди снизу робота, для получения более точной картины. Опять же, можно использовать и 3D-сканеры, которые дают гораздо более точную и полную информацию об окружающей среде, но и стоят они гораздо дороже.

Считаю, что именно этот сканер прекрасно подходит для обучения в соотношении цена-качество.

Как сделать локальную карту
Hokuyo URG-04LX-UG01

Коротко о принципе действия лазерного сканера:
Дальномер испускает лучи вдоль плоскости. Луч, который встретил на своем пути препятствие, отражается от него и возвращается обратно. По разности фаз между посылаемым и принимаемым сигналами, можно судить о том, насколько далеко расположено препятствие.

Соответственно, если испускаемый луч не вернулся, то в 5 — 6 метрах вдоль прямой его испускания либо нет никаких препятствий, либо луч не смог корректно отразиться.

Как сделать локальную карту

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

Для каждого испущенного луча:

О построении карты

Для построния карты и ее отрисовки мною были использованы средства ROS (Robot Operating System), а именно: программа Rviz и тип данных nav_msgs::OccupancyGrid. Я создала публикатор (publisher) локальной карты с типом сообщений nav_msgs::OccupancyGrid под соответстующим топиком local_map. В Rviz, подписываясь на данный топик, принимала данные о карте и выводила их в форме типа Map.

В соответствии с таким алгоритмом необходимо было программно настроить обработку данных с лазерного сканера и запись их в необходимый формат для передачи. В OccupancyGrid карта хранится и передается в одномерном массиве.

Для тех, кто впервые сталкивается с подобным типом данных ROS: это необычно, так как карта привычным образом представяется в виде двумерного массива с определенным числом столбцов и строк.

Так было и у меня. Карту на основе данных со сканера я храню в двумерном массиве, а при формировании сообщения для отправки в Rviz, я преобразую двумерный массив в одомерный, необходимый для OccupancyGrid.

На самом деле карта в OccupancyGrid только хранится и передается в одномерном массиве. При расшифровке ее данных она автоматически превратится в квадратную двумерную карту.
Но чтобы это произошло корректно, необходимо записывать этот одномерный масив определенным образом.

А именно: строчка за строчкой из двумерного хранилища записывать в одну строку.

Вуаля! Это весь секрет.

Как сделать локальную карту

mapSize — размер локальной карты
j — номер столбца
i — номер строки

Ячейки карты (опять же в соответствии с типом данных OccupancyGrid) должны иметь значения от 0 до 100. Чем меньше значение, тем больше вероятность того, что ячейка является проходимой и наоборот.

Для упрощения задачи мною были выбраны 3 основные цвета раскрашивания ячеек.

До прихода данных со сканера карта является полностью неизвестной (значения всех ячеек = 50) и каждый раз после прорисовки вновь обновляется до неизестного состояния. Это делается для того, чтобы карта не наслаивала на себя лишних, предыдущих значений. Ведь локальная карта отражает состояние окружающей обстановки только в данный момент времени.

Как сделать локальную карту
Неизвестная карта

Строятся лучи c помощью преобразования из полярной системы координат (ПСК)
в декартову систему координат (ДСК).

$$display$$\left\ <\beginx = r * cos φ \\ y = r * sin φ \end\right.$$display$$

x, y — новые координаты в ДСК
r — расстояние до препятствия
φ — угол, на который был отброшен луч
r, φ — старые координаты в ПСК

Алгоритм обработки данных с датчика:

Полностью проходим по массивам расстояний r и углов φ лучей (данные ПСК). Для каждого элемента выполняем следующее:

Если такое произошло, это может означать следующее:

Как сделать локальную карту

Или потому, что препятствие было слишком черным и забрало в себя большую часть энергии луча и лучу не хватило энергии, чтобы вернуться обратно.

Таким образом, невозможно быть полностью уверенным в том, что произошло, если луч не вернулся.

Что делать в подобных ситуациях?

Разрешение карты

Наконец, последние штрихи!

У каждой карты есть разрешение. Проще говоря, это количество ячеек, которые могут поместиться в 1 клетку.

Например
Если в 1 клетке 1 ячейка (простейший случай), значит разрешение 1.
Если в 1 клетке 5 ячеек, то разрешение 0.2.

Разрешение моей карты — 0.04. То есть в каждой клетке находится 25 ячеек. Таким образом, мой минимальный шаг — это 4 см. А 1 клетка равняется 1м.

Как сделать локальную карту
Разница клетки и ячейки на моей карте

Что же получилось в итоге?

Как сделать локальную карту
Пример построения локальной карты проходимости
*Желтым цветом обозначены цвета ячеек

Я считаю, что в целом проделанная мною работа была успешна, но понимаю, что алгоритм несовершенен и требует уточнений и доработок.

Ой, у вас баннер убежал!

Читают сейчас

Редакторский дайджест

Присылаем лучшие статьи раз в месяц

Скоро на этот адрес придет письмо. Подтвердите подписку, если всё в силе.

Как сделать локальную карту

Похожие публикации

Калибровка камеры Intel RealSense d435 с помощью OpenCV2 и ROS

3D лазерный сканер на Android телефоне

Реверс-инжиниринг лазерного сканера Leuze RS4

Вакансии

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Минуточку внимания

Комментарии 21

Как сделать локальную карту

Как сделать локальную карту

Как сделать локальную карту

Principle of distance measurement is based on calculation of the phase difference, due to which it is possible to obtain stable measurement with minimum influence from object’s color and reflectance.

Как сделать локальную карту

А еще для совсем простых проектов недавно появился совсем дешевый датчик GY-530 VL53L0X (на али 200-300 руб всего!). Сам правда пока его не пробовал. Но было бы неплохо попробовать.

Как сделать локальную карту

Как сделать локальную карту

Как сделать локальную карту

Как сделать локальную карту

Как сделать локальную карту

Как сделать локальную карту

Жаль, что карта каждый раз чистится и строится заново.
Можно попробовать учитывать данные прошлых сканирований, а за одно еще и улучшить точность навигации.
Положим робот у нас автономный и делает выводы об изменении своего положения по показаниям энкодеров на колёсах. При этом возможны проскальзывания в ту или иную сторону, что по мере движения ухудшает интегральную точность.
После некоторого перемещения можно вычислить теоретическое новое положение робота относительно абсолютной карты. Проведя повторное сканирование, а также сдвинув и повернув предыдущую карту на нужный угол (в соответствии с вычисленным по энкодерам перемещением) можно получить ожидаемую и фактическую карту. Они очевидно будут отличаться.
Итак, у нас есть две «абсолютные» карты: до (назовём её M’) и после перемещения (M).
Мы знаем из каких сегментов состояло наше перемещение, например, это был поворот на (примерно) 30 градусов и движение на (примерно) 1 метр. Каждое из этих действий вносит ошибку (вычисляемую эмпиоически). Например, заставляем робота поверунться много раз на 1000 градусов, и каждый раз замеряем реальный угол поворота. Среднеквадратичное отклонение от 1000 градусов будет мерой ошибки. Её можно пронормировать и вычислять примерно какой ошибки следует ожидать в каких смещениях и каких поворотах. На самом деле ошибка состоит из двух частей, одна зависит от величины перемещения, а другая нет, и каждую надо учитывать, но это уже детали.
В конце концов зная величины возможных ошибок после перемещения у нас есть, грубо говоря, диапазоны в пределах которых нужно подёргать карту M’ сравнивая её с актуальной. Сравнивать можно введя понятие нормы резонанса. Например, перемножаем карты попиксельно, а затем суммируем элементы. Наша задача найти такие перемещения, при котороых преобразованная карта входит в резонанс с актуальной. Это будут уточненные данные о нашем фактическом перемещении.
Новую карту мы можем закрасить поверх полупрозрачным серым, а сверху нанести на неё актуальную карту.

Так наша карта станет абсолютной, наш робот не будет мгновенно забывать что было «за углом», навигация станет более точной, поскольку будет опираться на характерные элементы местности, наезд на край ковра или шнур на полу не собьют фатально навигацию.

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

Источник

Форум на ОКУЛУС

Всего тем: 32844, сообщений: 961227

Список тем форума

темаавторк-во сообщенийпоследний ответ
Как сделать локальную картуНа форуме Окулуса запрещены политические дискуссииИрина Звягина117.03.2014 16:26
Как сделать локальную картуТренируемся предсказывать будущее.Rey1487
08.02.2021 19:14Как сделать локальную картуСтану ли я бомжом?odontalgiqu
e707.03.2021 07:19Как сделать локальную картуЧёрная полоса в жизни. Проблемы с психикой уже.odontalgiqu
e2007.03.2021 01:34Как сделать локальную картуКазус Якимушкина.владимиров2
0106.03.2021 17:07Как сделать локальную картуКакие взаимоотношения лучше?olesya281006.03.2021 20:18Как сделать локальную картуОриентацияМэш806.03.2021 21:40Как сделать локальную картуВопрос по отработке Нептуна и Скорпионаджедай605.03.2021 23:45Как сделать локальную картуБудет ли выгоден этот бизнес? ХорарJulsi505.03.2021 19:39Как сделать локальную картуАлькокоден и хилегольга261105.03.2021 01:48Как сделать локальную картуОрбы для сатурнаhappy32906.03.2021 20:07Как сделать локальную картуПерспективы работы по специальности.Jane 40K3402.03.2021 20:56Как сделать локальную картуЧем отличается речь (не юмор, не смех, что я спрашивала в прошлых темах!) Меркурия в Раке от речи Меркурия в Рыбах?Котёнок93704.03.2021 10:36

Пояснения

Используемые значки

Как сделать локальную картуОткрытая тема.
Как сделать локальную картуЗакрытая тема. В эту тему нельзя добавить сообщение.
Как сделать локальную картуТема с отметкой. Эта тема не участвует в обычной сортировке по дате.
Как сделать локальную картуТема с отметкой. Эта тема отмечена как «флуд».
Как сделать локальную картуТема с отметкой. В этой теме отмечена «ссора».
Как сделать локальную картуТема с отметкой. В этой теме отмечена «провокация».

Форумы

Правила форума

У нас на форуме

Смогу ли я поменять работу?

Хорар. Перспективы выигрыша в суде.

10 дом в гороскопе, понять и найти себя

«Дитя Эпохи Водолея. Я верить смею, что будет радостным твой Путь. «

Как проработать Марс в Скорпионе?

В блогах Окулуса

Что для нас самое главное в людях, с которыми мы имеем дело.

Прогноз на оставшийся период марта на денежное благосостояние.

Гороскоп на март для асцендента в Овне, Тельце, Близнецах, Весах и Скорпионе

Неделя перед Новолунием с 6 по 13 марта. Тончайшим сделаны пером судьбы картинки И виснут в воздухе сыром на паутинке. Лариса Миллер

Китайская метафизика о здоровье в марте

Новые статьи

Гороскоп на март 2021

Новое на Джокере

Венера в секстиле с Ураном

Венера в квадрате с Марсом

Нижнее соединение Меркурия с Солнцем

Анонсы

Наталья Князева
Прогноз на март 2021

Юдина Тамара
Возрастные кольца Сатурна. Часть 1.

Наталия Бучацкая
Прогноз на март 2021 для Овнов, Тельцов, Близнецов, Раков, Львов, Дев

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *