Instalacja ROS w obrazie IMG Ubuntu dla jednoplatformowego komputera

Wprowadzenie

Ostatnio, pracując nad pracą dyplomową, stanąłem przed koniecznością stworzenia obrazu Ubuntu dla jednopłytkowego komputera z już zainstalowanym ROS (Robot Operating System – system operacyjny robotów). W skrócie, praca dyplomowa dotyczy zarządzania grupą robotów. Roboty wyposażone są w dwa koła i trzy dalmierze. Całość jest kontrolowana z ROS, który działa na płycie ODROID-C2.

Instalacja ROS w obrazie IMG Ubuntu dla jednoplatformowego komputera
Robot Ladybug. Przepraszam za słabą jakość zdjęcia

Nie miałem ani czasu, ani chęci, aby instalować ROS na każdym robocie z osobna, w związku z czym pojawiła się potrzeba uzyskania obrazu systemu z już zainstalowanym ROS. Przeszukując zasoby internetu, znalazłem kilka podejść do tego, jak można to zrobić.
Ogólnie wszystkie znalezione rozwiązania można podzielić na następujące grupy.

  1. Programy tworzące obraz z gotowego i skonfigurowanego systemu (Distroshare Ubuntu Imager, linux live kit, linux respin, systemback i inne)
  2. Projekty, które pozwalają na stworzenie własnego obrazu (yocto, linux from scratch)
  3. Samodzielne tworzenie obrazu (liveCD customization i rosyjski odpowiednik, plus artykuł na habrze)

Użycie rozwiązań z pierwszej grupy wydawało się najprostszym i najbardziej atrakcyjnym rozwiązaniem, jednak nie udało mi się stworzyć obrazu systemu live dla ODROID. Rozwiązania z drugiej grupy również nie były dla mnie odpowiednie z powodu zbyt wysokiego progu wejścia. Samodzielne tworzenie zgodnie z posiadanymi tutorialami również nie pasowało, ponieważ w moim obrazie nie było skompresowanego systemu plików.
Ostatecznie, natrafiając na wideo o chroot (chroot — change root, link do wideo na końcu postu) i jego możliwościach, postanowiłem go użyć. Poniżej opiszę mój szczególny przypadek dostosowywania Ubuntu dla programistów robotyki.

Dane wyjściowe:

  • Cały proces modyfikacji obrazu (z wyjątkiem zapisywania na karcie SD za pomocą balenaEtcher) odbywał się w systemie operacyjnym Ubuntu 18.04.
  • System operacyjny, który modyfikowałem – Ubuntu 18.04.3 wersja mate desktop.
  • Maszyna, na której będzie działał zebrany system – ODROID-C2.

Przygotowanie obrazu

  1. Pobieramy obraz Ubuntu dla ODROID z oficjalnej strony

  2. Rozpakowujemy archiwum

    unxz –kv

  3. Tworzymy katalog, w który zamontujemy obraz

    mkdir mnt

  4. Określamy partycję, na której znajduje się system plików

    file

    Szukamy partycji z systemem plików w formacie ext2, ext3 lub ext4. Potrzebujemy adresu początku partycji (wyróżniony na czerwono na zrzucie):

    Instalacja ROS w obrazie IMG Ubuntu dla jednoplatformowego komputera

    Uwaga. Lokalizację systemu plików można również sprawdzić za pomocą narzędzia parted.

  5. Montowanie obrazu

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

    Szukany przez nas partycja zaczyna się od bloku 264192 (u ciebie liczby mogą się różnić), rozmiar jednego bloku to 512 bajtów, pomnóżmy je, aby uzyskać przesunięcie w bajtach.

  6. Przechodzimy do folderu z zamontowanym systemem i wchodzimy w niego.

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

    ~/livecd/mnt — pełna ścieżka do katalogu z zamontowanym systemem
    bin/sh — powłoka (można również zastąpić na bin/bash)
    Teraz możemy zająć się instalacją potrzebnych pakietów i aplikacji.

Instalacja ROS

Instalowałem ROS najnowszej wersji (ROS Melodic) zgodnie z oficjalnym samouczkiem..

  1. Aktualizujemy listę pakietów

    sudo apt-get update

    Tutaj napotkałem błąd:

    Err:6 http://deb.odroid.in/c2 bionic InRelease
    The following signatures were invalid: EXPKEYSIG 5360FB9DAB19BAC9 Mauro Ribeiro (mdrjr)

    Jest to spowodowane tym, że ważność klucza do podpisywania pakietów wygasła. Aby zaktualizować klucze, wpisz:

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

  2. Przygotowujemy system do instalacji 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. Instalujemy ROS
    Niestety, nie udało mi się zainstalować wersji desktop ROS, więc zainstalowałem tylko podstawowe pakiety:

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

    Uwaga 1. W trakcie instalacji czasami występował błąd:

    dpkg: error: failed to write status database record about 'iputils-ping' to '/var/lib/dpkg/status': No space left on device

    Można to naprawić, czyściąc pamięć podręczną narzędzia apt:

    sudo apt-get clean; sudo apt-get autoclean

    Uwaga 2. Po instalacji należy źródło (source) wykonać poleceniem:

    source /opt/ros/melodic/setup.bash

    nie będzie możliwe, ponieważ nie uruchomiliśmy bash, więc nie trzeba tego wpisywać w terminalu.

  4. Instalujemy potrzebne zależności

    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. Ustawiamy prawa dostępu
    Ponieważ jesteśmy w trybie chroot i faktycznie wykonujemy wszystkie działania jako root systemu, więc ROS będzie uruchamiany wyłącznie z prawami superużytkownika.
    Przy próbie uruchomienia roscore bez sudo pojawia się błąd:

    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'

    Aby błąd nie występował, rekursywnie zmieńmy uprawnienia do katalogu domowego użytkownika ROS. W tym celu wpisujemy:

    sudo rosdep fix-permissions

  6. Instalujemy pakiety rviz i rqt

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

Ostatnie szlify

  1. Wychodzimy z chroot:
    exit
  2. Odmontowujemy obraz
    cd ..
    sudo umount mnt/
  3. Pakujemy obraz systemu do archiwum
    xz –ckv1

Wszystko! Teraz za pomocą balenaEtcher można zapisać obraz systemu na karcie SD, włożyć do ODROID-C2, a będziesz mieć Ubuntu z zainstalowanym ROS!

Linki:

  • Z tym jak chrootować w linuxie i po co to jest, bardzo pomogło to wideo:

Odtwarzaj wideo


Źródło: habr.com
Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster