Pacotes
Sumário
Todos os softwares ROS são organizados dentro de pacotes. Um pacote ROS é uma coleção coerente de arquivos, geralmente incluindo tanto executáveis como arquivos de apoio, que servem para um propósito específico. No exemplo, utilizamos dois executáveis chamados turtlesim_node
e turtle_teleop_key
. Ambos são membros do pacote turtlesim
.
⚠️ Tome cuidado com a diferença entre os pacotes ROS e os pacotes utilizados pelo seu gestor de pacotes do sistema operacional, tais como os pacotes
deb
usados pelo Ubuntu. Os conceitos são similares, e instalar um pacotedeb
pode adicionar um ou mais pacotes ROS na sua instalação, mas os dois não são equivalentes.
Não é um exagero dizer que todos os softwares ROS são parte de um pacote ou de outro. É importante notar que isto inclui novos programas que você cria. Nós veremos como criar novos pacotes na seção 3.1. Enquanto isso, o ROS oferece diversos comandos para interagir com os pacotes instalados.
Listagem e localização de pacotes
É possivel obter uma lista de todos os pacotes ROS instalados usando este comando:
rospack list
No sistema do autor isso produz uma lista de 188 pacotes. Cada pacote é definido por um manifesto, que é um arquivo chamado package.xml
. Este arquivo define alguns detalhes sobre o pacote, incluindo o seu nome, versão, mantenedor e dependências. O diretório contendo package.xml
é chamado de diretório de pacote. (De fato, isto é a definição de um pacote ROS: Qualquer diretório que o ROS pode encontrar que contém um arquivo chamado package.xml
é um diretório de pacote.) Este diretório armazena a maior parte dos arquivos de pacote.
⏩ Uma exceção importante é que, para a maior parte dos pacotes — especialmente aqueles que vem sendo atualizados para usar o novo sistema de construção
catkin
— compiladores de executáveis não são armazenados no diretorio de pacotes, mas numa hierarquia de diretórios padronizada separada. Para pacotes instalados peloapt-get
, essa hierarquia está baseada em/opt/ros/indigo
. Executáveis são armazenados no subdiretóriolib
abaixo dessa base. Da mesma forma, automaticamente gerados inclui arquivos que são armazenados dentro do subdiretório include sob essa base. Quando precisa deles a ROS encontra esses arquivos procurando nos diretórios listados na variável de ambienteCMAKE_PREFIX_PATH
, que é definida automaticamente porsetup.bash
. Esse tipo de compilação sem fonte é uma das mudanças principais introduzidas pelocatkin
na distribuiçãogroovy
do ROS, comparadofuerte
e distribuições antigas. Geralmente, no entanto, tudo isso acontece atrás das cenas, e podemos confiar no ROS para encontrar os arquivos necessárias.
Para encontrar o diretório de um único pacote, use o comando de procura rospack
:
rospack find package-name
Claro que, podem ter vezes que você não sabe (ou não se lembra) o nome completo do pacote que você está interessado. Nesses casos, é bem conveniente que rospack
suporte o preenchimento de tabulações para nome de pacotes. Por exemplo, você pode escrever
rospack find turtle
e, antes de pressionar Enter, pressione a tecla Tab duas vezes para ver a lista de todos os pacotes ROS instalados dos quais os nomes começam com turtle.
De fato, a maior parte dos comandos ROS suportam esse tipo de preenchimento, não só para nomes de pacotes, mas em todos os locais em que isso faz sentido. No comando acima, você também poderia usar Tabs para completar tanto o nome do comando rospack
como do “subcommand” find
.
⚠️ A utilização frequente do preenchimento de tabulações pode contribuir muito para a redução do numero de coisas que você precisa se lembrar, incluindo os nomes completos dos pacotes, nós, tópicos, tipos de mensagens e serviços. Computadores são bastante bons para armazenar e recordar este tipo de coisa. Conselho não solicitado: deixe o seu computador fazer esse trabalho por você.
Inspecionando um pacote
Para visualizar os arquivos em um diretório de pacote, use um comando como este:
rosls package-name
Se quiser “ir” a um diretório de pacote, é possível mudar o diretório atual para um pacote particular, usando um comando como este:
roscd package-name
Com um exemplo simples, suponha que você queria ver a coleção de imagens de tartarugas usadas pelo turtlesim
. O código abaixo mostra um exemplo sobre como poderia usar rosls
e roscd
para ver a lista dessas imagens e visualizar cada uma delas.
$ rosls turtlesim
cmake
images
msg
package.xml
srv
$ rosls turtlesim/images
box−turtle.png
diamondback.png
electric.png
fuerte.png
groovy.png
hydro.png
hydro.svg
indigo.png
indigo.svg
palette.png
robot−turtle.png
sea−turtle.png
turtle.png
$ ros cdturtlesim/images/
$ eog box−turtle.png
⚠️ Em algumas partes da documentação online, é possível ver referências para o conceito de uma pilha. Uma pilha é uma coleção de pacotes relacionados. Começando com uma versão
groovy
o conceito de pilha foi gradualmente eliminado e substituído por meta-pacotes. A grande diferença é um “achatamento” da hierarquia: Um meta-pacote é um pacote — que tem um manifesto assim como qualquer outro pacote, e nenhum outro pacote é armazenado dentro deste diretório — onde uma pilha é um contêiner para pacotes armazenados como subdiretórios. Raramente há uma razão para novos usuários interagirem diretamente com os pacotes.