David laserscanner своими руками
Для начала
Калибровка камеры
Трехмерное Лазерное Сканирование
Сшивание Форм
Часто Задаваемые Вопросы
Общие подсказки
DAVID — свободно распространяемое программное обеспечение, которое позволяет вам сканировать/оцифровывать трёхмерные объекты.
http://www.david-laserscanner.com
Простите, но наше программное обеспечение не может автоматически адаптироваться к вашей среде; для этого программа нуждается в вашей помощи. Именно поэтому вы должны прочитать руководство или, по крайней мере, следующие 5 подсказок:
Это были основные причины, почему успехи наших «нетерпеливых” испытателей бета — версии не были успешными. Но есть больше вещей, о которых вы должны знать, из-за этого вы должны продолжить чтение руководства. Особенно, если Ваши результаты сканирования не столь красивы, как наши скриншоты и результаты, представленные в нашей wiki и на форуме. Руководство не такое большое …
Было предложено много подходов для бесконтактных методов измерения поверхностей объектов и подходов для восстановления трехмерных объектов; но часто они требуют сложного и дорогого оборудования. Не в последнюю очередь из-за быстро увеличивающего числа эффективных трехмерных аппаратных и программных системных компонентов, альтернативные недорогие решения всегда в спросе. DAVID — такая недорогая система для трехмерного сбора данных. Единственные требования к оборудованию — простой продаваемый ручной лазер и веб-камера или стандартная черно-белая камера.
….с Windows 2000/XP/Vista/7 (32/64 bit) и Microsoft .NET Framework 2.0 или новее
Любой источник освещения, который создает линию очень тонкого, но яркого света. В большинстве случаев лазерного уровеня за 10 евро из хозяйственного магазина будет достаточно.
Хотя сканер работает и с дешевыми веб-камерами, вы получите лучше результаты с высококачественными камерами. Цвет необходим только, если вы хотите получить цветную текстуру. С чёрно-белой камерой вы можете получить лучше результаты, чем с цветной. Камера ДОЛЖНА работать с WDM драйверами.
Вам нужен «Калибровочный Угол” для калибровки камеры и как фоновая структура во время сканирования. «Угол” должен состоять из двух плоских стенок / досок, которые образуют угол в 90°. Для калибровки камеры вы можете найти шаблон калибровки в каталоге DAVID, который надо распечатать и приклеить на стены / доски.
Следующие этапы показывают, как вы можете построить собственный «Калибровочный Угол”. В этом примере используются две белые плоские пластмассовые доски, немного изоляционной ленты, и распечатка шаблона калибровки (выберите из Calibpoints ….pdf файлов, которые идут с программой DAVID). Теоретически, вы можете распечатать шаблон, масштабируя его, т.е. делая размер больше или меньше.
Вы должны измерить и запомнить длину «Масштаб” на распечатке т.к. она вам понадобится при калибровке камеры.
Очень точно разрежьте распечатку по тонкой линии, которая отмечена символом ножницы. Очень важно, чтобы края разрезанных двух частей точно касались друг друга.
Приклейте распечатки к доскам так, чтобы, когда доски будут установлены под углом в 90°, края разрезанных частей точно косались друг друга. Вы можете использовать изоляционную ленту (предпочтительно матовую, а не глянцевую), но тогда листок бумаги после нескольких дней становится волнистым. Поэтому, лучше использовать пластырь или немного самоклеющейся бумаги.
Используйте любой прямоугольный объект, чтобы установить две доски точно под углом в 90°. Части серой координатной системы в низу угла должны соответствовать друг другу! Двойной маркер должен быть в нижнем правом углу шаблона (с точки зрения камеры)!
. Эти требования должны соблюдаться во время калибровки камеры и сканирования.
Вы должны склеить доски вместе используя изоляционную ленту, или лучше, соединить их петлями используя шурупы.
Как альтернативу, вы можете использовать угол комнаты, стены плоские, имеют угол в 90°, и позволяют вам прикрепить распечатанный калибровочный шаблон так, чтобы края разрезов состыковывались вместе. Помните, что двойной маркер в шаблоне калибровки должен быть в правом нижнем углу (для изображения камеры).
Источник
Создание 3D сканера из вебкамеры, лазера, и еще кучки радиодеталей
В прошлом году мы с другом были на летней школе. На ней необходимо было сделать проект. Прочитав две статьи про создание 3d сканеров (раз, два) мы решили попробовать свои силы в его сборке и по возможности улучшить его конструкцию. Мы даже не представляли, что из этого получится и тем более не представляли, что победим с ним на нескольких научно-инженерных выставках. Но по порядку. Кому интересно узнать результат, добро пожаловать под кат (много фотографий).
Первый прототип
Сначала мы решили собрать лазерный дальномер. Сделан он был по мотивам статьи на радиолюбительском форуме. Просто лазерная указка и камера. Для обработки изображений была написана программа на Java. Для одного измерения делались две фотографии: с лазером и без лазера. После их сравнения мы могли однозначно найти лазерную точку. После того, как это заработало, дальномер был установлен на платформу, которая могла вращаться в двух плоскостях. Прежде чем я покажу то, что получилось, нужно предупредить — на летней школе не так много материалов, а потому мы собрали прототип из того, что у нас было:
Камеру видно сразу, а лазер — это тот латунный цилиндрик над ней. Для вращения платформы мы применили два шаговых двигателя, которые в свою очередь были подключены к плате управления на микроконтроллере Atmega32. К ней же подключался лазер. Сама плата соединялась с компьютером посредством USB->UART переходника. Программа на компьютере делала снимки, обрабатывала их, заносила координаты полученных точек в файл и отсылала команды плате управления.
Результат был интересный. Да, мы находили расстояние. Да, мы могли «нацелиться» на любую точку в полусфере над сканером. И радости нашей не было предела. Но когда мы провели оценку времени сканирования этой полусферы, то оно оказалось равным 48 часам. И дело не в камере. И даже не в Java. А в том, что установка была настолько хлипкой, что колебалась после каждого поворота в течение пяти секунд. Приходилось делать измерение, поворачиваться и ждать пять секунд, пока она не перестанет качаться. А вдобавок библиотека для камеры перед каждым снимком включала ее, а затем выключала. На это уходило 1-2 секунды. Но летняя школа заканчивалась, и переделывать было некогда: это была уже ночь перед сдачей проекта. Вернее утро. На следующий день мы представляли наш проект на конкурсе перед научным жюри и неожиданно выиграли. Наверное, именно из-за этой победы мы решили продолжить нашу работу над этим проектом.
Версия два
На самом деле лето закончилось, а учебный год начался. Желание работать пропало. Установку планировали закончить к следующему конкурсу, до которого был целый месяц. Месяц. А потом внезапно три дня. Но за месяц мы решили изменить установку. Собрать ее крепкой, установить на лазерную указку линзу, которая будет создавать лазерную линию. Это позволило бы сканировать сразу 720 точек (в сканере стояла HD камера). Вот только три дня внесли свои коррективы:
Собран второй сканер из визирных пластиковых линеек, клея, малярного скотча и держится только благодаря синей изоленте. Вместо линзы стоит пробирка. На эту пробирку светит зеленый лазер. Отразившийся луч создает на экране более-менее равномерную лазерную полоску. Дальномер закреплен лишь на одном моторе, который вращает его в горизонтальной плоскости. Плату управления заменили на STM32VLDiscovery. Просто STM32 я знаю лучше, да еще и Atmega сгорела, а программатор был давно утерян. Выглядит не очень, зато работает! Колебания уменьшились, а скорость соответственно увеличилась. Но не сильно. Тут был обнаружен очень интересный подвох — китайская лазерная указка включалась не сразу, а плавно увеличивала свою мощность в течение секунды. Таким образом, секунда на колебания, секунда на прогрев лазера, секунда на снимок, а их два. Вот и получаем 4 секунды. Но за одно измерение мы находим расстояние до 720 точек! Выглядел процесс сканирования приблизительно так:
А результат так:
Картинка выглядит не очень интересно, но кружка была в программе объемной. Можно было посмотреть ее с разных сторон.
А что собственно конкурс? А вот ничего! Мы закончили сканировать все подряд в 4 часа ночи, а в 9 утра на стенде обнаружили, что лазер сгорел. Как оказалось, пока мы несли его из гостиницы к стенду, в него попал дождь, и при включении он сгорел. А выглядит она в нерабочем состоянии так, что поверить в слова «оно работало 5 часов назад» сложно. Мы расстроились. Желание продолжать улетучилось с дымком из лазера. Но все же была собрана…
Третья версия
И собрана она была опять же к конкурсу. Причем к нему мы готовились долго и основательно. Больше недели. И вот результат:
Первое что бросается в глаза — это то, что теперь мы сканируем не область вокруг сканера, а объект, который вращается на платформе. А так же мы достали нужную линзу, собрали все нормально, переписали программу, а еще заменили отладочную плату на самодельную. И еще теперь мы делаем только один снимок на измерение. Лазер достаточно мощный, а линза достаточно хороша для того, чтобы однозначно находить лазер на фотографии. Благодаря этому мы не дожидаемся прогрева лазера — он всегда включен. А еще камеру теперь включаем только один раз. То есть время тратится по большей части на поворот платформы и обработку изображения. В программе добавили меню выбора точности. Время сканирования — от двух до десяти минут. В зависимости от выбранной точности. При максимальной точности получается, что платформа за шаг поворачивается на 0,5 градуса, а расстояние определяется с точностью 0,33 мм. Платформа приводится в движение шаговым мотором через редуктор. Собственно платформа — большой диск, а резиновый валик на валу мотора — маленький. Мотором и лазером управлял микроконтроллер STM32F050F4 через полевые транзисторы. В самом начале статьи как раз скан игрушки, полученный с помощью этого сканера. Так как сканер выдает облако точек в формате .obj, то после триангуляции мы можем напечатать отсканированный объект на 3D принтере, что и видно на той же фотографии. На экране мы можем видеть модель после триангуляции. Никакой ручной работы над моделью не проводилось.
На конкурсе мы победили. А он давал проход на международный конкурс Intel ISEF. А потому мы начали работать над следующим сканером.
Четвертая версия
На данный момент это последняя версия сканера, которую мы собрали. Для сравнения на платформе стоит вторая версия. К разработке четвертого сканера мы постарались подойти со всей основательностью, с какой только могли. Установка была начерчена в САПРе, детали вырезаны лазером, все покрашено, ничего лишнего снаружи не торчит. Изменения: теперь платформа действительно является шестерней. Она вырезана из оргстекла и по краям у нее 652 зубчика. Это решает проблему, которая сильно портила сканы в предыдущем сканере: резиновый валик немного проскальзывал, из-за чего платформа часто поворачивалась не на 360 градусов. Сканы были либо с «вырезанным кусочком», либо с перекрытием. Здесь же мы всегда точно знали насколько повернута платформа. Мощность лазера сделали регулируемой программно. Благодаря этому можно было на ходу менять мощность лазера, избегая засветки ненужных частей при малой освещенности помещения. Для управления всей электронникой решили не разводить новую плату, а просто применить отладочную F401RE-Nucleo. На ней установлен ST-LinkV2.1, который работает отладчиком и USB->UART адаптером.
Точность получилась потрясающая: Угловое разрешение 0.14 градуса. По расстоянию 0,125 мм. Область сканирования представляет собой цилиндр высотой 20 см и диаметром 30 см. Цена всех деталей и резки лазером на момент его создания (май 2014) составляла менее 4000 рублей.
В процессе использования мы всего один раз ставили максимальную точность. Сканирование длилось 15-20 минут. Получили почти 2 миллиона точек. Ноутбук отказался рассчитывать модель из облака точек. Эксперимент больше не повторяли.
Заключение
В ближайшее время мы планируем возобновить работу над проектом, а потому будем дорабатывать и программу, и установку. Надеюсь, в ближайшее время напишем про пошаговую сборку, выложим чертежи, программы и все остальное. В эту статью это уже не поместится.
Спасибо всем, кто дочитал до конца!
UPD:
Коллега нашел видео о работе сканера, которое мы снимали на ISEF:
Да, большая часть видео не интересная, но в конце моделька на ноутбуке.
Источник
3D Scanner собственными руками
Высшее назначение математики состоит в том, чтобы находить скрытый порядок в хаосе, который нас окружает
Норберт Винер
Здравствуйте!
Этот материал про то, как собственными руками создать 3d Scanner. Я постараюсь на пальцах объяснить логику его работы.
Вдохновившись вот этим:
http://en.wikipedia.org/wiki/3d_scanner
захотелось тоже сделать себе такую штуковину. Точнее это один вариант решения этой задачи из бесчисленного множества. Это, конечно же, не будет сверхточным прибором, но я надеюсь, что вам будет интересно.
Что необходимо для того чтобы завести сканер:
1. Web-камера.
2. Лампа.
3. Два квадратных листа перпендикулярных друг другу.
Web-камеры сейчас стоят очень дешево: обошлась мне в 600 р. (D-Link DSB C320). Разумеется, что чем лучше камера, тем лучше результаты.
Я с гордостью представляю вам свой девайс:
Картонка для отбрасывания тени (должна быть плоской и отбрасывать тень в одной плоскости). Это будет имитировать работу лазера, который светит в плоскости, который вы тоже можете использовать, если он у вас есть (вы его можете заказать в интернете, он стоит около 20 у.е.). Естественно, лазер лучше лампы.
Теперь о принципе работы. Давайте посмотрим на эту картинку:
Мы видим, как падает тень. Линия тени должна быть чётко видна как на квадратных плоскостях, так и на сканируемом объекте. Угол ABC (как вы уже должны были догадаться) — прямой.
Давайте взглянем на то, что нам из этого нужно поближе:
Обратите внимание на линию пересечения с квадратными плоскостями и линию сканирования. Все точки на этих линиях лежат в одной плоскости. Если вы внимательно посмотрите на линию пересечения с плоскостями, то обнаружите, что они образуют три точки (A,B,C) пересечения с плоскостями. Значит, нам известны три точки из плоскости, в которой лежит линия сканирования (и линия пересечения). Три точки это всё что необходимо для построения уравнения плоскости.
Зная координату камеры, можем испустить луч из камеры на линию сканирования. Пересечение с плоскостью тени и будут будущим 3d объектом.
Рассчитать координату камеры имея точки 0,1,2,3,4,5 очень трудно. Однако мы можем калибровать камеру вручную в 3д редакторе.
Я предпочитаю Maya и буду делать в ней и описывать всё на языке MEL.
Если вдуматься, то всё очень просто. Я даже полагаю, что человеческий мозг руководствуется теми же принципами, когда оценивает расстояние одним глазом. Если мы посчитаем картинку без тени, то предметы будут «висеть в воздухе», т.е. глазомер не может определить месторасположение объекта. Его координату можно вычислить только если объект движется … однако я загнался.
И так. Если вы не понимаете, что такое уравнение плоскости, то я постараюсь рассказать, как это понимаю я.
Несмотря на неоценимую мощь, плоскость описывается просто:
Ax + By + Cz + D = 0 (где A,B,C и D — постоянные, причём A,B и C одновременно не равны нулю)
Это общее уравнение плоскости. В прочем, в интернете вы можете много чего найти про плоскость.
В справочниках очень сложно-звучащие определения. Лично я представляю себе плоскость в виде нормали и расстояния до плоскости от центра координат. Нормаль – это единичный вектор, а расстояние – это скаляр.
Представьте себе нормаль: она описывает плоскость, проходящую через центр координат, а потом подвиньте эту плоскость в направлении нормали на известное расстояние. Получается, что плоскость – это четыре скаляра или один вектор и скаляр.
На языке MEL плоскость можно описать так:
float $plane[4];
Это просто четыре числа. Получить их можно из трёх точек (три точки – это три вектора). Пример решения на MEL:
Выглядит громоздко, потому что я очень стараюсь комментировать подробно, но если вам что-то непонятно, то это простые действия над векторами. Обратитесь к любому справочнику (или даже к руководству Maya). Ничего сверхсложного здесь нет.
Как находить плоскость уже догадываемся. Теперь жизненно необходима позиция камеры. Чтобы рассчитать луч из камеры до линии сканирования.
Калибровка камеры является очень сложной математической задачей. И я не решился мучить себя и (не дай бог) Вас этим занятием. Я подумал, что проще всего в ручную настроить камеру и снимать с неё координату.
Для этого создал сцену, в которой создал персональную камеру и каркас для подгона будущих точек, которые тоже будут назначаться вручную.
Да… это не очень уж быстро, нудно, но нет никаких ограничений по материалу санируемого объекта и его окружению. Так что плюсов в этом способе предостаточно (лучшим плюсом является, пожалуй, — простота реализации).
Калибровку камеры удобно совершать, когда картинка подгоняется к Resolution Gate.
Появилась позиция камеры. Теперь необходимо научиться рассчитывать пересечение луча с плоскостью. Для этого надо понимать, что такое луч. Луч – это два вектора. Один вектор — это координата старта луча (в нашем случае это камера), другой — это его направление. Направление, как и нормаль, — это единичный вектор (нормализованный вектор).
Можно долго на словах объяснять, как рассчитывать пересечение:
Как видите, решение весьма изящное:
Ну вот математика и кончилась.
Непосредственно сам процесс сканирования выглядит так:
Функция ( createScannerPoint ) создает точки (сферы) будущего объекта и помещает их в специальную группу (final_group), которую удобно проявлять и убирать из виду с помощью дополнительных кнопок на интерфейсе:
Если это можно назвать интерфейсом. А что тут собственно ещё такого придумаешь. Мне кажется, что код сложных интерфейсов крайне неудобно читать (даже если ты сам его написал), а это всё-таки ещё и урок.
Запускаем проект майя и скрипт (source «3dScanner.mel»;).
Смотрим, как всё устроено: дёргаем локаторы. Теперь снимаем видео с web-камеры:
Подгоняем main_camera вместе с подключённым Image Plane (с включённым проигрыванием секвенции кадров из avi). Как я уже говорил подгонять удобно по Resolution Gate:
Чтобы повысить точность сначала воспользуйтесь alt и мышью, а потом Move Tool, Rotate Tool и чуть угол обзора подкрутить, если нужно. После подгона сделайте камере Lock ( в дополнительных инструментах окошка это делается одной кнопкой ).
У меня моя горе-цифромыльница умеет снимать максимум 640*480 и делает это ужасно. В принципе, можно использовать цифровой фотоаппарат или видеокамеру подключённые к компьютеру. Раз 640*480, то и в настройках Image Size должны быть эти числа.
Теперь, не нервничая, вручную двигаем прицел (target) по линии сканирования, не забывая перемещать локаторы, образующие плоскость тени (p1,p2,p3). Удобно также проставить на хот кей команду createScannerPoint или использовать кнопку G, после запуска команды из Script Editor.
В итоге получаем набор из точек в трёх координатах. Чем точнее были ваши движения и техника, тем с меньшим шумом выглядит финальный результат.
На самом деле меня очень сильно расстроило качество моей техники: мыленная и очень маленькая картинка, кадров в секунду катастрофически мало и монитор маловат у меня для точной работы. Самый облом – это лампа. Она даёт рассеянную тень в любом случае. Необходим специальный лазер (хоть он и стоит дёшево, но мой опыт общения с нашей почтой отбил желание его заказывать).
Вы можете из каждой сканированной линии делать NURBS кривую и по ним в итоге запустить loft поверхность. Или же написать скрипт, который строит сетку по полученным точкам, координаты которых вы можете снимать со сфер.
Урок построен так, что без понимания принципа работы отсканировать было бы трудновато. Не знаю, даже, хорошо это или плохо, но я подумал, что принцип тут интереснее реализации и на этом делал акцент урока (или статьи?). Короче говоря, сам не знаю, что я написал.
Надеюсь, что вам было интересно и спасибо за внимание.
Источник