一、ROS简介
随着技术进步,机器人产业分工开始走向细致化、多层次化,如今的电机、底盘、激光雷达、摄像头、机械臂等等元器件都有不同厂家专门生产。社会分工加速了机器人行业的发展。而各个部件的集成就需要一个统一的软件平台,在机器人领域,这个平台就是机器人操作系统ROS。
ROS是一个适用于机器人编程的框架,这个框架把原本松散的零部件耦合在了一起,为他们提供了通信架构。ROS虽然叫做操作系统,但并非Windows、Mac那样通常意义的操作系统,它只是连接了操作系统和你开发的ROS应用程序,所以它也算是一个中间件,基于ROS的应用程序之间建立起了沟通的桥梁,所以也是运行在Linux上的运行时环境,在这个环境上,机器人的感知、决策、控制算法可以更好的组织和运行。
所以说框架、中间件、操作系统、运行时环境这些词都可以用来描述ROS的特性。
二、ROS文件系统
要了解ROS文件系统,先了解catkin的编译系统和package软件包的创建和结构。
2.1、Catkin编译系统来源
Linux下的编译器有gcc、g++,随着源文件的增加,直接用gcc/g++命令的方式显得效率低下,人们开始用Makefile来进行编译。然而随着工程体量的增大,Makefile也不能满足需求,于是便出现了Cmake工具。CMake是对make工具的生成器,是更高层的工具,它简化了编译构建过程,能够管理大型项目,具有良好的扩展性。对于ROS这样大体量的平台来说,就采用的是CMake,并且ROS对CMake进行了扩展,于是便有了Catkin编译系统。
2.2、Catkin特点
Catkin是基于CMake的编译构建系统,具有以下特点:
l Catkin沿用了包管理的传统像基础结构
l 扩展了CMake,例如
软件包编译后无需安装就可使用
自动生成 find_package() 代码, pkg-config 文件
解决了多个软件包构建顺序问题
一个Catkin的软件包(package)必须要包括两个文件:
l package.xml: 包括了package的描述信息
l CMakeLists.txt: 构建package所需的CMake文件
调用Catkin的函数/宏
解析 package.xml
找到其他依赖的catkin软件包
将本软件包添加到环境变量
也就是说,Catkin就是将 cmake 与 make 指令做了一个封装从而完成整个编译过程的工具。
catkin有比较突出的优点,主要是:操作更加简单、一次配置,多次使用、跨依赖项目编译。
l 编译过程中,它们的工作流程如图:
后两个路径由catkin系统自动生成、管理,我们日常的开发一般不会去涉及,而主要用到的是src文件夹,我们写的ROS程序、网上下载的ROS源代码包都存放在这里。
在编译时,catkin编译系统会递归的查找和编译 src/ 下的每一个源代码包。因此你也可以把几个源代码包放到同一个文件夹下,如下图所示:
2.3、Package软件包结构
package是catkin工作空间的基本单元,一个package下常见的文件、路径有:
其中定义package的是 CMakeLists.txt 和 package.xml ,这两个文件是package中必不可少的。catkin编译系统在编译前,首先就要解析这两个文件。这两个文件就定义了一个package。
l CMakeLists.txt: 定义package的包名、依赖、源文件、目标文件等编译规则,是package 不可少的成分
l package.xml: 描述package的包名、版本号、作者、依赖等信息,是package不可少的成分
l src/: 存放ROS的源代码,包括C++的源码和(.cpp)以及Python的module(.py)
l include/: 存放C++源码对应的头文件
l scripts/: 存放可执行脚本,例如shell脚本(.sh)、Python脚本(.py)
l msg/: 存放自定义格式的消息(.msg)
l srv/: 存放自定义格式的服务(.srv)
l models/: 存放机器人或仿真场景的3D模型(.sda, .stl, .dae等)
l urdf/: 存放机器人的模型描述(.urdf或.xacro)
l launch/: 存放launch文件(.launch或.xml)
通常ROS文件组织都是按照以上的形式,这是约定俗成的命名习惯,建议遵守。以上路径中,只有 CMakeLists.txt 和 package.xml 是必须的,其余路径根据软件包是否需要来决定。
2.4、Package软件包创建
创建一个package需要在 catkin_ws/src 下,用到 catkin_create_pkg 命令,用法是:
catkin_create_pkg package depends
其中package是包名,depends是依赖的包名,可以依赖多个软件包。
新建 test_pkg 的软件包,包括:
catkin_create_pkg 帮你完成了软件包的初始化,填充好了 CMakeLists.txt 和 package.xml ,并且将依赖项填进了这两个文件中。