在这里详述 roschina/教程/NavigatingTheFilesystem

Note: This tutorial assumes that you have completed the previous tutorials: Installing and Configuring Your ROS Environment.
(!) 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.

Navigating the ROS Filesystem

Description: This tutorial introduces ROS filesystem concepts, and covers using the roscd, rosls, and rospack commandline tools.

Tutorial Level: BEGINNER

Next Tutorial: Creating a ROS package

ROS文件系统中的基本概念

  • Packages: Package是ROS系统中最底层最基本的组织,里面存放各种文件:库、工具、可执行文件等.

  • Manifest: 一个package描述xml文件,定义package之间的依赖关系.

  • Stacks: package的集合,比package这个概念高一级别

  • Stack Manifest: 作用类似package manifest文件,但是它是针对stack的.

在文件系统中很容易识别package和stack:

  • package是一个包含 manifest.xml 文件的目录.
  • stack是一个包含 stack.xml 文件的目录.


filesystem_layout.png

文件系统工具

ROS中大量代码分散在众多的packages和stacks之中. 命令工具lscd已不能满足检索要求。因此ROS提供了一套自己的命令工具来完成与这些命令相似的工作.

使用rospack和rosstack

rospackrosstack 命令都包含于 rospack package中. 两个命令用于获取packages 和stacks的信息. 教程中我们只提及命令的find的参数,作用是返回相应package或者stack的目录路径.

用法:

$ rospack find [package_name]
$ rosstack find [stack_name]

例子:

$ rospack find roscpp

得到结果:

  • YOUR_INSTALL_PATH/stacks/ros_comm/clients/cpp/roscpp

举例,如果在Ubuntu下使用编译好的软件包安装了ROS Electric版本,将会得到如下结果:

  • /opt/ros/electric/stacks/ros_comm/clients/cpp/roscpp 

使用roscd

roscd 包含于 rosbash package中. 该命令用于改变当前目录到指定的package或者stack的目录(cd).

用法:

$ roscd [locationname[/subdir]]

例子:

$ roscd roscpp

为了验证我们已经切换到了roscpp package 目录. 我们使用unix的命令查看一下pwd:

$ pwd 

得到结果:

  • YOUR_INSTALL_PATH/stacks/ros_comm/clients/cpp/roscpp

现在可以看到结果YOUR_INSTALL_PATH/stacks/ros_comm/clients/cpp/roscpp 和先前rospack find 得到的是一样的.

命令 roscd及其它的ROS命令仅适用于环境变量$ROS_PACKAGE_PATH中存在的目录路径. 使用下面的命令查看环境变量$ROS_PACKAGE_PATH:

$ echo $ROS_PACKAGE_PATH

如果还没有编辑过 $ROS_PACKAGE_PATH 应该显示结果如下:

  • YOUR_INSTALL_PATH/stacks

$ROS_PACKAGE_PATH可以添加任意目录路径,目录路径之间 ':' 分开。

子目录

roscd 也能够直接进入一个 package 或 stack的子目录中.

例如:

$ roscd roscpp/include
$ pwd

得到结果:

  • YOUR_INSTALL_PATH/stacks/ros_comm/clients/cpp/roscpp/include

roscd的特殊用法

有几个roscd 的特殊用法.

roscd 不带任何参数

不带参数时roscd 直接进入环境变量 $ROS_ROOT 定义的目录. 例如:

$ roscd 
$ pwd

得到结果:

  •  YOUR_INSTALL_PATH/ros

这个目录就是环境变量 $ROS_ROOT定义的. 例如:

$ echo $ROS_ROOT

得到结果:

  • YOUR_INSTALL_PATH/ros

roscd log

roscd log 命令切换到ROS储存日志文件的目录。注意如果从未运行过任何ROS程序,命令会返回目录不存在的错误。

例如:

$ roscd log

使用 rosls

rosls 包含于rosbash package中. 作用是列出指定的package或stack中的文件及目录.

用法:

$ rosls [locationname[/subdir]]

例子:

$ rosls roscpp_tutorials

得到结果:

  • add_two_ints_client         listener                      listener_with_userdata  srv
    add_two_ints_server         listener_async_spin           Makefile                srv_gen
    add_two_ints_server_class   listener_class                manifest.xml            talker
    anonymous_listener          listener_multiple             node_handle_namespaces  time_api
    babbler                     listener_single_message       notify_connect          timers
    bin                         listener_threaded_spin        parameters
    CMakeLists.txt              listener_unreliable           ROS_NOBUILD
    custom_callback_processing  listener_with_tracked_object  src

Tab Completion

在键盘输入ROS命令及目录文件名时,使用tab键可以自动补齐剩余的命令字符。 例如:

$ roscd roscpp_tut<<< now push the TAB key >>>

按下 TAB 键后, 命令行会自动补齐.

  • $ roscd roscpp_tutorials/

如果存在有歧义的package时,可以连续按下tab键将会切换显示所有相关的ROS package名称。

例如:

$ roscd tur<<< now push the TAB key >>>

按下 TAB 键后, 命令行会如下显示:

  • $ roscd turtle

但是,例子中有多个packages 开头包含字符 turtle.

试着再次按下 TAB 键. 这会切换显示所有的以字符 turtle 开头的ROS packages。

  •   turtle_actionlib/  turtlesim/         turtle_tf/         

得到结果:

  • $ roscd turtle

现在 turtle 后面输入 s ,然后按下 TAB

$ roscd turtles<<< now push the TAB key >>>

因为只有一个package 以字符 turtles开头,所以得到结果如下:

  • $ roscd turtlesim/

回顾

ROS 工具命令有个固定的命名格式:

  • rospack = ros + pack(age)
  • rosstack = ros + stack
  • roscd = ros + cd
  • rosls = ros + ls

下一章节: CreatingPackage.

Wiki: roschina/教程/NavigatingTheFilesystem (last edited 2012-02-21 01:33:36 by LuZhiShen)