Камеры глубины. Опыт сканирования помещений.
Развитие RGB-D сенсоров способствует их активному внедрению в различные сферы нашей жизни — недорогие камеры можно использовать для сканирования помещения и объектов, с целью построения их 3D моделей. Но для того, чтобы это сделать, необходимо пройти достаточно непростой путь — на основе своего опыта мы расскажем о ключевых моментах, важных для осуществления сканирования.
Часть 1 \ Часть 2
Предполагается, что читатель уже знаком с основами работы технологии.
Постановка задачи
Рассмотрим применение RGB-D сенсоров для построения трёхмерной модели окружающего нас пространства — наша задача в режиме реального времени постепенно выстраивать 3D модель того, что видит сенсор. Сначала выясним примерные шаги, которые необходимо сделать для ее решения:
- Необходимо преобразовать два кадра с сенсора (цветное изображение и кадр с глубиной) в “облако точек” в 3D пространстве, относительно системы координат сенсора.
- Необходимо построить глобальную неподвижную систему координат, относительно которой мы будем выстраивать 3D модель. Сенсор будет перемещаться относительно этой системы координат, поэтому здесь возникает две подзадачи: определение положения сенсора и пересчёт координат между системой координат сенсора и глобальной системой координат.
- Когда мы знаем координаты точек в неподвижной системе координат, остается только объединить результаты с данными, полученными на предыдущем шаге, для получения полноценного скана.
Далее рассмотрим решение этих задач.
Преобразование данных с сенсора в 3D
В основном, с RGB-D сенсоров в каждый момент времени можно получить следующие данные:
- Цветное изображение. Далее будем называть его RGB изображением.
- Карту глубины.
Карта глубины представляет собой двумерный массив чисел, чей размер может совпадать или не совпадать с размером RGB изображения — в самом простом случае, размеры одинаковые. Каждое число на карте глубины показывает расстояние от сенсора до точки в реальном мире, которая была спроецирована на плоскость камеры. Пример представлен на рис. 1. На рисунке присутствуют участки с чёрным цветом. Это означает, что информация о глубине неизвестна.
Фактически, нам необходимо сделать то, что обычно делают в компьютерной графике, только в обратную сторону. В компьютерной графике — создают проекцию из 3D в 2D для отображения трёхмерной сцены на экране, а нашей задачей будет сделать проекцию из 2D в 3D. В общем случае, без дополнительной информации сделать это однозначно нельзя, но у нас есть информация с карты глубины.
Проецирование делится на два этапа:
- Выравнивание карты глубины с RGB изображением.
- Расчёт координат в 3D.
Зачем нужно выравнивание? Если мы хотим получить цветное “облако точек”, то информацию о реальном цвете можно взять только с RGB изображения. Как правило, камера, которая получает цветное изображение, и камера, которая анализирует глубину, находятся рядом с друг другом, но между ними все же есть небольшое расстояние. Для наглядности: на рис. 2 цифрой 1 обозначена камера, чувствительная к инфракрасному излучению(большинство RGB-D сенсоров используют её для определения глубины), а цифрой 2 обозначена RGB камера, которая передаёт цвет. Из-за смещения (расстояния между ними), пиксели на карте глубины и RGB изображении не будут соответствовать друг другу, следовательно необходима некоторая корректировка.
Для этого нам понадобятся внешние параметры камеры (extrinsics). Получение этих параметров может отличаться в зависимости от SDK, используемого вместе с RGB-D сенсором. Мы рассмотрим пример на основе Intel RealSense SDK 2.0. Если у вас нет камеры RealSense, то ничего страшного - в SDK предусмотрена возможность воспроизводить специальные файлы в формате .bag, записанные заранее, так, как будто мы получаем данные с реальной камеры, но с некоторыми ограничениями по настройке. Для воспроизведения результатов достаточно загрузить пример, записанный на камеру SR300, и установить SDK 2.0. На момент написания использовался build 2.29.0.
После перехода по ссылке, для загрузки примера необходимо нажать на изображение:
Сначала попробуем просто сопоставить два изображения без выравнивания. Результат представлен на рис. 3.
Видно, что объекты не совпадают. Для визуализации значений глубины была использована цветовая схема Hue из SDK.
Попробуем воспользоваться встроенным в SDK механизмом выравнивания. Результат представлен на рис. 4.
Видно, что результат соответствует ожидаемому.
Технически это реализуется следующим образом: у каждой камеры своя система координат. Пусть у RGB камеры будет система координат с началом в точке A, у инфракрасной камеры система координат с началом в точке B.
То что мы видим на рис. 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’. Для этого необходимо:
- Спроектировать точку P’ обратно в 3D, в системе координат Bx’y’z’.
- Пересчитать координаты P’ в системе Axyz с помощью внешних параметров камеры.
- Спроектировать обратно на плоскость в системе 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.
Отслеживание перемещения устройства
Теперь мы умеем получать “облако точек” с цветом, но относительно системы координат, связанной с камерой. Как было замечено выше, нам нужна глобальная система координат, которая будет неподвижной, и мы должны знать положение сенсора относительно нее. Некоторые RGB-D сенсоры имеют встроенные датчики (гироскоп, акселерометр) для отслеживания перемещения, например ZED Mini или RealSense D435i. Если сенсор не обладает встроенными датчиками, то можно рассмотреть вариант комбинации с планшетом или телефоном.
Здесь мы приходим к необходимости реализовать SLAM алгоритм. Для этого необходимо понять, какие данные мы можем получать от RGB-D сенсоров:
- Данные с гироскопа и акселерометра (могут быть недоступны).
- Изображения с камеры.
- Карту глубины.
Акселерометр позволяет вычислить ускорение устройства вдоль трёх основных осей. Если пересчитать ускорение относительно Земли, то можно найти координаты путём двойного интегрирования.
Процесс интегрирования связан с накоплением ошибок. Это приводит к погрешностям в определении местоположения, которая растёт со временем. Более подробно можно прочитать об этом в [2]. Для того, чтобы решить эту проблему, необходимо периодически корректировать местоположение.
Здесь нам может помочь камера и визуальная одометрия (visual odometry). У визуальной одометрии есть свои проблемы - например, метод плохо работает в тёмном помещении.
В итоге, каждый из методов имеет свои недостатки. Возникает вопрос - что будет, если объединить два метода? Таким образом мы сможем использовать преимущества обоих подходов.
В результате мы получили визуально-инерционную одометрию (visual-inertial odometry). Можно посмотреть видео с сравнением различных алгоритмов между собой.
Кстати, именно данный подход используется в технологиях ARKit от Apple и ARСore от Google, которые мы используем в своих проектах с дополненной реальностью.
С инфракрасной камерой и корректировкой позиции связан интересный факт, касающийся контроллеров Oculus Quest. На камеру RealSense D435 или D415, чувствительную к инфракрасному излучению, можно заснять инфракрасные излучатели на контроллерах как на рис. 8. Шлем также видит их с помощью своих камер.
Улучшить результаты можно с помощью дополнения алгоритмов визуально-инерционной одометрии информацией с карты глубины. Более подробно это описано в [3].
С помощью алгоритмов, рассмотренных выше, мы можем получить траекторию движения RGB-D сенсора со временем относительно глобальной системы координат. В качестве начала глобальной системы координат мы можем взять самое первое положение сенсора (красная точка). Пример приведён на рис. 9.
Итеративное обновление данных
Осталось решить последнюю задачу — добавление новых точек. Зная положение и ориентацию сенсора в каждый момент времени, мы можем по карте глубины посчитать 3D координаты точек относительно камеры, а потом пересчитать относительно глобальной системы координат.
В теории этого достаточно. На практике возникает много проблем. Из-за неточностей определения положения, одна и та же точка в реальном мире, снятая с разных ракурсов, может иметь разные координаты. Частично проблему может решить алгоритм ICP и его модификации (видео с демонстрацией работы ICP). Реализации этого алгоритма есть в библиотеке PCL. Много возможностей представляет библиотека Open3D. Описание одного из алгоритмов для 3D реконструкции можно посмотреть в [4]. С помощью них мы можем начать сопоставлять текущие данные с новыми, и постепенно выстраивать полноценную 3D модель.
Существует приложение RTAB-Map [5], в котором многое из того, что было упомянуто раннее, уже реализовано, и с помощью него можно получить подобный результат как на рис. 10:
На выходе получится модель, которую можно посмотреть в любом 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