机器人操作系统入门(二)ROS文件系统
参考资料:
https://www.icourse163.org/course/ISCAS-1002580008?tid=1003713012 //中国大学MOOC
https://www.bilibili.com/video/av23401751 //B站
《ROS操作系统入门讲义》PDF下载
链接:https://pan.baidu.com/s/1OCja2WLDRnjYXMrpnZ3-sQ
提取码:mziy
第二章 ROS文件系统
1. Catkin编译系统(Groovy版本后投入使用) //早期的ROS编译系统是rosbuild
(1)特点
Catkin沿用了包管理的传统像 find_package() 基础结构, pkg-config;扩展了CMake,例如
- 软件包编译后无需安装就可使用
- 自动生成 find_package() 代码, pkg-config 文件
- 解决了多个软件包构建顺序问题
一个Catkin的软件包(package)必须要包括两个文件:
- package.xml:包括了package的描述信息
- name, description, version, maintainer(s), license
- opt. authors, url's, dependencies, plugins, etc...
- CMakeLists.txt:构建package所需的CMake文件
- 调用Catkin的函数/宏
- 解析 package.xml
- 找到其他依赖的catkin软件包
- 将本软件包添加到环境变量
(2)工作原理
catkin编译的工作流程如下: //相当于封装了cmake和make
- 首先在工作空间 catkin_ws/src/ 下递归的查找其中每一个ROS的package
- package中会有 package.xml 和 CMakeLists.txt 文件,Catkin(CMake)编译系统依据 CMakeLists.txt 文件,从而生成 makefiles (放在 catkin_ws/build/ )
- 然后 make 刚刚生成的 makefiles 等文件,编译链接生成可执行文件(放在 catkin_ws/devel )
注:要用catkin编译一个工程或软件包,只需要用 catkin_make 指令 //catkin编译之前需要回到工作空间目录, catkin_make 在其他路径下编译不会成功,如果有新的目标文件产生需要紧接着“source刷新环境”
2. Catkin工作空间
(1)初始化
1 $ mkdir -p ~/catkin_ws/src 2 $ cd ~/catkin_ws/ 3 $ catkin_make #初始化工作空间
- catkin_make命令必须位于工作空间目录catkin_ws下运行
- 原先的初始化命令catkin_init_workspace在src目录下运行
(2)结构介绍 //用 tree 命令查看
1 $ cd ~/catkin_ws 2 $ sudo apt install tree 3 $ tree
默认包含三个文件夹:
- src/: ROS的catkin软件包(源代码包)
- build/: catkin(CMake)的缓存信息和中间文件
- devel/: 生成的目标文件(包括头文件,动态链接库,静态链接库,可执行文件等)、环境变量
编译流程如下:
注:yaml文件一般存储了ROS需要加载的参数信息,一些属性的配置。通常在launch文件或程序中读取.yaml文件,把参数加载到参数服务器上。
3. package软件包 //catkin编译的基本单元
(1)结构
一个package下常见的文件、路径有
其中CMakeLists.txt和package.xml定义了整个package(必不可少)
- CMakeLists.txt: 定义package的包名、依赖、源文件、目标文件等编译规则
- package.xml: 描述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)
(2)package的创建:catkin_create_pkg 命令
用法:catkin_create_pkg 包名 依赖项 // 如catkin_create_pkg test_pkg roscpp rospy std_msgs
(3)相关命令
常用命令:rosdep install --from-paths src --ignore-src --rosdistro=kinetic -y //用于安装工作空间中 src 路径下所有package的依赖项(由pacakge.xml文件指定)
4. CMakeLists.txt:规定了package要依赖哪些package,要编译生成哪些目标,如何编译等等流程
非常重要,它指定了由源码到目标文件的规则,catkin编译系统在工作时首先会找到每个package下的CMakeLists.txt,然后按照规则来编译构建。
(1)写法 //进一步的CMake语法可参考《CMake实践》:https://github.com/Akagi201/learning-cmake/blob/master/docs/cmake-practice.pdf
总体的宏结构如下:
(2)示例(turtlesim包下的turtlesim/CMakeLists.txt)
5. package.xml:软件包的描述文件,描述包的基本信息
(1)作用
- pacakge.xml 包含了package的名称、版本号、内容描述、维护人员、软件许可、编译构建工具、编译依赖、运行依赖等信息。
- 实际上 rospack find 、 rosdep 等命令之所以能快速定位和分析出package的依赖项信息,就是直接读取了每一个package中的 package.xml 文件,为用户提供了快速了解一个package的渠道。
(2)写法:遵循xml标签的写法
格式1(old):
其中,1-6为必备标签
格式2(new):
(3)示例(turtlesim/package)
老版本
新版本
6. Metapackage //老版本里的概念为“功能包集”stack
作用:将一些相近的功能模块、软件包放到一起
(1)常见metapackage
其中,navigation metapackage包含以下软件包:
navigation就是一个简单的package,里面只有几个文件,但它依赖了其他所有的软件包
(2)写法 //metapackage为虚包,无具体的包文件
一般有且仅有两个文件:CMakeLists.txt 和 pacakge.xml
CMakeLists.txt 写法如下:
1 cmake_minimum_required(VERSION 2.8.3) 2 project(ros_academy_for_beginners) 3 find_package(catkin REQUIRED) 4 catkin_metapackage() #声明本软件包是一个metapacakge
package.xml 写法如下:
与普通package的不同之处:
- CMakeLists.txt :加入了catkin_metapackage()宏,指定本软件包为一个metapacakge
- package.xml :标签将所有软件包列为依赖项,标签中添加标签声明。