## page was copied from ROS/Tutorials/catkin/NavigatingTheFilesystem <<TOC(4)>> === Quick Overview of Filesystem Concepts === * '''Packages:''' Packages are the software organization unit of ROS code. Each package can contain libraries, executables, scripts, or other artifacts. * '''Manifest ([[catkin/package.xml|package.xml]]):''' A manifest is a description of a ''package''. Its serves to define dependencies between ''packages'' and to capture meta information about the ''package'' like version, maintainer, license, etc... {{{{#!wiki blue/solid <<SeeSaw()>>{{{ }}}<<SeeSaw(stacks, toshow="note about stacks")>> {{{#!wiki seesaw/stacks section '''Note:''' [[rosbuild]] users might be wondering where stacks went, the concept of stacks was removed with catkin to simplify the growing code base and to support better distribution of packages. In [[catkin]] you can define [[catkin/migrating_from_rosbuild#Metapackages_and_the_Elimination_of_Stacks|metapackages]] to collect similar packages and multiple packages can reside in a single VCS repository. Those two features replace the functionality of stacks. }}} }}}} === Filesystem Tools === Code is spread across many ROS packages. 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 ==== [[rospack]] allows you to get information about packages. In this tutorial, we are only going to cover the `find` option, which returns the path to package. Usage: {{{ # rospack find [package_name] }}} Example: {{{ $ rospack find roscpp }}} Would return: {{{ YOUR_INSTALL_PATH/share/roscpp }}} If you installed ROS from `apt` on Ubuntu Linux you would see exactly: {{{ /opt/ros/hydro/share/roscpp }}} ==== Using roscd ==== `roscd` is part of the [[rosbash]] suite. It allows you to change directory ([[http://ss64.com/bash/cd.html|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 [[http://ss64.com/bash/pwd.html|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 within the directories listed in your [[ROS/EnvironmentVariables#ROS_PACKAGE_PATH|ROS_PACKAGE_PATH]]. To see what is in your [[ROS/EnvironmentVariables#ROS_PACKAGE_PATH|ROS_PACKAGE_PATH]], type: {{{ $ echo $ROS_PACKAGE_PATH }}} Your [[ROS/EnvironmentVariables#ROS_PACKAGE_PATH|ROS_PACKAGE_PATH]] should contain a list of directories where you have ROS packages separated by colons. A typical [[ROS/EnvironmentVariables#ROS_PACKAGE_PATH|ROS_PACKAGE_PATH]] might look like this: {{{ /opt/ros/hydro/base/install/share:/opt/ros/hydro/base/install/stacks }}} Similarly to other environment paths, you can add additional directories to your [[ROS/EnvironmentVariables#ROS_PACKAGE_PATH|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 }}} ==== 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 ==== [[rosbash#rosls|rosls]] is part of the [[rosbash]] suite. It allows you to [[http://ss64.com/bash/ls.html|ls]] directly in a package by name rather than by absolute path. Usage: {{{ # rosls [locationname[/subdir]] }}} Example: {{{ $ rosls roscpp_tutorials }}} Would return: {{{ cmake package.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 [[http://en.wikipedia.org/wiki/Command_line_completion | 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) * roscd = ros + cd * rosls = ros + ls This naming pattern holds for many of the ROS tools.