1.工作空间
工作空间(work space)是ROS系统中存放工程开发相关的文件夹,其目录结构如下:
src:代码空间(Source Space),用于存放开发代码
build:编译空间(Build Space),catkin(CMake)的缓存信息和中间文件
devel:开发空间(Development Space),生成的目标文件(包括头文件,动态链接库,静态链接库,可执行文件等)、环
install:安装空间(Install Space)
一个最小的项目结构如图所示


更加详细的目录结构如下:

1.1 如何创建并编译一个工作空间
创建工作空间
在根目录下创建一个叫catkin_ws的工作空间,并进入到src目录下进行初始化
$ source /opt/ros/kinetic/setup.bash
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace编译工作空间
catkin_make相当于cmake编译器,ROS对其进行改造(加入CMakeLists.txt进行功能包索引)。一般在修改了src下的程序代码或配置文件后需要进行编译。
$ cd ~/catkin_ws
$ catkin_make 设置环境变量
在这里记住一点,但凡编译过工作空间,一定要重新source环境变量,否则代码不会更新。
这里使用的是setup.bash,还有两个文件为setup.sh和setup.zsh,要source哪个文件取决于你的默认解释程序(echo $SHELL)
$ souce ~/catkiin_ws/devel/setup.bash
补充:工作空间的覆盖
ROS系统中工作空间存在Overlaying机制,即工作空间覆盖机制,catkin支持包的逐层覆盖, 当前最高,其它依据source的顺序逐层变高, 高层可覆盖低层. ,符合以下规则:
1)工作空间的路径记录在ROS_PACKAGE_PATH环境变量中
2)新设置的路径(source后)会放在ROS_PACKAGE_PATH变量的最前端
3)运行程序时,ROS会优先在靠近前端的工作空间中查找指定的功能包
4)只有当前端工作空间不存在该功能包时才向后查找
如图所示

可以观察到source当前工作空间后,将当前工作空间的绝对路径放到了系统工作空间之前

2.功能包
2.功能包创建方式
ROS里的功能包用于区分某个文件夹下代码的功能,如机器人有移动,导航,视觉等功能,我们为整个机器人创建工作空间,也可称为一个项目,接来要开发它的各个功能,于是我们使用功能包来分隔一类别代码。下面是创建功能包的方式:
下面命令创建了一个叫做test1个功能包,导入了rospy roscpp依赖包,ROS支持python和c++开发,所以导入这两个依赖包让功能包可以通过这两种语言开发。
创建完功能包后需要catkin_make进行编译,编译后需要source当前工作空间,这样就完成了功能包的创建
$ cd ~/catkin_ws/src
$ catkin_create_pkg test1 rospy roscpp
$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash补充:如果是第三方下载的,如需进行catkin_create_pkg,直接执行catkin_make编译即可
2.ros功能包的目录结构
如果所示,一个功能包的目录结构如下,CmakeLists.txt和package.xml是必须的,分别定义编译规则和描述信息。
其他类似src、include、scripts这些目录命名都是约定俗成的,并未明确定义,但是ros默认会去这些目录下找相关文件,所以为了标准化,请规范命名

- CMakeLists.txt:定义package的包名、依赖、源文件、目标文件等编译规则,是package
- 不可少的成分
- package.xml:描述package的包名、版本号、作者、依赖等信息,是package不可少的成
- 分
- src/:存放ROS的源代码,包括C++的源码和(.cpp)以及Python的module(.py)
- include/:存放C++源码对应的头文件
- scripts/:存放可执行脚本,例如shell脚本(.sh)、Python脚本(.py)
- msg/:存放自定义格式的消息(.msg)
- srv/:存放自定义格式的服务(.srv)
- models/:存放机器人或仿真场景的3D模型(.sda, .stl, .dae等)
- urdf/:存放机器人的模型描述(.urdf或.xacro)
- launch/:存放launch文件(.launch或.xml)
注意:同一个工作空间不能存在相同名称的功能包,不同工作空间可以存在相同名称的功能包
3.功能包相关命令rospack
- rospack list :列出本机所有package
- rospack depends [package] :显示package的依赖包
- rospack find [package] :定位某个package
- rospack profile :刷新所有package的位置记录
4.功能包相关命令roscd
- roscd [package]:cd到ROS Package的目录
补充:使用前必须source空间
5.功能包相关命令
rosdep 是用于管理ROS package依赖项的命令行工具,用法如下:
- rosdep check [pacakge] :检查package的依赖是否满足
- rosdep install [pacakge] :安装pacakge的依赖
- rosdep db :生成和显示依赖数据库
- rosdep init :初始化/etc/ros/rosdep中的源
- rosdep keys :检查package的依赖是否满足
- rosdep update :更新本地的rosdep数据库
3.Catkin编译系统
1.两个文件
- package.xml:包括了package的描述信息,例如name, description, version, maintainer(s), license
- CMakeLists.txt:构建package所需的CMake文件,作用为:调用Catkin的函数/宏,解析 package.xml ,找到其他依赖的catkin软件包,将本软件包添加到环境变量
2.catkin编译的工作流程
- 1.首先在工作空间catkin_ws/src/下递归的查找其中每一个ROS的package。
- 2. package中会有package.xml和CMakeLists.txt文件,Catkin(CMake)编译系统依据CMakeLists.txt文件,从而生成makefiles(放在catkin_ws/build/)。
- 3.然后make刚刚生成的makefiles等文件,编译链接生成可执行文件(放在catkin_ws/devel)。
$ cd ~/catkin_ws #进入工作空间,catkin_make必须在工作空间下执行
$ catkin_make #开始编译
$ source ~/catkin_ws/devel/setup.bash #刷新坏境编译之后,catkin_make运行后终端输出文件部分解析
#基本路径
Base path: /home/user/catkin_ws
Source space: /home/user/catkin_ws/src --SOURCE SPACE 源空间
Build space: /home/user/catkin_ws/build --BUILD SPACE 编译空间
Devel space: /home/user/catkin_ws/devel --DEVEL SPACE 开发空间
Install space: /home/user/catkin_ws/install --INSTALL SPACE 安装空间
注意:catkin编译之前需要回到工作空间目录,catkin_make在其他路径下编译不会成功。编译完成后,如果有新的目标文件产生(原来没有),那么一般紧跟着要source刷新环境,使得系统能够找到刚才编译生成的ROS可执行文件。这个细节比较容易遗漏,致使后面出现可执行文件无法打开等错误
4.catkin_make可选参数
用ninja或nmake方式编译
- --use-ninja :用ninja取代make
- --use-nmake:用nmake取'make --force-cmake 强制cmake,即使已经cmake过
指定源码位置,如果源码不在当前工作空间的src下
- --source my_src :my_src为指定的src路径(默认为'workspace_base/src')
- --build BUILD :build的路径 ,指定编译后build文件存放的位置(默认为'workspace_base/build')
- catkin_make -DCATKIN_WHITELIST_PACKAGES="package1":编译指定的包,仅编译package1
编译所有包
- catkin_make -DCATKIN_WHITELIST_PACKAGES="":在双引号内不填代表编译所有包
- catkin_make install :使用install模式,编译后的可执行文件将存放在install目录中
