Se você deseja utilizar um container em seus projetos de robótica junto ao ROS, este post é para você!

Docker logo

Como criar um contêiner ROS ?

Existem duas formas de utilizar o ROS por meio de um contêiner. A primeira opção, a mais simples, é criando a partir de uma imagem padrão do ROS, que são disponibilizadas no repositório oficial do ROS. Escolha a versão adequada e siga os seguintes passos, caso esteja em dúvidas sobre os comandos, sugerimos a publicação anterior sobre comandos básicos.

$ docker pull ros:kinetic-robot # instalar a imagem
$ docker run -ti --name NAME -ti osrf/ros:kinetic-desktop-full bash # criar e inicializar o contêiner
$  /# source opt/ros/kinetic/setup.bash   # configurar o ambiente ROS

Para configurar o ambiente do ROS prefira utilizar o arquivo que está no caminho que indicamos, source opt/ros/kinetic/setup.bash, ao invés do ros_entrypoint.sh. Entrypoint, ponto de entrada, é o arquivo que contém as instruções necessárias para configurar todo o contêiner.

A segunda opção é criar um contêiner usando a imagem de uma distro do Ubuntu e em seguida instalar o ROS normalmente, como você instala em sua máquina, seguindos as instruções para instalação e escolhendo a opção Desktop-Full Install. Então você deve procurar uma imagem do Ubuntu compatível com a versão do ROS e seguir os seguintes passos.

$ docker pull ros:kinetic-robot # instalar a imagem
$ docker run -ti --name NAME -ti osrf/ros:kinetic-desktop-full bash # criar e inicializar o contêiner
  /# source opt/ros/kinetic/setup.bash    # configurar o ambiente ROS

Esta segunda opção pode levar alguns minutos a mais, mas certifica que o ROS e os demais pacotes e dependências tenham sido instalados corretamente, evitando possíveis problemas futuros.

ROS + GUI’s

Até este momento, sabemos que o ROS e todos os pacotes estão devidamente instalados, mas se, por exemplo, você tentar abrir o gazebo irá se deparar com o seguinte erro: “cannot connect to X server”. Isso ocorre porque não foi realizado a conexão necessária para que o contêiner Docker possa se comunicar com a interface gráfica da sua máquina (GUI- Graphical User Interface). Existem algumas formas ara que isso seja feito, sinalizadas na documentação do ROS. A forma mais simples envolve expôr o xhost da máquina para que o contêiner possa renderizar para a exibição correta, por meio do soquete UNIX.

$  docker run -it \
      --env="DISPLAY" \
      --env="QT_X11_NO_MITSHM=1" \
      --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
      osrf/ros:indigo-desktop-full \
      rqt
$  export containerId=$(docker ps -l -q)

$  xhost +local:`docker inspect --format='' $containerId`
$  docker start $containerId

É importante sinalizar que esta não é a opção mais segura, uma vez que você está expondo o xhost, mesmo que seja o específico da sua aplicação. A segunda opção é para quem possui uma GPU NVIDIA, uma alternativa mais segura e mais simples, utilizando o NVIDIA Container Toolkit. Para essa solução, você deve instalar corretamente a ferramenta e rodar o seguinte comando:

$  docker run -it --net=host --gpus all \
      --env="NVIDIA_DRIVER_CAPABILITIES=all" \
      --env="DISPLAY" \
      --env="QT_X11_NO_MITSHM=1" \
      --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
      osrf/ros:noetic-desktop-full \
      bash -it -c "rqt"

Nas duas situações estamos criando contêineres, definindo variáveis de ambiente pela TAG env e compartilhando um determinado volume da máquina com ele, referente ao X11 e em seguida executando um comando que irá mostrar que a interface gráfica do contêiner está funcionando.

VScode + Docker

Uma outra dica é para os usuários do VScode. Existe uma extensão fornecida pela Microsoft que permite visualizar e editar as pastas e arquivos dos contêineres, assim como você faz normalmente, com id ms-azuretools.vscode-docker. Além disso, ela facilita também o gerenciamento dos contêineres e imagens, permitindo visualizar os status, desativar e ativá-los, dentre outras coisas.


Ficou com alguma dúvida? Dá uma olhada na nossa introdução sobre Docker ou sobre os comandos básicos .Entre em contato com a gente pelos comentários! :)



Autora


brenda
Brenda Alencar
Estagiária no CC-RoSA, graduanda em Eng. Elétrica. Participou de projetos de Robótica Subaquática e Manipuladores Subaquáticos.