Note: This tutorial assumes that you have completed the previous tutorials: Instalando e Configurando O Seu Ambiente ROS. |
Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags. |
Navegando pelo Sistema de Arquivos do ROS
Description: Este tutorial introduz os conceitos de sistema de arquivos do ROS e cobre a utilização das ferramentas de linha de comando roscd, rosls, e rospack.Tutorial Level: BEGINNER
Next Tutorial: Criando um Pacote ROS
Contents
Quick Overview of Filesystem Concepts
Packages: Packages are the lowest level of ROS software organization. They can contain anything: libraries, tools, executables, etc.
Manifest: A manifest is a description of a package. Its most important role is to define dependencies between packages.
Stacks: Stacks are collections of packages that form a higher-level library.
Stack Manifest: These are just like normal manifests, but for stacks.
When you look at the filesystem, it's easy to tell packages and stacks apart:
- A package is a directory with a manifest.xml file.
- A stack is a directory with a stack.xml file.
Filesystem Tools
Code is spread across many ROS packages and stacks. Navigating with command-line tools such as ls and cd can be very tedious which is why ROS provides tools to help you.
Using rospack and rosstack
rospack and rosstack allow you to get information about packages and stacks. In this tutorial, we are only going to cover the find option, which returns the path to package or stack.
Usage:
$ rospack find [package_name] $ rosstack find [stack_name]
Example:
$ rospack find roscpp
Would return:
YOUR_INSTALL_PATH/share/roscpp
If, for example, you have used the binary install of ROS Fuerte on Ubuntu linux, you would see exactly:
/opt/ros/fuerte/share/roscpp
Using roscd
roscd is part of the rosbash suite. It allows you to change directory (cd) directly to a package or a stack.
Usage:
$ roscd [locationname[/subdir]]
Run this example:
$ roscd roscpp
To verify that we have changed to the roscpp package directory. Now let's print the working directory using the Unix command pwd:
$ pwd
You should see:
YOUR_INSTALL_PATH/share/roscpp
You can see that YOUR_INSTALL_PATH/share/roscpp is the same path that rospack find gave in the previous example.
Note that roscd, like other ROS tools, will only find ROS packages that are below the directories listed in your $ROS_PACKAGE_PATH. To see what is in your $ROS_PACKAGE_PATH, type:
$ echo $ROS_PACKAGE_PATH
If you have not modified your $ROS_PACKAGE_PATH, you should see:
YOUR_INSTALL_PATH/share:YOUR_INSTALL_PATH/stacks
Similarly to other environment paths, you can add additional directories to your $ROS_PACKAGE_PATH, with each path separated by a colon ':'
Subdirectories
roscd can also move to a subdirectory of a package or stack.
Try:
$ roscd roscpp/cmake $ pwd
You should see:
YOUR_INSTALL_PATH/share/roscpp/cmake
Special cases for roscd
There are a few special places you can tell roscd to go, that are not a package or stack.
roscd with no arguments
roscd without an argument will take you to $ROS_WORKSPACE. Try:
$ roscd $ pwd
You should see:
/home/user/fuerte_workspace
Note: Prior to Fuerte, roscd would take you to $ROS_ROOT.
roscd log
roscd log will take you to the folder where ROS stores log files. Note that if you have not run any ROS programs yet, this will yield an error saying that it does not yet exist.
If you have run some ROS program before, try:
$ roscd log
Using rosls
rosls is part of the rosbash suite. It allows you to ls directly in a package, stack, or common location by name rather than by package path.
Usage:
$ rosls [locationname[/subdir]]
Example:
$ rosls roscpp_tutorials
Would return:
bin cmake manifest.xml srv
Tab Completion
It can get tedious to type out an entire package name. In the previous example, roscpp_tutorials is a fairly long name. Luckily, some ROS tools support TAB completion.
Start by typing:
$ roscd roscpp_tut<<< now push the TAB key >>>
After pushing the TAB key, the command line should fill out the rest.
$ roscd roscpp_tutorials/
This works because roscpp_tutorials is currently the only ROS package that starts with roscpp_tut.
Now try typing:
$ roscd tur<<< now push the TAB key >>>
After pushing the TAB key, the command line should fill out as much as possible:
$ roscd turtle
However, in this case there are multiple packages that begin with turtle. Try typing TAB another time. This should display all the ROS packages that begin with turtle
turtle_actionlib/ turtlesim/ turtle_tf/
On the command line you should still have
$ roscd turtle
Now type a s after turtle and then push TAB
$ roscd turtles<<< now push the TAB key >>>
Since there is only one package that start with turtles, you should see:
$ roscd turtlesim/
Review
You may have noticed a pattern with the naming of the ROS tools:
- rospack = ros + pack(age)
- rosstack = ros + stack
- roscd = ros + cd
- rosls = ros + ls
This naming pattern holds for many of the ROS tools.
Contents
Pré-requisitos
Neste tutorial, vamos inspecionar um pacote em ros-tutorials, instale-o com o seguinte comando
$ sudo apt-get install ros-<distro>-ros-tutorials
Substitua '<distro>' com o nome da sua distribuição de ROS (por exemplo: kinetic, lunar, melodic etc.)
Visão Geral dos Conceitos de Sistema de Arquivos
Pacotes: Pacotes são a unidade básica de organização de software em ROS. Cada pacote pode conter bibliotecas, executáveis, scripts ou outros artefatos.
Manifesto (package.xml): Um manifesto é uma descrição de um pacote. É utilizado para definir dependências entre pacotes e para coletar meta-informação a respeito do pacote tal como versão, mantedor, licença, etc...
Show Hide Nota sobre stacks Nota sobre stacks
Nota: Usuários de rosbuild podem estar se perguntando onde foram parar os 'stacks', o conceito de stacks foi removido no catkin para simplificar a crescente base de código e para suportar uma melhor distribuição de pacotes. Em catkin você pode definir metapackages para coletar pacotes similares e múltiplos pacotes podem viver num mesmo repositório de controle de versão. Essas duas funcionalidades substituíram o que os stacks faziam.
Ferramentas do Sistema de Arquivos
O código é espalhado através de muitos pacotes ROS. Navegando com ferramentas de linha de comando tais quais ls e cd pode se tornar bastando tedioso. Justamente por isso que o ROS disponibiliza ferramentas para lhe auxiliar.
Utilizando rospack
rospack permite você adquirir informações sobre pacotes. Neste tutorial, iremos simplesmente cobrir a utilização da opção find, que retorna o endereço do pacote.
Uso:
$ rospack find [nome_do_pacote]
Exemplo:
$ rospack find roscpp
Deveria retornar:
DIRETÓRIO_DE_INSTALAÇÃO/share/roscpp
Se você instalou ROS Kinetic, por exemplo, a partir do apt no Ubuntu, você deve ver exatamente:
/opt/ros/kinetic/share/roscpp
Utilizando roscd
roscd é parte da suíte rosbash. Esse comando permite que você mude de diretório (cd) diretamente à um pacote ou stack.
Uso:
$ roscd [local[/subdiretório]]
Execute este exemplo:
$ roscd roscpp
Para verificar que mudamos para o diretório do pacote roscpp, vamos imprimir o diretório atual utilizando o comando Unix pwd:
$ pwd
Você deveria ver:
DIRETÓRIO_DE_INSTALAÇÃO/share/roscpp
Você pode notar que DIRETÓRIO_DE_INSTALAÇÃO/share/roscpp é o mesmo local que rospack find retornou no exemplo anterior.
Note que roscd, assim como outras ferramentas do ROS, vai apenas encontrar pacotes ROS que estão nos diretórios listados na sua variável de ambiente ROS_PACKAGE_PATH. Para ver o que está na sua ROS_PACKAGE_PATH, digite:
$ echo $ROS_PACKAGE_PATH
Sua variável ROS_PACKAGE_PATH deve conter uma lista de diretórios onde você tem pacotes ROS, separados por :. Uma ROS_PACKAGE_PATH típica deve parecer com isso:
/opt/ros/kinetic/base/install/share
Assim como outras variáveis de ambiente, você pode adicionar diretórios à sua variável ROS_PACKAGE_PATH, com cada caminho separado por dois pontos ':'.
Subdiretórios
roscd permite que você se mova para um subdiretório de um pacote ou 'stack'.
Faça:
$ roscd roscpp/cmake $ pwd
Você deve ver:
DIRETÓRIO_DE_INSTALAÇÃO/share/roscpp/cmake
roscd log
roscd log vai lhe levar para a pasta onde o ROS armazena arquivos de log. Perceba que se você não rodou nenhum programa ROS, isto gerará um erro dizendo que tal pasta ainda não existe.
Caso você já tenha executado algum programa ROS anteriormente, faça:
$ roscd log
Utilizando rosls
rosls faz parte da suíte rosbash. Esse comando permite que você visualize o interior de um pacote diretamente pelo nome, ao invés de informar o caminho absoluto para a pasta (como o comando ls).
Utilização:
# rosls [local[/subdir]]
Exemplo:
$ rosls roscpp_tutorials
Deve retornar:
cmake launch package.xml srv
Completar com TAB
Digitar o nome de um pacote inteiro pode ser um tanto quanto tedioso. No exemplo anterior, roscpp_tutorials é um nome bastante longo. Por sorte, algumas ferramentas ROS têm suporte para completar com TAB.
Comece digitando:
# roscd roscpp_tut<<< agora aperte a tecla TAB >>>
Após pressionar a tecla TAB, a linha de comando deve preencher o resto:
$ roscd roscpp_tutorials/
Isto funciona porque roscpp_tutorials é atualmente o único pacote ROS que começa com roscpp_tut.
Agora tente digitar:
# roscd tur<<< agora tecle TAB >>>
Após pressionar a tecla TAB, a linha de comando vai preencher o máximo possível:
$ roscd turtle
Entretanto, neste caso existem vários pacotes que iniciam com turtle. Tente pressionar TAB duas vezes rapidamente. Isso deve imprimir na tela todos os pacotes ROS que iniciam com turtle:
turtle_actionlib/ turtlesim/ turtle_tf/
Na linha de comando você deve ter:
$ roscd turtle
Agora digite un s após turtle e então pressione TAB
# roscd turtles<<< agora pressione TAB >>>
Já que não existe apenas um pacote que inicia com turtles, você deve ver:
$ roscd turtlesim/
Revisão
Você talvez tenha notado um padrão com a nomeação das ferramentas ROS:
- rospack = ros + pack(age) // (package = pacote)
- roscd = ros + cd
- rosls = ros + ls
Show Hide Nota sobre cd e ls Nota sobre cd e ls
Nota: cd e ls são ferramentas de linha de comando bastante comuns em ambientes Linux (e outros obviamente). cd = Change Directory, ls = LiSt.
Esta convenção de nomeação se mantém por várias outras ferramentas ROS.
Agora que você já conhece um pouco de ROS, vamos criar um pacote.