Въведение
Скоро, работя по диплома, се сблъсках с необходимостта да създам образ на Ubuntu за едноплатна платка с вече инсталиран ROS (Robot Operating System – операционна система за роботи). Ако кратко, дипломната работа е посветена на управлението на група роботи. Роботите разполагат с два колела и три далекомери. Всичко това се управлява от ROS, който работи на платката ODROID-C2.

Робот Ladybug. Извинявайте за лошото качество на снимката
Нямаше нито време, нито желание да инсталирам ROS на всеки робот поотделно, поради което възникна необходимостта от образ на система с вече инсталиран ROS. Разглеждайки интернет, намерих няколко подхода как това може да се направи.
Общо взето, всички намерени решения могат да бъдат разделени на следните групи.
- Програми, които създават образ на готова и конфигурирана система (, , , systemback и др.)
- Проекти, които позволяват да сглобите свой образ (, )
- Сглобяване на образ ръчно ( и , плюс )
Използването на решения от първата група изглеждаше най-простият и привлекателен вариант, но не успях да създам образ на live-система за ODROID. Решенията от втората група също не ми подхождаха заради значителния праг на влизане. Сглобяването ръчно по наличните уроци също не проработи, тъй като в моя образ нямаше компресирана файлова система.
В крайна сметка, след като попаднах на видео за chroot (chroot — change root, линк към видеото в края на поста) и неговите възможности, реших да го използвам. По-долу ще опиша моя случай на кастомизация на Ubuntu за разработчици на роботика.
Изходни данни:
- Целият процес на модификация на образа (с изключение на записа на SD-картата с помощта на balenaEtcher) се извършва в операционната система Ubuntu 18.04.
- Операционната система, която модифицирах – Ubuntu 18.04.3 mate desktop версия.
- Машината, на която трябва да работи сглобената система – ODROID-C2.
Подготовка на образа
Сваляме образа на Ubuntu за ODROID от
Разпакетиране на архива
unxz –kvСъздаваме директория, в която ще монтираме образа
mkdir mntОпределяме дяла, на който се намира файловата система
fileТърсим дял с файлова система във формат ext2, ext3 или ext4. Нужен ни е адресът на началото на дяла (избран в червено на екрана):

Забележка. Местоположението на файловата система може да бъде видяно и с помощта на утилита parted.Монтираме образа
sudo mount -o loop,offset=$((264192*512)) mnt/Необходимо ни е партиция, която започва от блок 264192 (възможно е цифрите да се различават), размерът на един блок е 512 байта, умножаваме ги, за да получим отстъп в байтове.
Преминаваме в папката с монтираната система и чрутиме в нея
cd mnt/ sudo chroot ~/livecd/mnt/ bin/sh~/livecd/mnt — пълният път до директорията с монтираната система
bin/sh — обвивка (може също да се замени на bin/bash)
Сега можем да започнем инсталацията на необходимите пакети и приложения.
Инсталация на ROS
Инсталирах последната версия на ROS (ROS Melodic) съгласно .
Актуализираме списъка с пакети
sudo apt-get updateТук срещнах грешка:
Err:6 http://deb.odroid.in/c2 bionic InRelease Следните подписи бяха невалидни: EXPKEYSIG 5360FB9DAB19BAC9 Mauro Ribeiro (mdrjr)Тя е свързана с това, че срокът на валидност на ключа за подписване на пакетите е изтекъл. За актуализиране на ключовете въвеждаме:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys AB19BAC9Подготвяме системата за инсталация на 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 updateИнсталираме ROS
За съжаление, не успях да инсталирам версията desktop на ROS, затова инсталирах само основните пакети:sudo apt install ros-melodic-ros-base apt search ros-melodicЗабележка 1. По време на инсталацията понякога се появяваше грешка:
dpkg: error: failed to write status database record about 'iputils-ping' to '/var/lib/dpkg/status': No space left on deviceТя беше отстранена с помощта на почистване на кеша на утилитата apt:
sudo apt-get clean; sudo apt-get autocleanБележка 2. След инсталацията просорсваме (source) с командата:
source /opt/ros/melodic/setup.bashне е възможно, тъй като не стартирахме bash, затова не е необходимо да я въвеждаме в терминала.
Инсталираме необходимите зависимости
sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essentialsudo apt install python-rosdepsudo rosdep init rosdep updateНастройваме права на достъп
Тъй като сме в chroot и всъщност извършваме всички действия от името на суперпотребителя на системата, и ROS ще се стартира само с правата на суперпотребителя.
При опит за стартиране на roscore без sudo възниква грешка: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'За да не възникне грешка, рекурсивно ще променим правата за достъп до домашната директория на потребителя ROS. За целта въвеждаме:
sudo rosdep fix-permissionsИнсталираме пакетите rviz и rqt
sudo apt-get install ros-melodic-rqt ros-melodic-rviz
Финални щрихи
- Излизаме от chroot:
exit - Размонтиране на образа
cd .. sudo umount mnt/ - Записваме образа на системата в архив
xz –ckv1
Готово! Сега с помощта на можете да запишете образа на системата на SD-карта, да я поставите в ODROID-C2 и ще имате Ubuntu с инсталиран ROS!
Линкове:
- С това как да се чрутувате в linux и за какво е необходимо, много помогна това видео:

Източник: habr.com

