Embedded Motion Control/Tutorials/Navigating the ROS filesystem
Description: This tutorial introduces ROS filesystem concepts, and covers using the roscd, rosls, and rospack commandline tools.
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]
For example, if you type the following in a terminal:
rospack find roscpp
It returns:
/opt/ros/groovy/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:
/opt/ros/groovy/share/roscpp
You can see that this 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
This should return
/home/YOUR_NAME/ros/emc:/opt/ros/fuerte/share:/opt/ros/fuerte/stacks
This means that ROS will look for packages and stacks within all these colon-seperated directories. So, we should be able to navigate to any ROS package or stack that is located in ros/emc in your home folder. To check this, type:
roscd pico_gazebo
If everything is set up correctly, you will have navigated to
/home/YOUR_NAME/ros/emc/general/pico_gazebo
Subdirectories
roscd can also move to a subdirectory of a package or stack.
Try:
roscd pico_example/src
$ pwd You should see:
/home/YOUR_NAME/ros/emc/general/pico_example/src
which means you directly navigated to the src directory in the pico_example package.
Tab Completion
It can get tedious to type out an entire package name. For example, it may become annoying to type pico_example over and over again. Luckily, many ROS tools support TAB completion.
Start by typing:
roscd pico_e<<< now push the TAB key >>>
After pushing the TAB key, the command line should fill out the rest.
roscd pico_example
This works because pico_example is currently the only ROS package that starts with pico_e.
Now try typing:
roscd pico<<< now push the TAB key >>>
After pushing the TAB key, the command line should fill out as much as possible:
roscd pico_
However, in this case there are multiple packages that begin with pico. Try typing TAB another time. This should display all the ROS packages that begin with pico
pico_description pico_example pico_gazebo pico_visualization
On the command line you should still have
roscd pico_
Now type an e after pico_ and then push TAB
roscd pico_e<<< now push the TAB key >>>
Since there is only one package that start with pico_e, you should see:
roscd pico_example
Review
You may have noticed a pattern with the naming of the ROS tools:
- rospack = ros + pack(age)
- rosstack = ros + stack
- roscd = ros + cd
This naming pattern holds for many of the ROS tools.
Now that you can get around in ROS, let's create a package.