Ардуино сканирование пространства

3D Scanner — Arduino + Step motors

What’s up my friends, welcome back. Almost all of my DIY project have a 3D printed case of some sort of printed part. To print an object, you first need the 3D file. You have the file, you print the object. This project will do just the opposite, you have the object you get the 3D file. This machine should be able to 3D scan small objects with dimensions up to 13cm in the x and Y directions.

PART 1 — Building the frame

Below you can find a link for the STL files for the frame. Download it and print the files using your 3D printer. I’ve used 2 perimeters, 20% infill, 0.4mm nozzle and 0.2mm layer height.

Follow this steps and build the frame. Place the two NEMA17 motors in place on the frame base. Fix them in place with M3 screws and the printed top parts. Now, fit in place the two smooth rods. Prepare the Z-axis carrige with the linear bearings. Use zip ties and fit those in place and then, add a 8mm nut on the back.

Now place the carrige on the smooth rods, add the plastic pulley on the shaft of the motor and put the threaded rod or lead screw. Finally, add the turntable on the front motor.

The sensor will give a direct analog output according to the measured distance. Finnaly, add (or not if using no homming code) the limit switch for the Z-axis. This limit swithc is used to home the axis at the beggining of the code loop when we start the machine. The frame is ready.

PART 2 — 3D scanner schematic

This below is what we need for the electronics part. The schematic is with an end stop limit switch. If you don’t want to use it, make sure to later upload the code without limit switch. The push button is used to start the scanning process. Remember to connect Vref to 3.3V. We do that because the amximum voltage of the sensor is 2.4V. To increase precision, we use external voltage refference for the ADCs.

I’ve made all teh connections on a drilled PCB. We have the Arduino NANO with female pins so we could remove it. The SD card module on the side and the rest of the components. The input of 12V will eb connected to those two screw PCB connectors. I’ve used 0.1mm wire to make the connections. Remember to add those 47uF capacitors for the motor drivers. Connect the wires from the motors and sensor to the PCB. Make sure the rotation is in the desired direction. If not, juse reverse the motor inputs.

PART 3 — The code

Let’s see the code. Don’t change anything in the code. Just the first variables at the beginning of the code acording to the parts you have used and the layer height you want. You have a code for the schematic using limit swithc for z-axis and for the manual homming. Download from below the code you want to use. If you don’t have the limit switch connected, just use the other code.

Read all the comments in the code for better understanding. The code is simple. Create a loop that will make 360º rotation of the turntable. Each step we measure the distance. The X and Y increment is given by simple trigonommetry as seen below. Next, the x, y and z variable are stored to the SD card divided by a «,» character. This step is important for later.

PART 4 — Point cloud to STL

Place the object on the turntable in the middle. Connect power supply and wait for theamchine to home itself. When reached, press the scanning push button and wait. Depending on the layer height you choose and object size it will take more or less to complete. Once complete, remove the SD card.

Remove the SD card and copy the file to your PC. The file should have the next format. Three columns separated by a comma with the values of the x, y,and z coordinates. This are just points in a format of a point cloud. To obtain an STL file, we use the MESHLAB software which you could download from a link below.

Use MESHLAB

Now go to filter, remeshing simplification and reconstruction and here select screened poisson surface reconstruction. Play with the settings if you want and then click apply. Close the window and there we have our file.

Now, the file was scanned. The precision is not that good. For learning purposes, this project is more than enough.

So, there you have it guys. The precision could get better using a better distance sensor. Maybe a laser based one would give better precision. Also have in mind that in the code, the sensor makes 40 measurements and give the mean of those in order to increase precision. Consider using a lead screw instead of a normal threaded rod, better sensor, more measurements, add an end stop switch and improve this project however you want.

See more tutorials

Источник

Почти DIY 3d сканер для дома

Пару лет назад попалась мне на глаза статья на хабре о 3D-сканере за 30$, и очень меня эта тема заинтересовала, хотя быстро пришло понимание того, что ни о каких 30$ для качественного сканирования не может быть и речи.

Но основной плюс, который я вынес из статьи – программа для сканирования David-3D, к которой действительно есть хорошее руководство на русском языке и, что немаловажно, покупка лицензии — это последнее, что требуется, так как ограничение у бесплатной версии только на сохранение результата сканирования. Все остальное работает в полной мере, а значит вполне можно тестировать программу, настройки и свое железо сколько угодно. А если вам и результат не требуется с высокой точностью – то и вовсе без покупки лицензии можно обойтись.

Мне точность требовалась, так как основное, что мне хотелось сканировать это были миниатюры из настольной игры Warhammer (дабы потом их изменять, как хочется и печатать :)). В высота этих «солдатиков» всего 3 см, однако это не мешает им быть очень детализированными.


Если вам не требуется снимать настолько мелкие объекты – то требования к оборудованию у вас будут ниже, а значит и намного проще будет собрать себе подобный сканер.

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

Но начнем по порядку. Что понадобится для того, чтобы опробовать 3д сканирование в домашних условиях:
1 – проектор.
2 – веб камера.

Собственно все, короткий список на удивление получился. Тем не менее, если вы хотите получать очень точные и качественные сканы, то придется кое что доработать ручками. Без дополнительных затрат тут конечно не обойтись, но в итоге это все все равно обойдется дешевле, чем покупка любого из имеющихся в продаже 3д сканеров, да и качество результата получить можно намного лучше.

Теперь по порядку и подробно.

Свои первые опыты по сканированию я, как и автор предыдущей статьи, начинал с лазерной указки, но они сразу же показали, насколько это неудобный способ. Недостатков тут сразу несколько:
– невозможность получения луча с достаточно тонкой линией. Тем более, что при повороте указки меняется расстояние от линзы до объекта, а значит сбивается фокусировка.
– если требуется регулярно сканировать, поворачивать лазерную указку с достаточной точностью и плавностью вручную очень сложно, да и утомительно просто – руки не такой уж стабильный инструмент когда речь идет о длительном времени.
– сканировать приходится в темноте, дабы была видна только линия лазера и ничего более.

И если со вторым недостатком еще можно бороться путем создания специального поворотного механизма (хотя это уже получается не такая уж и простая задача, во всяком случае, за 5 минут на коленке такое не сделать), то избавление от первого недостатка дороже.

Когда я все это осознал, то решил попробовать сканирование с помощью проектора, для чего взял на время какую-то простую модель у знакомого.

Тут следует сделать небольшое уточнение – в прошлой статье автор упоминал о возможности сканирования с помощью проектора, хотя предложение было, на мой взгляд, весьма странное —

Подойдет проектор с мощной лампой, свет которой нужно направить сквозь узкую щель на сканируемый объект

Возможно, в ранних версиях программы это был единственный вариант, но в версии 3 с которой я экспериментировал, проектор использовался намного лучше, т.к. там есть возможность называемая Structured Light Scanning (SLS). В отличие от лазерного сканирования, проектор сразу проецирует на объект сетки из вертикальных и горизонтальных линий различной толщины, что на порядок уменьшает время сканирования и позволяет в автоматическом режиме снимать цветную текстуру объекта. Ну и при хорошей фокусировке, линия в 1 пиксель шириной намного тоньше, чем возможно получить от недорогой лазерной указки.

К сожалению, фотографии с тех первых опытов я не делал, да и фотографировать особенно было нечего – проектор на столе, рядом с ним веб-камера, все это смотрит в одну сторону :) Однако даже такая простейшая конструкция показала, что этот вариант намного предпочтительней как по скорости сканирования, так и по качеству. Тогда я и решил купить для этих целей себе проектор.

Критерии для выбора проектора были простые – разрешение больше, цена и размеры меньше :)
Выбор остановился на IconBit Tbright x100 — ультракомпактный DLP LED проектор, разрешение 1080 – на тот момент мне казалось, что лучше и не придумаешь, но как выяснилось позже – я ошибался, хотя занимаясь с ним, я получил много интересного опыта.

Первая проблема, которая возникает при сканировании маленького объекта с помощью проектора, заключается в том, что для лучшего результата, размер проецируемой сетки должен примерно соответствовать размеру сканируемого объекта. Данный проектор позволял получить наименьшую диагональ экрана при самом близком фокусе — примерно в 22 см. Согласитесь, что на таком фоне миниатюра в 3 см высотой далека от понятия «примерно равные размеры». Ответ нашелся на официальном форуме – люди в таких случаях устанавливают на проектор фотоаппаратные линзы для макросъемки. Учитывая небольшие размеры объектива проектора, я остановил свой выбор на линзах marumi с диаметром резьбы 34 мм.

Используя два таких комплекта, удалось получить экран проектора с диагональю всего около 3 см. Чего оказалось вполне достаточно, чтоб сделать свой первый микроскан –

Это единичный скан, поэтому и есть «дырки» на модели, рваные края и т.д. Поворачивая монету и сканируя с разных ракурсов, можно получить несколько таких сканов, которые впоследствии объединяются в один объект (сама программа сканирования позволяет правильно совмещать разные сканы, сшивать их и сохранять как единый объект). В процессе сшивания заодно уточняется форма объекта. Но сохранять результаты такого сшивания – возможно только после покупки лицензии.

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

На основной странице David’а и изображена подобная система – ничего сложного она собой не представляет. Да и полистав форум и посмотрев, как это организую себе разные люди, понял, что ничего сложного тут не требуется.

Для этих целей была взята стойка от сгоревшего ЖК монитора, и оргстекло от него же, вырезана и склеена вот такая конструкция, как она выглядела в первом варианте

К подставке для проектора и был приделан крепеж для установки различных линз, что позволяло менять диагональ экрана, и сканировать объекты разного размера.
Следует также упомянуть о том, что сканирование с помощью проектора не требует постоянного нахождения в поле зрения калибровочных панелей. После того как произведена калибровка их можно убрать. Это позволяет откалибровав установку спокойно её переносить, двигать и т.д.
То есть вы можете используя большой калибровочный шаблон произвести дома на стенах калибровку, а затем с этой стойкой и ноутбуком выйти на улицу и отсканировать свой автомобиль, например. Взяли меньший шаблон, поставили пару линз – и можно сканировать ювелирные изделия.

Недавно фирма выпустила усовершенствованный набор для сканирования, вот там уже стойка намного серьезней и интересней смотрится –

Как по мне, при стоимости лицензии на программу около 500$ (это они еще цену подняли недавно), отдавать за такой набор более 2000 евро – не совсем оправданно, собрать самому что-то подобное не сложно и значительно дешевле.

Вернемся к проектору. Как оказалось, у этого проектора был один существенный недостаток для использования в сканере, а именно его родное разрешение (854*480). И все бы ничего, если бы он и на выходе выдавал то же самое, но увы – картинка преобразовывалась к стандартным разрешениям (типа 1024*768), и в результате линия шириной в один пиксель была в разных частях экрана где-то ярче, где-то тусклее, где-то уже а где-то шире… Все это негативно сказывалось на качестве сканирования, выражаясь в виде ряби и полосок на получаемой модели.
К тому времени я уже задумывался о покупке проектора для стереолитографического 3Д принтера (http://geektimes.ru/post/245590/). Рассмотрев несколько вариантов, я остановился на модели Acer P1500, т.к. ей не нужны никакие доработки для использования в принтере (этот проектор без всяких линз способен дать сфокусированное изображение на экране примерно 4*7 см). А значит, и для сканера он подойдет как нельзя лучше. При этом разрешение в 1920*1080 у него реальное. Так оно и вышло, этим проектором пользуюсь до сих пор и полностью доволен результатами.

Критерии при выбора камеры у меня были те же, что и при выборе проектора. Пройдясь по магазинам, остановился на Logitech C615. Скан монеты был сделан именно с неё, без всяких модификаций. Но когда я попытался отсканировать фигурку, то столкнулся с трудностью, которая называется «глубина резкости». Когда объект настолько мал, то фактически у нас получается макросъемка, а резкость при такой съемке достигается только на небольшом отрезке, буквально всего пара миллиметров (именно поэтому монета хорошо отсканировалась – рельеф вполне укладывался в область резкости). Было решено переделать камеру под другой объектив. На Ebay было заказано несколько разных объективов для пробы, а также был вырезан новый корпус под плату камеры. План был такой

Финальный результат немного отличался

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

С платы камеры пришлось убрать стандартный объектив, и как выяснилось позже – вместе с ним был убран и ИК-фильтр, так что будьте в этом вопросе аккуратней. Фильтр потом пригодится для использования с другими объективами, хотя можно и отдельно их докупить – цена копеечная.

Таким образом, у меня вот такая коллекция объективов образовалась.

Пока я ожидал доставку объективов, читались различные форумы по фотосъемке. Изучая вопрос с глубиной резкости, я выяснил, что увеличить её можно сильнее закрыв диафрагму объектива. А значит и объектив требовался такой, в котором была возможность регулировать диафрагму (увы, среди заказанных не все обладали такой возможностью, но на мое счастье и парочка таких попалась). В общем, для улучшения камеры желательно иметь варифокальный объектив с зумом и регулируемой диафрагмой. На практике все оказалось так, как и было в теории – закрывая диафрагму, сразу было видно увеличение глубины резкости, что позволило-таки сканировать объемные, но мелкие объекты.

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

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

Собственно на этом можно было бы и закончить – вроде обо всем рассказал. Я тоже думал что на этом у меня закончилась сборка сканера, но чем дальше в лес… Изучая форум данной программы я часто натыкался на различные схемы поворотных столиков — благо софт позволяет автоматизировать процесс сканирования. После одного скана подается команда на com-порт, поворотный столик вращается, поворачивая объект на заданное количество градусов, и дает команду на следующий скан. В результате одним кликом мышки мы имеем круговые сканы объекта — казалось бы, чего еще желать? Эту систему я с интересом опробовал, но увы – мне такой подход абсолютно не понравился, и тому есть пара причин.

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

Допустим, какая-то часть модели на одном из сканов вышла идеально. Но это не значит что на всех сканах, в которые эта часть попала, она выглядит также идеально, а при сшивании сканов с разных ракурсов результат будет усреднен, что не может радовать. Программа позволяет немного редактировать полученные сканы (можно вырезать ненужную часть). Если мы вращаем модель на 20 градусов, значит, после полного оборота у нас будет 18 сканов, нужная нам часть вполне может присутствовать на половине из них, следовательно, чтобы оставить наилучший результат надо будет удалить этот кусок из 8ми сканов… А таких кусков при сложной модели может быть много, в результате от каждого скана будет отрезаться чуть ли не половина, что очень трудоемко и требует много времени.

Вместо этого лучше после первого скана сразу сканировать прилегающие области, и проверять результат. Как только какой-то кусок готов – переходим к сканированию следующего, и так, пока вся модель не будет в идеальном виде. Такой подход дает лучший результат за меньшее время.

Но возникает вопрос удобства. Согласитесь, неудобно вручную пытаться крутить объект, глядя не на него, а на монитор – чтоб контролировать попадание в объектив, не поменяв расстояние до камеры и проектора при этом (дабы не сбился фокус). При очередной подобной эквилибристике я случайно задел камеру, что соответственно сбило всю калибровку, и весь процесс пришлось начать заново. Такой расклад мне категорически не понравился, и я после некоторых размышлений пришел к плану вот такой конструкции (которую, как вы понимаете, впоследствии и собрал).

Это не поворотный столик в обычном понимании этого термина. Благодаря такой конструкции я могу не только вращать модель, но и наклонять её, как мне будет нужно. При этом центр модели остается в плоскости фокуса, но даже если и нет – можно вперед-назад крепление с моделью двигать.


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

Внутренности

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

Следует также упомянуть о некоторых нюансах сканирования.
1 – невозможно сканировать блестящие и зеркальные поверхности. Свет от них отражается, или дает такой блик, что программа не может корректно распознать линию. Если есть необходимость сканирования такого объекта, то подобные части придется чем-то замаскировать (смывающейся краской, бумажным скотчем и т.д.).
2 – удобнее сканировать монотонные объекты, так как при настройке камеры на светлый цвет выставляется не такая большая яркость проектора, малая экспозиция и т.д. А для объекта темного цвета требуется большая яркость, так что если у вас объект разноцветный, то для разных его частей требуются разные настройки для получения наилучшего результата. Здесь тоже удобней использовать сканирование объекта частями.
3 – если вы хотите сразу получить цветную текстуру то учтите, что настройки камеры и проектора для скана не влияют на настройки для снятия текстуры (скан вообще в черно-белом режиме делается), так что поиграйтесь настройками в режиме текстуры также, как вы будете это делать в режиме сканирования.

Процесс сканирования у меня сейчас выглядит таким образом:
— Фокусировка проектора и камеры

Свет проектора слишком ярок и на фото не видна проецируемая сетка, но вот вид из камеры в программе

— калибровка сканера

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

Вид в программе

Рекомендуется, чтобы совокупный угол между лучом проектора и камеры был около 20 градусов. Поэтому такая стойка и используется — при сканировании больших объектов (например, человека) камеру надо гораздо дальше от проектора отставить, здесь же они у меня вплотную стоят. Расположение камеры относительно проектора может быть только вертикальным, или только горизонтальным — в зависимости от геометрии объекта. В данном случае расположение диагональное (13 градусов по вертикали и 36 по горизонтали).

Результаты сканирования с разных ракурсов. Это уже подчищенные сканы, т.е. удалены все неудачные и ненужные (подставка фигуры, попавшее в кадр крепление) части.

Совмещение сканов для последующего объединения в один объект

Благодаря тому, что каждый скан имеет свой цвет удобно контролировать правильность совмещения.

Ну и после объединения сканов с разных ракурсов получаем такие модели

Миниатюра Боромира из властелина колец.

При сканировании разноцветного объекта результат немного хуже, если сильно не заморачиваться. Но зато можно получить объект сразу с текстурой :)

Оригиналы моделей

В галерее работ пользователей на сайте разработчика (http://www.david-3d.com/en/news&community/usergallery) можно найти еще много интересных сканов, даже отпечатки пальцев люди сканируют. И встречаются даже сканы таких же миниатюр из вархаммера

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

1 — Полученные сканы, при хорошем качестве сканирования (а мы ведь хотим получить наилучшее качество) имеют очень много полигонов. Нет, даже ОЧЕНЬ много. Скан Боромира после слияния содержал более 8 миллионов полигонов — не каждый слайсер сможет работать с таким объектом.
2 — Любые объекты несут на себе следы сборки и изготовления. И если в реальности для исправления этого применяют надфили и наждачку (а иногда все-равно есть недоступные места, где невозможно применить инструменты), то работая с цифровой копией объекта, мы можем изменить его как угодно — убрать дефекты, улучшить детализацию и т.д.
3 — Как я говорил в начале статьи, когда я задумался о сканере, я хотел не копии объектов печатать, а изменять их как мне будет угодно. Я не скульптор, у меня нет инструментов, материалов и навыков, чтобы вылепить такую мелкую модель. Но умея работать в 3Д, мне намного проще, отсканировав подобного Боромира, сделать из него какого-нибудь Принца датского.


Кстати, эта модель содержит уже почти в 100 раз меньше полигонов, чем результат сканирования.

Источник

Adblock
detector