Немного предыстории моей цели
Я нахожусь в процессе создания мобильного автономного робота, который должен перемещаться по неизвестной области, должен избегать препятствий и получать речевой ввод для выполнения различных задач. Он также должен распознавать лица, объекты и т. Д. Я использую датчик Kinect и данные одометрии колеса в качестве датчиков. Я выбрал C # в качестве основного языка, поскольку официальные драйверы и SDK легко доступны. Я закончил модуль Vision and NLP и работаю над навигационной частью.
В настоящее время мой робот использует Arduino в качестве модуля для связи и 64-битный процессор Intel i7 на ноутбуке в качестве процессора.
Это обзор робота и его электроники:
Проблема
Я реализовал простой алгоритм SLAM, который получает положение робота от кодировщиков и добавляет все, что он видит, используя kinect (в качестве 2D-сечения трехмерного облака точек) на карту.
Вот как выглядят карты моей комнаты:
Это приблизительное представление о моей комнате:
Как видите, они очень разные и поэтому очень плохие карты.
- Ожидается ли это от использования только мертвого счета?
- Мне известны фильтры частиц, которые его улучшают, и я готов их реализовать, но как я могу улучшить этот результат?
Обновить
Я забыл упомянуть мой текущий подход (который я раньше должен был, но забыл). Моя программа примерно делает это: (я использую хеш-таблицу для хранения динамической карты)
- Возьмите облако точек от Kinect
- Ожидать поступающие данные серийной одометрии
- Синхронизация с использованием метода на основе отметки времени
- Оцените позу робота (x, y, theta), используя уравнения из Википедии и данные кодировщика
- Получить «кусочек» облака точек
- Мой срез в основном массив параметров X и Z
- Затем постройте эти точки на основе позы робота и параметров X и Z
- Повторение
Я бы посоветовал вам попробовать фильтры частиц / EKF.
Что вы сейчас делаете:
-> Dead Reckoning: Вы смотрите на свою текущую позицию без каких-либо ссылок.
-> Непрерывная локализация: вы примерно знаете, где находитесь на карте.
Если у вас нет ссылки и вы не знаете, где находитесь на карте, независимо от того, какие действия вы предпринимаете, вам будет сложно получить идеальную карту.
Например: вы в круглой комнате. Вы продолжаете двигаться вперед. Вы знаете, каким был ваш последний ход. Карта, которую вы получите, будет иметь вид прямоугольной структуры. Это будет происходить до тех пор, пока у вас не будет постоянного способа локализоваться или узнать, где именно вы находитесь на карте.
Локализация может быть выполнена через EKF / Particle Filters, если у вас есть начальная контрольная точка. Тем не менее, отправная точка отсчета является обязательным.
источник
Потому что вы используете мертвую расплату за ошибки в оценке позы робота, которые накапливаются во времени. По моему опыту, через некоторое время, оценка мертвой расплаты становится бесполезной. Если вы используете дополнительные датчики, такие как гироскоп или акселерометр, оценка позы улучшится, но, поскольку у вас нет обратной связи, она будет расходиться, как и раньше. В результате, даже если у вас есть хорошие данные из Kinect, создать точную карту сложно, поскольку ваша оценка позы неверна.
Вы должны локализовать своего робота одновременно с попыткой построить свою карту (SLAM!). Так как карта создается, эта же карта также используется для локализации робота. Это гарантирует, что ваша оценка позы не будет расходиться, а качество вашей карты должно быть лучше. Поэтому я бы предложил изучить некоторые алгоритмы SLAM (например, FastSLAM) и попытаться реализовать собственную версию.
источник