Доброго времени суток.
Сегодня я поделюсь историей о том, как я собрал свой первый 3d сканер. Всё началось с того, что на Хабре мне попался пост, в котором пара чуваков рассказывали как у них(с пятой попытки) всё круто получилось. И мне захотелось сделать подобную штуковину, так как в сканере применяется и компьютерное зрение, и 3d графика, и программирование микроконтроллеров. В общем - всё самое крутое и интересное, что можно придумать.
Первоначальная задумка заключалась в следующем: я быстренько делаю сканер, быстренько пишу к нему софт и на сдачу делаю игрушку на Unity3d, в которой можно было бы поиграть за свежеотсканированного персонажа. Планировалось закончить всё к ярмарке УчСиб, где обычно тусуется много школьников. Они могли бы лепить из пластилина всякие ништяки, сканировать их, а потом поиграть в игру за своё творение.
На практике всё вышло не так сказочно. Слово "быстро" явно не совмещалось с хорошо работающим сканером. Изначально хотелось сделать всё грамотно и с умом. Я смоделировал на компьютере электронную схему для сканера, и она могла виртуально подключаться к com-порту и общаться с софтом для сканера.
Для реализации мозга сканера был выбран С++.
Qt - для интерфейса, многопоточности и для любых непонятных ситуаций.
OpenCV - для получения видеопотока и поиска луча лазера
OpenGL - для визуализации облака точек и готовой модели
PCL - для работы с облаком точек
Принцип работы сканера следующий: есть вращающаяся платформа, на которую помещается сканируемый объект, пара лазеров проецируют на объект две линии, вебкамера получает изображение объекта с линиями, а компьютер по форме этих линий восстанавливает форму объекта.
Собственно, основная сложность состоит в том, чтобы управлять углом поворота платформы с компьютера. Для поворота платформы используется шаговый двигатель и редуктор, чтобы уменьшить угол поворота платформы. В качестве редуктора выступают две шестерни: маленькая надета на вал моторчика, большая шестерня - это сама платформа, на которую устанавливается объект.
Из-за ограниченности сроков сборки, времени на проектирование и изготовление нужных шестерней не было. В качестве решения этой проблемы была использована такая техника:
на вал моторчика я намотал слой изоленты, которая заменила резиновый валик. Этот резиновый валик вращает платформу. Для лучшего сцепления с валиком на край платформы наклеил уплотнитель для окон(такая резиновая полая трубочка). Сама же платформа была закреплена на колесо от домашнего кресла(подшипник я тоже не нашёл).
Сначала я хотел отделаться малой кровью и собрать платформу из того, что было в продуктовом отделе. Выбор пал на одноразовые тарелочки.
Для её крепления было достаточно двухстороннего скотча, и у меня оставалась бы ещё куча времени на отладку программы. К сожалению, работала она не так хорошо, как выглядела. Как это ни странно, но одноразовые тарелочки совершенно не рассчитаны для использования в точном оборудовании. У неё были настолько кривые края, что моторчик не мог крутить её с одной скоростью, как бы мне этого не хотелось. К тому же при размещении на ней тяжёлого объекта с тарелкой случалась вполне предсказуемая вещь(она гнулась).
Вторая версия платформы была собрана из содержимого магазина: "Всё для дома", не, ну а что, я же дома собирался потом сканером пользоваться, после ярмарки. Там была куплена тарелка из странного жёлтого материала, в состав которого входило что-то вроде слоновьих костей, пробкового дерева и фарфоровой пыли. Из-за такого экзотического состава тарелка хорошо сверлилась и я смог проделать в ней пару отверстий для крепления к колесу от кресла (я инженер - я так вижу). Чтобы наверняка не пролететь с центром, я просверлил отверстия с запасом, чтобы можно было ослабить гайки и немного передвинуть платформу, для лучшей центрованности. Даже это не спасло чудо-тарелку. У неё, кажется, просто нет центра, как бы я ни старался, она описывала эллипс. В конечном счёте платформа была вырезана из оргстекла под заказ, хотя и не станком с ЧПУ, но мастер был достаточно ровный. Там же был изготовлен и новый корпус(подставка), предыдущий вариант был из пеноплекса.
У оргстекла есть странная особенность. Я хотел приклеить резиновую прокладку по краю на супер клей, вышло кривовато. Резинку оторвал, а остатки клея решил счистить жидкостью для снятия лака, и оргстекло довольно быстро покрылось расползающимися трещинами. После споласкивания в воде, реакция прекратилась.
Далее лазеры. Лазеры я купил хорошие, у них линза регулируется и всё такое. Единственная проблема заключалась в том, что они дают точку, а не линию.
В качестве линзы я использовал пипетку из аптеки. Она стеклянная, цилиндрическая и даёт неплохую линию.
Всё управлялось микроконтроллером PIC16F690, который получал команды от COM-порта и управлял лазером и моторами. Так же схема содержит микросхему MAX232 для перевода сигналов из уровня rs-232 в ttl и обратно, и драйвер двигателя L293D.
При проектировании схемы столкнулся с ещё одной проблемой: в ISIS com-порт выдаёт сразу ttl уровни, а мне хотелось проверить правильно ли я собираюсь подключать MAX232 именно на сигнал rs-232 уровня. В качестве решения, в ISIS я сделал две микросхемы подключённых друг к другу, между ними были сигналы rs-232, а на выходе ttl.
Плату разводил в Sprint-Layout. Потом изготовлял ЛУТ методом. Запорол пару первых плат: на первой плохо прижал утюгом и дорожки не везде приклеились, вторая получилась хорошо, но, как оказалось, если отзеркалить схему и нанести на текстолит - она ещё раз отзеркалится.
В общем с третей попытки получилась довольно годная плата. Я травил в хлорном железе и сыпанул его немного больше чем нужно - всё вытравилось минут за 10. Потом проделал отверстия для деталей, попутно сломав пару свёрл.
После сборки выяснилось, что L293D довольно хорошо нагревается, поэтому пришлось идти и покупать термоклей и радиатор, хотя с ним схема смотрится даже солиднее.
В общем, упуская ещё длинный список моих инженерных находок и причин, по которым я не советую искать их самостоятельно, перейдём к финальной части рассказа. Я всё таки уложился в срок. Сканер был собран точно к выставке и первый запуск произведён за 3 часа перед тем, как надо было грузить его в автобус. Сканер был в состоянии выдавать облака точек и делать вид, что пытается их триангулировать.
Конечный вид установки:
Дерево из пластилина:
Чайник, и его триангуляция. Я почти уверен, что несёт некоторую художественную ценность:
В завершение вот вам ещё фотки с процессом сборки и с самого мероприятия:













Комментариев нет:
Отправить комментарий