Installation von ROS im IMG-Image von Ubuntu für Einplatinencomputer

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.

Installation von ROS im IMG-Image von Ubuntu für Einplatinencomputer
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.

  1. Programme, die ein Image eines fertigen und konfigurierten Systems erstellen (Distroshare Ubuntu Imager, linux live kit, linux respin, systemback und andere)
  2. Projekte, die es ermöglichen, ein eigenes Image zu erstellen (yocto, linux from scratch)
  3. Selbstständige Erstellung des Images (liveCD customization und russisches Pendant, plus Artikel auf Habré)

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

  1. Laden Sie das Ubuntu-Image für ODROID von der offiziellen Website

  2. Entpacken Sie das Archiv

    unxz –kv

  3. Erstellen Sie ein Verzeichnis, in das wir das Image einbinden werden

    mkdir mnt

  4. Bestimmen Sie die Partition, auf der sich das Dateisystem befindet

    file

    Suchen 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):

    Installation von ROS im IMG-Image von Ubuntu für Einplatinencomputer

    Hinweis. Der Speicherort des Dateisystems kann auch mit einem Dienstprogramm angesehen werden parted.

  5. 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.

  6. 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äß dem offiziellen Tutorial installiert..

  1. Wir aktualisieren die Paketliste.

    sudo apt-get update

    Hier 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 AB19BAC9

  2. Wir 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 C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

    sudo apt update

  3. Installation 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-melodic

    Hinweis 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 autoclean

    Hinweis 2. Nach der Installation müssen wir source ausführen mit:

    source /opt/ros/melodic/setup.bash

    es wird nicht funktionieren, da wir bash nicht gestartet haben, also ist es NICHT nötig, dies im Terminal einzugeben.

  4. Wir installieren die erforderlichen Abhängigkeiten.

    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. Wir 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-permissions

  6. Installieren Sie die Pakete rviz und rqt nach.

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

Letzte Schliffe

  1. Verlassen wir chroot:
    exit
  2. Unmounten Sie das Image
    cd ..
    sudo umount mnt/
  3. Packen Sie das System-Image in ein Archiv
    xz –ckv1

Alles klar! Jetzt kann balenaEtcher 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:

Video abspielen


Quelle: habr.com
60GB SSD 8Gb DDR4