Coche RC controlado por visión artificial


Varias empresas de todo el mundo están desarrollando activamente automóviles autónomos que utilizan la visión por computadora para detectar la presencia de obstáculos en su camino y realizar la navegación por puntos intermedios. El objetivo del proyecto actual es desarrollar una pequeña configuración en la que un estudiante pueda implementar y probar iterativamente diferentes algoritmos. Este proyecto consta del automóvil, el enlace de comunicación IR y el software de procesamiento de imágenes en una computadora portátil.
Un coche de juguete hecho con dos motores de corriente continua montados en una placa perforada. El automóvil gira mediante un accionamiento diferencial y recibe señales de la computadora a través de un receptor de infrarrojos. Se utiliza un Arduino Nano para decodificar las señales IR recibidas y controla los dos motores de CC. Las señales IR pueden emitirse desde la placa emisora de IR conectada a la computadora portátil o al control remoto de un televisor normal.
Una cámara superior fija con vista al campo desde arriba captura imágenes que se transfieren a la computadora portátil Linux a través de USB. Se utiliza una computadora portátil con bibliotecas Python y openCV para el procesamiento de imágenes. En la versión actual, el programa Python detecta la ubicación y la orientación del automóvil (marca triangular) en relación con el destino (marca pentagonal) y guía el automóvil hasta el destino. Este programa de Python se puede actualizar con varios algoritmos avanzados sin cambios importantes en el hardware.
La computadora portátil Linux se comunica con el auto RC a través de un transmisor IR (IR LED) y un receptor (VS1838). El emisor de IR consiste en un Arduino Uno montado en una placa perforada y conectado a la computadora portátil a través de un cable USB. El coche de juguete contiene el receptor IR que también está conectado al Arduino Uno que alimenta el coche.


El automóvil que se muestra en la Fig. 1 tiene dos motores de 9 V CC con engranajes alimentados por dos baterías AA de 1,5 V en serie. El motor está alimentado por transistores BC547. BC 547 es un transistor NPN de propósito general. Se usa comúnmente en amplificadores de audio y circuitos de procesamiento de señales. En esta aplicación, el transistor se utiliza como interruptor del lado bajo. El cable positivo del motor siempre está conectado a la alimentación de +3V. El polo negativo del motor está conectado a tierra a través del transistor. Solo cuando el transistor está conduciendo, la corriente fluye a través del motor. El transistor tiene conexiones de colector, base y emisor. El colector está conectado a la terminal negativa del motor y el emisor está conectado a tierra. La base está conectada a la señal de Arduino a través de una resistencia de 500 ohm como se muestra en la Figura 2. Los transistores de motor izquierdo y derecho están conectados a los pines de salida digital D3 y D5. La resistencia sirve para limitar el flujo de corriente hacia la base del transistor. Cuando ambos pines D3 y D5 se cambian a ALTO, ambos transistores comienzan a conducir y el auto RC avanza. Si solo uno de los transistores se cambia a ALTO, el automóvil gira. Con esta configuración no es posible conducir el automóvil hacia atrás.


El receptor IR VS1838B se utiliza para recibir comandos desde un control remoto de TV (Tata Sky) o el transmisor conectado a la computadora portátil. Es compatible con los formatos de datos comunes para controles remotos IR. El voltaje de entrada es de 3V a 5V. Tiene 3 pines: Vcc, salida y tierra. El propio Arduino proporciona la fuente de alimentación de 5 V para el receptor IR, lo que garantiza una conexión a tierra común. El pin de salida está conectado al pin D10 de Arduino. La biblioteca Arduino ampliamente utilizada "IRremote.h" se utiliza para decodificar las señales IR recibidas y convertirlas en números enteros sobre los que luego se puede actuar.
El automóvil terminado se cubre con un triángulo de cartón blanco (consulte la Figura 7) de modo que la forma de un triángulo sea visible para que la cámara superior identifique la ubicación y la orientación del automóvil. El receptor VS1838B sobresale del triángulo para que pueda recibir las señales de la placa del transmisor o del control remoto del televisor.


Los códigos recibidos en el monitor serial del Arduino Nano del automóvil cuando se presionan varios botones en el control remoto Tata Sky se enumeran en la Tabla 1. Estos códigos se identificaron conectando el Arduino Nano receptor a la computadora a través de un cable USB y registrando su número de serie en el monitor cuando se presionan varios botones en el control remoto Tata Sky (como se muestra).


Mientras opera en el automóvil, el Arduino Nano en el automóvil escucha continuamente estos códigos en un bucle. En el código Arduino programado en el automóvil, se asignaron funciones a los códigos de los botones izquierdo, derecho y delantero del control remoto Tata Sky que hacen que el automóvil gire a la izquierda, a la derecha o en línea recta, respectivamente. El código correspondiente a las teclas numéricas 1,2,3,4 se ha asignado para configurar los tiempos de conducción diferenciales en diferentes duraciones. Por ejemplo, si presiona 1 y luego el botón izquierdo, el motor derecho gira durante 500 milisegundos mientras que el motor izquierdo se detiene. Al presionar 2 y luego el botón izquierdo, el motor derecho gira durante 1000 milisegundos mientras se detiene el motor izquierdo. Por lo tanto, se puede controlar la cantidad de rotación. Al presionar el botón de color rojo y el botón de avance en el control remoto, el automóvil avanza durante 2 segundos, mientras que al presionar el botón de avance azul, el automóvil avanza durante 500 milisegundos.
Tabla 1 Códigos para varios botones en el control remoto Tata Sky
botón en el control remoto Tata Sky | valor entero recibir |
0 a 10 números | 12582912 a 2582921 |
A la derecha | 12583003 |
Izquierda | 12583002 |
frente | 12583000 |
Devolver | 12583001 |
Azul | 12583024 |
Amarillo | 12583023 |
Verde | 12583022 |
Rojo | 12583021 |
descanso del juego | 12582948 |
La placa emisora de IR que se muestra en la Figura 5 es una placa perforada simple con un Arduino Uno que conduce un LED IR a través de un transistor BC547, como se muestra en la Figura 6. El pin de salida digital PWM D3 está conectado a la base del transistor a través de la resistencia limitadora de corriente de 500 ohmios. El colector del transistor está conectado al LED y el emisor está conectado al suelo común. El LED IR está conectado al pin de 5V de Arduino a través de la resistencia limitadora de corriente.




El comando IRsend() de la biblioteca IRremote.h se utiliza para enviar los códigos correspondientes a las distintas teclas numéricas del control remoto Tata Sky. Por lo tanto, el transmisor IR simplemente emula el control remoto Tata Sky. El programa Arduino en el Uno conectado al emisor IR monitorea su puerto serie en un bucle. Cuando el programa Python que ejecuta la rutina de procesamiento de imágenes emite el comando de avance/rotación al puerto serie, el Arduino lee el carácter del puerto serie y transmite la señal IR correspondiente a través del LED IR. Todo el procesamiento de imágenes y la toma de decisiones de navegación en el automóvil se realiza mediante el programa Python, que simplemente pasa los comandos al Arduino Uno, que luego los transmite al Arduino Nano en el automóvil.


Se utiliza una cámara web Logitech montada en un marco para capturar imágenes de forma continua en un bucle. La computadora portátil captura imágenes de la cámara web utilizando la función VideoCapture de openCV. Cada imagen se procesa y se da un comando de movimiento antes de tomar la siguiente imagen. El diagrama de flujo de todo el programa de Python se muestra en la Figura 8.


Como primer paso después de la adquisición de la imagen, se aplica un desenfoque gaussiano para eliminar el ruido de las imágenes. La imagen en color se convierte a escala de grises y se aplica un umbral de 210 para distinguir las áreas blancas y negras. Todos los valores de píxeles por encima de 210 se tratan como blancos y los valores de píxeles por debajo de 210 se tratan como negros. Esto convierte la escala de grises en una imagen en blanco y negro, que luego se pasa a la función de búsqueda de contorno findContours() de openCV. La matriz de contorno devuelta por findContours() se pasa a la función approxPolyDP() para extraer polígonos. Cada uno de los polígonos devueltos se prueba para el número de lados. Si no hay reflejos disruptivos, se reconocen un pentágono, un triángulo y 4 rectángulos en la imagen en blanco y negro. Estos contornos detectados se muestran en la Figura 9.


Se dibuja una línea a través del centroide del triángulo y el punto medio del lado más corto del triángulo. Esta línea se trata como el eje del coche. La línea que conecta el centroide del triángulo del automóvil y el pentágono objetivo se trata como una línea de trayectoria. Para cada imagen, se calcula el ángulo entre la línea de trayectoria y el eje del vehículo y se emite un comando de giro si el ángulo es superior a 5 grados. El comando de avance se emite cuando la distancia entre los dos centroides es mayor que el umbral. La comprobación de la distancia y el ángulo se realiza en cada imagen y el proceso se repite hasta que tanto la distancia como el ángulo son inferiores al umbral. En este punto, se considera que el coche ha llegado a su destino. Los cuatro cuadros delimitadores se utilizan para verificar que el automóvil se encuentra dentro de los límites del área negra mate.
Descarga el código fuente
Toda la configuración se probó varias veces moviendo el marcador de destino a diferentes ubicaciones dentro de los rectángulos delimitadores y verificando que el automóvil alcanzara el objetivo. Enfermería logró la meta dentro de los umbrales establecidos en la mayoría de los casos. A pesar del uso de un fondo negro mate con iluminación constante controlada, ocurrieron reflejos espurios que el código no es lo suficientemente robusto para tener en cuenta. Dado que el código de Python se ejecuta en la computadora portátil, el código podría extenderse y hacerse más sólido para tener en cuenta el desorden al determinar las posiciones de destino y la posición actual del automóvil. Además, se pueden colocar obstáculos poligonales regulares en la carretera y se puede mejorar el motor de Python para planificar un camino que evite estos obstáculos. El hardware del vehículo se puede actualizar para permitir que retroceda utilizando un controlador de motor de CC adecuado. Los archivos fuente del código Arduino para el transmisor y el receptor, y el código Python modular para el procesamiento de imágenes y la navegación se proporcionan con este artículo para mejorar. Mire el video a continuación para ver un video que muestra el funcionamiento del automóvil bajo control manual.
A continuación se muestra un video del funcionamiento de un automóvil cuando es controlado por el programa Python:
Si quieres conocer otros artículos parecidos a Coche RC controlado por visión artificial puedes visitar la categoría Electrónica.
Deja una respuesta