Tabla de contenido:

Escáner láser Raspberry Pi: 9 pasos (con imágenes)
Escáner láser Raspberry Pi: 9 pasos (con imágenes)

Video: Escáner láser Raspberry Pi: 9 pasos (con imágenes)

Video: Escáner láser Raspberry Pi: 9 pasos (con imágenes)
Video: TODO ESTO PUEDES HACER CON UNA RASPBERRY PI 😈💻 2024, Noviembre
Anonim
Image
Image
Escáner láser Raspberry Pi
Escáner láser Raspberry Pi

El escáner láser es un dispositivo de sistema integrado Raspberry Pi capaz de digitalizar objetos en archivos de malla.obj para su reproducción mediante impresión 3D. El dispositivo hace esto utilizando un láser de línea y una PiCam integrada para realizar visión por computadora. El láser se coloca a 45 grados oblicuo del láser y proyecta una línea roja brillante en un corte vertical del objeto. La cámara detecta la distancia del corte desde el centro para dar un corte de malla. El objeto se hace girar en la bandeja giratoria y el proceso se repite hasta que se escanea el objeto completo. El archivo.obj generado finalmente se envía por correo electrónico al usuario, lo que hace que el sistema sea completamente independiente e integrado.

Este Instructable explicará cómo se construyó el dispositivo, algunos resultados y pasos futuros.

Paso 1: inspiración

Inspiración
Inspiración
Inspiración
Inspiración

Como un ávido creador, he trabajado en la impresión 3D y el modelado de sólidos durante varios años. He trabajado con muchas herramientas de creación de prototipos diferentes, desde enrutadores CNC hasta cortadoras láser e impresoras 3D. Un dispositivo que mi maker local aún no ha comprado ha sido un escáner 3D, y puedo decirte por qué.

Los más baratos (unos pocos cientos de dólares) no eran confiables, requerían condiciones perfectas y aún producían resultados bastante lamentables. Los costosos eran … bueno, costosos, y llegaban a varios miles de dólares, por lo que su función no valía la pena en muchos casos. Además de eso, la mayoría de las veces, opto por tomar medidas y diseñar un modelo desde cero en lugar de ocuparme de la malla de superficie generada a partir de un escaneo.

Debido a esto, quería construir un escáner independiente económico para ver qué tan bien podía escanear un objeto utilizando componentes estándar.

Después de investigar un poco, vi que muchos escáneres 3D utilizaban una plataforma giratoria y luego una variedad de sensores diferentes para medir la distancia desde el centro a fin de construir un modelo giratorio. Muchos de ellos usaban cámaras duales similares a las del Kinect. Finalmente me topé con el Yscanner, que es un escáner de baja resolución que utiliza un láser. En cuanto a la simplicidad y la viabilidad, esta técnica láser, en la que se ilumina un láser con una compensación relativa a una cámara para medir la distancia desde el centro, parecía un camino claro hacia adelante.

Paso 2: herramientas y piezas

Partes:

  • Frambuesa Pi $ 35.00
  • Cámara Raspberry Pi V2 $ 30.00
  • LED, resistencias y cables
  • Filamento de impresión 3D
  • 12x12x0.125 hojas de madera
  • Hardware M3
  • Motor paso a paso - $ 14
  • Línea láser - $ 8
  • Controladores de motor paso a paso LN298 - $ 2.65
  • Botón de metal - $ 5

Instrumentos:

  • Soldador
  • Cortador láser
  • impresora 3d
  • Destornillador
  • Alicates

Paso 3: Diseño de alto nivel

Diseño de alto nivel
Diseño de alto nivel
Diseño de alto nivel
Diseño de alto nivel

El componente central de este diseño es el láser de línea que se proyecta sobre un corte vertical de los objetos. Esta proyección podría capturarse en la picamera, corregir su perspectiva y luego filtrarse antes del procesamiento de la imagen. En el procesamiento de imágenes, se podría recopilar la distancia entre cada segmento de la línea desde el centro del objeto. En coordenadas radiales, esta imagen produciría las componentes ry z. La tercera dimensión, Θ, se logra girando el objeto a un nuevo corte. Este concepto se muestra en la primera figura.

Para realizar las acciones descritas anteriormente, utilicé una Raspberry Pi como nuestra unidad informática central. Conecté un motor paso a paso y un controlador de motor al Pi, alimentado por un suministro externo de 5V y controlado por los pines GPIO del Pi. Se colocó un láser de línea en la línea de 3.3 V en el Pi y se conectó una PiCam a la entrada de la cámara en el Pi. Por último, se instaló un simple botón desplegable y un LED de estado para indicar al usuario en qué estado se encuentra el sistema. El sistema completo se resume en un diagrama de bloques del sistema.

Desde el principio, se planeó alojar la electrónica en una caja cortada con láser unida con ranuras en T y hardware M3. La electrónica estaría oculta a la vista en un compartimento inferior y una tapa permitiría un fácil acceso a la ubicación de los objetos en la bandeja giratoria. Esta tapa es necesaria para minimizar la cantidad de luz que se filtra al sistema, ya que esta luz externa puede producir ruido en el escaneo final.

Paso 4: hardware

Hardware
Hardware
Hardware
Hardware
Hardware
Hardware

Como se vio anteriormente, antes de comenzar a cortar con láser o imprimir en 3D, utilicé Autodesk Fusion 360 para hacer un modelo 3D detallado de nuestro diseño. Como resumen, el dispositivo es una caja simple con una tapa con bisagras cortadas con láser. Hay dos capas principales del dispositivo: la plataforma electrónica y la plataforma principal, con orificios para que los cables pasen entre las dos capas.

La mayor parte de nuestra caja se fabricó con una cortadora láser, y los diseños se produjeron en Fusion 360 y se cortaron en una cortadora láser Epilog Zing de 40 W. Nuestros diseños se muestran en las figuras de arriba. Desde arriba a la izquierda moviéndose hacia la derecha, las piezas son la cama principal, la cama de la electrónica, dos piezas para la tapa, la pieza trasera, la pieza delantera y las dos piezas laterales. En la cama principal, hay tres cortes principales: uno para montar el motor paso a paso, uno para enrutar los cables del láser y otro para enrutar el cable ancho de la PiCam. La pieza de la cama tiene orificios de montaje para asegurar el Pi, la placa de pruebas y el controlador del motor y un corte más grande para acceder al motor paso a paso. Las piezas de la tapa se unen simplemente para formar la pieza triangular que se ve arriba y la bisagra es una extrusión simple que es el ancho del diámetro del orificio de las tablas laterales. La pieza trasera y una de las piezas laterales tienen ranuras en el lateral para que se pueda acceder fácilmente a los puertos del Pi (HDMI, USB, Ethernet, Power). El frente es una pieza simple en la que eventualmente hice agujeros con un taladro de mano para montar el botón y el LED. Como se ve en todas las piezas, nuestras piezas se mantienen unidas por hardware M3 usando juntas en T y ranuras. Este es un método para sujetar piezas cortadas con láser de forma ortogonal y segura. Las aletas de las piezas se alinean con las ranuras de otras piezas y el corte en forma de T en los bordes dan espacio para que una tuerca M3 se atasque en ellas sin girar. Esto nos permite usar un tornillo M3 para bloquear las piezas juntas con muy poco margen de maniobra sin que el ensamblaje sea completamente permanente.

Elegí hacer la mayoría de nuestras piezas con un cortador láser debido a su rapidez y facilidad. Sin embargo, todavía tenía que imprimir en 3D algunas piezas debido a su geometría 3D que sería más difícil de crear en la cortadora. La primera pieza fue el soporte del láser de línea. Esta pieza debía montarse en la cama principal a 45 grados de la vista de la cámara y tenía un orificio para que el láser pudiera encajar cómodamente por fricción. También tuve que crear un soporte de motor porque el eje del motor era muy largo. El montaje por fricción encajó en las piezas cortadas con láser y bajó el plano al que estaba unido el motor de modo que la plataforma giratoria quedara al ras con la cama principal.

Paso 5: Electrónica

Electrónica
Electrónica

El hardware de cableado de este proyecto fue muy simple ya que el escáner 3D no requería demasiados periféricos. Era necesario conectar un motor, un botón, un LED, un láser y una cámara al Pi. Como se muestra, me aseguré de conectar resistencias en serie con cada pin que usamos para proteger los pines. Un pin GPIO se dedicó a controlar el LED de estado, que se iluminaba cuando el dispositivo estaba listo para ser utilizado y pulsaba con PWM cuando el dispositivo estaba funcionando. Otro pin GPIO se conectó a un botón levantado, registrándose ALTO cuando no se presionó el botón y BAJO cuando se presionó el botón. Por último, dediqué cuatro pines GPIO a impulsar el motor paso a paso.

Dado que nuestro motor solo tenía que avanzar un cierto grado sin requerir control de velocidad, optamos por un controlador de motor paso a paso más simple (L298N) que simplemente aumenta las líneas de control para alimentar las entradas del motor. Para aprender cómo operar los motores paso a paso a un nivel muy bajo, nos referimos tanto a la hoja de datos L298N como a la biblioteca Arduino. Los motores paso a paso tienen un núcleo magnético con dedos sobresalientes de polaridad alterna. Los cuatro cables están envueltos para controlar dos electroimanes que alimentan cada uno de los dedos opuestos del motor. Por lo tanto, al cambiar la polaridad de los dedos, podemos empujar el paso a paso un paso. Con este conocimiento de cómo funcionaban los steppers desde un nivel de hardware, pudimos controlar los steppers mucho más fácilmente. Optamos por alimentar nuestro motor paso a paso con una fuente de alimentación de 5 V en el laboratorio en lugar del Pi debido a su consumo máximo de corriente de aproximadamente 0,8 A, que es más de lo que el Pi podría suministrar.

Paso 6: software

Software
Software
Software
Software
Software
Software
Software
Software

El software de este proyecto se puede dividir en cuatro componentes principales que interactúan entre sí: procesamiento de imágenes, control de motores, creación de mallas y funciones integradas.

Como resumen del software, podemos mirar la primera figura. A medida que el sistema se inicia,.bashrc inicia sesión automáticamente en Pi y comienza a ejecutar nuestro código Python. El sistema enciende la luz de estado para que el usuario sepa que se ha iniciado correctamente y espera a que se presione el botón. A continuación, el usuario puede colocar el artículo a escanear y cerrar la tapa. Después de presionar el botón, el LED parpadea para que el usuario sepa que el dispositivo está funcionando. El dispositivo circulará entre el procesamiento de imágenes y el control del motor hasta que se complete la rotación completa y se recopilen todos los datos del objeto. Finalmente, se crea la malla y el archivo se envía por correo electrónico a un correo electrónico preseleccionado. Esto reinicia el ciclo y la máquina está lista para realizar otro escaneo con solo presionar un botón.

Procesamiento de imágenes

Lo primero que se implementó fue procesar una imagen capturada para extraer la información almacenada en la imagen en una forma que pudiera usarse para crear una matriz de puntos en el espacio. Para hacer esto, comencé tomando una foto del objeto en la plataforma junto con todo el ruido de fondo creado por el láser que brilla en la parte posterior de la caja y se dispersa. Esta imagen tenía dos problemas principales en su forma original. Primero, el objeto fue visto en un ángulo con una perspectiva elevada y segundo, había mucho ruido de fondo. Lo primero que tenía que hacer era tener en cuenta este ángulo de visión porque usar la foto tal cual no nos permitiría determinar una altura constante del objeto. Como se ve en la segunda figura, la altura de la forma de "L" invertida es consistente; sin embargo, debido a que un lado es más largo que el otro, parecen tener diferentes alturas en el borde más cercano al espectador.

Para solucionar esto, tuve que transformar el espacio de trabajo en la imagen en un rectángulo de la forma trapezoidal que tenía anteriormente. Para hacer esto, utilicé el código proporcionado por este enlace, que cuando se le da una imagen y cuatro puntos, recorta la imagen entre los cuatro puntos y transforma la imagen recortada para compensar la perspectiva. Esta transformación utiliza los cuatro puntos para crear un rectángulo en lugar de una forma de tipo trapezoide como se ve en la tercera figura.

El siguiente problema que debía resolverse era el del ruido de fondo en forma de luz exterior y la luz reflejada por el propio láser. Para hacer esto, filtré la luz usando la función inRange () de OpenCV. Configuré el umbral para que solo captara la luz roja en un cierto nivel. Para obtener el valor correcto, comencé con un umbral indulgente y seguí aumentando el nivel del umbral hasta que la única luz que se captaba era la luz láser del objeto que se estaba escaneando. Una vez que tuve esta imagen, encontré el píxel más brillante en cada fila para obtenga una línea de un píxel por fila que bordee el lado más a la izquierda de la línea láser. Luego, cada píxel se convirtió en un vértice en el espacio 3D y se almacenó en una matriz, como se describe en la sección de creación de malla. Los resultados de estos pasos se pueden ver en la cuarta figura.

Control del motor

Después de poder procesar con éxito una sola imagen para obtener el corte del objeto, necesitaba poder rotar el objeto para tomar una nueva imagen con un ángulo diferente. Para hacer esto, controlé el motor paso a paso debajo de la plataforma en la que se encuentra el objeto que se está escaneando. Construí una base de nuestra función de pasos creando una variable para rastrear el estado del motor y micropasos alternando cada una de las cuatro entradas del motor.

Creación de malla Para crear una malla a partir de todas las imágenes procesadas, primero tuve que convertir cada píxel blanco de la imagen procesada en un vértice en el espacio 3D. Debido a que estoy recolectando cortes individuales del objeto con simetría cilíndrica, tenía sentido comenzar a recolectar coordenadas cilíndricas. Esto tenía sentido ya que la altura de la imagen podría representar el eje z, la distancia desde el centro de la mesa giratoria podría representar el eje R y la rotación del motor paso a paso podría representar el eje theta. Sin embargo, debido a que almacené nuestros datos en coordenadas cilíndricas, tuve que convertir cada uno de estos vértices en coordenadas cartesianas.

Una vez que se crearon estos vértices, se almacenaron en una lista y dicha lista se almacenó en otra lista que contenía las listas de vértices creadas para cada imagen capturada. Una vez que todas las imágenes fueron procesadas y convertidas a vértices, tuve que seleccionar los vértices que realmente quería representar en la malla final. Quería que se incluyeran el vértice superior y el vértice inferior y luego, en función de la resolución, elegí un número de vértices espaciados uniformemente para usar en cada imagen. Debido a que no todas las listas de vértices tenían la misma longitud, tuve que igualarlas encontrando la lista con el menor número de vértices y eliminando los vértices de todas las demás listas hasta que todas fueran pares. Con las listas de vértices creadas, ahora podía crea una malla. Elegí formatear nuestra malla con el estándar de archivo.obj ya que es simple e imprimible en 3D.

Función incrustada

Una vez que el dispositivo fue funcional, lo pulí agregando una funcionalidad integrada completa. Esto significó quitar el teclado, el mouse y el monitor, y hacer que nos enviara de forma inalámbrica el archivo.obj después de terminar el procesamiento. Para comenzar, cambié el código.bashrc para iniciar sesión automáticamente e iniciar el programa principal de Python al inicio. Esto se hizo usando sudo raspi-config y seleccionando "Console Autologin" y agregando la línea "sudo python /home/pi/finalProject/FINAL.py" a /home/pi/.bashrc. Además de esto, también agregó un botón y un LED de estado para la entrada y salida del usuario. El botón le permitiría al usuario decirle al dispositivo cuándo comenzar a escanear y el LED le indicaría al usuario el estado de la máquina. Si el LED está encendido, el dispositivo está listo para iniciar un nuevo escaneo. Si el LED parpadea, el dispositivo está escaneando actualmente. Si el LED es de oficina, hay un error de software que solicita un reinicio del sistema. Por último, habilité el dispositivo para enviar el archivo.obj por correo electrónico. Esto se hizo utilizando las bibliotecas smtplib y de correo electrónico. Esta capacidad de enviar correos electrónicos nos brindó una forma muy conveniente e inalámbrica de entregar el archivo producido al usuario para que pueda acceder a él en muchas plataformas diferentes.

Paso 7: Integración

Integración
Integración

Después de fabricar las distintas piezas del dispositivo, lo ensamblé. La figura de arriba muestra en orden:

(a) caja ensamblada afuera

(b) caja ensamblada en el interior con cámara y láser

(c) vista interior de la cama electrónica

(d) parte posterior del Pi con acceso a los puertos Pi y la entrada del motor de 5V

(e) pulsador con anillo LED y luz de estado en la parte frontal del dispositivo

Paso 8: Resultados

Resultados
Resultados
Resultados
Resultados
Resultados
Resultados
Resultados
Resultados

El escáner láser 3D pudo escanear objetos con una precisión decente. Las características de los objetos son distintas y reconocibles y las partes fueron muy fáciles de imprimir en 3D utilizando un software de corte como Repetier. Las figuras de arriba muestran algunos escaneos de muestra de un trozo de madera y un patito de goma.

Uno de nuestros mayores hallazgos y éxitos que descubrí durante las pruebas fue la consistencia del dispositivo. A lo largo de varias pruebas del mismo objeto, el escáner pudo producir un archivo.obj que era muy, muy similar cada vez, incluso si modificamos ligeramente la ubicación del objeto. Como se ve en los tres escaneos separados, todos se ven muy similares, capturando los mismos detalles y la misma cantidad de detalles. En general, quedé muy impresionado con la consistencia y solidez de nuestro sistema.

Una de las variables que realmente pude ajustar es la resolución de los escaneos. Debido a que hay 400 pasos en el paso a paso, puedo elegir el tamaño de cada ΔΘ para dictar la resolución angular. De forma predeterminada, tengo la resolución angular configurada en 20 iteraciones, lo que significa que en cada cuadro, el motor gira en 20 pasos (400/20 = 20). Esto se eligió principalmente en aras del tiempo: se necesitan unos 45 segundos para completar un escaneo de esta manera. Sin embargo, si quiero un escaneo de calidad mucho mayor, puedo aumentar el número de iteraciones hasta 400. Esto da muchos más puntos para construir el modelo, lo que hace que el escaneo sea mucho más detallado. Además de la resolución angular, también puedo ajustar la resolución vertical, o cuántos puntos diferentes elijo para sondear a lo largo del corte láser. Para un interés similar en el tiempo, tengo este valor predeterminado establecido en 20, pero puedo aumentarlo para obtener mejores resultados. Al jugar con estos parámetros de resolución angular y resolución espacial, pude compilar los resultados de diferentes escaneos a continuación en la última figura. Cada etiqueta está formateada de manera que sea la resolución angular x resolución espacial. Como se ve en la configuración de escaneo predeterminada, las características del pato son reconocibles pero no detalladas. Sin embargo, a medida que aumento la resolución, comienzan a mostrarse características precisas individuales, incluidos los ojos, el pico, la cola y las alas del pato. La imagen de mayor resolución tardó unos 5 minutos en escanearse. Ver tan alto de una resolución alcanzable fue un gran éxito.

Limitaciones

A pesar de los resultados exitosos del proyecto, todavía existen algunas limitaciones en el diseño y la implementación. Con el uso del láser surgen muchos problemas con la forma en que se dispersa la luz. Muchos objetos que traté de escanear que eran translúcidos, brillantes o muy oscuros resultaron problemáticos con la forma en que la luz se reflejaba en la superficie. Si el objeto fuera translúcido, la luz se absorbería y se dispersaría, lo que haría una lectura muy ruidosa de los cortes. En los objetos brillantes y oscuros, la luz se reflejaría o se absorbería hasta el punto en que sería difícil captarla. Además, debido a que estoy usando una cámara para capturar las características de los objetos, su detección está limitada por su línea de visión, lo que significa que los objetos cóncavos y los ángulos agudos a menudo están bloqueados por otras partes del objeto. Esto se muestra en nuestro ejemplo del pato de goma, ya que la cola a veces pierde su curvatura en el escaneo. La cámara también solo puede detectar estructuras de superficie, lo que significa que no se pueden capturar agujeros o geometrías internas. Sin embargo, este es un problema común que también tienen muchas otras soluciones de escaneo.

Próximos pasos

Aunque estaba contento con los resultados de nuestro proyecto, había algunas cosas que podrían implementarse para mejorarlo. Para empezar, en el estado actual, la resolución de escaneo solo se puede cambiar cambiando las variables de resolución codificadas en nuestro código. Para que el proyecto esté más integrado, se podría incluir un potenciómetro de resolución para que el usuario pueda cambiar la resolución sin tener que conectar un monitor y un teclado al escáner. Además, el escáner crea imágenes que a veces pueden parecer irregulares. Para solucionar este problema, se podrían implementar técnicas de suavizado de malla para suavizar las irregularidades y las esquinas ásperas. Por último, descubrí que las coordenadas de píxeles no se adaptan bien al mundo real. Las mallas que creé eran de 6 a 7 veces más grandes que el objeto real. En el futuro sería ventajoso implementar una forma de escalar las mallas para que sean más precisas al tamaño real del objeto.

Paso 9: Recursos

He incluido el código, los archivos STL para imprimir y los archivos DXF para cortar durante la totalidad del proyecto.

Concurso Raspberry Pi 2020
Concurso Raspberry Pi 2020
Concurso Raspberry Pi 2020
Concurso Raspberry Pi 2020

Primer premio en el Concurso Raspberry Pi 2020

Recomendado: