ROS学习(二)——ROS文件系统

前言

学习ROS的文件系统,要了解几个重要的概念,主要包括
1.工作空间(workspace)
2.程序包(package)
3.节点(node)

工作空间

在ROS入门教程中,在开始所有的编程工作之前,首先是要创建一个catkin_ws,即catkin工作空间,需要创建这样一个工作空间的原因与这个catkin工具有关。
Catkin is a collection of CMake macros and associated code used to build packages used in ROS.参考网页
就是说,catkin是一些cmake宏的集合,以及用于编译ros程序包的相关代码,简单理解它就是一个编译程序的工具,具体实现上可以参看ros安装目录下的catkin_make的python脚本,实际上catkin_make的工作就是确认各种编译需要的文件的存在性以及路径,解析程序包之间的依赖关系等等,简单了解即可。
正是由于ros编译程序采用了catkin_make工具,因此我们需要将创建的程序包放在catkin工作空间中,这样就简化了编译程序的工作,省去了编写编译文件中的许多工作量。
更多关于catkin工作空间的资料,可以参考
http://wiki.ros.org/cn/ROS/Tutorials/CreatingPackage
http://docs.ros.org/api/catkin/html/
/opt/ros/indigo/bin/catkin_make

程序包

程序包的概念比较容易理解,可以将它视为一个解决方案,我们可以将同类功能的程序都放在一个程序包中,比如添加一个新的传感器驱动,我们就可以将它作为一个程序包。在ros中,创建一个程序包非常简单,在工作空间的src文件夹中新建一个文件夹,在该文件夹下添加src文件夹,include文件夹,一个CmakeList.txt文件以及package.xml文件。文件树的结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
workspace_folder/ -- WORKSPACE
src/ -- SOURCE SPACE
CMakeLists.txt -- 'Toplevel' CMake file, provided by catkin
package_1/
src/
include/
CMakeLists.txt -- CMakeLists.txt file for package_1
package.xml -- Package manifest for package_1
...
package_n/
src/
include/
CMakeLists.txt -- CMakeLists.txt file for package_n
package.xml -- Package manifest for package_n

需要注意的是,每个package文件夹下只能有一个描述文件,也只能生产一个程序包,但是可以将多个程序包放在一个元程序包的文件夹下。举个例子,一个机器人可能配置了许多传感器,每个传感器的驱动都是一个程序包,而所有传感器的程序包可以放在一个我们命名位drivers的元程序包中,用文件树描述如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
workspace_folder/
src/
CMakeLists.txt
drivers/
driver_1/
src/
include/
CMakeLists.txt
package.xml
...
driver_n/
src/
include/
CMakeLists.txt
package.xml

这样组织文件带来的好处是使文件系统看起来更加简洁,可以将几个大类的功能分别放在相应的元程序包中,而不会使各种程序包放在一起显得杂乱无章。例如,一个机器人系统的软件系统包含驱动,感知,规划,显示等几个部分,我们就可以这样来组织文件:

1
2
3
4
5
6
7
workspace_folder/
src/
CMakeLists.txt
drivers/
perception/
planning/
visualization/

关于package.xml文件和CmakeList.txt文件的具体内容和编写方式,放到下篇文章中详细描述。

节点

一个节点其实只不过是ROS程序包中的一个可执行文件。ROS节点可以使用topic与其他节点通信。节点可以发布或接收一个话题。节点也可以提供或使用某种服务。
我们最主要的工作就是要编写节点程序,这里就回到了我们熟悉的编写程序的部分,要编写源文件,头文件,在程序中定义节点的输入输出接口,执行算法,实现逻辑判断等等。编写完节点程序,要让该节点程序成为一个可执行文件,需要在CmakeList.txt添加相应的命令,这个等下篇细讲。

总结

总结一下,本文主要介绍了ros文件系统的组织形式,包括工作空间,程序包和节点,工作空间的创建可以说是一劳永逸,主要目的就是为了使用catkin工具,程序包就是一个解决方案,每次新建时都要用描述文件来配置,节点是一个可执行文件,CmakeList.txt用来对程序包和节点进行编译。
另外,ros wiki上关于文件系统的介绍多是关于文件系统指令的使用,rospack , roscd , rosls等,可以了解一下
http://wiki.ros.org/cn/ROS/Tutorials/NavigatingTheFilesystem