Instalación de ROS en una imagen IMG de Ubuntu para una placa de un solo tablero

Introducción

Recientemente, mientras trabajaba en mi tesis, me encontré con la necesidad de crear una imagen de Ubuntu para una placa única con ROS ya instalado (Robot Operating System – sistema operativo de robots). En resumen, la tesis se centra en controlar un grupo de robots. Los robots están equipados con dos ruedas y tres sensores de distancia. Todo esto se controla a través de ROS, que se ejecuta en la placa ODROID-C2.

Instalación de ROS en una imagen IMG de Ubuntu para una placa de un solo tablero
Robot Ladybug. Disculpa por la mala calidad de la foto

No había ni tiempo ni ganas de instalar ROS en cada robot por separado, por lo que surgió la necesidad de una imagen del sistema con ROS ya instalado. Tras navegar por Internet, encontré varios enfoques sobre cómo se podría hacer.
En general, todas las soluciones encontradas se pueden clasificar en los siguientes grupos.

  1. Programas que crean una imagen de un sistema ya configurado (Distroshare Ubuntu Imager, linux live kit, linux respin, systemback, etc.)
  2. Proyectos que permiten crear tu propia imagen (yocto, linux from scratch)
  3. Creación manual de una imagen (liveCD customization y su equivalente en ruso, más artículo en habr)

El uso de soluciones del primer grupo parecía la opción más sencilla y atractiva, sin embargo, no pude crear una imagen de sistema live para ODROID. Las soluciones del segundo grupo tampoco me funcionaron debido a un umbral de entrada bastante alto. La creación manual según los tutoriales disponibles tampoco fue viable, ya que mi imagen no tenía un sistema de archivos comprimido.
Al final, tras encontrar un video sobre chroot (chroot — cambiar raíz, enlace al video al final de la publicación) y sus capacidades, se decidió utilizarlo. A continuación, describiré mi caso particular de personalización de Ubuntu para desarrolladores de robótica.

Datos de origen:

  • Todo el proceso de modificación de la imagen (excepto la grabación en la tarjeta SD con balenaEtcher) se realizó en el sistema operativo Ubuntu 18.04.
  • El sistema operativo que modifiqué es Ubuntu 18.04.3 versión desktop mate.
  • La máquina en la que debe funcionar el sistema creado es ODROID-C2.

Preparación de la imagen

  1. Descargamos la imagen de Ubuntu para ODROID desde el sitio oficial

  2. Descomprimimos el archivo

    unxz –kv

  3. Creamos un directorio donde montaremos la imagen

    mkdir mnt

  4. Determinamos la partición donde se encuentra el sistema de archivos

    file

    Buscamos la partición con el sistema de archivos en formato ext2, ext3 o ext4. Necesitamos la dirección de inicio de la partición (resaltada en rojo en la captura de pantalla):

    Instalación de ROS en una imagen IMG de Ubuntu para una placa de un solo tablero

    Nota. La ubicación del sistema de archivos también se puede ver mediante la utilidad parted.

  5. Montamos la imagen

    sudo mount -o loop,offset=$((264192*512))  mnt/

    La partición que necesitamos comienza en el bloque 264192 (sus números pueden diferir), el tamaño de un bloque es de 512 bytes, multiplicamos para obtener el desplazamiento en bytes.

  6. Vamos a la carpeta con el sistema montado y hacemos chroot en ella

    cd mnt/
    sudo chroot ~/livecd/mnt/ bin/sh

    ~/livecd/mnt — la ruta completa al directorio con el sistema montado
    bin/sh — shell (también se puede reemplazar por bin/bash)
    Ahora podemos proceder a instalar los paquetes y aplicaciones necesarios.

Instalación de ROS

Instalé la última versión de ROS (ROS Melodic) siguiendo el tutorial oficial.

  1. Actualizamos la lista de paquetes

    sudo apt-get update

    Aquí tuve un error:

    Err:6 http://deb.odroid.in/c2 bionic InRelease
    Las siguientes firmas no eran válidas: EXPKEYSIG 5360FB9DAB19BAC9 Mauro Ribeiro (mdrjr)

    Está relacionado con el hecho de que la clave para firmar los paquetes ha caducado. Para actualizar las claves, ingrese:

    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys AB19BAC9

  2. Preparando el sistema para la instalación de ROS

    sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

    sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

    sudo apt update

  3. Instalando ROS
    Desafortunadamente, no pude instalar la versión de escritorio de ROS, por lo que solo instalé los paquetes básicos:

    sudo apt install ros-melodic-ros-base
    apt search ros-melodic

    Nota 1. Durante la instalación a veces surgía un error:

    dpkg: error: fallo al escribir el registro de estado sobre 'iputils-ping' en '/var/lib/dpkg/status': No queda espacio en el dispositivo

    Se solucionó limpiando la caché de apt:

    sudo apt-get clean; sudo apt-get autoclean

    Nota 2. Después de la instalación, hay que 'source' con el comando:

    source /opt/ros/melodic/setup.bash

    no funcionará, ya que no hemos iniciado bash, por lo que NO debe ingresarse en la terminal.

  4. Instalamos las dependencias necesarias

    sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential

    sudo apt install python-rosdep

    sudo rosdep init
    rosdep update

  5. Configuramos los permisos
    Dado que hemos hecho chroot y, de hecho, estamos realizando todas las acciones como root del sistema que estamos construyendo, ROS se ejecutará solo con privilegios de superusuario.
    Al intentar ejecutar roscore sin sudo, aparece un error:

    Traceback (most recent call last): File "/opt/ros/melodic/lib/python2.7/dist-packages/roslaunch/__init__.py", line 230, in main write_pid_file(options.pid_fn, options.core, options.port) File "/opt/ros/melodic/lib/python2.7/dist-packages/roslaunch/__init__.py", line 106, in write_pid_file with open(pid_fn, "w") as f: IOError: [Errno 13] Permission denied: '/home/user/.ros/roscore-11311.pid'

    Para evitar que se produzca un error, cambiemos recursivamente los permisos del directorio personal del usuario ROS. Para ello, ingresamos:

    sudo rosdep fix-permissions

  6. Instalamos los paquetes rviz y rqt

    sudo apt-get install ros-melodic-rqt ros-melodic-rviz

Los toques finales

  1. Salimos de chroot:
    exit
  2. Desmontamos la imagen
    cd ..
    sudo umount mnt/
  3. Compactamos la imagen del sistema en un archivo
    xz –ckv1

¡Listo! Ahora con ayuda de balenaEtcher puedes grabar la imagen del sistema en una tarjeta SD, insertarla en ODROID-C2, ¡y tendrás Ubuntu con ROS instalado!

Enlaces:

  • El video sobre cómo utilizar chroot en linux y por qué es necesario fue de gran ayuda:

Reproducir video


Fuente: habr.com
Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster