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.

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.
- Programy tworzące obraz z gotowego i skonfigurowanego systemu (, , , systemback i inne)
- Projekty, które pozwalają na stworzenie własnego obrazu (, )
- Samodzielne tworzenie obrazu ( i , plus )
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
Pobieramy obraz Ubuntu dla ODROID z
Rozpakowujemy archiwum
unxz –kvTworzymy katalog, w który zamontujemy obraz
mkdir mntOkreślamy partycję, na której znajduje się system plików
fileSzukamy partycji z systemem plików w formacie ext2, ext3 lub ext4. Potrzebujemy adresu początku partycji (wyróżniony na czerwono na zrzucie):

Uwaga. Lokalizację systemu plików można również sprawdzić za pomocą narzędzia parted.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.
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 .
Aktualizujemy listę pakietów
sudo apt-get updateTutaj 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 AB19BAC9Przygotowujemy 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 C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654sudo apt updateInstalujemy 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-melodicUwaga 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 deviceMożna to naprawić, czyściąc pamięć podręczną narzędzia apt:
sudo apt-get clean; sudo apt-get autocleanUwaga 2. Po instalacji należy źródło (source) wykonać poleceniem:
source /opt/ros/melodic/setup.bashnie będzie możliwe, ponieważ nie uruchomiliśmy bash, więc nie trzeba tego wpisywać w terminalu.
Instalujemy potrzebne zależności
sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essentialsudo apt install python-rosdepsudo rosdep init rosdep updateUstawiamy 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-permissionsInstalujemy pakiety rviz i rqt
sudo apt-get install ros-melodic-rqt ros-melodic-rviz
Ostatnie szlify
- Wychodzimy z chroot:
exit - Odmontowujemy obraz
cd .. sudo umount mnt/ - Pakujemy obraz systemu do archiwum
xz –ckv1
Wszystko! Teraz za pomocą 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:

Źródło: habr.com

