3D сканеры Ciclop и Piclop

GoPro

GoPro

Два сканера со сходной идеологией, но разными аппаратными и программными решениями. Вероятно, самый простой способ отсканировать модель это поместить ее на вращающийся стол, осветить под углом лазерной указкой с цилиндрической линзой, превращающей точку в вертикальную линию, снять на камеру и вычислить смешение точек линии от вертикали вызванные моделью. Года 3 назад идея была реализована в Испании BQ labs  и опубликована под свободными лицензиями. Были выложены детали конструкции для печати на 3D принтере  и очень красивая программа horus, написанная на Python. Для четкого выделения лазерной подсветки необходимо было управлять экспозицией камеры. В момент создания актуальной была Ubuntu 14.04. V4L2 поддерживает управление камерой, но она не стыкуется с официальной версией OpenCV.  Следуя принципу написания минимального собственного кода для получения работоспособного результата, разработчики слегка подправили текущую версию OpenCV. Решение правильное, рабочая установка была получена, а кто запоздал, пусть сам расхлебывает ситуацию, при которой установка на новые версии Ubuntu требует сноса всех программ, использующих более новые версии OpenCV. Идеологически система устарела, и авторам. вероятно, было не интересно править последующие версии тем более, что массового потребителя, использующего в своей работе Windows это не коснулось, поскольку в этой ОС используются драйверы от производителя камеры.   Сообщество конечно задачу попыталось решить, но идеального всех устраивающего результата похоже не добилось. Я воспользовался решениями, предложенными Fabien Devaux. Его версия horus не требует специальной версии OpenCV, но работает очень медленно. Он предложил свое решение этой проблемы, написав  программу thot с интерфейс командной строки CLI (Command line interface). Программа имеет собственную систему автоматической калибровки, но можно воспользоваться и результатами калибровки, полученными с помощью horus.  Программа мне в целом очень понравилась, но вот автоматическая калибровка это не мой стиль :-). В случае ручной калибровки достижение результата это вопрос времени и терпения, а в случае автоматической это всегда лотерея. Конструкция Ciclop плохо приспособлена для калибровки путем перемещения лазеров и камеры, хотя конечно можно подправить автоматически полученные цифры для получения приемлемого результата с имеющимся расположением элементов конструкции. Поэтому встретив в сети описание сканера на камере Raspberry Pi (с которой я хорошо знаком) и требующей именно точной механической юстировки элементов конструкции я решил ее повторить. Для управления в этом случае используется программа freelss, написанная на C++. У камер Raspberry Pi очень богатые возможности управления экспозицией, но в данной программе они не используются, а для точной подгонки используется регулируемое освещение. На данном этапе я не стал переделывать программу и решил сравнить возможности сканеров как бы в первозданном виде. Поскольку я собирал свою конструкцию исключительно из имеющихся деталей,  то в конструкцию были внесены некоторые изменения, а совместимость с исходным кодом программы была достигнута введением, вообще говоря, лишнего элемента на компьютере Arduino.

   Статья получается довольно большой, поэтому привожу ее оглавление:

Piclop

Основное отличие в конструкции сканера типа Piclop это необходимость предусмотреть возможность аккуратной юстировки, позволяющей выставить параллельно лучи лазеров и вертикальную ось кадра. Кроме того, лучи лазеров должны перекрещиваться точно на оси вращения платформы. Поэтому желательно так сконструировать крепления, чтобы при фиксации они не смещались. Дополнительные возможности точной юстировки достигаются опорными винтами, позволяющими независимо перекашивать вращающийся стол и вертикальные штанги сканера. Ниже приведены  фотографии узлов сканера и файлы с отпечатанными элементами конструкции в формате STL и FreeCad. Все детали были отпечатаны на принтере Creality 3D. Поскольку я использовал имеющиеся алюминиевые профили, выпущенные лет тридцать назад, сегодня возможно будет трудно найти их точные аналоги, поэтому желающим повторить конструкцию придется подправить исходные чертежи, выполненные в программе FreeCad.

piclop

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

piclop

Крепление камеры выполнено в виде элемента шаровой опоры, что позволяет ее вращать в произвольной плоскости. Объектив с фокусным расстоянием 3,6 мм, камера 5 Мп. Однако с полным разрешением ее использовать для сканирования редко целесообразно, поскольку возросшие сложности с точной юстировкой съедят все преимущества высокого разрешения, особенно если сканировать используя оба лазера.

piclop

STL, FreeCad

piclop

STL, FreeCad

piclop

STL, FreeCad

picloppiclop

Крепление лазеров.

piclop

STL, FreeCad

piclop

STL, FreeCad

piclop

Освещение сделано на основе светодиодной ленты с напряжением питания 12В. Регулировка яркости с помощью ШИМ на мой взгляд не слишком удачная идея, поскольку при скважности порядка 50% изображение начинает заметно мерцать, потому я добавил и ручную регулировку с помощью переменного сопротивления. Два ряда из 18 светодиодов пожалуй слишком много, одного ряда однако мало.

piclop

STL, FreeCad

piclop

STL, FreeCad

piclop

STL, FreeCad

piclop

Основное отличие моей конструкции связано с тем, что управление шаговым двигателем осуществляется не микросхемой A4988, а L298 и соответственно нет возможности делать микрошаги и контролировать ток. Поэтому был собран редуктор с червячной передачей с отношением 1:32. Для того чтобы ограничить ток и избежать перегрева двигателя в цепи питания было установлено сопротивление в 25 Ом. Шестерня с 32 зубьями была отпечатана, а червяк я для большей точности и минимизации люфтов  выточил на токарном станке, хотя полагаю, что и отпечатанная деталь могла подойти. 

piclop

STL, FreeCad

piclop

STL

piclop

Поскольку команды управления у этих микросхем не совпадают, то я для согласования установил Arduino nano с простенькой согласующей программой piclopmotor6:

int enable1 = 12;//зеленый
int enable2 = 7;//черный

int out1 = 11;//N1 синий
int out2 = 10;//N2 фиолетовый
int out3 = 9;//N3 серый
int out4 = 8;//N4 белый
int inpnapr = 6;//оранжевый - направление
int inpstep = 5;//желтый - шаг
int inpen = 2;//зеленый enable
int st = 0;
int en = 0;
int napr = 1;
int dt1 = 3;

int faz = 0;
void setup()
{
pinMode(enable1, OUTPUT);
pinMode(enable2, OUTPUT);
pinMode(out1, OUTPUT);
pinMode(out2, OUTPUT);
pinMode(out3, OUTPUT);
pinMode(out4, OUTPUT);
pinMode(inpnapr, INPUT);
pinMode(inpstep, INPUT);
pinMode(inpen, INPUT);

digitalWrite(enable1, LOW);
digitalWrite(enable2, LOW);
digitalWrite(out1, LOW);
digitalWrite(out2, LOW);
digitalWrite(out3, LOW);
digitalWrite(out4, LOW);
// digitalWrite(inpen, HIGH);
// digitalWrite(inpstep, HIGH);

}
void loop() {
en = digitalRead(inpen); // Чтение состояния
st = digitalRead(inpstep); // Чтение состояния
napr = digitalRead(inpnapr); // Чтение состояния
if (en == LOW){
digitalWrite(enable1, HIGH);
digitalWrite(enable2, HIGH);
}
else{
digitalWrite(enable1, LOW);
digitalWrite(enable2, LOW);
}
if (st == LOW){
Faza();
Faza();
Faza();
Faza();
}

}

void Faza() {
byte fazaA[] = {HIGH, HIGH, LOW, LOW};
byte fazaB[] = {LOW, LOW, HIGH, HIGH};
byte fazaC[] = {LOW, HIGH, HIGH, LOW};
byte fazaD[] = {HIGH, LOW, LOW, HIGH};

if (napr == LOW){
faz = faz + 1;}
else{
faz = faz - 1;}
if (faz > 3)
{faz = 0;}
else if (faz < 0)
{faz = 3;}

digitalWrite(out1, fazaA[faz]);
digitalWrite(out2, fazaB[faz]);
digitalWrite(out3, fazaC[faz]);
digitalWrite(out4, fazaD[faz]);

delay(dt1);

}


piclop

STL, FreeCad


piclop

В качестве основного компьютера установлена модель Pi3. С программой freelss она, вероятно, избыточна, но в будущем я возможно напишу свою с использованием OpenCV. Это потенциально позволит реализовать все настройки камеры, как я уже писал в статье Использование OpenCV для получения живой стерео картинки, исправления искажений, получения карты глубин. Включение лазеров и светодиодов освещения,  как и в оригинале, реализовано на микросхеме ULN2003A, а в цепи управления двигателем добавлены развязки на оптронах. В штатной ситуации они лишние и являются перестраховкой. Наводки от двигателя могут провоцировать паразитные лишние шаги, поэтому в цепь добавлены конденсаторы и учитывая, что 1:32 шага скорее всего никогда не понадобится, Arduino превращает каждый шаг от Raspberry Pi в 4 шага двигателя. Общее питание всей системы 12 В. Для питания Raspberry Pi установлен преобразователь 12В в 5 В.

Стол гладкий для предотвращения смещения используется двусторонняя липкая лента. Для большинства объектов это оказалось очень удачное решение.

freelss

Свободная программа, написанная на C++ под лицензией  GPL, созданная для свободного сканера ATLAS 3D.

Программа управляется через WEB интерфейс и таким образом для работы можно подключить к Raspberry Pi только монитор и мышь или воспользоваться компьютером или планшетом, находящимся с ней в одной сети. Начинаем со страницы SETTIGS/Setup и заносим в таблицу, к каким контактам GPIO у нас подключен драйвер мотора, лазеры и свет. Переходим на страницу  CAMERA. Включаем лазеры. Ставим мишень на стол, добиваемся пересечения лазерных лучей в его центре их параллельности между собой осью стола и вертикальной осью камеры. Хотя у камеры Raspberry Pi богатые возможности по регулировки экспозиции, в программе они не используются, а регулируется освещение с помощью ШИМ. Задаем процент и жмем кнопку Set Light. Крутим стол задав угол и нажав кнопку Rotate. Проверяем что нет ложных срабатываний и если задано 360 градусов то он делает ровно один оборот и крутится достаточно быстро. 

freelss

Измеряем расстояние между осью стола и камерой и заносим в таблицу на странице SETTIGS/Setup. Измеряем расстояние между лазерами и камерой и тоже заносим в таблицу.

freelssfreelss

Переключаем камеру в режим максимального разрешения на странице SETTIGS, возвращаемся на страницу CAMERA и нажимаем кнопку калибровки лазеров. Если нажать кнопку Test, то будет сделан снимок и на нем выделены лазерные лучи, вертикальная ось камеры и крестиками отмечены результаты калибровки лазеров.

freelss

Возвращаемся на страницу SETTINGS и задаем параметры сканирования.

freelss

Переключаемся на страницу SCAN и нажимаем кнопку Start Scan. В процессе сканирования можно переключиться на просмотр получаемых результатов. По окончанию сканирования можно просмотреть, стереть и записать результаты. Для сохранения в желаемом формате нажимаем на надпись STL или PLY. В формате PLY (Polygon File Format или the Stanford Triangle Format) сохраняется облако точек, треугольники, образующие поверхность, и нормали к ним. Таким образом в этом формате сохранена вся полученная информация и обычно достаточно сохранять результаты только в нем. Для этого надо снять пометку на странице SETTINGS.

freelss

horus

Написанная на Python программа, распространяемая под лицензией GPL. Безусловно, самая красивая из рассматриваемых программа, только вот с выбором камеры повезло не очень. Сегодняшним пользователям Linux добиться адекватной реакции на изменения ее параметров, заложенных в программе, весьма непросто. Причина в том, что заставили ее работать только под измененной версией OpenCV, а идею закрепить эти изменения в новых версиях никто не подхватил.  Программа многократно описана, поэтому ограничусь картинками.

horus

Контроль.

horus

Настройка параметров сканирования и отдельно калибровки.

horus

Выбор порогового значения, размытия и ширины зоны вокруг луча.

horus

Калибровка.

horus

Результаты калибровки.

horus

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

horus

Окно сканирования.


thot

Программа с интерфейсом командной строки CLI (Command line interface) написана Fabien Devaux.  В отдельном окне выводится изображение с камеры с наложенным результатом обработки лазерных лучей или шахматной доски.


thot

thot


Возможности программы лучше всего демонстрирует  список доступных команд:

Scan Bot> advanced
Using advanced commands
Scan Bot> help
Commands:
 advanced              Toggle Advanced Command Set
 algop                 List, Get Or Set Algorithm Parameters
 algorithm             Change The Algorithm For Laser Detection One Of: Uncanny, Pureimages
 calibrate             Start Platform & Laser Calibration
 calibrate_manual      Calibrate Platform & Scanner With User Confirmation Of Laser Lines
 calibrate_shots       
 cam_brightness        Get Or Set Camera Brightness
 cam_exposure          Get Or Set Camera Exposure
 capture               Capture Images
 capture_color         Capture Images (Color Only)
 capture_lasers        Capture Images (Lasers Only) [Puremode Friendly]
 cfg                   Set, Get Or List Configuration Settings
 debug_settings        Display Horus & Thot Configurations Side By Side
 exit                  
 help                  
 import_val            Imports Some Configuration From Horus
 keep_laser            Set Dual Scanning (No Param) Or A Single Laser (1 Or 2)
 lasers                Toggle Lasers
 make                  Compute Mesh From Images (Pure Mode Aware)
 pattern_colors        Capture Chessboard Pattern (Color Only)
 pattern_lasers        Capture Chessboard Pattern (Lasers Only) [Puremode Friendly]
 pure                  
 quit                  
 recalibrate           
 recalibrate_manual    Calibrate Platform & Scanner With User Confirmation Of Laser Lines
 roi                   Set With And Height Of The Scanning Cylinder, In Mm (Only One Value = Height)
 rotate                Rotates The Platform By X Degrees
 scan                  Scan Object
 shot                  Save Pattern Image For Later Camera Calibration
 shots_remove          Remove All Shots
 use_horus_cfg         Load Horus Calibration Configuration
 use_thot_cfg          Load Thot Calibration Configuration
 view                  Toggle Webcam Output (Show Chessboard If Detected)
 view_mode

Программа имеет собственную систему автоматической калибровки, вызываемую командой calibrate. Можно отбраковку снимков, когда программа приняла за лазерный луч что-то другое, воспользовавшись командой calibrate_manual.  И наконец, можно воспользоваться и результатами калибровки, полученными с помощью horus с помощью команды use_horus_cfg из предварительно сохраненного файла .horus/calibration.json. Последнее может быть полезным, поскольку файлы калибровки horus легко отредактировать в любом текстовом редакторе. И наконец, сделав несколько снимков шахматной доски, можно устранить дисторсию объектива командой calibrate_shots, а затем recalibrate.

После калибровки запускаем сканирование  командой scan. Обрабатываем их для получения файла model.ply командой make. Поскольку все снимки, сделанные при сканировании, сохраняются, то можно провести обработку несколько раз с разными параметрами.

Пока у меня к программе только одно замечание: Команда keep_laser без параметров не работает, keep_laser 1 запускает оба лазера, а  keep_laser 2 только левый. Таким образом, не ясно, как работать только с правым лазером.

Обработка

Результаты сканирования оба сканера записывают в формате с расширением PLY (Polygon File Format или the Stanford Triangle Format). Однако содержимое у них существенно отличается. У сканера Ciclop это только облако точек и для превращения его в модель надо вычислить нормали и объединить точки в треугольники. Для этих целей в руководстве к сканеру авторы рекомендуют использовать программы MeshLab или CloudCompare. Сканер Piclop, управляемый программой freelss, записывает в файл  как облако точек, так и сразу треугольники с нормалями, и может сразу записывать и формат STL (STereoLithography), который содержит те же треугольники с нормалями и без дополнительной обработки не пригоден для печати так как содержит множество дыр и не является моделью твердого тела. Эти файлы можно сразу загружать, например, в Blender и там обрабатывать.

blender

Экспортируем из меню 3D Printing  и сразу получаем почти пригодную к печати модель.

Blender

Тем не менее, MeshLab и CloudCompare с автоматическим  заделыванием дыр справляются лучше. После удаления лишних точек в них для этого используется фильтр Poisson Surface Reconstruction. В обеих программах можно добиться примерно одинакового результата. Какая удобнее, сказать сложно. В MeshLab больше фильтров и возможностей обработки. CloudCompare работает медленнее, но в ней, на мой взгляд, более гибкие возможности очистить модель от лишних точек и больше настроек при построении нормалей, что иногда является принципиальным, когда часть нормалей являются инвертированными, а нужно направить их перпендикулярно внешней поверхности модели. Лишние точки сильно осложняют получение правильных нормалей, поэтому начинать надо с их удаления. Далее можно попробовать несколько раз инвертировать нормали и иногда это помогает. В CloudCompare кроме выбора центральной точки есть еще два фильтра влияющие на ориентацию объединенных в группу Orient normals. Визуализация направления нормалей в  CloudCompare осуществляется цветом, а MeshLab и Blender отрезками прямых. В случае с файлами Piclop нормали можно вычислить заново, но обычно те, что заданы сканером, правильные и их, возможно, только придется инвертировать.

MeshLab,

Программа написана  в Итальянском исследовательском центре  ISTI - CNR в 2005 году. Распространяется под лицензией GPL. Последняя версия вышла в декабре 2016 года. В данной статье используется старая версия 1.3.2 от февраля 2016 года.

Загружаем. Редактируем, нажав на значок Select Vertexes, и удаляем лишние точки. В случае со сканером Ciclop определяем направление нормалей. В случае с Piclop используем нормали, записанные программой freelss, без изменений.

MeshLab

Все нужные нам фильтры  собраны в разделе Point Set.

MeshLab

Определяем направление нормалей.

MeshLab

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

MeshLab

Финальный результат

CloudCompare

Французская программа, написанная Daniel Girardeau-Montaut  в 2003 году и распространяемая под лицензией GPL. Версия 2.9.alpha вышла 5 февраля  2017 года.

В случае работы со сканером Ciclop:  

CloudCompare

Загружаем файл.

CloudCompare

Редактируем, нажав на значок ножницы (Segment) на верхней панели.

CloudCompare

Определяем направление нормалей. Выбираем Use Preferred Orientation -Barycenter.  В случае со сканером Piclop только инвертируем нормали, записанные программой сканирования.

CloudCompare

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

CloudCompare

Финальный результат для сканера Ciclop. Обращаю внимание на левую панель где информация из загруженного файла PLY отображается как Cloud.

CloudCompare

Финальный результат для сканера Piclop. Обращаю внимание на левую панель где информация из загруженного файла PLY отображается как Mesh.

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

Итоги

 Ciclop

Сканер Ciclop, один левый лазер, программа сканирования thot, реконструкция в MeshLab. Пропали детали воротника на левом плече. В зоне уверенного отражения детализация достаточно подробная и практически без дефектов.

Ciclop

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

Ciclop

Сканер Ciclop, один левый лазер, программа сканирования thot, реконструкция в CloudCompare.


Piclop

Сканер Piclop, оба  лазера, программа сканирования freelss,  реконструкция в MeshLab.

Piclop

Сканер Piclop, оба  лазера, программа сканирования freelss,  реконструкция в CloudCompare.

Piclop

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

Сканеры позволяют добиться примерно одинакового результата. Высокое разрешение камеры Piclop не востребовано, как и возможность делать более 800 снимков за один оборот. Лимитирует разрешение воспринимаемая толщина лазерного луча.  Воспринимаемая толщина линии зависит от яркости точки, которая в свою очередь зависит от отражающей способности материала модели и угла падения луча на поверхность. При использовании нынешнего алгоритма выделения лазерного луча уменьшение толщины линии за счет лучшей фокусировки или увеличения единого порогового значения приведет к улучшению разрешения для ярких точек и к полной потере информации для более темных. Сейчас у нас компромисс состоит в том, что за счет ограничения разрешения мы получаем информацию о всех точках поверхности, на которую упал лазерный луч. Потенциально для сканера Piclop можно написать программу которая при высоких разрешениях будет делать несколько снимков с разной экспозицией. Однако это увеличит и так не маленькое время сканирования с разрешением 5 Мп. Если не рассматривать отдельных моделей с мелким слабовыраженным рельефом, разумное разрешение для этого сканера 1,9 Мп (1600 х 1200). При этом разрешении скорость сканирования у обеих сканеров порядка пяти минут, но учитывая меньше операций финальной обработки, результат со сканера Piclop будет получен чуть быстрее.

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


24.02.2017
Установите проигрыватель Flash

Облако тегов:
3D печать
Arduino
Raspberry Pi
Аэрофотосъемка
Байдарки
Геомеханика
История
Камеры
Макросъемка
Объективы
Освещение
Панорамы
Принадлежности
Принтеры
Программы
Сканеры
Стереосъемка
Фильтры
Фокусировка
Фотокубики
...
rss