Programa un coche Arduino con Inteligencia Artificial
El Machine Learning nos permitirá utilizar Redes Neuronales para que un coche Arduino conduzca sólo evitando obstáculos.
En el artículo anterior, creamos una red neuronal desde cero en Python. En este artículo mejoraremos esa red y copiaremos sus pesos a una red con propagación hacia adelante en Arduino que permitirá que el coche robot conduzca sólo sin chocar.
La Nueva Red Neuronal
Por simplificar el modelo de aprendizaje, en el post anterior teníamos una red de tres capas con 2 neuronas de entrada 3 ocultas y 2 de salida: giro y dirección. Para este ejercicio haremos que la red neuronal tenga 4 salidas: una para cada motor. Además las salidas serán entre 0 y 1 (apagar o encender motor). También cambiaremos las entradas para que todascomprendan valores entre -1 y 1 y sean acordes a nuestra función tangente hiperbólica. Aquí vemos los cambios en esta tabla:
Entrada: Sensor Distancia | Entrada: Posición Obstáculo | Salida: Motor 1 | Salida: Motor 2 | Salida: Motor 3 | Salida: Motor 4 |
---|---|---|---|---|---|
-1 | 0 | 1 | 0 | 0 | 1 |
-1 | 1 | 1 | 0 | 0 | 1 |
-1 | -1 | 1 | 0 | 0 | 1 |
0 | -1 | 1 | 0 | 1 | 0 |
0 | 1 | 0 | 1 | 0 | 1 |
0 | 0 | 1 | 0 | 0 | 1 |
1 | 1 | 0 | 1 | 1 | 0 |
1 | -1 | 0 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 | 0 |
Siendo el valor de los motores 1 y 0:
Acción | Motor 1 | Motor 2 | Motor 3 | Motor 4 |
---|---|---|---|---|
Avanzar | 1 | 0 | 0 | 1 |
Retroceder | 0 | 1 | 1 | 0 |
Giro Derecha | 0 | 1 | 0 | 1 |
Giro Izquierda | 1 | 0 | 1 | 0 |
Para instanciar nuestra red ahora usaremos este código:
Aquí podemos ver el código Python Completo modificado de la Jupyter Notebook. Y también vemos la gráfica del coste, que disminuye a medida que se entrena tras 40.000 iteraciones.
¿¿No es impresionante cómo con apenas 9 datos de entrada podemos enseñar a un robot a conducir??
El coche Arduino
En mi caso es un coche Arduino Elegoo Uno V3 de 4 motores. Si eres Maker, te resultará fácil construir el tuyo o puede que ya tengas uno en casa para programarlo. El coche puede ser cualquier otro, de hecho podría ser de 2 motores y modificando apenas la red funcionaría. En caso de querer construirlo tu mismo explicaré brevemente los requerimientos:
Necesitaremos:
- Una placa Arduino Uno y una placa de expansión de IO
- o puede ser una placa Arduino Mega
- El controlador de motor L298N
- 4 motores DC (o podrían ser 2) y sus ruedas
- Servo Motor SG90
- Sensor Ultrasónico
- Baterias para alimentar los motores (y la placa obviamente!)
- Chasis para el coche
- Cables!
Circuito del coche
No entraré en detalle, ya que va más allá de este tutorial (si a muchos lectores les interesa, podría ampliar el artículo en el futuro) pero básicamente tenemos el siguiente circuito (ignorar el bluetooth y los sensores infrarrojos):
Montar el coche
Utilizaremos un Servo en la parte delantera del coche que moverá al sensor de distancia de izquierda a derecha, a modo de radar, para detectar obstáculos.
Más allá de eso… es un coche! pondremos las 4 ruedas y las placas Arduino encima del chasis. (El objetivo de este artículo es enseñar a programar una red neuronal en la IDE de Arduino)
Este es el video tutorial oficial de ensamblaje de Elegoo de este coche.
Así nos quedará montado… ta taáan:
Copiar la red neuronal
Una vez obtenida la red neuronal Python, haremos copiar y pegar de la matriz de pesos en el código Arduino (reemplazaremos las lineas 23 y 24):
El código Arduino
El código Arduino controlará el servo motor con el sensor de distancia que se moverá de izquierda a derecha y nos proveerá las entradas de la red: Distancia y Dirección(ó giro).
El resto, lo hará la red neuronal! En realidad, la red ya «aprendió» (en Python) es decir, sólo hará multiplicaciones y sumas de los pesos para obtener salidas. Realizará el camino forward propagation. Y las salidas controlarán directamente los 4 motores.
Hay código adicional para darle ciclos de tiempo a las ruedas a moverse (variable accionEnCurso) y dar más o menos potencia a los motores al cambiar de dirección. Son relativamente pocas líneas de código y logramos que la red neuronal conduzca el coche!
Nota: Para el movimiento del Servo motor se utiliza una librería «Servo» estándard.
Aquí vemos el código Arduino completo. Tal vez la parte más interesante sea la función conducir().
El Coche en Acción!
Conecta tu coche, sube el código y ¡pruébalo!
Veamos un video del coche funcionando con su propia inteligencia artificial en el planeta tierra.
Conclusión
Aplicamos Machine Learning y sus redes neuronales a un objeto del mundo real y vimos cómo funciona, haciendo que el coche evite obstáculos y tome las decisiones por sí mismo, sin haberle dado instrucciones ni código explícito.
Mejoras a Futuro
Tengamos en cuenta que estamos teniendo como entradas los datos proporcionados por un sólo sensor de distancia y un servo motor que nos indica si está a izquierda o derecha. Podríamos tener más sensores de distancia, infrarrojos, medir velocidad, luz, sonido… en fin. Si tuviéramos que programar «manualmente» ese algoritmo, tendría una complejidad enorme y sería muy difícil de mantener o modificar. En cambio, hacer que una red neuronal aprenda sería muy sencillo. Tan sólo agregaríamos features (columnas) a nuestro código y volveríamos a entrenar nuevamente la red. Voila!. Copiar y pegar los pesos obtenidos en Arduino, y nuestro coche tendría la inteligencia de manejarse por sí mismo nuevamente.
Suscripción al Blog
Puedes suscribirte al Blog y ser el primero en recibir los artículos cada 15 días.
Puedes hacer más ejercicios de Aprendizaje Automático en Python en nuestra categoría d Ejercicios paso a paso
Recursos
- Artículo anterior, donde se explica con mayor detalle cómo se crea la Red Neuronal
- Descarga el código Python con la nueva Red Neuronal
- Descarga el código Arduino
- Si quieres comprar el mismo coche Arduino que yo, click aqui: ELEGOO UNO Proyecto Kit de Coche Robot Inteligente V3.0. Te recuerdo que puedes construir tu propio coche Arduino si te das maña y utilizar este código. De hecho puede funcionar con un coche de 2 motores modificando las salidas de la red, en vez de tener 4, tener 2.
- Aquí puedes ver a otro Maker que hizo un coche Arduino con Red Neuronal que escapa de la luz.
0 comentarios:
Publicar un comentario