Instalar ROS en una Raspberry Pi

Ya escribí anteriormente sobre la instalación de rosserial_arduino para la interacción del microcontrolador Arduino con la plataforma robótica ROS en un artículo anterior.. rosserial_arduino es un paquete de la pila rosserial diseñada para la plataforma ROS y "convierte" la placa Arduino en un nodo ROS independiente con el que otros componentes del sistema pueden interactuar. Cuando se usa Arduino para proyectos robóticos, hay una limitación significativa: Arduino no se puede usar como un nodo informático completo que pueda manejar todas las operaciones requeridas para el funcionamiento normal del robot. Por ejemplo, no puede ejecutar scripts de OpenCV en él para tareas de visión por computadora. En este artículo quiero hablar sobre mi experiencia instalando un sistema ROS y conectando un Arduino a una microcomputadora Raspberry Pi usando el ya conocido paquete rosserial_arduino.

imagen


Motivación


Después de conocer la plataforma rosserial_arduino, tuve una pregunta: ¿puedo usar Arduino de alguna manera junto con una microcomputadora más potente de tal manera que el robot sea más independiente de la computadora portátil?
Entonces tuve la idea de probar ROS en una microcomputadora Raspberry Pi. La Raspberry Pi es una mini computadora independiente en el tablero. Tiene un chip de CPU, un chip de gráficos, una ranura para tarjeta SD, una entrada de Ethernet, varias interfaces USB y una salida de video HDMI para conectar un monitor. Puede conectar un mouse, teclado y un HDD externo a las entradas USB.
La combinación de Raspberry Pi y Arduino es muy prometedora y se ha utilizado repetidamente en proyectos robóticos.
Raspberry Pi también le permite conectar una cámara (cámara web o cámara especial RPi Board). Un simple robot con ruedas en una placa Arduino Uno modificada cayó en mis manos hace un año. Justo ahora, en mis manos estaba el Raspberry Pi Modelo B.

imagen

Instalación del sistema operativo en la Raspberry Pi


Primero necesita instalar la distribución de Linux en la "frambuesa". La forma más fácil de hacerlo es con el administrador de instalación del sistema operativo NOOBS. Cómo hacerlo se puede leer en este manual en el portal oficial de Raspberry Pi .
Elegí instalar Raspbian, una distribución Debian modificada diseñada específicamente para Raspberry.
Nota: al conectar un monitor, a menudo hay problemas con la visualización de una imagen, en particular, esto sucede con monitores más antiguos que no tienen una entrada HDMI. Aquí el archivo config.txt nos ayuda: el archivo de configuración Raspberry para la configuración del monitor. En algunos casos, ya está en el archivo de imágenes del sistema (Raspbian), en el caso de NOOBS debe crearse en la raíz de la tarjeta SD.
Inserte las siguientes líneas en el archivo:

# For more options and information see
# http://www.raspberrypi.org/documentation/configuration/config-txt.md
# Some settings may impact device functionality. See link above for details
 
# uncomment if you get no picture on HDMI for a default "safe" mode
hdmi_safe=1
 
# uncomment this if your display has a black border of unused pixels visible
# and your display can output without overscan
#disable_overscan=1
 
# uncomment the following to adjust overscan. Use positive numbers if console
# goes off screen, and negative if there is too much border
#overscan_left=16
#overscan_right=16
#overscan_top=16
#overscan_bottom=16
 
# uncomment to force a console size. By default it will be display's size minus
# overscan.
#framebuffer_width=1280
#framebuffer_height=720
 
# uncomment if hdmi display is not detected and composite is being output
hdmi_force_hotplug=1
 
# uncomment to force a specific HDMI mode (this will force VGA)
#hdmi_group=1
#hdmi_mode=1
 
# uncomment to force a HDMI mode rather than DVI. This can make audio work in
# DMT (computer monitor) modes
#hdmi_drive=2
 
# uncomment to increase signal to HDMI, if you have interference, blanking, or
# no display
config_hdmi_boost=4
 
# uncomment for composite PAL
#sdtv_mode=2
 
#uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=800


En este caso, las líneas importantes son:

hdmi_safe=1
hdmi_force_hotplug=1
config_hdmi_boost=4


En mi caso, estos ajustes permitieron obtener la imagen correcta en un monitor con entrada VGA.

Configurar el acceso remoto a la Raspberry Pi


Puede conectarse a la placa Raspberry Pi a través de la red a través de SSH. Para hacer esto, la Raspberry Pi debe estar conectada a la red mediante un cable Ethernet (hay una entrada especial en la placa para esto) o mediante un adaptador Wi-Fi conectado a un puerto USB. Cuando conecta un cable Ethernet, Raspberry recibe automáticamente una dirección IP en la red e inmediatamente está disponible.
Si usa un adaptador, debe realizar una serie de procedimientos simples.
Utilicé el siguiente adaptador Wi-Fi TPLINK:

imagen

conecte el adaptador al puerto USB y compruebe si el dispositivo detecta el dispositivo en el sistema

$ iwconfig

Ahora escaneamos el espacio para buscar redes inalámbricas disponibles:

$ sudo iwlist wlan0 scan

El campo ESSID en la salida del comando indica el nombre del punto de acceso.
Ahora conéctese al punto de acceso para el cifrado WPA utilizando la utilidad wpa_supplicant.
Usando la utilidad wpa_passphrase, que es parte del paquete wpa_supplicant, generamos una contraseña basada en la clave de acceso:

$ wpa_passphrase <hotspot_name> <hotspot_access_key>

donde hotspot_name y hotspot_access_key son el nombre del punto de acceso y la clave de acceso, respectivamente.
La utilidad devuelve la cadena psk generada.
Luego, todo el bloque de red, que contiene el ssid de red y la línea psk, se inserta al final del archivo de configuración /etc/wpa_supplicant/wpa_supplicant.conf y se guarda. Finalmente, reiniciamos nuestra Raspberry Pi y verificamos la conexión de red.
Para conectarse a través de SSH en la terminal de la computadora, debe ejecutar el comando:

$ ssh pi@<raspi_ip>

donde <raspi_ip> es la dirección IP de frambuesa, que puede reconocerse mediante el comando ifconfig ejecutado directamente en el terminal de frambuesa.
Para conectarse a través de SSH con la capacidad de ejecutar aplicaciones gráficas, use el comando:

$ ssh -X pi@<raspi_ip>

Puede conectarse a "Malinka" en el modo de escritorio remoto utilizando el programa Virtual Network Computing (VNC). La gestión se lleva a cabo transmitiendo las pulsaciones del teclado y los movimientos del mouse de una computadora a otra y transmitiendo el contenido de la pantalla a través de una red informática. El sistema VNC es independiente de la plataforma.
Primero, instale el servidor VNC en la Raspberry Pi usando el comando en la terminal:

$ sudo apt-get install tightvncserver

Una vez completada la instalación, ejecute el comando:

$ vncserver :1 -geometry 1280x800 -depth 16

Este comando iniciará el servidor VNC. En este caso, esto significa que se está ejecutando una sesión X virtual (presentación virtual del escritorio Raspberry Pi). Ahora, después de iniciar el cliente VNC y conectarse a él, se conectará a este escritorio virtual.
Parámetro: 1 define el número de puerto en el que se ejecutará el proceso VNC. El parámetro de geometría establece la resolución (en este caso, el tamaño) del escritorio virtual. El parámetro de profundidad determina la profundidad de color de la pantalla del escritorio en bits (8, 16 y 24, el valor predeterminado es 16).
En el primer inicio, el servidor VNC le pedirá que ingrese una contraseña, que se le solicitará cuando se conecte al escritorio remoto.
Ahora instale el cliente VNC en una computadora de escritorio:

$ sudo apt-get install xtightvncviewer

Estamos listos para conectarnos al escritorio remoto "Malinka":

$ vncviewer <raspi_ip>:1

e ingrese la contraseña.
Se abre una ventana con una imagen de escritorio similar a esta:

imagen

Vale la pena señalar que cada vez que reinicia una frambuesa, el servidor VNC debe reiniciarse.

Conecte Arduino a Raspberry Pi


El Arduino se puede conectar a la Raspberry Pi tan fácilmente como a una computadora normal. Para comenzar, instale el IDE de Arduino en la Raspberry Pi:

$ sudo apt-get update
$ sudo apt-get install arduino

Inicie el comando Arduino IDE:

$ arduino

El IDE Arduino se conecta a la Raspberry Pi a través de su cable de programación USB. Dicha conexión requiere que la consola serie esté desconectada. Por defecto, Raspberry Pi configura el puerto serie (GPIO14-GPIO15) para proporcionar información de arranque. También le permite iniciar sesión en su Raspberry Pi a través de un dispositivo conectado. Para poder programar Arduino, debe deshabilitar esta opción de forma predeterminada.
Para deshabilitar la autorización, edite el archivo de sistema inittab:

$ sudo nano /etc/inittab


Encuentra la línea:

T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

comentarlo:

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

Después de eso, guarde y cierre el archivo.
Al arrancar, la Raspberry Pi envía mensajes de depuración al puerto serie. Esto puede ser útil en algunos casos, pero ahora necesitamos deshabilitar esta funcionalidad. Para hacer esto, edite el archivo de sistema cmdline.txt:

$ sudo nano /boot/cmdline.txt

Encuentra la línea:

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

y elimine el bloque de parámetros de la consola para obtener una línea como esta:

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

Guarde y cierre el archivo.
Para que el sistema aplique los cambios, debe reiniciar Raspberry Pi:

$ sudo reboot

Ahora puede conectar la placa Arduino al puerto USB de la Raspberry Pi, configurar el IDE Arduino para su modelo de placa Arduino y cargar el boceto.

Configuración de ROS y rosserial_arduino


Elegí instalar ROS Indigo. Las instrucciones de instalación de ROS Indigo se describen en detalle en la página oficial .
Recomiendo instalar la opción de instalación ROS-Comm. Desde mi propia experiencia, puedo decir que instalar la opción de escritorio puede llevar mucho tiempo del orden del mediodía.
Después de instalar ROS y resolver todas las dependencias con la utilidad rosdep, simplemente compilamos catkin_workspace:

$ catkin_make
$ catkin_make install


Ejecución de bocetos rosserial_arduino en Raspberry Pi


Ahora tenemos instalado rosserial_arduino y podemos ejecutarlo:

$ roslaunch rosserial_python serial_node.py /de/ttyACM0

Al iniciar el servidor rosserial, puede producirse un error: no hay ningún módulo llamado diagnostico_msgs.msg.
Para resolver el problema, debe descargar desde el repositorio oficial de ROS la fuente de los mensajes ROS : common_msgs que no están en la instalación, y cargarlo en la carpeta del paquete rosserial en la carpeta del espacio de trabajo, luego compilar ROS:

$ catkin_make install

¡Comentario! Al cargar bocetos en el IDE de Arduino, puede producirse un error de "error grave: cadena: no se finalizó la compilación de dicho archivo o directorio". Esto significa que tenemos tipos de mensajes ROS en ros_lib, pero también deben compilarse en los tipos correspondientes para Arduino. Necesita compilarlos de esta manera:

$ cd <sketchbook>/libraries
$ rm -rf ros_lib
$ rosrun rosserial_python make_libraries.py .

Ahora puede trabajar con rosserial_arduino en la Raspberry Pi de la misma manera que en una computadora normal: cree nodos, suscríbase a temas, publique temas, etc.
Puede conectar una cámara RPi Board a la Raspberry Pi y usar el paquete cv_bridge ROS (la interfaz ROS para interactuar con OpenCV, la descripción se puede encontrar aquí ) para realizar tareas de visión por computadora.
Por cierto, mi robot está completamente armado:

imagen

imagen

Conclusión


Espero que este artículo sea una buena entrada para que comience a trabajar con ROS en la Raspberry Pi y tenga sus propias ideas para usar la Raspberry Pi junto con Arduino u otros microcontroladores de este tipo. ¡Les deseo buena suerte en sus experimentos y proyectos y espero compartir pronto mis nuevas ideas en los siguientes artículos!

PD: Algunas instrucciones están tomadas del libro por V. Petin, “Electrónica. Microcomputadoras Raspberry Pi. Guía práctica.

Source: https://habr.com/ru/post/es385493/


All Articles