Камеры глубины. Опыт сканирования помещений.

PHYGITALISM
PHYGITALISM
Published in
9 min readNov 17, 2019

Развитие RGB-D сенсоров способствует их активному внедрению в различные сферы нашей жизни — недорогие камеры можно использовать для сканирования помещения и объектов, с целью построения их 3D моделей. Но для того, чтобы это сделать, необходимо пройти достаточно непростой путь — на основе своего опыта мы расскажем о ключевых моментах, важных для осуществления сканирования.

Часть 1 \ Часть 2

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

Постановка задачи

Рассмотрим применение RGB-D сенсоров для построения трёхмерной модели окружающего нас пространства — наша задача в режиме реального времени постепенно выстраивать 3D модель того, что видит сенсор. Сначала выясним примерные шаги, которые необходимо сделать для ее решения:

  1. Необходимо преобразовать два кадра с сенсора (цветное изображение и кадр с глубиной) в “облако точек” в 3D пространстве, относительно системы координат сенсора.
  2. Необходимо построить глобальную неподвижную систему координат, относительно которой мы будем выстраивать 3D модель. Сенсор будет перемещаться относительно этой системы координат, поэтому здесь возникает две подзадачи: определение положения сенсора и пересчёт координат между системой координат сенсора и глобальной системой координат.
  3. Когда мы знаем координаты точек в неподвижной системе координат, остается только объединить результаты с данными, полученными на предыдущем шаге, для получения полноценного скана.

Далее рассмотрим решение этих задач.

Преобразование данных с сенсора в 3D

В основном, с RGB-D сенсоров в каждый момент времени можно получить следующие данные:

  • Цветное изображение. Далее будем называть его RGB изображением.
  • Карту глубины.

Карта глубины представляет собой двумерный массив чисел, чей размер может совпадать или не совпадать с размером RGB изображения — в самом простом случае, размеры одинаковые. Каждое число на карте глубины показывает расстояние от сенсора до точки в реальном мире, которая была спроецирована на плоскость камеры. Пример представлен на рис. 1. На рисунке присутствуют участки с чёрным цветом. Это означает, что информация о глубине неизвестна.

Рис. 1. Слева карта глубины. Справа RGB изображение.

Фактически, нам необходимо сделать то, что обычно делают в компьютерной графике, только в обратную сторону. В компьютерной графике — создают проекцию из 3D в 2D для отображения трёхмерной сцены на экране, а нашей задачей будет сделать проекцию из 2D в 3D. В общем случае, без дополнительной информации сделать это однозначно нельзя, но у нас есть информация с карты глубины.

Проецирование делится на два этапа:

  • Выравнивание карты глубины с RGB изображением.
  • Расчёт координат в 3D.

Зачем нужно выравнивание? Если мы хотим получить цветное “облако точек”, то информацию о реальном цвете можно взять только с RGB изображения. Как правило, камера, которая получает цветное изображение, и камера, которая анализирует глубину, находятся рядом с друг другом, но между ними все же есть небольшое расстояние. Для наглядности: на рис. 2 цифрой 1 обозначена камера, чувствительная к инфракрасному излучению(большинство RGB-D сенсоров используют её для определения глубины), а цифрой 2 обозначена RGB камера, которая передаёт цвет. Из-за смещения (расстояния между ними), пиксели на карте глубины и RGB изображении не будут соответствовать друг другу, следовательно необходима некоторая корректировка.

Рис. 2. Смещение между двумя датчиками на RGB-D камере.

Для этого нам понадобятся внешние параметры камеры (extrinsics). Получение этих параметров может отличаться в зависимости от SDK, используемого вместе с RGB-D сенсором. Мы рассмотрим пример на основе Intel RealSense SDK 2.0. Если у вас нет камеры RealSense, то ничего страшного - в SDK предусмотрена возможность воспроизводить специальные файлы в формате .bag, записанные заранее, так, как будто мы получаем данные с реальной камеры, но с некоторыми ограничениями по настройке. Для воспроизведения результатов достаточно загрузить пример, записанный на камеру SR300, и установить SDK 2.0. На момент написания использовался build 2.29.0.

После перехода по ссылке, для загрузки примера необходимо нажать на изображение:

Сначала попробуем просто сопоставить два изображения без выравнивания. Результат представлен на рис. 3.

Рис. 3. Сопоставление карты глубины и RGB изображения без выравнивания.

Видно, что объекты не совпадают. Для визуализации значений глубины была использована цветовая схема Hue из SDK.

Попробуем воспользоваться встроенным в SDK механизмом выравнивания. Результат представлен на рис. 4.

Рис. 4. Сопоставление карты глубины и RGB изображения после выравнивания.

Видно, что результат соответствует ожидаемому.

Технически это реализуется следующим образом: у каждой камеры своя система координат. Пусть у RGB камеры будет система координат с началом в точке A, у инфракрасной камеры система координат с началом в точке B.

Рис. 5. Система координат двух камер.

То что мы видим на рис. 5— это проекция точки S в точку P на RGB изображении, и в точку P’ на карте глубины. Для построения проекции используется модель проективной камеры. Такая проекция описывается с помощью внутренних (intrinsics) параметров камеры. Например, если мы посмотрим на внутренние параметры камеры глубины из SDK с запущенным примером, то получим следующие значения(они могут отличаться в зависимости от калибровки):

width: 640, height: 480, ppx: 314.246, ppy: 245.973, fx: 475.647, fy: 475.647, model: 2, coeffs: [0.150283, 0.0176776, 0.00374443, 0.00247127, 0.143258]

Здесь приведены значения фокусных расстояний камеры fx, fy, координаты центра камеры ppx, ppy, модель дисторсии model и коэффициенты дисторсии coeffs.

В примере выше, вторая система координат (с началом в B) ещё и повёрнута на несколько градусов вокруг оси BZ’. В итоге, пиксели на одинаковых позициях карты глубины и RGB изображения, не соответствуют друг другу в реальности.

Для решения проблемы выравнивания нужно воспользоваться аппаратом линейной алгебры. Мы хотим узнать, какая точка в системе координат Axyz соответствует точке P’. Для этого необходимо:

  1. Спроектировать точку P’ обратно в 3D, в системе координат Bx’y’z’.
  2. Пересчитать координаты P’ в системе Axyz с помощью внешних параметров камеры.
  3. Спроектировать обратно на плоскость в системе Axyz.

Если посмотреть на внешние параметры камеры, то они имеют следующий вид (значения могут отличаться в зависимости от калибровки):

rotation: [0.999996, -0.00216331, 0.00187769, 0.0021743, 0.99998, -0.00586952, -0.00186496, 0.00587358, 0.999981]
translation: [0.0257, -0.000733263, 0.00409536]

По названиям можно понять, что это значения матрицы поворота (rotation) между двумя системами координат и вектор переноса начала координат (translation). Пересчёт координат заключается в умножении на матрицу, если использовать однородные координаты.

Здесь мы приходим к проблеме обратного преобразования из 2D в 3D. Благодаря информации о глубине мы можем решить эту задачу.

В некоторых SDK для RGB-D сенсоров есть готовые функции — можно посмотреть как это сделано в RealSense SDK (rs2_deproject_pixel_to_point) или в Azure Kinect (k4a_transformation_depth_image_to_point_cloud). Конечно, некоторые детали были опущены, но это отображает основную идею (более подробно описано в [1]). На этом этапе мы можем получать “облако точек” вместе с цветом.

Посмотреть это можно в стандартном приложении Intel RealSense Viewer, которое входит в состав SDK, если перейти в режим 3D. Важно выбрать режим отрисовки точек (красная стрелка) как на рис. 6. Результат представлен на рис. 7.

Рис. 6. Выбор режима отрисовки.
Рис. 7. “Облако точек” с цветом, в приложении Intel RealSense Viewer.

Отслеживание перемещения устройства

Теперь мы умеем получать “облако точек” с цветом, но относительно системы координат, связанной с камерой. Как было замечено выше, нам нужна глобальная система координат, которая будет неподвижной, и мы должны знать положение сенсора относительно нее. Некоторые RGB-D сенсоры имеют встроенные датчики (гироскоп, акселерометр) для отслеживания перемещения, например ZED Mini или RealSense D435i. Если сенсор не обладает встроенными датчиками, то можно рассмотреть вариант комбинации с планшетом или телефоном.

Здесь мы приходим к необходимости реализовать SLAM алгоритм. Для этого необходимо понять, какие данные мы можем получать от RGB-D сенсоров:

  1. Данные с гироскопа и акселерометра (могут быть недоступны).
  2. Изображения с камеры.
  3. Карту глубины.

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

Процесс интегрирования связан с накоплением ошибок. Это приводит к погрешностям в определении местоположения, которая растёт со временем. Более подробно можно прочитать об этом в [2]. Для того, чтобы решить эту проблему, необходимо периодически корректировать местоположение.

Здесь нам может помочь камера и визуальная одометрия (visual odometry). У визуальной одометрии есть свои проблемы - например, метод плохо работает в тёмном помещении.

В итоге, каждый из методов имеет свои недостатки. Возникает вопрос - что будет, если объединить два метода? Таким образом мы сможем использовать преимущества обоих подходов.

В результате мы получили визуально-инерционную одометрию (visual-inertial odometry). Можно посмотреть видео с сравнением различных алгоритмов между собой.

Кстати, именно данный подход используется в технологиях ARKit от Apple и ARСore от Google, которые мы используем в своих проектах с дополненной реальностью.

С инфракрасной камерой и корректировкой позиции связан интересный факт, касающийся контроллеров Oculus Quest. На камеру RealSense D435 или D415, чувствительную к инфракрасному излучению, можно заснять инфракрасные излучатели на контроллерах как на рис. 8. Шлем также видит их с помощью своих камер.

Рис. 8. Инфракрасные излучатели на контроллерах Oculus Quest.

Улучшить результаты можно с помощью дополнения алгоритмов визуально-инерционной одометрии информацией с карты глубины. Более подробно это описано в [3].

С помощью алгоритмов, рассмотренных выше, мы можем получить траекторию движения RGB-D сенсора со временем относительно глобальной системы координат. В качестве начала глобальной системы координат мы можем взять самое первое положение сенсора (красная точка). Пример приведён на рис. 9.

Рис. 9. Перемещение RGB-D сенсора со временем.

Итеративное обновление данных

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

В теории этого достаточно. На практике возникает много проблем. Из-за неточностей определения положения, одна и та же точка в реальном мире, снятая с разных ракурсов, может иметь разные координаты. Частично проблему может решить алгоритм ICP и его модификации (видео с демонстрацией работы ICP). Реализации этого алгоритма есть в библиотеке PCL. Много возможностей представляет библиотека Open3D. Описание одного из алгоритмов для 3D реконструкции можно посмотреть в [4]. С помощью них мы можем начать сопоставлять текущие данные с новыми, и постепенно выстраивать полноценную 3D модель.

Существует приложение RTAB-Map [5], в котором многое из того, что было упомянуто раннее, уже реализовано, и с помощью него можно получить подобный результат как на рис. 10:

Рис. 10. Анимация работы приложения RTAB-Map.

На выходе получится модель, которую можно посмотреть в любом 3D редакторе или непосредственно в приложении. Например, с помощью телефона Lenovo Phab 2 Pro и приложения RTAB-Map, была получена 3D модель помещения.

Мы рассмотрели основные этапы, необходимые для проведения сканирования окружающего нас пространства и построения 3D модели с помощью RGB-D сенсоров, которые сейчас становятся всё более доступны.

Смартфонов с ToF камерами становится всё больше, и для нас, энтузиастов XR, это означает новый уровень развития технологий дополненной и виртуальной реальности. С выходом HoloLens 2, который тоже оснащён RGB-D сенсором, можно представить ситуацию, когда человек сможет отсканировать то, на что направлен его взгляд — а впоследствии посмотреть на это в 3D. Звучит фантастически, правда?

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

< предыдущая часть

Список использованных источников

1. Mileu, R., Lucas, C.: Building World Representations using Color-Depth Cameras. Master Thesis, Inst. Super. Tec. Univ. Lisboa (2013).

2. Thong, Y.K., Woolfson, M.S., Crowe, J.A., Hayes-Gill, B.R., Jones, D.A.: Numerical double integration of acceleration measurements in noise. Meas. J. Int. Meas. Confed (2004). doi: 10.1016/j.measurement.2004.04.005

3. Angladon, V., Gasparini, S., Charvillat, V. et al. J An evaluation of real-time RGB-D visual odometry algorithms on mobile devices (2019). doi: 10.1007/s11554–017–0670-y

4. Li J, Gao W, Li H, Tang F, Wu Y. Robust and Efficient CPU-Based RGB-D Scene Reconstruction (2018). doi: 10.3390/s18113652

5. Labbé M., Michaud F. RTAB-Map as an open-source lidar and visual simultaneous localization and mapping library for large-scale and long-term online operation // Journal of Field Robotics (2019). doi: 10.1002/rob.21831

Автор

Александр Крючков

a.kryuchkov@phygitalism.com

Инженер-исследователь в Phygitalism

--

--

PHYGITALISM
PHYGITALISM

We are a young technology company founded in 2015 and currently developing Phygital+, a product for creators combining AI, 3D and XR