В этом посте вы узнаете, как реализовать монокулярную визуальную одометрию.

Одометрия — это устройство для сбора данных о движущемся приводе для оценки изменения положения с течением времени, например, поворотный энкодер для измерения вращения колеса.

Одометрия в основном используется на колесных транспортных средствах, но традиционная методика одометрии не надежна для роботов с ногами или летающих роботов. Кроме того, это приведет к неточному результату, когда робот работает на неровных поверхностях или скользит. Показания одометра будут более ненадежными, так как ошибка накапливается с течением времени.

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

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

Подход

У нас есть поток изображений в градациях серого, снятых в моменты времени tи t+1, которые обозначены как Iᵗ, Iᵗ⁺¹. Затем устраните искажения изображений, используя внутренний параметр камеры, полученный в результате калибровки камеры. В этом случае, поскольку я использую набор данных KITTI, изображения уже неискажены, а внутренние параметры камеры были предоставлены в файле калибровки. Калибровка камеры также может быть выполнена с помощью OpenCV.

В каждом кадре мы извлекаем признаки, а затем отслеживаем их на следующих кадрах. На основе 5-точечного алгоритма Нистера с RANSAC мы оцениваем преобразование между кадрами.

Затем оцените R,tиз основной матрицы, вычисленной на предыдущем шаге. Поскольку преобразования выполняются в n-единицах, нам нужен внешний источник для вычисления информации о масштабе.

Извлечение признаков

Мой подход к извлечению признаков заключается в использовании БЫСТРОГО обнаружения углов. Алгоритм FAST (Features from Accelerated Segment Test) был предложен Эдвардом Ростеном и Томом Драммондом в их статье «Машинное обучение для высокоскоростного обнаружения поворотов» в 2006 году (позже переработанный в 2010 году). Алгоритм поясняется ниже:

  1. Выберите пиксель p на изображении, который должен быть идентифицирован как точка интереса или нет. Пусть его интенсивность будет Ip.
  2. Выберите соответствующее пороговое значение t.
  3. Рассмотрим круг из 16 пикселей вокруг тестируемого пикселя.
  4. Теперь пиксель pявляется углом, если существует набор nнепрерывных пикселей в круге (из 16 пикселей), которые все ярче, чем Ip+t, или все темнее, чем lp-t. (Показаны белыми пунктирными линиями на изображении выше). n было выбрано равным 12.
  5. Был предложен высокоскоростной тест, чтобы исключить большое количество неугловых. В этом тесте проверяются только четыре пикселя 1, 9, 5 и 13 (первые 1 и 9 проверяются, если они слишком яркие или темные. Если да, то проверяются 5 и 13). Если pугол, по крайней мере три из них должны быть ярче, чем Ip+t, или темнее. чем IP-t. Если ни один из них не соответствует действительности, то pне может быть углом. Затем к пройденным кандидатам можно применить критерий проверки полного сегмента путем проверки всех пикселей в круге. Этот детектор сам по себе демонстрирует высокую производительность.

Алгоритм имеет несколько ограничений. Во-первых, для n‹12 алгоритм работает не очень хорошо во всех случаях, поскольку при n‹12 количество обнаруженных точек интереса очень велико. Во-вторых, порядок, в котором запрашиваются 16 пикселей, определяет скорость алгоритма. Для решения этих проблем в алгоритм был добавлен подход машинного обучения.

Отслеживание функций

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

  1. Обнаружение объекта в первом кадре. (что мы сделали на предыдущем шаге)
  2. Для каждой функции вычислите движение (трансляционное или аффинное) между последовательными кадрами.
  3. Свяжите вектор движения в последовательных кадрах, чтобы получить трек для каждой точки.
  4. Вводить новые точки через каждые m (10 или 15) кадров.
  5. Отслеживайте новые и старые точки, используя шаги 1–3.

Более подробное объяснение вы можете найти на Веб-странице KLT Tracker.

Существенная матричная оценка

После того, как у нас есть точки соответствия, нам нужно вычислить существенную матрицу из соответствующих точек на двух изображениях. Для этого воспользуемся функцией OpenCV findEssentialMat(). Эта функция оценивает существенную матрицу на основе решателя пятиточечного алгоритма. Эпиполярная геометрия описывается следующим уравнением:

где E — существенная матрица, p1 и p2 — соответствующие точки на первом и втором изображениях соответственно. Результат этой функции будет передан далее в recoverPose() для восстановления относительной позы между камерами. Оценка основных матриц с использованием 5-точечного алгоритма Нистера подробно описана в этой статье.

Восстановить относительную позу

R и t восстанавливаются из существенной матрицы на основе следующей теоремы:

  • Позволять

  • Пусть сингулярное разложение существенной матрицы есть E ∼ U diag(1, 1, 0)V, где U и V выбраны так, что det(U) › 0 и det (V ) › 0. Тогда t ∼ tu ≡ [u13 u23 u33 ]и R равно Ra ≡ UDVили Rb ≡ UDV.

Любая комбинация R и t в соответствии с приведенным выше рецептом удовлетворяет эпиполярному ограничению. Чтобы устранить присущие ей неоднозначности, предполагается, что матрица первой камеры имеет вид [I | 0] и что t имеет единичную длину.

Построение траектории

R, tотносительное положение камеры. Для вычисления эгодвижения камеры используйте следующее уравнение:

где R, t— вращение матрицы и перемещение камеры, а Rpos, tpos— эгодвижение камеры, предполагается, что Rposинициализировано I и tposинициализировано пользователем [0, 0, 0].

Результаты

исходный код:

https://gitlab.com/rezaarrazi/monocular_vision_odometry