ROS基础(5)——文件系统

一、catkin编译系统

对于源代码包,我们只有编译才能在系统上运行。
而Linux下的编译器有gcc、g++,随着源文件的增加,直接用gcc/g++命令的方式显得效率低下,人们开始用Makefile来进行编译。
然而随着工程体量的增大,Makefile也不能满足需求,于是便出现了Cmake工具。
CMake是对make工具的生成器,是更高层的工具,它简化了编译构建过程,能够管理大型项目,具有良好的扩展性。
对于ROS这样大体量的平台来说,就采用的是CMake,并且ROS对CMake进行了扩展,于是便有了Catkin编译系统。

Cmake的拓展——Catkin——将cmake与make 指令做了一个封装从而完成整个编译过程的工具
ROS基础(5)——文件系统_第1张图片

1、Catkin特点

Catkin是基于CMake的编译构建系统,具有以下特点:Catkin沿用了包管理的传统像 find_package()基础结构,pkg-config。扩展了CMake,例如软件包编译后无需安装就可使用、自动生成find_package()代码,pkg-config文件、解决了多个软件包构建顺序问题

一个Catkin的软件包(package)必须要包括两个文件:
(1)package.xml: 包括了package的描述信息

name、description、version, 
aintainer(s)、license、opt.authors
url's、dependencies、plugins、etc...

(2)CMakeLists.txt: 构建package所需的CMake文件

调用Catkin的函数/宏
解析package.xml
找到其他依赖的catkin软件包
将本软件包添加到环境变量

2、Catkin工作原理

编译工作流程:

在工作空间catkin_ws/src/下递归查找其中每一个ROS的package,
读取package中相应的package.xm和cMakeLists.txt文件,
Catkin (CMake)编译系统依据cMakeLists.txt文件,从而生成makefiles (放在catkin_ws/build/)
然后make刚刚生成的makefiles等文件,编译链接生成可执行文件(放在catkin_ws/devel)

也就是说,Catkin就是将cmake与make指令做了一个封装从而完成整个编译过程的工具。

catkin有比较突出的优点,主要是:
操作更加简单
一次配置,多次使用
跨依赖项目编译
catkin_make指令

3、使用catkin_make进行编译

先学习一下这一章节:工作空间的创建和使用

要用catkin编译一个工程或软件包,只需要用catkin_make指令。
一般写完代码,执行一次catkin_make进行编译,调用系统自动完成编译和链接过程,构建生成目标文件。编译的一般性流程如下:

cd ~/catkin_ws #回到工作空间,catkin_make必须在工作空间下执行
catkin_make    #开始编译
source ~/catkin_ws/devel/setup.bash #刷新坏境

catkin编译之前需要回到工作空间目录,catkin_make在其他路径下编译不会成功。
编译完成后,如果有新的目标文件产生(原来没有),那么一般紧跟着要source刷新环境,使得系统能够找到刚才编译生成的ROS可执行文件。
这个细节比较容易遗漏,致使后面出现可执行文件无法打开等错误。

可以通过–help指令查看catkin_make命令的参数:
ROS基础(5)——文件系统_第2张图片
ROS基础(5)——文件系统_第3张图片

二、Catkin工作空间

Catkin工作空间是创建、修改、编译catkin软件包的目录
catkin的工作空间,直观的形容就是一个仓库,里面装载着ROS的各种项目工程,便于系统组织管理调用
自己写的ROS代码通常就放在工作空间中(写的ROS程序、网上下载的ROS源代码包都存放src文件夹)

在编译过程中,它们的工作流程如图:
ROS基础(5)——文件系统_第4张图片
src/:ROS的catkin软件包(源码包)
build/:catkin(CMake)的缓存信息和中间文件
devel/:生成的目标文件(包括头文件、动态链接库、静态链接库、可执行文件等)环境变量

在编译时,catkin编译系统会递归的查找和编译src/下的每一个源代码包。因此你也可以把几个源代码包放到同一个文件夹下,如下图所示
ROS基础(5)——文件系统_第5张图片

三、Package软件包

上一章package软件包进行了分类,分别介绍了二进制包和源代码包。
而ROS中的package的定义更加具体,它不仅是Linux上的软件包,更是catkin编译的基本单元
我们调用catkin_make编译的对象就是一个个ROS的package,
也就是说任何ROS程序只有组织成package才能编译。
所以package也是ROS源代码存放的地方,
任何ROS的代码无论是C++还是Python都要放到package中,这样才能正常的编译和运行。
一个package可以编译出来多个目标文件(ROS可执行程序、动态静态库、头文件等等)。

1、 package结构

一个package下常见的文件、路径有:

CMakeLists.txt: 定义package的包名、依赖、源文件、目标文件等编译规则,是package不可少的成分
package.xml: 描述package的包名、版本号、作者、依赖等信息,是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)

其中定义package的是CMakeLists.txt和package.xml,这两个文件是package中必不可少的。
catkin编译系统在编译前,首先就要解析这两个文件。
这两个文件就定义了一个package。

通常ROS文件组织都是按照以上的形式,这是约定俗成的命名习惯,建议遵守。

2、package的创建

创建一个package需要在catkin_ws/src下,用到catkin_create_pkg命令,用法是:

catkin_create_pkg package [depends]

其中package是包名,depends是依赖的包名,可以依赖多个软件包。

例如,新建一个package叫做test_pkg,依赖roscpp、rospy、std_msgs(常用依赖)。

catkin_create_pkg test_pkg roscpp rospy std_msgs

这样就会在当前路径下新建test_pkg软件包,包括:

├── CMakeLists.txt
├── include
│ └── test_pkg
├── package.xml
└── src
catkin_create_pkg帮你完成了软件包的初始化,填充好了CMakeLists.txt和package.xml,并且将依赖项填进了这两个文件中。

3、package相关命令

ROS基础(5)——文件系统_第6张图片
ROS基础(5)——文件系统_第7张图片

四、CMakeLists.txt

1、CMakeLists.txt作用

CMakeLists.txt原本是Cmake编译系统的规则文件,
而Catkin编译系统基本沿用了CMake的编译风格,
只是针对ROS工程添加了一些宏定义。
所以在写法上,catkin的CMakeLists.txt与CMake的基本一致。

这个文件直接规定了这个package要依赖哪些package,
要编译生成哪些目标,如何编译等等流程。
所以CMakeLists.txt非常重要,它指定了由源码到目标文件的规则,
catkin编译系统在工作时首先会找到每个package下的CMakeLists.txt,
然后按照规则来编译构建。

2、CMakeLists.txt写法

CMakeLists.txt的基本语法都还是按照CMake,而Catkin在其中加入了少量的宏,总体的结构如下:

cmake_minimum_required() #CMake的版本号 
project()                #项目名称 
find_package()           #找到编译需要的其他CMake/Catkin package
catkin_python_setup()    #catkin新加宏,打开catkin的Python Module的支持
add_message_files()      #catkin新加宏,添加自定义Message/Service/Action文件
add_service_files()
add_action_files()
generate_message()       #catkin新加宏,生成不同语言版本的msg/srv/action接口
catkin_package()         #catkin新加宏,生成当前package的cmake配置,供依赖本包的其他软件包调用
add_library()            #生成库
add_executable()         #生成可执行二进制文件
add_dependencies()       #定义目标文件依赖于其他目标文件,确保其他目标已被构建
target_link_libraries()  #链接
catkin_add_gtest()       #catkin新加宏,生成测试
install()                #安装至本机

五、package.xml

package.xml也是一个catkin的package必备文件,它是这个软件包的描述文件,
在较早的ROS版本(rosbuild编译系统)中,这个文件叫做manifest.xml,用于描述pacakge的基本信息。

1、package.xml作用

pacakge.xml包含了package的名称、版本号、内容描述、维护人员、软件许可、编译构建工具、编译依赖、运行依赖等信息。

实际上rospack find、rosdep等命令之所以能快速定位和分析出package的依赖项信息,就是直接读取了每一个pacakge中的package.xml文件。它为用户提供了快速了解一个pacakge的渠道。

2、package.xml写法

pacakge.xml遵循xml标签文本的写法,由于版本更迭原因,现在有两种格式并存(format1与format2),不过区别不大。

老版本(format1)的pacakge.xml通常包含以下标签:

<pacakge>           根标记文件  
<name>              包名  
<version>           版本号  
<description>       内容描述  
<maintainer>        维护者 
<license>           软件许可证  
<buildtool_depend>  编译构建工具,通常为catkin  
<build_depend>      编译依赖项,与Catkin中的  
<run_depend>        运行依赖项

在新版本(format2)中,包含的标签为:

<pacakge>               根标记文件  
<name>                  包名  
<version>               版本号  
<description>           内容描述  
<maintainer>            维护者 
<license>               软件许可证  
<buildtool_depend>      编译构建工具,通常为catkin    
<depend>                指定依赖项为编译、导出、运行需要的依赖,最常用
<build_depend>          编译依赖项  
<build_export_depend>   导出依赖项
<exec_depend>           运行依赖项
<test_depend>           测试用例依赖项  
<doc_depend>            文档依赖项

六、 Metapackage

1、Metapackage介绍

Metapackage的作用将多个功能接近、甚至相互依赖的软件包的放到一个集合中去

ROS里常见的Metapacakge有:

Metapacakge名称 描述 链接
navigation 导航相关的功能包集 https://github.com/ros-planning/navigation
moveit 运动规划相关的(主要是机械臂)功能包集 https://github.com/ros-planning/moveit
image_pipeline 图像获取、处理相关的功能包集 https://github.com/ros-perception/image_common
vision_opencv ROS与OpenCV交互的功能包集 https://github.com/ros-perception/vision_opencv
turtlebot Turtlebot 机器人相关的功能包集 https://github.com/turtlebot/turtlebot
pr2_robot pr2机器人驱动功能包集 https://github.com/PR2/pr2_robot

以上列举了一些常见的功能包集,例如navigation、turtlebot,他们都是用于某一方面的功能,以navigation metapackage(官方介绍里仍然沿用stack的叫法)为例,它包括了以下软件包:
ROS基础(5)——文件系统_第8张图片

七、 其他常见文件类型

launch文件
launch文件一般以.launch或.xml结尾,它对ROS需要运行程序进行了打包,通过一句命令来启动。一般launch文件中会指定要启动哪些package下的哪些可执行程序,指定以什么参数启动,以及一些管理控制的命令。 launch文件通常放在软件包的launch/路径中中。

msg/srv/action文件
ROS程序中有可能有一些自定义的消息/服务/动作文件,为程序的发者所设计的数据结构,这类的文件以.msg,.srv,.action结尾,通常放在package的msg/,srv/,action/路径下。

urdf/xacro文件
urdf/xacro文件是机器人模型的描述文件,以.urdf或.xacro结尾。它定义了机器人的连杆和关节的信息,以及它们之间的位置、角度等信息,通过urdf文件可以将机器人的物理连接信息表示出来。并在可视化调试和仿真中显示。

yaml文件
yaml文件一般存储了ROS需要加载的参数信息,一些属性的配置。通常在launch文件或程序中读取.yaml文件,把参数加载到参数服务器上。通常我们会把yaml文件存放在param/路径下

dae/stl文件
dae或stl文件是3D模型文件,机器人的urdf或仿真环境通常会引用这类文件,它们描述了机器人的三维模型。相比urdf文件简单定义的性状,dae/stl文件可以定义复杂的模型,可以直接从solidworks或其他建模软件导出机器人装配模型,从而显示出更加精确的外形。

rviz文件
rviz文件本质上是固定格式的文本文件,其中存储了RViz窗口的配置(显示哪些控件、视角、参数)。通常rviz文件不需要我们去手动修改,而是直接在RViz工具里保存,下次运行时直接读取。

你可能感兴趣的:(ROS,linux,ROS)