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 предполагает использование матрицы
объектива, полученной в этом пункте, и при изменении параметров
матрицы нужно повторять этот пункт) и делаем серию снимков,
перемещая шахматную доску таким образом, чтобы была задействована
вся площадь кадра.
Переходим к пункту Laser triangulation и проводим калибровку.
Запоминаем значения и повторяем калибровку. Значения, скорее
всего, будут отличаться и довольно сильно до 10 мм для расстояния
между камерой лазером. Чуть сдвигаем мишень и повторяем
калибровку. Замечаем, что для одного из лазеров значения
варьируются больше, чем для другого. Это связано с тем, что
шахматная доска не лучшая поверхность для определения положения
лазерных лучей и мощность лазеров разная, а индивидуальной
подстройки у сканера Ciclop нет. Ошибка возникает, когда граница
клеток проходит рядом с лазерным лучом и линия вырождается в
лесенку. В этом случае вычисленное средне значение отличается от
значения на однородной поверхности. Забегая вперед, отмечу, что
для приемлемого результата при сканировании двумя лазерами ошибка
в расстояниях до лазеров не должна превышать 0,5 мм. Такой
точности мы на этом этапе не достигнем, но пытаемся добиться
относительно стабильных результатов. Переходим к пункту Platform
extrinsics и проводим калибровку. Запоминаем результат в файл
.horus/calibration.json.
Ставим на стол объект в форме параллелепипеда, проводим
сканирование, запоминаем результат, открываем в 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. Поворачиваем объект и повторяем сканирование.
Начинаем с удаления лишних точек. Для этих целей удобнее CloudCompare, поскольку там выделяется произвольная область, заданная отрезками прямой.
Грубое совмещение в CloudCompare и далее запуск автоматического выравнивания.
Если мы объединяем два облака от разных лазеров, полученные за одно сканирование, то в грубом совмещении нет необходимости. В параметрах задаем число итераций, а не точность, и не полное совмещение, а 90%.
В этом случае исключается возможность того что программа задумается слишком надолго. А если нас результат не полностью устроит, то повторяем несколько раз. У меня эта команда вступает в конфликт с комнатами и после ее выполнения все окна видны во всех комнатах. После получения удовлетворительного результата выделяем на левой панели и объединяем облака командой merge.
В завершение можно построить поверхность, сперва вычислив нормали. Это можно сделать в CloudCompare и MeshLab.
ИзмерениеМожно делать в любой из перечисленных программ обработки, а также в Blender. Где удобнее, - дело вкуса и привычки. В CloudCompare можно измерять как расстояния так и углы. Если нужно нанести несколько размеров и получить красивую картинку для отчета, то наверное, это удобнее делать в Blender через measureit. Многое зависит от точности выбора точки, что требует некоторой тренировки. Вероятно, достижима точность в 2 мм для объекта размером в 200 мм. Точность в 1% это пожалуй не хуже чем с помощью циркуля.
CloudCompare MeshLab
Blender
5.04.2017
Установите проигрыватель Flash
|
Облако тегов:
...
|