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.

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.
- Programas que crean una imagen de un sistema ya configurado (, , , systemback, etc.)
- Proyectos que permiten crear tu propia imagen (, )
- Creación manual de una imagen ( y , más )
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
Descargamos la imagen de Ubuntu para ODROID desde
Descomprimimos el archivo
unxz –kvCreamos un directorio donde montaremos la imagen
mkdir mntDeterminamos la partición donde se encuentra el sistema de archivos
fileBuscamos 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):

Nota. La ubicación del sistema de archivos también se puede ver mediante la utilidad parted.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.
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 .
Actualizamos la lista de paquetes
sudo apt-get updateAquí 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 AB19BAC9Preparando 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 C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654sudo apt updateInstalando 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-melodicNota 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 dispositivoSe solucionó limpiando la caché de apt:
sudo apt-get clean; sudo apt-get autocleanNota 2. Después de la instalación, hay que 'source' con el comando:
source /opt/ros/melodic/setup.bashno funcionará, ya que no hemos iniciado bash, por lo que NO debe ingresarse en la terminal.
Instalamos las dependencias necesarias
sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essentialsudo apt install python-rosdepsudo rosdep init rosdep updateConfiguramos 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-permissionsInstalamos los paquetes rviz y rqt
sudo apt-get install ros-melodic-rqt ros-melodic-rviz
Los toques finales
- Salimos de chroot:
exit - Desmontamos la imagen
cd .. sudo umount mnt/ - Compactamos la imagen del sistema en un archivo
xz –ckv1
¡Listo! Ahora con ayuda de 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:

Fuente: habr.com

