Установка ROS в IMG-образ Ubuntu для одноплатника

Введение

На днях, работая над дипломом, столкнулся с необходимостью создания образа Ubuntu для одноплатника с уже установленным ROS (Robot Operating System – операционная система роботов). Если кратко, то диплом посвящен управлению группой роботов. Роботы оснащены двумя колесами и тремя дальномерами. Управляется все это дело из ROS, который крутится на плате ODROID-C2.

Фото робота
Робот Ladybug. Сорри, за плохое качество фото

Устанавливать ROS на каждого робота в отдельности не было ни времени, ни желания, в связи с чем возникла потребность в образе системы с уже установленным ROS. Прогулявшись по просторам интернета, нашел несколько подходов к тому, как это можно было бы сделать.
В целом все найденные решения можно разбить на следующие группы.

  1. Программы, создающие образ с готовой и настроенной системы (Distroshare Ubuntu Imager, linux live kit, linux respin, systemback и др.)
  2. Проекты, позволяющие собрать свой образ (yocto, linux from scratch)
  3. Сборка образа ручками самому (liveCD customization и русский аналог, плюс статья на хабре)

Использование решений из первой группы казалось самым простым и привлекательным вариантом, однако создать образ live-системы для ODROID у меня так и не получилось. Решения второй группы также мне не подошли из-за достаточного высокого порога вхождения. Сборка ручками по имевшимся туториалам также не подходила, т.к. в моем образе не было сжатой файловой системы.
В итоге наткнувшись на видео про chroot (chroot — change root, ссылка на видео в конце поста) и его возможности, решено было использовать его. Далее опишу свой частный случай кастомизации Ubuntu для разработчиков робототехники.

Исходные данные:

  • Весь процесс модификации образа (за исключением записи на SD-карту с использованием balenaEtcher) выполнялся в операционной системе Ubuntu 18.04.
  • Операционная система, сборку которой модифицировал – Ubuntu 18.04.3 mate desktop версия.
  • Машина, на которой должна работать собранная система – ODROID-C2.

Подготовка образа

  1. Скачиваем образ Ubuntu для ODROID с официального сайта

  2. Распаковываем архив

    unxz –kv <файл архива с образом>

  3. Создаем директорию, в которую будем монтировать образ

    mkdir mnt

  4. Определяем раздел, на котором располагается файловая система

    file <файл образа>

    Ищем раздел с файловой системой в формате ext2, ext3 или ext4. Нам нужен адрес начала раздела (выделен красным на скрине):

    Скрин консоли с разбиением на раздела

    Примечание. Расположение файловой системы можно также посмотреть с помощью утилиты parted.

  5. Монтируем образ

    sudo mount -o loop,offset=$((264192*512)) <файл с образом> mnt/

    Нужный нам раздел начинается с блока 264192 (у вас цифры могут отличаться), размер одного блока — 512 байт, перемножаем их, чтобы получить отступ в байтах.

  6. Переходим в папку со смонтированной системой и чрутимся в ней

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

    ~/livecd/mnt — полный путь до директории со смонтированной системой
    bin/sh — оболочка (можно также заменить на bin/bash)
    Теперь можно уже заниматься установкой необходимых пакетов и приложений.

Установка ROS

Я ставил ROS последней версии (ROS Melodic) по официальному туториалу.

  1. Обновляем список пакетов

    sudo apt-get update

    Здесь у меня возникала ошибка:

    Err:6 http://deb.odroid.in/c2 bionic InRelease
    The following signatures were invalid: EXPKEYSIG 5360FB9DAB19BAC9 Mauro Ribeiro (mdrjr) <mauro.ribeiro@hardkernel.com>

    Она связана с тем, что срок действия ключа для подписи пакетов истек. Для обновления ключей набираем:

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

  2. Готовим систему для установки 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. Устанавливаем 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, поэтому ее НЕ надо набирать в терминале.

  4. Устанавливаем необходимые зависимости

    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. Настраиваем права доступа
    Поскольку мы зачрутились и, фактически, выполняем все действия от имени root собираемой системы, то и 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

  6. Доустанавливаем пакеты rviz и rqt

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

Финальные штрихи

  1. Выходим из chroot:
    exit
  2. Размонтируем образ
    cd ..
    sudo umount mnt/
  3. Запакуем образ системы в архив
    xz –ckv1 <файл образа>

Все! Теперь с помощью balenaEtcher можно записать образ системы на SD-карту, вставить в ODROID-C2, и у вас будет Ubuntu с установленным ROS!

Ссылки:

  • С тем как чрутиться в linux и для чего это надо очень помогло это видео:

Специально для сайта ITWORLD.UZ. Новость взята с сайта Хабр