Pull to refresh

Comments 21

Должен сказать, что получилась очень интересная работа. Для себя я получил минимальное представление о том, как строить локальную карту у робота, какие при этом возникают проблемы и… как работать с локатором.При этом большим плюсом является рассмотрение в рамках реального оборудования и программного обеспечения, на рабочем проекте.
Также очень порадовал оригинальный способ кодирования ячеек.
По вопросу дальнейших исследований могу лишь посоветовать рассмотреть алгоритмы интерполяции и экстраполяции (можно даже эвристические, например, заполнять 4-см ячейки значением 25, если вокруг её окружают 25 и т.д.).
Работа очень хорошая, в ней освещены основные вопросы построения локальной карты, возможные «подводные камни» и «пути их обхода».
Благодарю за отзыв и совет!
Поправлю. Лазерный сканер «URG-04LX-UG01» использует фазовый, а не времяпролетный (TOF) принцип измерения расстояния:
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.

За счет этого достигается разрешение в 1 мм.
Этот сканер достаточно дорогой (1000$), в любительских конструкциях можно использовать лазерные сканеры от пылесосов Neato — они продаются как запчасти по 100$.

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

Вот именно, что для самых простых. У этого датчика достаточно низкая скорость измерений и довольно широкий угол излучения, так что полноценный сканер на нем сделать нельзя.
Вы бы хоть ссылку дали. А-то не нашел сходу.
Исправила. Спасибо за отзыв, узнала новое)
Когдя я баловался с ардуинками, видел похожую идею, только на сонаре. Стоит копейки и для побаловаться снонсый результат.

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

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

Вместо заполнения всей старой карты серым перед смешиванием с новой можно, кстати, делать размытие Motion Blur с характеристиками, соответствующими потенциальным ошибкам перемещения. Так сдвиг будет размывать карту вдоль оси перемещения пропорционально расстоянию. Поворот будет делать радиальное размытие пропорционально углу.
Если правильно вас поняла, речь здесь уже скорее не о локальной карте (которая актуальна только в данный момент времени), а о так называемой глобаной (запоминание и наложение локальных карт с учетом перемещения). Эта задача была реализована мной, подумываю написать один из постов об этом.
Здорово! Ждём. Всегда интересны альтернативные подходы и нюансы в интересных задачах.
Я считал, что локальной картой стоит считать карту, имеющую максимальную актуальность в окрестности бота. Координаты здесь абсолютные, но локальные, заданные от произвольной точки начала ориентирования.
Глобальная карта — это карта, полученная извне с привязкой к абсолютным координатам. В этом случае мы можем её уточнять и ориентироваться по ней.
В общем для изолированного бота глобальной карты не будет. Откуда он возьмёт глобальную привязку?
Глобальная карта получается из локальной в момент замыкания кольца и/или других оптимизаций графа. Она, конечно, не будет привязана к каким-то глобальным координатам (типа GPS), если нет внешних данных, и вообще говоря может быть искривленной, но это не будет мешать локализации и планированию траекторий, если искривления в окрестности робота незначительны
Я постарался пояснить свою классификацию глобальной/локальной карты. Для меня карта глобальная, если у неё есть абсолютная привязка, которая что-то значит для нескольких ориентирующихся сущностей. Локальная карта — это карта, которую бот строит и использует только сам.
Если бот заколеьцевал и тем самым уточнил локальную карту, то от этого она и останется локальной. Если боты скинули свои карты в облако и на их основе была синтезирована единая карта в единой системе координат — это глобальная карта. Не вижу причин не привязывать локальную координатную сетку к глобальной при первом удобном случае.
Трассирование лучей по матрице занятости для маркировки свободных ячеек — не самый удачный способ определить свободное пространство, с одной стороны — из-за возможных потерь лучей, с другой — из-за недостаточного углового разрешения (на большом удалении получится ежик из лучей, а не непрерывная поверхность). Еще и неэффективно по вычислительным затратам. Рекомендую отрисовать все полученные точки занятыми, а затем сгенерировать полигон из всех точек скана, а также положения лидара, путем сортировки списка этих точек по углу в полярных координатах и соединения их последовательно. Получится многоугольник, который можно разом отрендерить в карту цветом свободных ячеек (ну или замешать с каким-то коэффициентом).
Следующая прикольная задача — собирать эту карту в движении.
Спасибо за совет! Карта собирается в движении, планирую написать об этом пост.
А как быть если Препятствие перемещается, или например попадает в оптическую тень, т.е стохастично маскируется ???? Как это отразиться на построении временной таблицы проходимости?? какова вообще частота обновления таблицы??
Частота обновления карты — это параметр, который можно настроить. Оптимально он должен быть >10 раз в секунду. Соответственно, динамические объекты будут замечены в своем движении, но не отразятся на карте, когда уйдут из поля зрения.
Sign up to leave a comment.

Articles