Einführung
Kürzlich musste ich, während ich an meiner Diplomarbeit arbeitete, ein Ubuntu-Image für einen Einplatinencomputer mit bereits installiertem ROS erstellen (Robot Operating System – Betriebssystem für Roboter). Kurz gesagt, die Diplomarbeit beschäftigt sich mit der Steuerung einer Gruppe von Robotern. Die Roboter sind mit zwei Rädern und drei Entfernungsmesstern ausgestattet. Alles wird über ROS gesteuert, das auf einer ODROID-C2-Platine läuft.

Roboter Ladybug. Entschuldigung für die schlechte Bildqualität
Es gab weder Zeit noch Lust, ROS auf jedem Roboter einzeln zu installieren, weshalb die Notwendigkeit für ein Systemimage mit bereits installiertem ROS entstand. Im Internet fand ich mehrere Ansätze, wie das gemacht werden könnte.
Insgesamt können alle gefundenen Lösungen in folgende Gruppen unterteilt werden.
- Programme, die ein Image eines fertigen und konfigurierten Systems erstellen (, , , systemback und andere)
- Projekte, die es ermöglichen, ein eigenes Image zu erstellen (, )
- Selbstständige Erstellung des Images ( und , plus )
Die Verwendung von Lösungen aus der ersten Gruppe schien die einfachste und attraktivste Option zu sein, jedoch gelang es mir nicht, ein Live-System-Image für ODROID zu erstellen. Die Lösungen der zweiten Gruppe passten ebenfalls nicht, da der Einstiegswiderstand zu hoch war. Auch die manuelle Erstellung nach vorhandenen Tutorials kam nicht infrage, da mein Image kein komprimiertes Dateisystem hatte.
Schließlich stieß ich auf ein Video über chroot (chroot — change root, Link zum Video am Ende des Beitrags) und dessen Möglichkeiten, weshalb entschieden wurde, es zu verwenden. Im Folgenden beschreibe ich meinen spezifischen Fall der Anpassung von Ubuntu für Entwickler der Robotik.
Eckdaten:
- Der gesamte Prozess der Modifikation des Images (mit Ausnahme der Aufnahme auf die SD-Karte mit balenaEtcher) wurde im Betriebssystem Ubuntu 18.04 durchgeführt.
- Betriebssystem, dessen Build ich modifiziert habe – Ubuntu 18.04.3 Mate-Desktop-Version.
- Die Maschine, auf der das erstellte System laufen soll – ODROID-C2.
Vorbereitung des Images
Laden Sie das Ubuntu-Image für ODROID von
Entpacken Sie das Archiv
unxz –kvErstellen Sie ein Verzeichnis, in das wir das Image einbinden werden
mkdir mntBestimmen Sie die Partition, auf der sich das Dateisystem befindet
fileSuchen Sie die Partition mit dem Dateisystem im ext2-, ext3- oder ext4-Format. Wir benötigen die Adresse des Beginns der Partition (rot markiert im Screenshot):

Hinweis. Der Speicherort des Dateisystems kann auch mit einem Dienstprogramm angesehen werden parted.Wir mounten das Abbild
sudo mount -o loop,offset=$((264192*512)) mnt/Der benötigte Abschnitt beginnt mit Block 264192 (die Zahlen können bei Ihnen abweichen), die Größe eines Blocks beträgt 512 Byte, multiplizieren wir sie, um den Offset in Byte zu erhalten.
Wir gehen in den Ordner mit dem gemounteten System und chrooten uns hinein.
cd mnt/ sudo chroot ~/livecd/mnt/ bin/sh~/livecd/mnt — vollständiger Pfad zum Verzeichnis mit dem gemounteten System
bin/sh — Shell (kann auch ersetzt werden durch bin/bash)
Jetzt können wir mit der Installation der benötigten Pakete und Anwendungen beginnen.
Installation von ROS
Ich habe ROS der neuesten Version (ROS Melodic) gemäß .
Wir aktualisieren die Paketliste.
sudo apt-get updateHier hatte ich einen Fehler:
Err:6 http://deb.odroid.in/c2 bionic InRelease Die folgenden Signaturen waren ungültig: EXPKEYSIG 5360FB9DAB19BAC9 Mauro Ribeiro (mdrjr)Dies hängt damit zusammen, dass die Gültigkeit des Schlüssels zum Signieren der Pakete abgelaufen ist. Um die Schlüssel zu aktualisieren, geben wir ein:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys AB19BAC9Wir bereiten das System für die Installation von ROS vor.
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 updateInstallation von ROS
Leider konnte ich die Desktop-Version von ROS nicht installieren, daher habe ich nur die Basispakete installiert:sudo apt install ros-melodic-ros-base apt search ros-melodicHinweis 1. Während der Installation trat manchmal ein Fehler auf:
dpkg: Fehler: konnte den Statusdatenbankeintrag über 'iputils-ping' nicht in '/var/lib/dpkg/status' schreiben: Kein Speicherplatz auf dem Gerät.Dies wurde durch das Leeren des apt-Caches behoben:
sudo apt-get clean; sudo apt-get autocleanHinweis 2. Nach der Installation müssen wir source ausführen mit:
source /opt/ros/melodic/setup.bashes wird nicht funktionieren, da wir bash nicht gestartet haben, also ist es NICHT nötig, dies im Terminal einzugeben.
Wir installieren die erforderlichen Abhängigkeiten.
sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essentialsudo apt install python-rosdepsudo rosdep init rosdep updateWir konfigurieren die Zugriffsrechte.
Da wir chrootet sind und tatsächlich alle Aktionen im Namen des root-Systems ausführen, wird auch ROS nur mit Superuser-Rechten gestartet.
Beim Versuch, roscore ohne sudo zu starten, tritt ein Fehler auf:Traceback (most recent call last): Datei "/opt/ros/melodic/lib/python2.7/dist-packages/roslaunch/__init__.py", Zeile 230, in main write_pid_file(options.pid_fn, options.core, options.port) Datei "/opt/ros/melodic/lib/python2.7/dist-packages/roslaunch/__init__.py", Zeile 106, in write_pid_file with open(pid_fn, "w") as f: IOError: [Errno 13] Permission denied: '/home/user/.ros/roscore-11311.pid'Um den Fehler zu vermeiden, ändern wir die Zugriffsrechte für das Home-Verzeichnis des ROS-Benutzers rekursiv. Geben Sie hierfür ein:
sudo rosdep fix-permissionsInstallieren Sie die Pakete rviz und rqt nach.
sudo apt-get install ros-melodic-rqt ros-melodic-rviz
Letzte Schliffe
- Verlassen wir chroot:
exit - Unmounten Sie das Image
cd .. sudo umount mnt/ - Packen Sie das System-Image in ein Archiv
xz –ckv1
Alles klar! Jetzt kann das System-Image auf eine SD-Karte geschrieben, in den ODROID-C2 eingesetzt werden, und Sie haben Ubuntu mit installiertem ROS!
Links:
- Wie man in Linux chroot macht und warum das nötig ist, hat mir dieses Video sehr geholfen:

Quelle: habr.com

