All scanner своими руками

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 поверхность. Или же написать скрипт, который строит сетку по полученным точкам, координаты которых вы можете снимать со сфер.

Урок построен так, что без понимания принципа работы отсканировать было бы трудновато. Не знаю, даже, хорошо это или плохо, но я подумал, что принцип тут интереснее реализации и на этом делал акцент урока (или статьи?). Короче говоря, сам не знаю, что я написал.

Надеюсь, что вам было интересно и спасибо за внимание.

Источник

Книжный сканер своими руками

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

Как все начиналось. Вначале было слово, и слово это было матерным. Поскольку после всей эпопеи со сканированием книги других слов не находилось.

Вопрос стал актуальным. Порывшись на просторах интернета нашел готовые решения книжных сканеров. Так сказать от производителя. Но стоимость подобных комплексов навевала грустные мысли, мне это не по карману.

Сев и пораскинув мозгами, пришел к выводу, что надо такой сканер сделать самому. И самое главное такой сканер смогу сделать сам. Ведь в чем заключается конструкция книжного сканера. Это колыбель для книги с определенным углом, стойки для крепления фотокамер и освещения, а так же программа для последующей обработки полученных фото.

Основной материал для сканера выбрал: дерево и пластик. Его легче в домашних условиях обрабатывать. А так же стандартный крепеж из магазина метизов.

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

Материал: деревянный брусок, стальные пластины, уголок для крепления вертикальных стоек, мебельные направляющие на которые будет устанавливаться основание колыбели книги.

Вертикальные стойки левая и правая идентичны.

Материал: деревянный брусок, мебельные направляющие на которые будет крепиться прижимное стекло, верхняя часть обычного штатива в которую будет установлено крепление для фотоаппарата.

Читайте также:  Арка садовая дерево своими руками

Закрепляется все на основании при помощи болтов.

Материал: мебельный щит толщиной 18 мм. Закрепляется на направляющие основания.

Материал: мебельный щит толщиной 18 мм. У колыбели угол развала 120 градусов. Что позволяет бережно обращаться с книгой, не повреждая её.

К вертикальным стойкам присоединяется перекладина жесткости.

Материал: деревянный брусок, стальная пластина.

К пластиковым направляющим прикрепляются планки освещения.

Материал: пластик, металлический уголок, светодиодные модули на 4 светодиода общей мощностью 23W, по 8 модулей с каждой стороны.

Крепление для фотоаппарата.

Стандартные от штатива.

Материал: оргстекло толщина 5 мм., используется две пластины соединенных между собой пластиковыми треугольниками.

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

Ткань плащевка черная.

Вид сканера с рабочего места.

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

Пример работы со сканером.

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

Все материалы по сканеру можно скачать тут.

Источник

Создание 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:

Да, большая часть видео не интересная, но в конце моделька на ноутбуке.

Источник

Оцените статью