Оглавление:

Лазерный сканер Raspberry Pi: 9 шагов (с изображениями)
Лазерный сканер Raspberry Pi: 9 шагов (с изображениями)

Видео: Лазерный сканер Raspberry Pi: 9 шагов (с изображениями)

Видео: Лазерный сканер Raspberry Pi: 9 шагов (с изображениями)
Видео: Как из планшетного USB-сканера сделать сетевой с помощью Raspberry Pi. Реальный проект 2024, Ноябрь
Anonim
Image
Image
Лазерный сканер Raspberry Pi
Лазерный сканер Raspberry Pi

Лазерный сканер - это встроенное системное устройство Raspberry Pi, способное оцифровывать объекты в файлы сетки.obj для воспроизведения с помощью 3D-печати. Устройство делает это за счет использования линейного лазера и встроенной камеры PiCam для компьютерного зрения. Лазер расположен под углом 45 градусов от лазера и проецирует ярко-красную линию на один вертикальный срез объекта. Камера определяет расстояние среза от центра для получения среза сетки. Объект вращается на вращающемся лотке, и процесс повторяется до тех пор, пока объект не будет отсканирован полностью. Сгенерированный файл.obj, наконец, отправляется пользователю по электронной почте, что делает систему полностью автономной и встроенной.

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

Шаг 1. Вдохновение

Вдохновение
Вдохновение
Вдохновение
Вдохновение

Как заядлый производитель, я уже несколько лет занимаюсь 3D-печатью и твердым моделированием. Я работал с множеством различных инструментов для создания прототипов, от фрезерных станков с ЧПУ до лазерных резаков и 3D-принтеров. Одно устройство, которое мое местное производственное пространство еще не купило, - это 3D-сканер - и я могу сказать вам, почему это нужно.

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

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

Проведя небольшое исследование, я увидел, что многие 3D-сканеры используют вращающуюся платформу, а затем различные датчики для измерения расстояния от центра с целью построения вращательной модели. Многие из них использовали двойные камеры, похожие на Kinect. В конце концов я наткнулся на Yscanner, сканер с низким разрешением, использующий лазер. С точки зрения простоты и осуществимости, этот лазерный метод, в котором лазер светится со смещением относительно камеры для измерения расстояния от центра, выглядел как чистый путь вперед.

Шаг 2: Инструменты и детали

Части:

  • Raspberry Pi $ 35.00
  • Камера Raspberry Pi V2 $ 30.00
  • Светодиоды, резисторы и провода
  • Нить для 3D-печати
  • 12x12x0,125 деревянных листов
  • Оборудование M3
  • Шаговый двигатель - 14 долларов.
  • Линейный лазер - 8 долларов
  • Драйверы шагового двигателя LN298 - 2,65 доллара США
  • Металлическая кнопка - 5 долларов

Инструменты:

  • Паяльник
  • Лазерный резак
  • 3д принтер
  • Отвертка
  • Плоскогубцы

Шаг 3: Дизайн высокого уровня

Дизайн высокого уровня
Дизайн высокого уровня
Дизайн высокого уровня
Дизайн высокого уровня

Центральным компонентом в этой конструкции является линейный лазер, который проецируется на вертикальный срез объектов. Эту проекцию можно было зафиксировать на пикамере, скорректировать ее перспективу и затем отфильтровать перед обработкой изображения. При обработке изображений можно было собрать расстояние между каждым сегментом линии от центра объекта. В радиальных координатах это изображение даст как компоненты r, так и z. Третье измерение, Θ, затем достигается путем поворота объекта на новый срез. Эта концепция показана на первом рисунке.

Для выполнения описанных выше действий я использовал Raspberry Pi в качестве нашего центрального вычислительного устройства. Я подключил к Pi шаговый двигатель и драйвер двигателя, питаемый от внешнего источника 5 В и управляемый контактами GPIO Pi. Линейный лазер был подключен к линии 3,3 В на Pi, а камера PiCam была подключена ко входу камеры на Pi. Наконец, была установлена простая кнопка и светодиодный индикатор состояния, чтобы указать пользователю, в каком состоянии находится система. Полная система представлена на блок-схеме системы.

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

Шаг 4: Оборудование

Аппаратное обеспечение
Аппаратное обеспечение
Аппаратное обеспечение
Аппаратное обеспечение
Аппаратное обеспечение
Аппаратное обеспечение

Как видно выше, до того, как я начал лазерную резку или 3D-печать, я использовал Autodesk Fusion 360 для создания подробной 3D-модели нашей конструкции. Для обзора устройство представляет собой простую коробку с крышкой с петлями, вырезанными лазером. Устройство состоит из двух основных слоев: электроники и основного, с отверстиями для проводов, которые проходят между двумя слоями.

Большая часть наших коробок была изготовлена с помощью лазерного резака, а дизайны были созданы в Fusion 360 и вырезаны на лазерном резаке Epilog Zing 40 Вт. Наши проекты показаны на рисунках выше. Сверху слева движется вправо: основная кровать, подставка для электроники, две части крышки, задняя часть, передняя часть и две боковые части. В основной платформе есть три основных выреза: один для установки шагового двигателя, один для прокладки проводов от лазера и один для прокладки широкого кабеля PiCam. Платформа имеет монтажные отверстия для крепления Pi, макета и драйвера двигателя, а также вырез большего размера для доступа к шаговому двигателю. Части крышки защелкиваются вместе, образуя треугольную деталь, показанную выше, а петля представляет собой простую форму, равную ширине диаметра отверстия в боковых панелях. Задняя часть и одна из боковых частей имеют слоты сбоку, чтобы можно было легко получить доступ к портам Pi (HDMI, USB, Ethernet, Power). Передняя часть представляет собой простую деталь, в которой я в конечном итоге проделал отверстия с помощью ручной дрели для установки кнопки и светодиода. Как видно на всех частях, наши части скрепляются с помощью оборудования M3 с помощью Т-образных соединений и пазов. Это метод перпендикулярной и надежной фиксации деталей, вырезанных лазером. Ребра деталей совпадают с прорезями других деталей, а Т-образный вырез на краях дает место для гайки M3, которую можно вставить в них без вращения. Это позволяет нам затем использовать винт M3 для фиксации частей вместе с очень небольшим пространством для маневра, не делая сборку полностью постоянной.

Я решил делать большинство наших изделий с помощью лазерного резака из-за его скорости и простоты. Однако мне все же пришлось напечатать некоторые детали из-за их трехмерной геометрии, которую было бы сложнее создать на резаке. Первой деталью был держатель линейного лазера. Эта деталь должна была быть установлена на основной станине под углом 45 градусов от поля зрения камеры и иметь отверстие, чтобы лазер мог плотно вставляться в него трением. Мне также пришлось создать опору двигателя, потому что вал двигателя был очень длинным. Крепление на трение входило в детали, вырезанные лазером, и опускало плоскость, к которой был прикреплен двигатель, так, чтобы вращающаяся платформа находилась заподлицо с основной станиной.

Шаг 5: Электроника

Электроника
Электроника

Аппаратное обеспечение этого проекта было очень простым, поскольку для 3D-сканера не требовалось слишком много периферийных устройств. К Pi нужно было подключить мотор, кнопку, светодиод, лазер и камеру. Как показано, я обязательно подключил резисторы последовательно к каждому выводу, который мы использовали, чтобы защитить выводы. Один вывод GPIO был предназначен для управления светодиодом состояния, который загорался, когда устройство было готово к использованию, и пульсировал с ШИМ, когда устройство работало. Другой вывод GPIO был подключен к вытянутой кнопке, регистрируя ВЫСОКИЙ, когда кнопка не была нажата, и НИЗКИЙ, когда кнопка была нажата. Наконец, я выделил четыре контакта GPIO для управления шаговым двигателем.

Поскольку нашему двигателю нужно было только шагать до определенной степени, не требуя контроля скорости, мы выбрали более простой драйвер шагового двигателя (L298N), который просто увеличивает линии управления для подачи на входы двигателя. Чтобы узнать, как управлять шаговыми двигателями на очень низком уровне, мы обратились как к листу данных L298N, так и к библиотеке Arduino. Шаговые двигатели имеют магнитный сердечник с выступающими пальцами переменной полярности. Четыре провода намотаны для управления двумя электромагнитами, каждый из которых приводит в действие каждый противостоящий палец в двигателе. Таким образом, переключая полярность пальцев, мы можем толкнуть шаговый двигатель на один шаг. Благодаря этим знаниям о том, как степперы работают на аппаратном уровне, мы смогли гораздо легче управлять шаговыми двигателями. Мы решили запитать наш шаговый двигатель от источника питания 5 В в лаборатории, а не от Pi, из-за его максимального потребления тока около 0,8 А, что больше, чем может обеспечить Pi.

Шаг 6: программное обеспечение

Программное обеспечение
Программное обеспечение
Программное обеспечение
Программное обеспечение
Программное обеспечение
Программное обеспечение
Программное обеспечение
Программное обеспечение

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

В качестве резюме программного обеспечения мы можем взглянуть на первый рисунок. Когда система загружается,.bashrc автоматически входит в Pi и запускает наш код Python. Система включает индикатор состояния, чтобы пользователь знал, что она была загружена правильно, и ожидает нажатия кнопки. Затем пользователь может поместить предмет для сканирования и закрыть крышку. После нажатия кнопки светодиодный индикатор мигает, чтобы пользователь знал, что устройство работает. Устройство будет переключаться между обработкой изображения и управлением двигателем, пока не будет завершено полное вращение и не будут собраны все данные об объекте. Наконец, сетка создается, и файл отправляется по электронной почте на заранее выбранный адрес электронной почты. Это перезапускает цикл, и машина готова к выполнению следующего сканирования одним нажатием кнопки.

Обработка изображений

Первое, что было реализовано, - это обработка захваченного изображения для извлечения информации, хранящейся в изображении, в форму, которая может быть использована для создания массива точек в пространстве. Для этого я начал с того, что сфотографировал объект на платформе вместе со всем фоновым шумом, создаваемым лазером, падающим на заднюю часть коробки и рассеивающимся. В исходном виде у этой картины были две основные проблемы. Во-первых, объект рассматривался под углом с повышенной перспективой, а во-вторых, было много фонового шума. Первое, что мне нужно было сделать, это учесть этот угол обзора, потому что использование фотографии как есть не позволит нам определить постоянную высоту объекта. Как видно на втором рисунке, высота перевернутой L-образной формы одинакова; однако из-за того, что одна сторона длиннее другой, кажется, что они имеют разную высоту на краях, ближайших к зрителю.

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

Следующей проблемой, которую необходимо было решить, была проблема фонового шума в виде внешнего света и света, отражаемого самим лазером. Для этого я отфильтровал свет, используя функцию inRange () OpenCV. Я установил порог, чтобы красный свет появлялся только на определенном уровне. Чтобы получить правильное значение, я начал с мягкого порога и продолжал увеличивать пороговый уровень до тех пор, пока единственным отраженным светом не стал лазерный луч на сканируемом объекте. Получив это изображение, я обнаружил, что самый яркий пиксель в каждой строке получить линию из одного пикселя на строку, ограничивающую крайнюю левую сторону лазерной линии. Затем каждый пиксель был преобразован в вершину в трехмерном пространстве и сохранен в массиве, как описано в разделе создания сетки. Результаты этих шагов можно увидеть на четвертом рисунке.

Управление двигателем

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

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

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

Встроенная функция

После того, как устройство заработало, я отполировал его, добавив полную встроенную функциональность. Это означало удаление клавиатуры, мыши и монитора и отправку им файла.obj по беспроводной сети после завершения обработки. Для начала я изменил код.bashrc, чтобы он автоматически входил в систему и запускал основную программу Python при запуске. Это было сделано с помощью sudo raspi-config и выбора «Console Autologin» и добавления строки «sudo python /home/pi/finalProject/FINAL.py» в /home/pi/.bashrc. В дополнение к этому я также добавлена кнопка и индикатор состояния для пользовательского ввода и вывода. Кнопка позволит пользователю сообщить устройству, когда начинать сканирование, а светодиодный индикатор сообщит пользователю о состоянии машины. Если светодиод горит, устройство готово к запуску нового сканирования. Если светодиодный индикатор мигает, устройство в настоящее время выполняет сканирование. Если светодиод горит, значит, произошла программная ошибка, требующая перезапуска системы. Наконец, я разрешил устройству отправлять файл.obj по электронной почте. Это было сделано с помощью библиотек smtplib и электронной почты. Эта возможность отправлять электронные письма дала нам очень удобный и беспроводной способ доставки созданного файла пользователю для доступа на многих различных платформах.

Шаг 7: интеграция

Интеграция
Интеграция

После изготовления различных частей устройства я собрал его вместе. На рисунке выше показан порядок следования:

(а) собранная коробка снаружи

(б) собранный внутри ящик с камерой и лазером

(c) вид изнутри кровати электроники

(d) задняя часть Pi с доступом к портам Pi и входу двигателя 5 В

(e) кнопка со светодиодным кольцом и индикатором состояния на передней панели устройства

Шаг 8: Результаты

Полученные результаты
Полученные результаты
Полученные результаты
Полученные результаты
Полученные результаты
Полученные результаты
Полученные результаты
Полученные результаты

Лазерный 3D-сканер смог сканировать объекты с приличной точностью. Характеристики объектов отчетливы и узнаваемы, а детали очень легко распечатать на 3D-принтере с помощью программного обеспечения для нарезки, такого как Repetier. На рисунках выше показаны некоторые образцы сканирования куска дерева и резиновой утки.

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

Одна из переменных, которую мне действительно удалось настроить, - это разрешение сканов. Поскольку в шаговом двигателе 400 шагов, я могу выбрать, насколько велика каждая ΔΘ, чтобы определять угловое разрешение. По умолчанию у меня угловое разрешение установлено на 20 итераций, что означает, что в каждом кадре двигатель вращается на 20 шагов (400/20 = 20). Это было выбрано в основном из соображений экономии времени - сканирование таким способом занимает около 45 секунд. Однако, если мне нужно сканирование более высокого качества, я могу увеличить количество итераций до 400. Это дает гораздо больше точек для построения модели, что делает сканирование гораздо более детальным. Помимо углового разрешения, я также могу настроить вертикальное разрешение или количество различных точек, которые я выбираю для опроса вдоль лазерного среза. Для того же интереса ко времени я установил это значение по умолчанию на 20, но я могу увеличить его для лучших результатов. Играя с этими параметрами углового разрешения и пространственного разрешения, я смог скомпилировать результаты различных сканирований ниже на последнем рисунке. Каждая этикетка отформатирована таким образом, что это угловое разрешение x пространственное разрешение. Как видно из настроек сканирования по умолчанию, особенности утки узнаваемы, но не детализированы. Однако по мере увеличения разрешения начинают проявляться отдельные точные особенности, включая глаза, клюв, хвост и крылья утки. На сканирование изображения с самым высоким разрешением ушло около 5 минут. Увидеть такое высокое достижимое разрешение было очень большим успехом.

Ограничения

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

Следующие шаги

Хотя я был доволен результатами нашего проекта, было несколько вещей, которые можно было реализовать, чтобы сделать его лучше. Во-первых, в текущем состоянии разрешение сканирования можно изменить только путем изменения жестко закодированных переменных разрешения в нашем коде. Чтобы сделать проект более встроенным, можно включить потенциометр разрешения, чтобы пользователь мог изменять разрешение, не подключая к сканеру монитор и клавиатуру. Кроме того, сканер создает изображения, которые иногда могут выглядеть неровными. Чтобы исправить это, можно применить методы сглаживания сетки, чтобы сгладить неровности и резкие углы. Наконец, я обнаружил, что координаты пикселей плохо масштабируются в реальном мире. Созданные мной сетки были в 6-7 раз больше, чем реальный объект. В будущем было бы полезно реализовать способ масштабирования сеток, чтобы они более точно соответствовали реальному размеру объекта.

Шаг 9: Ресурсы

Я включил код, файлы STL для печати и файлы DXF для вырезания всего проекта.

Конкурс Raspberry Pi 2020
Конкурс Raspberry Pi 2020
Конкурс Raspberry Pi 2020
Конкурс Raspberry Pi 2020

Первый приз в конкурсе Raspberry Pi 2020

Рекомендуемые: