Как Робот 3D-Сканирует

В мире существует множество технологий 3D-сканирования.

На основе каждого из них созданы десятки моделей сканеров.

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

Другие могут сканировать дом или комнату.

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

В этой статье я расскажу об одном из перспективных направлений сканирования — о том, как делают роботизированные 3D-сканеры.



Как робот 3D-сканирует



Почему это необходимо?

3D сканирование объект не является мгновенным процессом.

Это требует от человека постоянного анализа текущей ситуации и в зависимости от результатов корректировки своих действий.

Сканирование крупных объектов может занять некоторое время.

Вы можете посмотреть примеры здесь И здесь .

Если вам нужно отсканировать много объектов (например, для решения задачи контроля качества или оцифровки ассортимента магазина), то лучше, конечно, сэкономить на рутине и использовать робота.

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

(На самом деле главный аргумент, конечно: потому что это круто! Роботы-гуманоиды и всё такое!)

Как робот 3D-сканирует



Основное отличие и сложность процесса

Когда человек сканирует, он видит всё: что сканируется плохо, что сканируется не до конца, где в сканируемом объекте есть дырка.

Глаза — это независимый сканер, позволяющий проверить качество поступающих данных и сказать «АГА! Вот здесь ты это пропустил!» Но когда робот сканирует, он должен сам принимать такие решения.

И единственной информацией для принятия таких решений являются данные, полученные со сканера.

И данные часто выглядят так:

Как робот 3D-сканирует



Как робот 3D-сканирует

Вот результат того, что произойдет, если поместить сканер на 15-20 секунд рядом с объектом.

При сканировании все сканеры создают либо облако точек, облако полигонов, либо карту глубины.

Любая информация может содержать дыры.

Дырки могут появиться по ряду причин:

  • В объекте действительно может быть дырка
  • В объекте имеется углубление.

    Иногда сканер просто не может заглянуть внутрь: слишком большое основание между «глазами»

    Как робот 3D-сканирует

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

    ну вы уже поняли

  • Большой угол плоскости сканирования к сканеру также может стать причиной появления дыры.

  • Дырка будет, если не получится сканировать со стороны «дырки».

    Например, основание статуи или спина статуи, стоящей вплотную к стене (бывало такое)

  • Я уверен, что мы сможем придумать больше случаев
Но робот-сканер не знает причин.

Он не знает, закончен ли объект или это блики.

Робот не имеет независимых органов управления.

Он понимает окружающий мир только через сканер.



Как бороться?

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

Например, вот так: Этот подход имеет ряд недостатков:

  • Время сканирования довольно длительное.

    Приходится долго вращать предмет.

  • В случае с простыми формами (а-ля пивная банка) всё будет хорошо, но как только мы попытаемся отсканировать что-то достаточно сложное с большим количеством «подрезов», то окажется, что есть много несканируемых областей.

  • Не факт, что все положения будут приняты.

    Например, чтобы увидеть точку внутри объекта, нужно посмотреть строго с одной стороны с точностью до пары градусов и пройти весь 2πR. 2 ≈41253 квадратных градусов - нереально (даже с отрезанной нижней полуплоскостью ≈20к)



Как робот 3D-сканирует

(кадр из видео выше, видны ошибки внутри втулки) Второй подход – заранее рассчитанная траектория.

Конечно, это можно сделать только в ограниченном числе сценариев, когда форма объекта примерно известна.

Например, на производстве для решения проблемы контроля качества выпускаемой продукции.

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

На основе полученных данных строится замкнутая поверхность.

После чего итеративно наблюдаются участки с наименьшей достоверностью (поверхность есть, но нет подтверждающих ее точек).

Наблюдаем регион -> пересчитываем модель -> наблюдаем регион.

Результатом является целая серия последовательных сканирований, в результате которых робот «познает» объект.

Как робот 3D-сканирует

Остается только взять математику, которая позволит нам построить поверхность.

Добавить модуль оценки надежности построенной поверхности.

Запуск в цикле.



Пуассоновая реконструкция

Самая интересная и красивая математика, решающая задачу построения поверхности по неполным данным, — это «реконструкция Пуассона».

Основное предположение состоит в том, что мы рассматриваем один объект. Тогда мы можем представить себе «скрытую» функцию f(p) положения в пространстве.

Положительное значение находится снаружи объекта, отрицательное значение — внутри.

На искомой поверхности объекта функция будет равна нулю.



Как робот 3D-сканирует

Понятно, что градиент f(p) на поверхности является вектором нормали к искомой поверхности объекта.

При обработке первичных данных со сканера мы уже оцениваем нормали к сканируемой поверхности.

Тогда входными данными для поиска функции f(p) будет набор точек пространства и нормаль к поверхности объекта в этих точках: (p,n) я Обычно при сканировании более или менее сложного объекта таких точек сотни тысяч.

Смысл этой функции f(p) и нормалей легче всего понять в 2D. Слева — нормали к 2D-объекту, справа — значение функции f (показано третьей координатой), синий цвет — снаружи объекта, оранжевый — внутри.



Как робот 3D-сканирует

Очки (p,n) я лежать на поверхности.

В идеале:

Как робот 3D-сканирует

где перевернутый треугольник — это оператор Набла (вектор градиента).

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

В этой ситуации вводится нормальное поле v(x) и требуется минимум:

Как робот 3D-сканирует

Эта задача минимизации решается с помощью уравнения Пуассона:

Как робот 3D-сканирует

Кому интересно почитать подробнее о умозаключении и математике: статья автор, придумавший метод. И решив это уравнение (способов решения задачи много, но придется, конечно, перейти к разностной задаче, а затем и к огромному линейному уравнению), вам нужно будет найти изоповерхность с нулем значение f и используя алгоритм марширующие кубики построить полигональную модель.

Здесь, кстати, есть несколько проблем, которые предстоит преодолеть:

  1. Поле v(x) – поле нормалей, на самом деле несколько недифференцировано, а значит, их придется как-то «размазать» по пространству.

    Другими словами, фантазируйте.

  2. Решение проблемы Пуассона с точностью до константы.

    И нам нужно найти поверхность объекта, а значит, нам придется решить еще одну оптимизационную задачу, чтобы минимизировать значения функции f во всех точках p я .

Но со всех остальных точек зрения этот математический подход хорош и надежно применим в реальности (хотя и не является быстрым расчетным процессом).

Единственное, что.

плотность точек p я очень изменчив в пространстве, целесообразно разбить весь объем с помощью октодерева и решить полученное разностное уравнение с учетом разбиения на кубы разного размера.



Как робот 3D-сканирует

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

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



Гладкая реконструкция поверхности со знаком расстояния (почти реконструкция Пуассона)

Есть другой подход предложенный Ф.

Калакли и Г.

Таубина в 2011 г.

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

В Википедии эти два метода просто смущенный .

Аналогично мы ищем функцию f(p), которая отрицательна внутри объекта и положительна вне его.

Точно так же мы хотим приблизить градиент f(p) к нормали в заданных позициях, которые мы получили при сканировании.

Но мы будем искать минимум:

Как робот 3D-сканирует

Это выглядит довольно громоздко, но на самом деле мы лишь требуем, чтобы функция в точках Pi была меньше (первое слагаемое), чтобы ее градиент был ближе к нормали в тех же точках (второе слагаемое) и чтобы во всем ее объеме у него вторые производные были меньше, точнее, функции Гессе (третий член).

Требование вторых производных довольно важно, потому что очень хочется, чтобы функция не начинала колебаться при выходе за границы объекта и не выдавала такие кошмарные картины:

Как робот 3D-сканирует

Те.

Мы все минимизировали, но при удалении от точек, которые мы измеряли сканером, функция f(p) вела себя не произвольно.

Обратите внимание, что каждый член представляет собой квадрат. Это не просто так, потому что.

Именно для квадратичных форм несложно аналитически получить экстремум (для форм А*А-2*b*А+с имеется локальный минимум в точке А=b ).

Давайте просто запишем все в разностной форме, т.е.

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

И в результате мы получаем линейную систему уравнений, неизвестными в которой являются значения функции f(p) внутри кубов.

А кубы, как и в описанном выше методе реконструкции, следует брать неравномерно и строить в октодерево.

Кому интересно подробное заключение, текст статьи.

Скорость примерно такая же, как и у метода, основанного на уравнении Пуассона.

Есть одно небольшое преимущество в том, что вам не нужно «размазывать» нормали в пространстве, чтобы иметь возможность получить расхождение от векторного поля нормалей, теряя при этом точность и излишне сглаживая объект. С другой стороны, если сканер оценивает нормали достаточно грубо, то это преимущество может стать недостатком метода.



Мера качества

Сам алгоритм Пуассона не говорит нам, что видно, а что нет. Необходимо придумать какой-то показатель качества, позволяющий оценить достоверность результата.

Самая простая мера — пройтись по поверхности небольшими кубиками и посмотреть, сколько точек попадает в каждый из них:

Как робот 3D-сканирует

Чем больше точек, тем выше надежность, тем более красный цвет. Этот показатель качества будет весьма репрезентативным.

Действительно, мы не можем доверять областям, где мы ничего не видели.

И если вы это видели, то наверняка там действительно что-то есть.



Выбор дальнейшего направления сканирования

Теперь вроде все ясно.

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

Для этого разметим окружающее пространство.

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

Чем больше таких точек, тем выгоднее выглядеть.



Как робот 3D-сканирует

Остается только найти локальные максимумы и запустить наблюдения:

Как робот 3D-сканирует

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

И так по кругу, пока не появится готовая модель.



Нужен ли Пуассон?

Может быть, можно хорошо отсканировать, чтобы все было одинаково? Зачем усложнять ситуацию кучей математики? Вот простой пример.

Три картинки.

3D сканирование был сделан Сканер Artec Spider .

Первый — это необработанная информация со сканера, по сути облако точек.

Второй — алгоритм «Fusion», который просто выполняет усреднение и контроль положения.

Третий — алгоритм Пуассона.

И разница очевидна!

Как робот 3D-сканирует



Как робот 3D-сканирует



Как робот 3D-сканирует

А вот так будет выглядеть весь дракон:

Как робот 3D-сканирует



Собираем все это вместе

В результате алгоритм сканирования поверхности робота выглядит следующим образом:
  1. Выполнение первоначального сканирования
  2. Построим аппроксимирующую поверхность на основе имеющейся информации
  3. Построим меру качества данной поверхности
  4. Выбор точек для дальнейшего сканирования
    • Если точки имеют большое значение, сделайте сканирование и перейдите к шагу 2.
    • Если во время сканирования почти не добавляется информация, дайте пользователю окончательное сканирование.



Как робот 3D-сканирует

Подробнее об этой схеме сканирования можно прочитать, например, Здесь .

Или посмотрите, как все это работает: P.S. Робот на видео просто так поворачивает голову, к сканированию это не имеет никакого отношения P.S.S. Спасибо Васютка за помощь в написании статьи и команде Артека за многочисленные правки и доведение ее до ума! Теги: #3d сканер #сканирование #пуассоновская реконструкция #робот-сканер #3d модель #robohand #ArTeC #3d #3d fusion #Алгоритмы #Обработка изображений #Разработка робототехники

Вместе с данным постом часто просматривают: