Ciclop как  измерительный прибор

Ciclop

В обсуждении моей предыдущей статьи было одно утверждение «бесполезен, что один, что другой» и один вопрос «как победить несовпадение облаков двух лазеров»,  на которые я изначально отвечать не собирался, но антропологи меня попросили проверить, можно ли использовать сканер Ciclop для проведения достаточно точных измерений черепов, и в результате косвенным следствием этой работы появились и развернутые ответы. Для того, чтобы подтвердить теорию, нужно много экспериментов, чтобы опровергнуть достаточно одного. Нижеприведенная инструкция по сканированию и обработке это и есть ответ на вопрос о полезности. Сразу предупреждаю, что приведенная методика не претендует быть единственно правильной и оптимальной для решения данной задачи, она всего лишь показывает, что существует установка и методика для ее решения. Данная методика предполагает использование только открытых готовых решений. Написание специализированной программы позволило бы кардинально уменьшить и число задействованных пакетов, и строчек кода в них. Однако на это не было времени, и было задействовано 4 программы, сильно пересекающиеся по своим функциональным возможностям. В большинстве руководств по сканированию предлагается использовать только пару программ, одну для калибровки и сканирования, другую для обработки. Однако оказалось, что в каждой паре  чего то не хватает и приходится для получения оптимального результата использовать последовательно все 4. А именно Horus и Thot ( в редакции  Fabien Devaux ), CloudCompare, MeshLab. Все эксперименты проводились на компьютере с ОС Maui 1 «Aurora»

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

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

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

Методика может быть разделена на 4 этапа:

Калибровка

Сперва проводим стандартную калибровку в программе Horus. Открываем вкладку Control workbech  и проверяем, что лазерные лучи параллельны, перпендикулярны платформе и пересекаются в ее центре. Проверяем отсутствие люфта втулки на оси мотора. Сканирование происходит рывками и винт придется подтягивать буквально каждый час. Возможно, стоит изготовить втулку из металла и использовать фиксирующий лак для резьбы винта. Открываем вкладку Adjustment workbech и в пункте Calibration capture, добиваемся распознавания шахматной доски и четкой видимости лазерных лучей (переключение в меню Capture mode). Переходим в Calibration segmentation и добиваемся четкого распознавания обоих лазерных лучей. Открываем вкладку Calibration workbech и начинаем калибровку с пункта  Scanner autocheck. Если все прошло нормально, переходим к последнему пункту Camera intrinsics (поскольку Laser triangulation предполагает использование матрицы объектива, полученной в этом пункте, и при изменении параметров матрицы нужно повторять этот пункт) и делаем серию снимков, перемещая шахматную доску таким образом, чтобы была задействована вся площадь кадра.

ciclop

Переходим к пункту Laser triangulation и проводим калибровку. Запоминаем значения и повторяем калибровку. Значения, скорее всего, будут отличаться и довольно сильно до 10 мм для расстояния между камерой лазером. Чуть сдвигаем мишень и повторяем калибровку. Замечаем, что для одного из лазеров значения варьируются больше, чем для другого. Это связано с тем, что шахматная доска не лучшая поверхность для определения положения лазерных лучей и мощность лазеров разная, а индивидуальной подстройки у сканера Ciclop нет. Ошибка возникает, когда граница клеток проходит рядом с лазерным лучом и линия вырождается в лесенку. В этом случае вычисленное средне значение отличается от значения на однородной поверхности. Забегая вперед, отмечу, что для приемлемого результата при сканировании двумя лазерами ошибка в расстояниях до лазеров не должна превышать 0,5 мм. Такой точности мы на этом этапе не достигнем, но пытаемся добиться относительно стабильных результатов. Переходим к пункту Platform extrinsics и проводим калибровку. Запоминаем результат в файл .horus/calibration.json.

ciclop

Ставим на стол объект в форме параллелепипеда, проводим сканирование, запоминаем результат, открываем в  CloudCompare или MeshLab, видим двойную границу объекта, измеряем расстояние и сравниваем с реальным. Определяем, какой лазер дал результат ближе к истинному. Открываем .horus/calibration.json и изменяем расстояние на 0,5 мм, повторяем сканирование. Добиваемся совпадения границ и правильного размера в мм.

        "distance_left": {
"value": 159.32618646100818
},
"distance_right": {
"value": 149.5000057209673
},

Сканирование удобнее проводить не в программе horus, а в thot с  помощью команды use_horus_cfg, задействовав калибровку, полученную в horus. В этом случае после изменения значений в файле калибровки повторное сканирование проводить не нужно, просто снова запускаем вычисление облака точек командой make. Подробно последовательность команд при работе с thot будет рассмотрена в разделе сканирование. Вообще говоря калибровку можно было бы проводить тоже в thot, но там результаты запоминаются в бинарном файле и править его не просто. Файл же horus очень удобен для редактирования в любом текстовом редакторе.

Сканирование

Сканирование проводим с помощью программы thot. Во-первых, в современном Linux это быстрее, а во вторых, это позволяет получить после сканирования раздельные результаты для правого и левого лазера. Последнее дает нам возможность объединить облака точек с большей точностью. С точки зрения поставленной задачи нам достаточно иметь только облако точек и раздельное измерение расстояний может дать нам при соответствующей обработке выигрыш. Однако это справедливо не для всех точек поверхности. С точки зрения построения модели это существенно улучшает внешний вид и проработку мелких деталей.

Итак: запускаем thot, видим приглашение Scan Bot>,  переходим в режим advanced. Настраиваем экспозицию командой cam_exposure 200. Здесь 200 это длительность выдержки. Приемлемые значения обычно лежат в диапазоне 50 - 500. Включаем лазеры командой lasers. Дополнительно подстраиваем экспозицию, если лучи на объекте слишком темные или светлые.  Задаем файл конфигурации use_horus_cfg. Включаем оба лазера  keep_laser 1. Здесь надо отметить что в подсказках программы ошибка. Написано Set Dual Scanning (No Param) Or A Single Laser (1 Or 2), а надо написать Set Dual Scanning (1) Or A Single Laser (2 Or 3). На цифру 3 будет сообщение об ошибке, но программа цифру съест. Далее запускаем сканирование scan. После сканирования проводим обработку командой make. Если собираемся обрабатывать отдельно облако от правого и левого сканера, то сперва keep_laser 2 и снова make, переименуем получившийся файл model.ply и keep_laser 2  и make. Если результат нас не устраивает, то можно повторить обработку, изменив порог algop threshold 5, make. Поворачиваем объект и повторяем сканирование.

ciclop

Совмещение

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

CloudCompare

Грубое совмещение в CloudCompare и далее запуск автоматического выравнивания.

CloudCompare

Если мы объединяем два облака от разных лазеров, полученные за одно сканирование, то в грубом совмещении нет необходимости. В параметрах задаем число итераций, а не точность, и не полное совмещение, а 90%.

CloudCompare
CloudCompare

В этом случае исключается возможность того что программа задумается слишком надолго. А если нас результат не полностью устроит, то повторяем несколько раз. У меня эта команда вступает в конфликт с комнатами и после ее выполнения все окна видны во всех комнатах. После получения удовлетворительного результата выделяем на левой панели и объединяем облака командой merge. 

В завершение можно построить поверхность, сперва вычислив нормали. Это можно сделать в CloudCompare и MeshLab.

Измерение

Можно делать в любой из перечисленных программ обработки, а также в Blender. Где удобнее, - дело вкуса и привычки. В CloudCompare можно измерять как расстояния так и углы. Если нужно нанести несколько размеров и получить красивую картинку для отчета, то наверное, это удобнее делать в Blender через measureit. Многое зависит от точности выбора точки, что требует некоторой тренировки. Вероятно, достижима точность в 2 мм для объекта размером в 200 мм. Точность в 1% это пожалуй не хуже чем с помощью циркуля. 

CloudCompare
CloudCompare
MeshLab
MeshLab
MeshLab
Blender
Blender
5.04.2017
Установите проигрыватель Flash

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