工程结构即文件系统结构。
一个典型的ros工程结构如下图所示
catkin
catkin工作空间
这是ros工程框架里层次最高的概念。
catkin:是ros定制的编译构建系统,是对CMake的扩展。我们用它来编译ros程序。
而catkin 工作空间其实就是一个文件夹,用它来组织和管理ros功能包的文件夹,比如对它的克隆,创建,修改等操作。那这个工作空间是从哪里来的呢,这就需要我们用指令来创建:
catkin_make
: 这个指令帮我们初始化工作空间,空间的名字可以随便取,但是里面一定要有src目录
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin_make
其实该指令的最主要功能不是初始化空间,而是编译,一般我们写完了代码都需要catkin_make 一下,系统就会帮我们自动构建。
注意:
- catkin_make 之前一定要回到 catkin_workspace,不然会失败
- catkin_make 之后要记得source bash文件:目的是要把刚刚编译完的ws刷新到环境变量里,这样才可以让系统知道ros系统文件放在哪里。
$ cd ~/catkin_ws
$ catkin_make
$ source ~/catkin_ws/devel/setup.bash
在catkin_make之后即可看到如下的目录结构:
同时src里放的就是各种功能包package,package就是catkin编译的基本单元。catkin在编译时会自动在src目录下递归的查找每一个package。因为是递归查找,所以如果你把package这样放也是可以的。
package
package: 即功能包,它是ROS软件的基本组织形式,也是catkin编译的基本单元,一个package可以包含多个可执行文件(节点)
ROS本质上就是一个个package组成的。但是一个package不一定只对应一个exe文件,也可以对应多个。
一个软件包如果想被ros系统认定为package,至少需要有如下的结构:
CMakeLists.txt
规定了catkin编译的规则, 例如:源文件、依赖项、目标文件。具体写法如下:
想更多了解可以查看《CMake实践》
package.xml
该文件定义package定义了该包的属性信息,相当于包的自我描述。
一般只需要修改画红线的两个地方就可以了。
代码文件
ros里面的可执行程序一般有两种来源:
- 脚本(shell,python)
- C ++ (头文件、源文件)
通常大家都会在package下建立script路径来存放这些可执行脚本,include和src来存放头文件和源文件。有些情况也会把一些python的组件包放在package/src下。
自定义通信格式
消息(msg)、服务(srv)、动作(acton)
launch 以及配置文件
launch文件(launch)、配置文件(yaml)
用launch文件组织多个可执行文件。
配置文件一般就比较高,通常都用yaml来写
常用指令
Metapacakge
sudo apt-get intall ros-kinectic-desktop-full
我们在搭建ros系统时安装的这个包其实就是一个meta包,是linux软件包管理的概念,里面没有实质性的内容,但是有很多依赖包。通过这种方法,我们可以把其他包组装起来。
在过去,也曾用过stack的概念来完成类似的功能,现在已经废弃,但是名字可能还会在一些地方见到,不用奇怪。
转载请注明出处。
本文总结于中国大学MOOC《机器人操作系统入门》
链接: link.
图片来自于课程视频截图