Как я могу улучшить карту в своем мобильном автономном роботе, используя KINECT

9

Немного предыстории моей цели

Я нахожусь в процессе создания мобильного автономного робота, который должен перемещаться по неизвестной области, должен избегать препятствий и получать речевой ввод для выполнения различных задач. Он также должен распознавать лица, объекты и т. Д. Я использую датчик Kinect и данные одометрии колеса в качестве датчиков. Я выбрал C # в качестве основного языка, поскольку официальные драйверы и SDK легко доступны. Я закончил модуль Vision and NLP и работаю над навигационной частью.

В настоящее время мой робот использует Arduino в качестве модуля для связи и 64-битный процессор Intel i7 на ноутбуке в качестве процессора.

Это обзор робота и его электроники:

обзор робота электроника робота


Проблема

Я реализовал простой алгоритм SLAM, который получает положение робота от кодировщиков и добавляет все, что он видит, используя kinect (в качестве 2D-сечения трехмерного облака точек) на карту.

Вот как выглядят карты моей комнаты:

как выглядит карта моей комнаты Другая карта моей комнаты

Это приблизительное представление о моей комнате:

введите описание изображения здесь

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

  • Ожидается ли это от использования только мертвого счета?
  • Мне известны фильтры частиц, которые его улучшают, и я готов их реализовать, но как я могу улучшить этот результат?

Обновить

Я забыл упомянуть мой текущий подход (который я раньше должен был, но забыл). Моя программа примерно делает это: (я использую хеш-таблицу для хранения динамической карты)

  • Возьмите облако точек от Kinect
  • Ожидать поступающие данные серийной одометрии
  • Синхронизация с использованием метода на основе отметки времени
  • Оцените позу робота (x, y, theta), используя уравнения из Википедии и данные кодировщика
  • Получить «кусочек» облака точек
  • Мой срез в основном массив параметров X и Z
  • Затем постройте эти точки на основе позы робота и параметров X и Z
  • Повторение
Шрейас Капур
источник

Ответы:

1

Это то, что и следовало ожидать: в принципе да. Хотя вы можете улучшить свою модель одометрии, в целом, этого недостаточно, чтобы получить хорошую карту. Без описания вашей системы сложно сказать, как ее улучшить. В большинстве систем оценка перевода лучше, чем ротация. Вы можете добавить гироскоп и измерить вращение. Это должно значительно улучшить ваши результаты.

Вместо того, чтобы самостоятельно реализовывать фильтр частиц, вы можете использовать реализацию SLAM, например, от openslam . Это должно сэкономить вам много времени и, скорее всего, даст лучшие результаты.

Jakob
источник
Вы заставляете меня чувствовать себя лучше, говоря, что это ожидаемое: D, но я действительно уверен, что моя одометрия очень хорошая ( особенно мое вращение : D). Я добавил обновление, которое кратко описывает систему (если этого недостаточно, я могу дать вам код или любую другую информацию). Я попробую использовать гироскоп завтра, а затем обновлю результаты. Я хотел бы использовать алгоритмы openslam, но я использую C # (так что я могу использовать официальный SDK), и большинство библиотек для таких задач либо на C ++, либо предоставляются в ROS (только для Linux). Я, конечно, хотел бы использовать их, но я не вижу острых!
Шрейас Капур
tinyslam утверждает, что использует 200 строк кода c. Я предполагаю, что перенос на c # не должен быть таким сложным.
Якоб
Вот Это Да! Но я думаю, что он не использует какой-либо фильтр частиц и делает то же самое, что я делаю. Но я обязательно постараюсь реализовать это. Большое спасибо :-)
Shreyas Kapur
1

Я бы посоветовал вам попробовать фильтры частиц / EKF.

Что вы сейчас делаете:

-> Dead Reckoning: Вы смотрите на свою текущую позицию без каких-либо ссылок.

-> Непрерывная локализация: вы примерно знаете, где находитесь на карте.

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

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

Локализация может быть выполнена через EKF / Particle Filters, если у вас есть начальная контрольная точка. Тем не менее, отправная точка отсчета является обязательным.

Naresh
источник
Спасибо за ответ, действительно очень хороший пример, я, конечно, буду использовать EKF, но проблема в том, что я неплохо разбираюсь в математике, но тоже не очень хорош, и я использую C #, поэтому у меня нет библиотек и я его реализую я возьму меня на веки Есть предложения по этому поводу?
Шрейас Капур
Было бы намного лучше освежить свою математику и пройти несколько курсов, чем сделать что-то, что вы не понимаете и не можете отлаживать. Изучите это и осуществите это. Это определенно будет полезно в будущем.
Нареш
Также ищите реализации C # на github. Работа более популярна, чем выглядит.
Нареш
Спасибо за предложения, обязательно сделаем это завтра. Я стараюсь изо всех сил, чтобы изучить математику, и надеюсь сделать это, и я уверен, что это будет иметь большое значение. Мне 13 лет, что является узким местом для обучения здесь, мы даже не познакомились с матрицами в школе! :-(
Шрейас Капур
Я знаю, что тебе 13 :) Интернет не заботится. Вы можете подобрать матрицы из ханской академии. Вероятность и статистика, а также.
Нареш
1

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

Вы должны локализовать своего робота одновременно с попыткой построить свою карту (SLAM!). Так как карта создается, эта же карта также используется для локализации робота. Это гарантирует, что ваша оценка позы не будет расходиться, а качество вашей карты должно быть лучше. Поэтому я бы предложил изучить некоторые алгоритмы SLAM (например, FastSLAM) и попытаться реализовать собственную версию.

Димитрис
источник
Спасибо за Ваш ответ :-). Я действительно понимаю, что мертвый расчет ошибочен, но карта, которую я построил, была в очень маленьком масштабе. Я двигал робота медленно и медленно, чтобы свести к минимуму как можно больше ошибок, робот мало двигался. На самом деле я изучал множество алгоритмов SLAM из openslam, но, как я сказал Нарешу: «Я неплохо разбираюсь в математике, но также не очень хорош, и я использую C #, поэтому у меня нет библиотек и я его реализую. Я возьму меня на веки ". Есть предложения по этому поводу?
Шрейас Капур
Делаете ли вы какую-либо постобработку с данными Kinect? Вполне возможно, что данные содержат некоторый шум, и если вы их не обработаете, это может сделать вашу карту недействительной. Постарайтесь сделать проблему проще. Пусть робот остановится и нанесет на карту стены впереди него. Как это работает сейчас? Если карта ясна, значит, проблема возникает из-за движения. Если нет, то проблема гораздо более фундаментальная.
Деметрис