Introduzione
Recentemente, mentre lavoravo alla mia tesi, mi sono trovato nella necessità di creare un'immagine di Ubuntu per una scheda singola con già installato ROS (Robot Operating System – sistema operativo per robot). In breve, la mia tesi riguarda la gestione di un gruppo di robot. I robot sono dotati di due ruote e tre sensori di distanza. Tutto viene controllato tramite ROS, che gira sulla scheda ODROID-C2.

Robot Ladybug. Scusate per la bassa qualità della foto
Installare ROS su ciascun robot singolarmente non era né possibile né desiderato, motivo per cui è sorta la necessità di un'immagine di sistema con già installato ROS. Dopo aver navigato su internet, ho trovato diversi approcci su come poterlo fare.
In generale, tutte le soluzioni trovate possono essere suddivise nei seguenti gruppi.
- Programmi che creano un'immagine da un sistema già configurato (, , , systemback e altri)
- Progetti che permettono di costruire la propria immagine (, )
- Creazione dell'immagine manualmente ( e , più )
L'utilizzo di soluzioni dal primo gruppo sembrava l'opzione più semplice e attraente, ma non sono riuscito a creare un'immagine live del sistema per ODROID. Anche le soluzioni del secondo gruppo non erano adatte a causa di un alto livello di difficoltà. Non ho potuto seguire le guide disponibili poiché nel mio immagine non era presente un filesystem compresso.
Alla fine, imbattenendomi in un video su chroot (chroot — cambia la radice, link al video alla fine del post) e le sue possibilità, è stata presa la decisione di utilizzarlo. Di seguito descrivo il mio caso specifico di personalizzazione di Ubuntu per sviluppatori di robotica.
Dati di base:
- L'intero processo di modifica dell'immagine (ad eccezione della scrittura sulla scheda SD tramite balenaEtcher) è stato eseguito nel sistema operativo Ubuntu 18.04.
- Il sistema operativo modificato è stato – Ubuntu 18.04.3 versione desktop mate.
- La macchina su cui deve funzionare il sistema assemblato è – ODROID-C2.
Preparazione dell'immagine
Scarichiamo l'immagine di Ubuntu per ODROID da
Decomprimi l'archivio
unxz –kvCreiamo una directory in cui monteremo l'immagine
mkdir mntIdentifichiamo la partizione in cui si trova il filesystem
fileCercando la partizione con il file system in formato ext2, ext3 o ext4. Abbiamo bisogno dell'indirizzo di inizio della partizione (evidenziato in rosso nello screenshot):

Nota. La posizione del file system può essere vista anche utilizzando l'utility parted.Montiamo l'immagine
sudo mount -o loop,offset=$((264192*512)) mnt/La partizione di interesse inizia con il blocco 264192 (i numeri potrebbero variare), la dimensione di un blocco è di 512 byte, moltiplichiamoli per ottenere l'offset in byte.
Accediamo alla cartella con il sistema montato e facciamo chroot in essa
cd mnt/ sudo chroot ~/livecd/mnt/ bin/sh~/livecd/mnt — il percorso completo alla directory con il sistema montato
bin/sh — shell (può anche essere sostituita con bin/bash)
Ora possiamo occuparci dell'installazione dei pacchetti e delle applicazioni necessarie.
Installazione di ROS
Ho installato l'ultima versione di ROS (ROS Melodic) seguendo .
Aggiorniamo l'elenco dei pacchetti
sudo apt-get updateQui ho riscontrato un errore:
Err:6 http://deb.odroid.in/c2 bionic InRelease Le seguenti firme non erano valide: EXPKEYSIG 5360FB9DAB19BAC9 Mauro Ribeiro (mdrjr)È legato al fatto che il periodo di validità della chiave per firmare i pacchetti è scaduto. Per aggiornare le chiavi digitiamo:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys AB19BAC9Prepariamo il sistema per l'installazione di 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 updateInstalliamo ROS
Sfortunatamente, non sono riuscito a installare la versione desktop di ROS, quindi ho installato solo i pacchetti di base:sudo apt install ros-melodic-ros-base apt search ros-melodicNota 1. Durante l'installazione si è verificato occasionalmente un errore:
dpkg: errore: impossibile scrivere il record dello stato del database riguardante 'iputils-ping' in '/var/lib/dpkg/status': Spazio su dispositivo esauritoÈ stato risolto pulendo la cache dell'utilità apt:
sudo apt-get clean; sudo apt-get autocleanNota 2. Dopo l'installazione, eseguire il comando:
source /opt/ros/melodic/setup.bashnon sarà possibile, poiché non abbiamo avviato bash, quindi NON è necessario digitare nel terminale.
Installiamo le dipendenze necessarie
sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essentialsudo apt install python-rosdepsudo rosdep init rosdep updateConfiguriamo i permessi
Poiché siamo entrati in root e, di fatto, eseguiamo tutte le azioni come utente root del sistema assemblato, anche ROS verrà eseguito solo con i diritti di superutente.
Quando si tenta di avviare roscore senza sudo si verifica un errore: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'Per evitare che si verifichi l'errore, cambiamo ricorsivamente i permessi della home dell'utente ROS. Per fare ciò, digitiamo:
sudo rosdep fix-permissionsInstalliamo i pacchetti rviz e rqt
sudo apt-get install ros-melodic-rqt ros-melodic-rviz
Ultimi ritocchi
- Uscire da chroot:
exit - Smontiamo l'immagine
cd .. sudo umount mnt/ - Imballiamo l'immagine di sistema in un archivio
xz –ckv1
Tutto! Ora con è possibile scrivere l'immagine di sistema su una scheda SD, inserirla in ODROID-C2, e avrete Ubuntu con ROS installato!
Link:
- Informarsi su cosa significhi chroot in Linux e perché sia necessario è stato molto utile grazie a questo video:

Fonte: habr.com

