Introducción
Normalmente cuando estamos por empezar a crear nuestro robot nos basamos en las imágenes de Ubiquity. Las mismas están basadas en Ubuntu 16.04, por lo que utilizan ROS kinetic.
Las imágenes están geniales, es clonar, insertar una SD en el lector, presionar el botón de grabar en Etcher y listo!
Pero bueno… ROS kinetic tiene un EOL para Abril del 2021(Xenial EOL). Y ROS melodic para 2023! Así que hice lo que cualquier persona haría, dedicar un fin de semana a crear su propia imagen de Ubuntu para una raspberry pi 3 con ROS Melodic.
Imagen SD
La imagen está basada en Ubuntu Core Ubuntu Server.
Instalada mediante rpi-imager.
Ubuntu Server para ARM incluye todo lo que busca en un sistema operativo de servidor, que incluye:
- El hipervisor de contenedor LXD, que le brinda acceso instantáneo a entornos aislados y seguros que se ejecutan con un rendimiento completo
- Tecnología de contenedor de aplicaciones basada en Docker y Kubernetes, incluida la FAN-based Network
Antes se seguir, no se si ubuntu Core Server es la mejor opción para robots.
Mi idea es poder correr ROS melodic en containers Docker, por lo que todo va a estar aislado (idealmente).
Conectarse a la raspi
Para conectarme a la raspberry, utilizo un AP creado en la misma placa. El mismo se puede configurar siguiendo el tutorial oficial y con la ayuda de este otro en algunos casos.
La configuración del AP podemos editarla haciendo sudo vim /etc/hostapd/hostapd.conf
country_code=AR
interface=wlan0
bridge=br0
ssid=robot
hw_mode=g
channel=4
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
Donde ssid lo tienen que modificar por el nombre de la red que quieran y wpa_passphrase por una clave más segura (al menos no es la más usada). Contraseñas muy complicadas en estos robots que realizan tareas no críticas, no tienen mucho sentido. Pero en la vida real, usen contraseñas seguras, sino después aparecen en páginas.
NOTA
usuario : ubuntu
contraseña : snowbot123
dirección de ip: 192.168.5.1
Entonces, buscamos robot en la lista de wifi, nos conectamos poniendo la clave 12345678 y ya estamos adentro! La raspberry nos va a asignar una IP del pool indicado en /etc/dnsmasq.conf, que van del 100 al 200. Por lo que, si hacemos ifconfig en nuestra PC, nos debería salir una ip en ese rango:
$ ifconfig
....
192.168.5.143
...
Una vez conectado al AP del robot, podemos conectarnos a la raspberry mediante ssh haciendo desde la terminal de nuestra PC:
$ ssh ubuntu@192.168.5.1
Listo!
¿Mejoras?
En stand-by tenemos un promedio de 30 tareas y 110Mb de RAM ocupada en la nueva imagen. Mientras que en la imagen de Ubiquity tenemos 80 tareas y 200Mb de RAM. ¿Porque la diferencia en RAM? en la imagen que armé no hay entorno gráfico :D
Las terminales son mas cool y, al fin y al cabo, no necesito una pantalla en mis robots. En futuros post espero seguir contando los resultados de ROS con Docker en la Raspberry.