机器人操作系统入门(二)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的描述信息
  1. name, description, version, maintainer(s), license
  2. opt. authors, url's, dependencies, plugins, etc...
  • CMakeLists.txt:构建package所需的CMake文件
  1. 调用Catkin的函数/宏
  2. 解析 package.xml
  3. 找到其他依赖的catkin软件包
  4. 将本软件包添加到环境变量

(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 :标签将所有软件包列为依赖项,标签中添加标签声明。
原文地址:https://www.cnblogs.com/hg-love-dfc/p/10333545.html