1.什么是工作空间
- 工作空间(workspace)是一个存放工程开发相关文件的文件夹。
- src:代码空间(SourceSpace),放置package源代码包
- build:编译空间(Build Space),放置编译产生的缓存和中间文件
- devel:开发空间(Development Space),放置编译完成之后的可执行文件,环境变量,脚本等
2.创建工作空间(catkin workspace)
$ mkdir -p ~/catkin_ws/src #创建建工作空间
$ cd ~/catkin_ws/ #回到工作空间,catkin_make必须在工作空间下执行
$catkin_make #开始编译
$source ~/catkin_ws/devel/setup.bash
注意: catkin编译之前需要回到工作空间目录,catkin_make在其他路径下编译不会成功。编译完成后,如果有新的目标文件产生(原来没有),那么一般紧跟着要source设置环境变量,使得系统能够找到刚才编译生成的ROS可执行文件。但是这个命令只会在当前的终端生效,在新的终端里此环境变量的设置不起效果。所以最好把这个设置环境变量的命令放在整个终端的配置文件里去:
$ vim ~/.bashrc
$source ~/catkin_ws/devel/setup.bash #放在最后一行
$ source ~/.bashrc #刷新环境,使上步的设置在当前终端生效
$ echo $ROS_PACKAGE_PATH #检测设置的环境变量是否生效
3.创建功能包(package)
package是catkin工作空间的基本单元,是ROS源代码存放的地方,一个package可以编译出来多个目标文件(ROS可执行程序、动态静态库、头文件等等)。一个功能包必需满足以下三个条件:
package必需包含 package.xml 文件,它描述package的包名、版本号、作者、依赖等基本信息
package必需包含 CMakeLists.txt 文件,它定义package的包名、依赖、源文件、目标文件等编译规则
每个package必需是一个单独的文件夹,不允许几个package文件夹嵌套在一起
$ cd ~/catkin_ws/src #功能包必需在工作空间src文件夹下
$ catkin_create_pkg learning_communication std_msgs rospy roscpp #创建功能包catkin_create_pkg <package_name>
[depend1] [depend2] [depend3]
$ cd ~/catkin_ws #编译功能包
$ catkin_make
$ source ~/catkin_ws/devel/setup.bash #由于前面已经在终端中设置了环境变量,故此处可不再设置
4.功能包依赖项
功能包依赖项含有功能包本身的一级依赖项(First-order dependencies),和依赖的间接依赖项(Indirect dependencies):
$rospack depends1 <package_name> #包含在package.xml的功能包一级依赖项
$rospack depends1 <depend> #功能包依赖的间接依赖项
$rospack depends <package_name> #功能包包括间接依赖项在内的所有依赖项
5.package.xml的写法
-
描述标签,首先用简练的语言更新描述标签
5 <description>The <package_name>/anything package</description>
-
维护者标签
7 <!-- One maintainer tag required, multiple allowed, one person per tag -->
8 <!-- Example: -->
9 <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
10 <maintainer email="user@todo.todo">user</maintainer>
- 许可整标签
12 <!-- One license tag required, multiple allowed, one license per tag -->
13 <!-- Commonly used license strings: -->
14 <!-- BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
15 <license>TODO</license>
- 依赖项标签,依赖项标签分为:build_depend,buildtool_depend,,exec_depend,test_depend
27 <!-- The *_depend tags are used to specify dependencies -->
28 <!-- Dependencies can be catkin packages or system dependencies -->
29 <!-- Examples: -->
30 <!-- Use build_depend for packages you need at compile time: -->
31 <!-- <build_depend>genmsg</build_depend> -->
32 <!-- Use buildtool_depend for build tool packages: -->
33 <!-- <buildtool_depend>catkin</buildtool_depend> -->
34 <!-- Use exec_depend for packages you need at runtime: -->
35 <!-- <exec_depend>python-yaml</exec_depend> -->
36 <!-- Use test_depend for packages you need only for testing: -->
37 <!-- <test_depend>gtest</test_depend> -->
38 <buildtool_depend>catkin</buildtool_depend>
39 <build_depend>roscpp</build_depend>
40 <build_depend>rospy</build_depend>
41 <build_depend>std_msgs</build_depend>
42
43 <exec_depend>roscpp</exec_depend>
44 <exec_depend>rospy</exec_depend>
45 <exec_depend>std_msgs</exec_depend>
- 最终package.xml文件,去除说明性和没实际用处的标签,最终package.xml文件如下
1 <?xml version="1.0"?>
2 <package format="2">
3 <name>beginner_tutorials</name>
4 <version>0.1.0</version>
5 <description>The beginner_tutorials package</description>
6
7 <maintainer email="you@yourdomain.tld">Your Name</maintainer>
8 <license>BSD</license>
9 <url type="website">http://wiki.ros.org/beginner_tutorials</url>
10 <author email="you@yourdomain.tld">Jane Doe</author>
11
12 <buildtool_depend>catkin</buildtool_depend>
13
14 <build_depend>roscpp</build_depend>
15 <build_depend>rospy</build_depend>
16 <build_depend>std_msgs</build_depend>
17
18 <exec_depend>roscpp</exec_depend>
19 <exec_depend>rospy</exec_depend>
20 <exec_depend>std_msgs</exec_depend>
21
22 </package>
6.工作空间的覆盖机制
- 工作空间的路径依次在ROS_PACKAGE_PATH环境变量中记录
- 新设置的路径在ROS_PACKAGE_PATHZ中会自动放置在最前端
- 运行时,ROS会优先查找最前端的工作空间中是否存在指定的功能包
- 如果不存在,就顺序向后查找其他工作空间