Introdução
Recentemente, enquanto trabalhava na minha tese, me deparei com a necessidade de criar uma imagem do Ubuntu para uma placa única já com o ROS instalado (Robot Operating System – sistema operacional de robôs). Em resumo, a tese aborda o controle de um grupo de robôs. Os robôs são equipados com duas rodas e três medidores de distância. Tudo isso é gerenciado a partir do ROS, que roda na placa ODROID-C2.

Robô Ladybug. Desculpe pela baixa qualidade da foto
Não havia tempo nem vontade de instalar o ROS em cada robô individualmente, o que gerou a necessidade de uma imagem do sistema já com o ROS instalado. Após navegar pela internet, encontrei várias abordagens sobre como isso poderia ser feito.
No geral, todas as soluções encontradas podem ser divididas nas seguintes categorias.
- Programas que criam uma imagem de um sistema pronto e configurado (, , , systemback e outros)
- Projetos que permitem montar sua própria imagem (, )
- Montagem da imagem manualmente ( e , além de )
A utilização de soluções do primeiro grupo parecia a opção mais simples e atraente, no entanto, não consegui criar uma imagem de sistema ao vivo para o ODROID. As soluções do segundo grupo também não me serviram devido à alta barreira de entrada. A montagem manual, seguindo os tutoriais disponíveis, também não funcionou, pois minha imagem não tinha um sistema de arquivos compactado.
No final, ao me deparar com um vídeo sobre chroot (chroot — mudar root, link para o vídeo ao final do post) e suas capacidades, decidi utilizá-lo. A seguir, descreverei meu caso particular de customização do Ubuntu para desenvolvedores de robótica.
Dados iniciais:
- Todo o processo de modificação da imagem (exceto a gravação no cartão SD usando o balenaEtcher) foi realizado no sistema operacional Ubuntu 18.04.
- O sistema operacional cuja montagem modifiquei – Ubuntu 18.04.3 versão desktop mate.
- A máquina onde o sistema montado deve funcionar – ODROID-C2.
Preparação da imagem
Baixe a imagem do Ubuntu para ODROID em
Descompacte o arquivo
unxz –kvCrie um diretório onde montaremos a imagem
mkdir mntDetermine a partição onde o sistema de arquivos está localizado
fileProcure uma partição com sistema de arquivos no formato ext2, ext3 ou ext4. Precisamos do endereço de início da partição (destacado em vermelho na captura de tela):

Observação. A localização do sistema de arquivos também pode ser visualizada utilizando a ferramenta parted.Montamos a imagem
sudo mount -o loop,offset=$((264192*512)) mnt/A partição que precisamos começa no bloco 264192 (os seus números podem ser diferentes), tamanho de um bloco — 512 bytes, multiplicamos para obter o deslocamento em bytes.
Vamos para a pasta do sistema montado e fazemos chroot nela
cd mnt/ sudo chroot ~/livecd/mnt/ bin/sh~/livecd/mnt — caminho completo até o diretório com o sistema montado
bin/sh — shell (pode ser substituído por bin/bash)
Agora já podemos instalar os pacotes e aplicativos necessários.
Instalação do ROS
Eu instalei a última versão do ROS (ROS Melodic) seguindo .
Atualizando a lista de pacotes
sudo apt-get updateAqui eu tive um erro:
Err:6 http://deb.odroid.in/c2 bionic InRelease As seguintes assinaturas eram inválidas: EXPKEYSIG 5360FB9DAB19BAC9 Mauro Ribeiro (mdrjr)Isso está relacionado ao fato de que a validade da chave para assinar os pacotes expirou. Para atualizar as chaves, digite:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys AB19BAC9Preparando o sistema para a instalação do 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 updateInstalando o ROS
Infelizmente, não consegui instalar a versão desktop do ROS, então instalei apenas os pacotes básicos:sudo apt install ros-melodic-ros-base apt search ros-melodicNota 1. Durante a instalação, às vezes ocorria um erro:
dpkg: erro: falha ao gravar o registro do banco de dados de status sobre 'iputils-ping' em '/var/lib/dpkg/status': Sem espaço restante no dispositivoIsso foi corrigido limpando o cache da ferramenta apt:
sudo apt-get clean; sudo apt-get autocleanNota 2. Após a instalação, faça source com o comando:
source /opt/ros/melodic/setup.bashnão será possível, pois não iniciamos o bash, então não é necessário digitá-lo no terminal.
Instalando as dependências necessárias
sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essentialsudo apt install python-rosdepsudo rosdep init rosdep updateConfigurando permissões de acesso
Como estamos em chroot e, de fato, executamos todas as ações como usuário root do sistema que estamos montando, o ROS será executado apenas com permissões de superusuário.
Ao tentar iniciar o roscore sem sudo, ocorre o erro: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'Para evitar que o erro ocorra, mudaremos recursivamente as permissões do diretório home do usuário ROS. Para isso, digite:
sudo rosdep fix-permissionsVamos instalar os pacotes rviz e rqt
sudo apt-get install ros-melodic-rqt ros-melodic-rviz
Toques finais
- Saindo do chroot:
sigreturn - Desmontando a imagem
cd .. sudo umount mnt/ - Vamos empacotar a imagem do sistema em um arquivo
xz –ckv1
Pronto! Agora com o você pode gravar a imagem do sistema em um cartão SD, inseri-lo no ODROID-C2, e você terá o Ubuntu com o ROS instalado!
Links:
- Este vídeo ajudou muito a entender como usar o chroot no Linux e para que serve:

Fonte: habr.com

