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