• Coche RC autónomo (III) - Primeros pasos de configuración de la Raspberry Pi

    En la tercera entrega del proyecto Construyendo un coche RC autónomo voy a detallar los primeros pasos con la Raspberry Pi. La idea es que este mini ordenador, que cuenta con WiFi en su versión 3, se ancle al vehículo radiocontrol para obtener imágenes (mediante su videocámara) para su posterior procesado mediante una red neuronal.

    Raspberry Pi

    Como la Raspberry Pi no deja de ser un ordenador, voy a instalar en ella la distribución GNU/Linux Raspbian (que no es más que una variante de Debian pero adaptado a las capacidades y recursos de la Raspberry Pi). Tras descargarla, seguiremos los pasos indicados en la documentación para grabar la distribución en una tarjeta micro SD de 16 GB.

    Para grabarla, existen varias aplicaciones. La recomendada en la propia página de Raspbian es Etcher, una mini aplicación que permite seleccionar una tarjeta SD destino y una imagen ISO, y con sólo pulsar un botón tendremos la tarjeta micro SD con la distribución lista para ser utilizada.

    Etcher - Grabando la imagen de Raspbian en una tarjeta micro SD

    Una vez grabada la imagen en la tarjeta micro SD la introducimos en la Raspberry Pi, y usando un cargador de móvil con cable USB - micro USB la enchufamos a la corriente, y con un cable DVI a la televisión o a un monitor para poder configurarla (incluido el adaptador WiFi para así más tarde poder conectarnos de forma remota mediante SSH utilizando un gestor de conexiones como Gnome Connection Manager). Necesitaremos también un teclado de ordenador USB para poder realizar la configuración.

    El usuario por defecto de la distribución Raspbian es pi, con la contraseña raspberry. Como queremos que nuestro vehículo autónomo no sea hackeado (o al menos, tan fácilmente), lo mejor será cambiar esta contraseña por defecto por una privada, secreta e intransferible.

    Para realizar la configuración inicial y cambiar el password del usuario pi, activar el servidor SSH (para poder acceder remotamente), expandir todo el sistema de archivos usando todo el espacio de la tarjeta micro SD, etcétera, vamos a ejecutar el siguiente comando:

    sudo raspi-config
    

    Una vez configurado los diferentes apartados, vamos a configurar la WiFi para poder conectarnos de forma remota mediante SSH. Para ello, configuramos mediante línea de comandos la nueva Raspberry Pi 3 según la documentación oficial, que ha cambiado y ya no utiliza los ficheros de configuración de red /etc/network/interfaces.

    En primer lugar queremos conocer el ESSID de la red WiFi a la que nos vamos a conectar, por lo que necesitamos un listado de las disponibles si no lo conocemos:

    sudo iwlist wlan0 scan
    

    Ahora editamos el fichero /etc/wpa_supplicant/wpa_supplicant.conf:

    sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
    

    Añadimos al final las siguientes líneas para identificar las redes WiFi a las que nos vamos a conectar. En mi caso, la de casa y la de la oficina de ITERNOVA, poniendo los identificadores de cada red SSID y su contraseña secreta correspondiente:

    network={
            ssid="WIFI-DE-CASA"
            psk="clave-secreta-de-wifi-de-casa"
            priority=1
            id_str="HOME"
    }
    
    network={
            ssid="WIFI-DE-ITERNOVA"
            psk="clave-secreta-de-wifi-de-iternova"
            priority=2
            id_str="ITERNOVA"
    }
    

    Ahora necesitamos editar el fichero /etc/dhcpcd.conf ya que queremos asignar IP estáticas (tanto de Ethernet como de WiFi). En nuestro caso, queremos asignar las IP 192.168.1.198 para el interfaz eth0 y 192.168.1.199 para el interfaz WiFi wlan0.

    sudo nano /etc/dhcpcd.conf
    

    Al final del fichero incluiremos las siguientes líneas:

    # eth0 static configuration
    interface eth0
    static ip_address=192.168.1.198/24
    static routers=192.168.1.1
    static domain_name_servers=8.8.8.8 8.8.4.4
    
    # wlan0 static configuration
    interface wlan0
    static ip_address=192.168.1.199/24
    static routers=192.168.1.1
    static domain_name_servers=8.8.8.8 8.8.4.4
    
    

    Con esto, reiniciamos la Raspberry Pi y ya debería estar conectada a la red.

    # Reiniciamos 
    sudo reboot
    
    # Tras reboot, comprobamos los interfaces de red activos
    sudo ifconfig
    

    Como además hemos activado el servicio SSH, podremos conectarnos de forma remota desde nuestro ordenador para actualizar los diferentes paquetes desde la propia aplicación raspi-config. Como veremos en próximos posts, desde aquí también podremos activar la cámara que vayamos a usar e instalar los paquetes y librerías que vamos a necesitar.

    Conectados a la Raspberry Pi mediante SSH usando la WiFi

    Si os está gustando y empezáis a ver mil millones de posibilidades utilizando la Raspberry Pi para experimentos, no dejéis de visitar los artículos de la revista MagPi (que se puede descargar de forma gratuita en PDF).

    Más información sobre el proyecto

  • Coche RC autónomo (II) - Primer análisis de requisitos del proyecto

    Como ya comenté en el post Coche RC autónomo (I) este año pretendo realizar un side project tecnológico un tanto especial.

    Autonomous RC Car

    Tras analizar los requisitos he ido pidiendo los materiales que vamos a necesitar y ya están comenzando a llegar:

    • Coche teledirigido (escala 1:20)
    • Raspberry Pi 3 (ya la teníamos en la oficina), que ya cuenta con adaptador WiFi
    • Sensores requeridos para la Raspberry Pi 3: Cámara y sensores de infrarrojos
    • Cinta para marcar el circuito por el que el coche deberá circular de forma autónoma, una vez tengamos el prototipo creado.

    En principio el proyecto que me iba a servir de referencia era del de Zheng Wang, el cual ofrecía su código fuente de forma abierta en Github - hamuchiwa/AutoRCCar. Este proyecto consistía, brevemente explicado sin detalles, en lo siguiente:

    • Colocar la Raspberry Pi en el vehículo teledirigido
    • La Raspberry Pi tomaría las imágenes y las enviaría por WiFi al ordenador (conectado en la misma red local)
    • El ordenador procesaría las imágenes mediante una red neuronal.
    • Las diferentes salidas obtenidas en la red neuronal (acelerar, frenar, girar a izquierda y girar a derecha) las transmitiríamos a una placa Arduino conectada mediante USB al ordenador.
    • Las salidas del Arduino estarían conectadas a los cables del mando a distancia del coche teledirigido, por lo que la acción a realizar (acelerar, frenar, girar, etcétera) las enviaría el propio mando a distancia al vehículo. Es decir, el Arduino controlaría el mando a control como si se tratara de un humano.

    De esta forma no tendríamos que tocar el vehículo, sólo el mando a distancia. El problema es que necesitamos una placa Arduino adicional.

    Buscando en Internet (vuelvo a decir que Internet es una herramienta increíble si se utiliza bien) he encontrado otros proyectos parecidos interesantes, como el de Shaun Butler, que también tiene el código compartido en Github - Pi Car. Este proyecto no es en sí de conducción autónoma sino de control del vehículo teledirigido desde el móvil (y quien dice móvil, dice desde el ordenador), utilizando únicamente una Raspberry Pi. El proceso que sigue es el siguiente:

    • Colocar la Raspberry Pi en el vehículo teledirigido.
    • Instalar en la Raspberry Pi varias librerías / aplicaciones para controlar las salida PWM (Pulse Width Modulation, o modulación por ancho de pulsos), de manera que conectaríamos dichas salidas de la Raspberry Pi directamente a los cables del propio coche teledirigido que se encargan de controlar los servos de acelerar / frenar, girar a izquierda o derecha.
    • La Raspberry Pi estaría conectada por WiFi al teléfono móvil (en la misma red) o al ordenador. Utilizando aplicaciones ya existentes o programando la API correspondiente, desde el ordenador podríamos lanzar comandos directamente a la Raspberry Pi de manera que podamos indicarle que acelere o que gire desde el propio ordenador.

    Así, sin necesidad de Arduino extra, tendríamos que modificar el coche teledirigido para conectarle las conexiones como corresponda (y no el mando a distancia). Y en este punto ya podríamos realizar los pasos del proyecto anterior relacionados con la conducción autónoma:

    • La Raspberry Pi tomaría las imágenes y las enviaría por WiFi al ordenador (conectado en la misma red local)
    • El ordenador procesaría las imágenes mediante una red neuronal.
    • Las diferentes salidas obtenidas en la red neuronal (acelerar, frenar, girar a izquierda y girar a derecha) las transmitiríamos directamente a la Raspberry Pi desde el ordenador utilizando la WiFi (en la misma red local ambos equipos)

    Por tanto, esta podría ser la forma en la que pretendemos controlar el vehículo, ya que es muy interesante también poder controlar de forma manual desde el ordenador el coche teledirigido, como si de un rover en suelo marciano se tratara, controlándolo desde lugares remotos.

    En la búsqueda de información he encontrado además otros muchos proyectos interesantes para obtener el mismo resultado. Si os interesa saber más podéis acceder a Donkey Car, que tiene pasos muy detallados de cómo crear un vehículo autónomo muy autónomo (que incluso compita en carreras con otros vehículos).

    En este caso, es la propia Raspberry Pi la que implementa la red neuronal mediante el uso de OpenCV (procesado de imágenes y visión por computador) y Tensorflow (red neuronal con Machine Learning para detectar señales, semáforos, etcétera). Así, directamente podríamos instalar estas librerías (todas ellas opensource, código abierto que todo el mundo puede utilizar, modificar, mejorar y compartir) para que sea el propio coche el que conduzca, sin necesidad de ordenador externo (aunque lo seguiremos utilizando para ver qué está viendo y haciendo la red neuronal y dar los comandos de arrancar el vehículo y apagarlo).

    Más información sobre el proyecto

  • Fortune

    Uno de los motivos por los que usamos GNU/Linux (Ubuntu o Debian, según temporadas) a diario en ITERNOVA es que nos permite controlar por completo todas las aplicaciones que utilizamos en el día a día, sin tener que instalar mil drivers y programas innecesarios y redundantes para realizar la menor de las tareas (como puede ser imprimir una página en la impresora). La mayoría de las aplicaciones son simples, lo que hace que sean fáciles de utilizar haciendo únicamente lo que se espera de ellas, sin más florituras.

    Fortune

    Además, el uso del terminal y su línea de comandos permite hacer cosas muy rápidamente (al menos, una vez que te sabes los comandos más usuales). Por ejemplo, una vez que te has acostumbrado cuesta menos escribir nemo que coger el ratón, navegar por menús, buscar el icono entre cientos de iconos y hacer doble click para abrir el explorador de archivos.

    Y como este post va sobre pequeñas aplicaciones y la línea de comandos, voy a contar un secreto de configuración que utilizo. Lo que voy a contar a continuación no sirve para nada absolutamente, pero es divertido.

    Fortune es una pequeña aplicación que coge una frase aleatoria de un fichero de texto y la saca por pantalla. Ya está. Esta aplicación no hace nada más.

    A continuación voy a poner los pasos para que cada vez que abra un terminal aparezca una frase aleatoria de nuestra propia colección.

    En primer lugar, instalaremos fortune:

    sudo apt-get update && sudo apt-get install fortune
    

    Ahora necesitamos un fichero de texto (por ejemplo, fortunes-jorgecasas) en las que escribiremos frases (cuantas más, mejor). Entre frase y frase, pondremos el símbolo de porcentaje en una línea nueva (%). Por ejemplo:

    Everything happens for a reason. Sometimes that reason is that you're stupid and make bad choices.
    %
    Toda ardilla es voladora si la tiras con suficiente fuerza
    %
    Software and cathedrals are much the same – first we build them, then we pray 
    %
    

    Este fichero lo guardaremos en el directorio /usr/share/games/fortunes, en donde habrá otros ficheros de texto (sin extensión) y otros con extensión .dat. Ahora necesitaremos convertir nuestro fichero de texto en .dat para que lo entienda fortune. Para ello ejecutamos:

    strfile -c % fortunes-jorgecasas fortunes-jorgecasas.dat
    

    Ahora, podremos obtener una frase aleatoria escribiendo el siguiente comando (siendo fortunes-jorgecasas el nombre de nuestro fichero de extensión .dat):

    fortune fortunes-jorgecasas
    

    Ahora, en el fichero ~/.bashrc, al final del todo escribiremos el siguiente código, para sacar la frase en color rojo negrita:

    # Fortune quotes with colors
    cli_colorize_normal="$(printf '\033[0m')" # returns to normal
    cli_colorize_red="$(printf '\033[0;1;31m')" # set bold red
    printf "%s" "$cli_colorize_red" ; fortune fortunes-jorgecasas ; printf "%s" "$cli_colorize_normal";
    

    Y con esto, una frase nueva cada vez que abras el terminal… Podéis encontrar mi fichero completo en Github, y completarlo con vuestras propias frases.