本章的主要内容是对 ROS 的工作空间和编译系统的阐述。
参考资料:
ROS Wiki:http://wiki.ros.org/ROS
ROS 自学笔记 4 – 工作空间与编译系统:https://blog.csdn.net/qq_1648…
下图是 ROS 的一个工程结构,反映的是文件系统之间的关系。一个典型的 ROS 工程就是这个样子。
下面来具体介绍一下这个图的结构。
1. catkin 空间
catkin 是 ROS 定制的编译构建系统对 CMake 的扩展。简单来说 catkin 就是用来编译 ROS 工程的。我们所有的代码都放到 catkin workspace 这个文件夹里的,这个文件夹的名字可以自己起。
首先先建立一个工作空间:
mkdir -p ~/catkin_new/src
编译:
cd ~/catkin_new/
catkin_make
source ~ catkin_new/devel/setup.zsh
需要注意的是一定要在相应工作空间下编译,然后编译完后 source 一下环境,如果没有这一步,就会导致我们生成的文件打不开。
在编译完成之后,会生成两个文件夹:build 和 devel。build 是 cmake 和 catkin 缓存和中间文件,devel 是目标文件。只有 src 是我们需要写代码的文件。
2. src 文件夹
我们日常写程序主要和 src 打交道。
src 里面放的是各种各样的功能包 package。package 是 catkin 编译的基本单元。
3. package
package 是 ROS 组成的基本细胞,是 catkin 编译的基本单元,我们在执行 catkin_make 指令时,编译系统会一个个的找 package 可执行包。所以多个 pachage 包放到同一个文件夹下也是可以的。catkin_make 会递归的查找编译每个文件。
一个 package 并不一定包含一个可执行文件,一个 package 还可以包含多个可执行文件(节点),package 架构最基本的结构:必须包含 CMkelists.txt 和 package.xml。
CMakeList.txt 规定了 catkin 编译的规则,例如:源文件、依赖项、目标文件。
package.xml 定义了 package 的属性,例如:包名,版本号,作者,依赖等。相当于包的自我描述。
<package> <!-- 根标签 -->
<name> <!-- 包名 -->
<version> <!-- 版本号 -->
<description> <!-- 包描述 -->
<maintainer> <!-- 维护者 -->
<license> <!-- 软件许可 -->
<buildtool_depend> <!-- 编译工具 -->
<build_depend> <!-- 编译时的依赖 -->
<run_depend> <!-- 运行时的依赖 -->
</package> <!-- 根标签 -->
有了上面这两个文件的 package 就是最基本的 package。
ROS 里面的可执行程序包括:(1) 脚本,如 shell 或者 python;(2)C++ 头文件或者源文件。通常会在像下图一样。
我们还会放一些自定义的通信格式:包括消息(msg)、服务(srv)、动作(action)。比如我们想在 ROS 下面自定义一个服务,那我们就在 package 下新建一个 srv 文件夹,然后在这个文件夹里放 *.srv 文件。我们还可以在 package 下放 launch 文件和配置文件。
launch 的作用就是用来一次性运行多个文件。一帮放在 launch 文件中。配置文件一般放到 config 文件夹下。它的自由度比较高,一般用.yaml 格式来写。