Создание 3D сканера из вебкамеры, лазера, и еще кучки радиодеталей

В прошлом году мы с другом были на летней школе. На ней необходимо было сделать проект. Прочитав две статьи про создание 3d сканеров (раз, два) мы решили попробовать свои силы в его сборке и по возможности улучшить его конструкцию. Мы даже не представляли, что из этого получится и тем более не представляли, что победим с ним на нескольких научно-инженерных выставках. Но по порядку. Кому интересно узнать результат, добро пожаловать под кат (много фотографий).

image

Первый прототип


Сначала мы решили собрать лазерный дальномер. Сделан он был по мотивам статьи на радиолюбительском форуме. Просто лазерная указка и камера. Для обработки изображений была написана программа на Java. Для одного измерения делались две фотографии: с лазером и без лазера. После их сравнения мы могли однозначно найти лазерную точку. После того, как это заработало, дальномер был установлен на платформу, которая могла вращаться в двух плоскостях. Прежде чем я покажу то, что получилось, нужно предупредить — на летней школе не так много материалов, а потому мы собрали прототип из того, что у нас было:

image

Камеру видно сразу, а лазер — это тот латунный цилиндрик над ней. Для вращения платформы мы применили два шаговых двигателя, которые в свою очередь были подключены к плате управления на микроконтроллере Atmega32. К ней же подключался лазер. Сама плата соединялась с компьютером посредством USB->UART переходника. Программа на компьютере делала снимки, обрабатывала их, заносила координаты полученных точек в файл и отсылала команды плате управления.

Результат был интересный. Да, мы находили расстояние. Да, мы могли «нацелиться» на любую точку в полусфере над сканером. И радости нашей не было предела. Но когда мы провели оценку времени сканирования этой полусферы, то оно оказалось равным 48 часам. И дело не в камере. И даже не в Java. А в том, что установка была настолько хлипкой, что колебалась после каждого поворота в течение пяти секунд. Приходилось делать измерение, поворачиваться и ждать пять секунд, пока она не перестанет качаться. А вдобавок библиотека для камеры перед каждым снимком включала ее, а затем выключала. На это уходило 1-2 секунды. Но летняя школа заканчивалась, и переделывать было некогда: это была уже ночь перед сдачей проекта. Вернее утро. На следующий день мы представляли наш проект на конкурсе перед научным жюри и неожиданно выиграли. Наверное, именно из-за этой победы мы решили продолжить нашу работу над этим проектом.

Версия два


На самом деле лето закончилось, а учебный год начался. Желание работать пропало. Установку планировали закончить к следующему конкурсу, до которого был целый месяц. Месяц. А потом внезапно три дня. Но за месяц мы решили изменить установку. Собрать ее крепкой, установить на лазерную указку линзу, которая будет создавать лазерную линию. Это позволило бы сканировать сразу 720 точек (в сканере стояла HD камера). Вот только три дня внесли свои коррективы:

image

Собран второй сканер из визирных пластиковых линеек, клея, малярного скотча и держится только благодаря синей изоленте. Вместо линзы стоит пробирка. На эту пробирку светит зеленый лазер. Отразившийся луч создает на экране более-менее равномерную лазерную полоску. Дальномер закреплен лишь на одном моторе, который вращает его в горизонтальной плоскости. Плату управления заменили на STM32VLDiscovery. Просто STM32 я знаю лучше, да еще и Atmega сгорела, а программатор был давно утерян. Выглядит не очень, зато работает! Колебания уменьшились, а скорость соответственно увеличилась. Но не сильно. Тут был обнаружен очень интересный подвох — китайская лазерная указка включалась не сразу, а плавно увеличивала свою мощность в течение секунды. Таким образом, секунда на колебания, секунда на прогрев лазера, секунда на снимок, а их два. Вот и получаем 4 секунды. Но за одно измерение мы находим расстояние до 720 точек! Выглядел процесс сканирования приблизительно так:

image

А результат так:

image

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

А что собственно конкурс? А вот ничего! Мы закончили сканировать все подряд в 4 часа ночи, а в 9 утра на стенде обнаружили, что лазер сгорел. Как оказалось, пока мы несли его из гостиницы к стенду, в него попал дождь, и при включении он сгорел. А выглядит она в нерабочем состоянии так, что поверить в слова «оно работало 5 часов назад» сложно. Мы расстроились. Желание продолжать улетучилось с дымком из лазера. Но все же была собрана…

Третья версия


И собрана она была опять же к конкурсу. Причем к нему мы готовились долго и основательно. Больше недели. И вот результат:

image

Первое что бросается в глаза — это то, что теперь мы сканируем не область вокруг сканера, а объект, который вращается на платформе. А так же мы достали нужную линзу, собрали все нормально, переписали программу, а еще заменили отладочную плату на самодельную. И еще теперь мы делаем только один снимок на измерение. Лазер достаточно мощный, а линза достаточно хороша для того, чтобы однозначно находить лазер на фотографии. Благодаря этому мы не дожидаемся прогрева лазера — он всегда включен. А еще камеру теперь включаем только один раз. То есть время тратится по большей части на поворот платформы и обработку изображения. В программе добавили меню выбора точности. Время сканирования — от двух до десяти минут. В зависимости от выбранной точности. При максимальной точности получается, что платформа за шаг поворачивается на 0,5 градуса, а расстояние определяется с точностью 0,33 мм. Платформа приводится в движение шаговым мотором через редуктор. Собственно платформа — большой диск, а резиновый валик на валу мотора — маленький. Мотором и лазером управлял микроконтроллер STM32F050F4 через полевые транзисторы. В самом начале статьи как раз скан игрушки, полученный с помощью этого сканера. Так как сканер выдает облако точек в формате .obj, то после триангуляции мы можем напечатать отсканированный объект на 3D принтере, что и видно на той же фотографии. На экране мы можем видеть модель после триангуляции. Никакой ручной работы над моделью не проводилось.

На конкурсе мы победили. А он давал проход на международный конкурс Intel ISEF. А потому мы начали работать над следующим сканером.

Четвертая версия



image

На данный момент это последняя версия сканера, которую мы собрали. Для сравнения на платформе стоит вторая версия. К разработке четвертого сканера мы постарались подойти со всей основательностью, с какой только могли. Установка была начерчена в САПРе, детали вырезаны лазером, все покрашено, ничего лишнего снаружи не торчит. Изменения: теперь платформа действительно является шестерней. Она вырезана из оргстекла и по краям у нее 652 зубчика. Это решает проблему, которая сильно портила сканы в предыдущем сканере: резиновый валик немного проскальзывал, из-за чего платформа часто поворачивалась не на 360 градусов. Сканы были либо с «вырезанным кусочком», либо с перекрытием. Здесь же мы всегда точно знали насколько повернута платформа. Мощность лазера сделали регулируемой программно. Благодаря этому можно было на ходу менять мощность лазера, избегая засветки ненужных частей при малой освещенности помещения. Для управления всей электронникой решили не разводить новую плату, а просто применить отладочную F401RE-Nucleo. На ней установлен ST-LinkV2.1, который работает отладчиком и USB->UART адаптером.

Точность получилась потрясающая: Угловое разрешение 0.14 градуса. По расстоянию 0,125 мм. Область сканирования представляет собой цилиндр высотой 20 см и диаметром 30 см. Цена всех деталей и резки лазером на момент его создания (май 2014) составляла менее 4000 рублей.

В процессе использования мы всего один раз ставили максимальную точность. Сканирование длилось 15-20 минут. Получили почти 2 миллиона точек. Ноутбук отказался рассчитывать модель из облака точек. Эксперимент больше не повторяли.

Заключение


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

Спасибо всем, кто дочитал до конца!

UPD:
Коллега нашел видео о работе сканера, которое мы снимали на ISEF:

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

А еще вот примеры отсканированных объектов. Но все они относятся к третьей версии сканера.
Dropbox
В файле model.obj хорошо видно, что получается при проскальзывании этого резинового валика на моторе — у собаки три глаза. Сканирование остановили, из-за чего получился вырез. Все файлы — это облака точек. Открывать можно при помощи MeshLab. Модели не обрабатывались руками. Полностью сырые данные. Сверху видно «белые пятна» — участки без точек. Их не видит камера. Так же белые пятна можно заметить и в других местах. Они появляются либо на слишком темных участках, либо при перекрытии поверхностей. Например в файле stn_10.obj рога козла перекрывают друг друга, из-за чего внутренняя поверхность рогов не отсканировалась.

Средняя зарплата в IT

113 000 ₽/мес.
Средняя зарплата по всем IT-специализациям на основании 10 037 анкет, за 2-ое пол. 2020 года Узнать свою зарплату
Реклама
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее

Комментарии 58

    0
    А как реализовано вертикальное перемещение луча?
      +2
      Всё, дошло. Вместо пробирки специальная линза, формирующая линию.
        +3
        Простите. Интернет медленный
          +1
          Мне кажется, что можно увеличить вертикальное разрешение, если повернуть камеру на 90 градусов :-)
            0
            Разрешение зависит от плотности пикселей и угла камера-лазерное пятно-лазер. Проблема в том, что при увеличении угла лазер может светить в щель, а камера лазерную точку не увидит.
              +1
              То, о чём я говорю, вроде как сделано в третьей версии, где камера расположена вертикально. Т.е. вместо 720 точек получается 1280. В четвёртой камера почему-то опять лежит горизонтально, как во второй версии.
                0
                Все, я понял. Извините. Это увеличит область сканирования по вертикали. Да, как-то не подумал
        +1
        Впечатлило, продолжайте в том же духе!
          0
          Че за «летняя школа», че за конкурс, где? В двух словах, просто интересно…
            +7
            Надеюсь не скажут, что реклама.
            Летняя школа «Ланат» lanat.ru в объединении с летней школой «Лифт в будущее» lifttothefuture.ru
            Конкурс первый был на летней школе. Вторая версия сканера на конкурс «Ученые будущего» www.intel.festivalnauki.ru
            Третья версия сканера «Балтийский научно-инженерный конкурс» baltkonkurs.ru
            Четвертая Intel ISEF student.societyforscience.org/intel-isef
            0
            Класс, молодцы! Как вам летняя школа? Мне интересно, какой там уровень обучения электротехнике, робототехнике.
              0
              В прошлом году летняя школа была одна — «Лифт в будущее». А потом преподаватели из МГУ остались в Ланате, а «Лифт в будущее» организовал другую ЛШ. В «Ланате» уровень высокий. Обучают программированию AVR микроконтроллеров. Сначала две недели в симуляторе, потом неделю в железе делают проект. Учат паять, трассировку платы делать, травить. В общем полный комплекс входа. В «Лифте» больше учат рассказывать про проект. Сделать что-то в железе можно только на курсе «Робототехники Lego». Но преподаватели по Lego там очень хорошие.
              +7
              Очень круто! Вам правда 17 лет и вы все делали сами включая схемотехнику, программирование на java и микроконтроллеров?
              Снимаю шляпу!
                +3
                Тогда нам было 16. И да, мы все делали сами: и чертежи, и платы, и программы. На самом деле само устройство не очень сложно. Мы планируем показать его сборку в ближайшее время.
                  0
                  Хотел предложить вам попробовать себя на kickstarter (или подобных платформах) + выложить под open source и open hardware, но уже похоже полно девайсов подобных.
                  например www.kickstarter.com/projects/1545315380/atlas-3d-the-3d-scanner-you-print-and-build-yourse?ref=discovery

                  Хотя в вашем есть явное приемущество: всего один лазер + нет необходимости докупать Raspberry Pi с камерой.
                    0
                    Ну мы подумываем. Было интересно: нужно ли это устройство кому-нибудь. Про open-source: выложим сюда статьи как собрать самому включая чертежи, исходники и прошивки. У нас еще есть преимущество в цене)
                      0
                      У нас еще есть преимущество в цене)

                      я это и имел ввиду говоря про 1 лазер и т.д. ;)
                +1
                Выложите пожалуйста результаты сканирования разных объектов.
                  0
                  Прикрепил модели к концу статьи.
                    0
                    Судя по результатам вам ещё есть куда работать.
                    Красиво конечно, но сыровато.
                  +1
                  Молодцы! Мало того, что сделали неплохой инженерный проект, так еще и описали все отлично. Спасибо!
                    0
                    можно использовать строительный лазер — он сразу дает линию и не стоит тоже недорого
                      +1
                      Мы с него линзу и взяли. Просто зеленый мощнее. Мы купили простейший уровень, сняли линзу и поставили на наш лазер. Это еще и места меньше заняло
                      +18
                      Молодцом!!!
                      И это напомнило мои студенческие годы
                      2002 год = 13 лет назад
                      Первый приличный результат

                      Первая деревянная версия девайса. Пожароопасная штука: несколько раз вспыхивал, т.к. внутри тесного корпуса из ДСП полыхала линейная галогенная лампа на 150Вт.

                      Все начиналось с идеи лазерного дальномера. Переходная версия от дальномера к сканеру выглядела так.

                        +7
                        Забыл оригинал показать
                        Вот такой резиновый котенок

                        На сканированной модели есть много дырок.
                        Отчасти, конечно, это несовершенство моего алгоритма построения сетки из облака точек. Но главное, что камера была только одна!
                        Позже была еще 1 камера. Камеры устанавливались по обе стороны от источника света под 45 градусов к нему. Дыр в модели становилось уже гораздо меньше, также была некоторая компенсация ошибок с каждой из камер.
                        +2
                        Скажу несколько слов, раз уж у вас пошло дело от действующего макета к законченному устройству.
                        Зеленые лазерные указки совершенно не рассчитаны на сколь-нибудь длительную работу. DPSS-лазер подразумевает работу при активном теплоотводе и термостатировании всего — и лазерного диода накачки, и кристалла активной среды, и кристалла-удвоителя. В указках места для этого нет и весь теплоотвод работает на тепловой инерции. Поэтому и нестабильная выходная мощность (то самое разгорание — это вам еще повезло, оптимальная рабочая точка оказалась при температуре выше комнатной, бывает такая свистопляска, что мама дорогая), и быстрый выход из строя и лазерного диода, и кристалла.
                        Выход — либо установка стабилизированного зеленого лазерного модуля, либо возврат к красному диодному лазеру, только с нормальным питанием. Хинт: закрыв красным светофильтром объектив, мы снизим помехи от внешнего освещения как минимум втрое. А закрыв установку кожухом — уберем их полностью (об этом дальше).
                        Еще надо сказать — лазер и живые организмы совместимы плохо. Особенно в данном случае, когда оператор неизбежно подвергается неконтролируемому облучению, причем не только рассеянным светом, но возможны и зеркальные отблески, крайне опасные для глаз. Поэтому совершенно необходим защитный кожух с дверцами. Заодно решаем и проблему с помехами от засветки.
                          0
                          Насчет кожуха уже думали. Хотим сделать кожух из оргстекла, на которое наклеен пленочный светофильтр. Цветное прозрачное оргстекло скорее всего будет слабо защищать от лазера, а видеть процесс все же хочется. Спасибо за объяснение про лазер. Скорее всего мы вернемся к лазерным указкам малой мощности. И тогда может и светофильтр не понадобится — они вроде как безопасны для человека.
                            +1
                            Безопасных лазеров не существует. Даже десятки микроватт могут повредить сетчатку глаза при длительном воздействии. Если есть хотя бы малейшее облучение оператора и окружающих лазерным излучением и его можно устранить, то это следует сделать.
                              +1
                              Цветное прозрачное стекло можно подобрать таким, чтобы оно практически полностью поглощало излучение лазера. Можно взять синий диодный лазер (они сейчас широко доступны) и желтое оргстекло. А на камеру поставить синий фильтр, так что от внешнего излучения для камеры закроемся почти полностью, и защитим окружающих от лазерного излучения, и получим возможность прекрасно видеть весь процесс съемки скана. Причем, за счет флюоресценции лазерная линия также будет видна.
                                +1
                                а видеть процесс все же хочется

                                А на компьютере во время сканирования не отображается отсканированные данные ни в каком виде?
                                Имхо лучший выход это смотреть на компьютере как процесс сканирования идёт,
                                а не просто как обьект освещается лазером (может в софте чтото сбойнуло давно а вы медитируете на подсвеченный обьект)…
                                  0
                                  На компьютере было отображение изображения с камеры и прогресс выполнения в процентах. Ну в принципе да. Тогда можно целиком закрыть непрозрачным оргстеклом и все. И лазер поставить от простой красной китайской указки.
                                    +1
                                    Лучше нормальный лазерный модуль взять с приличным драйвером и лазерным диодом в корпусе. Иначе указки будут расходным материалом — они работают до первой пылинки, севшей на открытый кристалл, а при каждом включении подгорают зеркала от переходных процессов.
                                  +2
                                  Добавьте вторую камеру, которая будет показывать просто процесс под дополнительным углом. Зачем глазами-то смотреть?
                                0
                                На КДПВ результат вашей установки?
                                Хотелось бы попбольше разных моделей увидеть с вашего сканера,
                                ато написали «добро пожаловать под кат (много фотографий).»
                                а фотографий моделей всего полторы (
                                  0
                                  Сейчас коллега найдет таки свой внешний ЖД и обязательно скинем модели. Прошу прощения. Просто у меня полетела таблица разделов на харде, а модели в бэкап не входили. Вот и получилось, что все они остались только у него)
                                    0
                                    Сейчас у меня есть только три скрина моделек:
                                    Скрины
                                    imageimageimage
                                    причем последнее — это облако точек, которое получено на выходе со сканера (правда там ничего не видно)

                                    И есть еще сама моделька в формате для печати:
                                    Ссылка на dropbox
                                      0
                                      Прикрепил модели к концу статьи.
                                      0
                                      Могли бы вы дать ссылку на софт, который использовали для построения облака точек по картинкам из камеры? Или выжодить на github.
                                      Появилась идея напечатать ваше вращающуюся платформу в виде гигансткой шестеренки на принтере, да и вообще весь сканер можно напечатать. Детали вращения отлично будут опираться на подшибники.
                                        0
                                        Коллега пишет статью про софт. Мы все детали вырезали лазером. Пришли в контору по лазерной резке, дали чертежи. Они все вырезали, а мы собрали.
                                          0
                                          А не подскажите ник коллеги на хабре, чтобы на него подписаться и не пропустить статью? А кстати, про статью не забыли то? Уж очень интересно на софт посмотреть…
                                            0
                                            Коллеги на Хабре пока нет. И статью он сейчас прекратил писать. У нас через 3 дня конкурс, и мы работаем над дугим проектом, поэтому этот пока-что стоит.
                                        0
                                        Бесспорно КРУТО.
                                        Респект вам и вашему научному руководителю.
                                        Мне как учителю, Хотелось бы подробностей про систему организации занятий, распределение ролей в процессе и вообще все что связано с практикой. В частности где ваши а где его идеи и все такое.
                                        Еще раз респект. Сейчас довольно мало народу которые умеют делать руками. Особенно впечатлила синяя изолента
                                          0
                                          Научного руководителя мы видели только на летней школе. Он учится в МФТИ, а мы живем в Новосибирске. Он предложил собрать сканер. А я как раз перед ЛШ читал статьи (те, что в начале статьи указаны), но строить не собирался. Но мы взаимодействовали через социальные сети и он помогал советами, а так-же часть деталей вырезал он на станке лазерной резки в МФТИ… Распределение ролей такое: я собираю установку, паяю и программирую микроконтроллеры, а друг пишет софт на компьютер. Занятия никак не организовывались. Собирались либо у меня дома, либо в школе после уроков (мы одноклассники) и занимались проектом. Строили целиком на собственные средства, а потому установка крайне дешевая) Идеи сложно разделить. Мы часто и много общались, а идеи рождались в диалоге.
                                          0
                                          Получили почти 2 миллиона точек. Ноутбук отказался рассчитывать модель из облака точек.
                                          Скажите а на каком этапе возникает проблема? Есть мысли как обойти это ограничение?
                                            0
                                            Он вроде даже не открыл файл. Возможно это внутреннее ограничение. Если кто-то знает в чем проблема, я был бы очень благодарен ему за помощь.
                                            0
                                            Уважаемый автор.
                                            Первая фотография выглядит хорошо. Будете доводить до ума?
                                            Сколько это будет стоить в перспективе для массового использования, однокнопочная система? Название модели + кнопка «Сделать хорошо» = импорт в один из распространенных форматов: max/fbx/obj.
                                            Обдумываете возможность заказать сырой вариант?
                                              0
                                              Сейчас мы собираем новый сканер с целью оценить во сколько обойдется сборка и сколько будут стоить материалы. Потом выложим здесь чертежи и программы, после чего пойдем на Бумстартер. Но это в лучшем случае. Непонятно: нужен ли этот сканер кому либо при таком обилии аналогов. Софт сейчас так и выглядит: выбор названия конечного файла, меню точности и большая кнопка «Сканировать». На выходе — облако точек в формате .obj
                                            0
                                            image

                                            Вот ещё DIY проект сканера: hci.rwth-aachen.de/fabscan

                                            И исходный код для корпуса, ПО и т.п.: github.com/francisengelmann/FabScan100
                                              +1
                                              можно использовать просто камеру
                                                0
                                                Тогда точность будет меньше, но способ интересный
                                                0
                                                Планируете выходить на KickStarter?
                                                  0
                                                  Выходить планируем, но на Бумстартер. Только для начала пересоберем установку заново, чтобы нормально выглядела.
                                                  0
                                                  Держите в курсе, я бы поучаствовал.
                                                    0
                                                    В статье хочется видеть небольшой ликбез об используемом принципе работы лазерного дальномера и сканера, для тех, кто не в теме, как я. Зачем было нужно делать два снимка в начале и принцип перехода к одному потом. Интересно видеть модели использовавшихся комплектующих, например, лазера, и каким образом осуществлялась регулировка его мощности, т.к., опять же, я не в теме, но интересно.
                                                      0
                                                      Про принцип работы: в начале статьи есть ссылка на радиолюбительский форум, где описан принцип работы. Два снимка делалось для того, чтобы лучше находить на снимке лазерную точку. Делая снимок с лазером и без лазера и сравнивая полученные картинки мы находили точки. Для регулировки мощности использовался банальный ШИМ на микроконтроллере. Только сигнал шел не напрямую к лазеру, а к базе полевого транзистора, к которому и был подключен лазер. Сам лазер — зеленая лазерная указка, коих много на ebay.com и подобных магазинах. Мощность 50 мВт.
                                                      0
                                                      Про принцип работы: в начале статьи есть ссылка на радиолюбительский форум, где описан принцип работы.
                                                      Это понятно, погуглить я в состоянии. Но тут же хабр, хочется несколько большего погружения в детали.
                                                      Для регулировки мощности использовался банальный ШИМ на микроконтроллере.
                                                      Т.е., учитывая описываемую инерционность лазера, степень регулировки мощности была далеко не линейной от скважности? Хотя, это неважно для задачи, наверное.

                                                      p.s. не попал в ветку ответа, а удалить сообщение уже нельзя

                                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                      Самое читаемое