Instalando ROS em uma imagem Ubuntu IMG para placa única
Introdução
Outro dia, enquanto trabalhava na minha tese, me deparei com a necessidade de criar uma imagem Ubuntu para uma plataforma single-board com ROS já instalado (Sistema operacional do robô - sistema operacional do robô). Em suma, o diploma é dedicado à gestão de um grupo de robôs. Os robôs estão equipados com duas rodas e três telêmetros. Tudo é controlado pelo ROS, que roda na placa ODROID-C2.
Joaninha robô. Desculpe pela má qualidade da foto
Não houve tempo nem vontade de instalar o ROS em cada robô individualmente e, portanto, houve a necessidade de uma imagem do sistema com o ROS já instalado. Depois de navegar na Internet, encontrei várias abordagens sobre como isso poderia ser feito.
Em geral, todas as soluções encontradas podem ser divididas nos seguintes grupos.
Usar soluções do primeiro grupo parecia ser a opção mais simples e atraente, mas nunca consegui criar uma imagem de sistema ao vivo para ODROID. As soluções do segundo grupo também não me agradaram devido ao limite de entrada bastante elevado. A montagem manual de acordo com os tutoriais disponíveis também não era adequada, pois... Minha imagem não tinha um sistema de arquivos compactado.
Como resultado, me deparei com um vídeo sobre chroot (chroot - altera a raiz, link para o vídeo no final do post) e suas capacidades, optou-se por utilizá-lo. A seguir, descreverei meu caso particular de customização do Ubuntu para desenvolvedores de robótica.
Linha de base:
Todo o processo de modificação da imagem (exceto gravação no cartão SD usando balenaEtcher) foi realizado no sistema operacional Ubuntu 18.04.
O sistema operacional cuja montagem modifiquei é o Ubuntu 18.04.3 mate versão desktop.
A máquina na qual o sistema montado deve funcionar é ODROID-C2.
Preparando a Imagem
Baixe a imagem do Ubuntu para ODROID em Site Oficial
Descompactando o arquivo
unxz –kv <файл архива с образом>
Crie um diretório no qual montaremos a imagem
mkdir mnt
Determine a partição na qual o sistema de arquivos está localizado
file <файл образа>
Procuramos uma partição com sistema de arquivos no formato ext2, ext3 ou ext4. Precisamos do endereço do início da seção (destacado em vermelho na tela):
Nota. A localização do sistema de arquivos também pode ser visualizada usando o utilitário se separaram.
Montando a imagem
sudo mount -o loop,offset=$((264192*512)) <файл с образом> mnt/
A seção que precisamos começa com o bloco 264192 (seus números podem ser diferentes), o tamanho de um bloco é 512 bytes, multiplique-os para obter o recuo em bytes.
Vá para a pasta com o sistema montado e entre nele
cd mnt/
sudo chroot ~/livecd/mnt/ bin/sh
~/livecd/mnt — caminho completo para o diretório com o sistema montado lixo/sh - shell (também pode ser substituído por bin/bash)
Agora você pode começar a instalar os pacotes e aplicativos necessários.
Instalando o ROS
Instalei a última versão do ROS (ROS Melodic) de acordo com tutorial oficial.
Atualizando a lista de pacotes
sudo apt-get update
Foi aqui que recebi o erro:
Err:6 http://deb.odroid.in/c2 bionic InRelease
The following signatures were invalid: EXPKEYSIG 5360FB9DAB19BAC9 Mauro Ribeiro (mdrjr) <[email protected]>
Isso se deve ao fato de a chave de assinatura do pacote ter expirado. Para atualizar as chaves, digite:
Configurando direitos de acesso
Como estamos logados e, de fato, realizamos todas as ações em nome da raiz do sistema que está sendo montado, o ROS só será iniciado com direitos de superusuário.
Ao tentar executar o roscore sem sudo, ocorre um 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, vamos alterar recursivamente os direitos de acesso ao diretório inicial do usuário ROS. Para fazer isso digitamos: