3D сканеры Ciclop и PiclopДва сканера со сходной идеологией, но разными аппаратными и программными решениями. Вероятно, самый простой способ отсканировать модель это поместить ее на вращающийся стол, осветить под углом лазерной указкой с цилиндрической линзой, превращающей точку в вертикальную линию, снять на камеру и вычислить смешение точек линии от вертикали вызванные моделью. Года 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. В отличие от оригинальной модели, в моей конструкции предусмотрена возможность перемещать профиль, к которому прикреплены камера и лазеры, и свет по вертикали. Крепление камеры выполнено в виде элемента шаровой опоры, что позволяет ее вращать в произвольной плоскости. Объектив с фокусным расстоянием 3,6 мм, камера 5 Мп. Однако с полным разрешением ее использовать для сканирования редко целесообразно, поскольку возросшие сложности с точной юстировкой съедят все преимущества высокого разрешения, особенно если сканировать используя оба лазера.
Крепление лазеров. Освещение сделано на основе светодиодной ленты с напряжением питания 12В. Регулировка яркости с помощью ШИМ на мой взгляд не слишком удачная идея, поскольку при скважности порядка 50% изображение начинает заметно мерцать, потому я добавил и ручную регулировку с помощью переменного сопротивления. Два ряда из 18 светодиодов пожалуй слишком много, одного ряда однако мало. Основное отличие моей конструкции связано с тем, что управление шаговым двигателем осуществляется не микросхемой A4988, а L298 и соответственно нет возможности делать микрошаги и контролировать ток. Поэтому был собран редуктор с червячной передачей с отношением 1:32. Для того чтобы ограничить ток и избежать перегрева двигателя в цепи питания было установлено сопротивление в 25 Ом. Шестерня с 32 зубьями была отпечатана, а червяк я для большей точности и минимизации люфтов выточил на токарном станке, хотя полагаю, что и отпечатанная деталь могла подойти. Поскольку команды управления у этих микросхем не совпадают, то я для согласования установил Arduino nano с простенькой согласующей программой piclopmotor6: int enable1 = 12;//зеленый В качестве основного компьютера установлена модель 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 градусов то он делает ровно один оборот и крутится достаточно быстро. Измеряем расстояние между осью стола и камерой и заносим в таблицу на странице SETTIGS/Setup. Измеряем расстояние между лазерами и камерой и тоже заносим в таблицу. Переключаем камеру в режим максимального разрешения на странице SETTIGS,
возвращаемся на страницу CAMERA и нажимаем кнопку калибровки лазеров. Если нажать кнопку Test, то будет сделан снимок и на нем выделены лазерные лучи, вертикальная ось камеры и крестиками отмечены результаты калибровки лазеров. Возвращаемся на страницу SETTINGS и задаем параметры сканирования. Переключаемся на страницу SCAN и нажимаем кнопку Start Scan. В процессе сканирования можно переключиться на просмотр получаемых результатов. По окончанию сканирования можно просмотреть, стереть и записать результаты. Для сохранения в желаемом формате нажимаем на надпись STL или PLY. В формате PLY (Polygon File Format или the Stanford Triangle Format) сохраняется облако точек, треугольники, образующие поверхность, и нормали к ним. Таким образом в этом формате сохранена вся полученная информация и обычно достаточно сохранять результаты только в нем. Для этого надо снять пометку на странице SETTINGS. horusНаписанная на Python программа, распространяемая под лицензией GPL. Безусловно, самая красивая из рассматриваемых программа, только вот с выбором камеры повезло не очень. Сегодняшним пользователям Linux добиться адекватной реакции на изменения ее параметров, заложенных в программе, весьма непросто. Причина в том, что заставили ее работать только под измененной версией OpenCV, а идею закрепить эти изменения в новых версиях никто не подхватил. Программа многократно описана, поэтому ограничусь картинками.Контроль. Настройка параметров сканирования и отдельно калибровки. Выбор порогового значения, размытия и ширины зоны вокруг луча. Калибровка. Результаты калибровки. Процесс сканирования с выводом результата в реальном времени. Окно сканирования. thotПрограмма с интерфейсом
командной строки CLI (Command line interface) написана Fabien Devaux. В отдельном окне выводится изображение с камеры с наложенным результатом обработки лазерных лучей или шахматной доски. Возможности программы лучше всего демонстрирует список доступных команд: 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 и там обрабатывать. Тем не менее, MeshLab и CloudCompare с автоматическим заделыванием дыр справляются лучше. После удаления лишних точек в них для этого используется фильтр Poisson Surface Reconstruction. В обеих программах можно добиться примерно одинакового результата. Какая удобнее, сказать сложно. В MeshLab больше фильтров и возможностей обработки. CloudCompare работает медленнее, но в ней, на мой взгляд, более гибкие возможности очистить модель от лишних точек и больше настроек при построении нормалей, что иногда является принципиальным, когда часть нормалей являются инвертированными, а нужно направить их перпендикулярно внешней поверхности модели. Лишние точки сильно осложняют получение правильных нормалей, поэтому начинать надо с их удаления. Далее можно попробовать несколько раз инвертировать нормали и иногда это помогает. В CloudCompare кроме выбора центральной точки есть еще два фильтра влияющие на ориентацию объединенных в группу Orient normals. Визуализация направления нормалей в CloudCompare осуществляется цветом, а MeshLab и Blender отрезками прямых. В случае с файлами Piclop нормали можно вычислить заново, но обычно те, что заданы сканером, правильные и их, возможно, только придется инвертировать. MeshLab,Программа написана в Итальянском исследовательском центре ISTI - CNR в 2005 году. Распространяется под лицензией GPL. Последняя версия вышла в декабре 2016 года. В данной статье используется старая версия 1.3.2 от февраля 2016 года. Все нужные нам фильтры собраны в разделе Point Set. Определяем направление нормалей. Одинаковым образом для обеих сканеров реконструируем поверхность. Финальный результат
CloudCompareФранцузская программа, написанная Daniel Girardeau-Montaut в 2003 году и распространяемая под лицензией GPL. Версия 2.9.alpha вышла 5 февраля 2017 года. В случае работы со сканером Ciclop: Загружаем файл. Редактируем, нажав на значок ножницы (Segment) на верхней панели. Определяем направление нормалей. Выбираем Use Preferred Orientation -Barycenter. В случае со сканером Piclop только инвертируем нормали, записанные программой сканирования. Одинаковым образом для обеих сканеров реконструируем поверхность. Финальный результат для сканера Ciclop. Обращаю внимание на левую панель где информация из загруженного файла PLY отображается как Cloud. Финальный результат для сканера Piclop. Обращаю внимание на левую панель где информация из загруженного файла PLY отображается как Mesh. И MeshLab и CloudCompare позволяют объединить результаты нескольких сканирований. Для меня самым удобным оказалось грубое совмещение в CloudCompare и далее запуск автоматического выравнивания. Не всегда, но обычно дает приличный результат. В MeshLab с автоматическим выравниванием у меня ничего не получилось, а чисто ручной способ с выбором совмещаемых точек в обеих программах слишком трудоемкий.
ИтогиСканер Ciclop, один левый лазер, программа сканирования thot, реконструкция в MeshLab. Пропали детали воротника на левом плече. В зоне уверенного отражения детализация достаточно подробная и практически без дефектов. Пузыри на модели образовались в местах, где направление нормалей было определено неправильно. Сканер Ciclop, один левый лазер, программа сканирования thot, реконструкция в CloudCompare. Сканер Piclop, оба лазера, программа сканирования freelss, реконструкция в MeshLab. Сканер Piclop, оба лазера, программа сканирования freelss, реконструкция в CloudCompare. Оба плеча имеют одинаковую детализацию, но модель более сглаженная и в некоторых местах появились артефакты, связанные не только с плохой калибровкой лазеров, но и с паразитными точками, которые при одиночном лазере воспринимались программой как изолированные, а при наложении второго облака точек стали элементами рельефа. Удалять такие точки в плотном облаке точек от сканирования с использованием двух лазеров весьма сложно. Сканеры позволяют добиться примерно одинакового результата. Высокое разрешение камеры Piclop не востребовано, как и возможность делать более 800 снимков за один оборот. Лимитирует разрешение воспринимаемая толщина лазерного луча. Воспринимаемая толщина линии зависит от яркости точки, которая в свою очередь зависит от отражающей способности материала модели и угла падения луча на поверхность. При использовании нынешнего алгоритма выделения лазерного луча уменьшение толщины линии за счет лучшей фокусировки или увеличения единого порогового значения приведет к улучшению разрешения для ярких точек и к полной потере информации для более темных. Сейчас у нас компромисс состоит в том, что за счет ограничения разрешения мы получаем информацию о всех точках поверхности, на которую упал лазерный луч. Потенциально для сканера Piclop можно написать программу которая при высоких разрешениях будет делать несколько снимков с разной экспозицией. Однако это увеличит и так не маленькое время сканирования с разрешением 5 Мп. Если не рассматривать отдельных моделей с мелким слабовыраженным рельефом, разумное разрешение для этого сканера 1,9 Мп (1600 х 1200). При этом разрешении скорость сканирования у обеих сканеров порядка пяти минут, но учитывая меньше операций финальной обработки, результат со сканера Piclop будет получен чуть быстрее. Мне оказалось легче добиться приемлемого результата при сканировании с двумя включенными лазерами на сканере Piclop с ручной калибровкой. Это достаточно трудоемко, но терпение и время позволяют добиться результата, тогда как автоматическая калибровка это лотерея, может сразу повезти, может не повезти никогда. 24.02.2017
Установите проигрыватель Flash
|
Облако тегов:
...
|