详解ROS文件系统

   日期:2024-12-29    作者:69ax7 移动:http://ljhr2012.riyuangf.com/mobile/quote/80160.html

本章主要介绍了ROS的工程结构,也就是ROS的文件系统结构。要学会建立一个ROS工程,首先要认识一个ROS工程,了解它们的组织架构,从根本上熟悉ROS项目的组织形式,了解各个文件的功能和作用,才能正确的进行开发和编程。

本章的主要内容有,介绍catkin的编译系统,catkin工作空间的创建和结构,package软件包的创建和结构,介绍CMakeLists.txt文件,package.xml以及其他常见文件。从而系统的梳理了ROS文件空间的结构,对于我们ROS学习和开发有着重要的作用。

01 Catkin编译系统

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

早期的ROS编译系统是rosbuild,但随着ROS的不断发展,rosbuild逐渐暴露出许多缺点,不能很好满足系统需要。在Groovy版本面世后,Catkin作为rosbuild的替代品被正式投入使用。Catkin操作更加简化且工作效率更高,可移植性更好,而且支持交叉编译和更加合理的功能包分配。目前的ROS同时支持着rosbuild和Catkin两种编译系统,但ROS的核心软件包也已经全部转换为Catkin。rosbuild已经被逐步淘汰,所以建议初学者直接上手Catkin。

本节我们主要来介绍catkin的编译系统。

1.1 Catkin特点

Catkin是基于CMake的编译构建系统,具有以下特点

  • Catkin沿用了包管理的传统像 基础结构,
  • 扩展了CMake,例如
    • 软件包编译后无需安装就可使用
    • 自动生成代码,文件
    • 解决了多个软件包构建顺序问题

一个Catkin的软件包(package)必须要包括两个文件

  • package.xml: 包括了package的描述信息
    • name, description, version, maintainer(s), license
    • opt. authors, url's, dependencies, plugins, etc...
  • CMakeLists.txt: 构建package所需的CMake文件
    • 调用Catkin的函数/宏
    • 解析
    • 找到其他依赖的catkin软件包
    • 将本软件包添加到环境变量

1.2 Catkin工作原理

catkin编译的工作流程如下

  1. 首先在工作空间下递归的查找其中每一个ROS的package。
  2. package中会有和文件,Catkin(CMake)编译系统依据文件,从而生成(放在)。
  3. 然后刚刚生成的等文件,编译链接生成可执行文件(放在)。

也就是说,Catkin就是将与指令做了一个封装从而完成整个编译过程的工具。catkin有比较突出的优点,主要是

  • 操作更加简单
  • 一次配置,多次使用
  • 跨依赖项目编译

1.3 使用进行编译

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

 

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

命令也有一些可选参数,例如

 

02 Catkin工作空间

Catkin工作空间是创建、修改、编译catkin软件包的目录。catkin的工作空间,直观的形容就是一个仓库,里面装载着ROS的各种项目工程,便于系统组织管理调用。在可视化图形界面里是一个文件夹。我们自己写的ROS代码通常就放在工作空间中,本节就来介绍catkin工作空间的结构。

2.1 创建catkin工作空间

创建一个 catkin 工作空间

 

2.2 编译工作空间

 

注意: catkin编译之前需要回到工作空间目录,在其他路径下编译不会成功。

编译完成后,如果有新的目标文件产生(原来没有,那么一般紧跟着要source刷新环境,使得系统能够找到刚才编译生成的ROS可执行文件。这个细节比较容易遗漏,致使后面出现可执行文件无法打开等错误。

命令也有一些可选参数,例如

 

注意, 对于 Python 3 用户,在一个空的 catkin 工作空间中第一次运行 catkin_make的命令应为

 

这将会配置 catkin_make 使用 Python 3.你可以在随后的构建中只使用 。

2.3 设置环境变量

另外,如果你查看一下当前目录应该能看到 'build' 和 'devel' 这两个文件夹。在 'devel' 文件夹里面你可以看到几个  文件。 这些文件中的任何一个都可以将当前工作空间设置在ROS工作环境的最顶层。接下来首先  一下新生成的  文件

 

2.4 检查环境变量

要想保证工作空间已配置正确,需确保环境变量包含你的工作空间目录,采用以下命令查看

 

到此你的工作环境已经搭建完成。

03 catkin结构介绍

catkin的结构十分清晰,具体的catkin工作空间结构图如下。初看起来catkin工作空间看起来极其复杂,其实不然,catkin工作空间的结构其实非常清晰。

在工作空间下用tree命令,显示文件结构。

 
 

结果为

 

通过tree命令可以看到catkin工作空间的结构,它包括了、、三个路径,在有些编译选项下也可能包括其他。但这三个文件夹是catkin编译系统默认的。它们的具体作用如下

  • src/: ROS的catkin软件包(源代码包
  • build/: catkin(CMake)的缓存信息和中间文件
  • devel/: 生成的目标文件(包括头文件,动态链接库,静态链接库,可执行文件等)、环境变量

在编译过程中,它们的工作流程如图

后两个路径由catkin系统自动生成、管理,我们日常的开发一般不会去涉及,而主要用到的是src文件夹,我们写的ROS程序、网上下载的ROS源代码包都存放在这里。

在编译时,catkin编译系统会递归的查找和编译下的每一个源代码包。因此你也可以把几个源代码包放到同一个文件夹下,如下图所示

小结

catkin工作空间基本就是以上的结构,package是catkin工作空间的基本单元,我们在ROS开发时,写好代码,然后catkin_make,系统就会完成所有编译构建的工作。至于更详细的package内容,我们将在下节继续介绍。

04 Package软件包

  • ROS程序只有组成package才能编译
  • package是ROS源代码存放的地方
  • ROS的代码无论是C++还是Python都要放到package中,这样才能正常的编译和运行
  • 一个package可以编译出来多个目标文件(ROS可执行程序、动态静态库、头文件等等)。

4.1 package结构

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

 
  • 其中定义package的是和,这两个文件是package中必不可少的。catkin编译系统在编译前,首先就要解析这两个文件。这两个文件就定义了一个package。
  • 通常ROS文件组织都是按照以上的形式,这是约定俗成的命名习惯,建议遵守。以上路径中,只有和是必须的,其余路径根据软件包是否需要来决定。

4.2 package的创建

创建一个package需要在下,用到命令,用法是

 

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

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

 

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

 

帮你完成了软件包的初始化,填充好了和,并且将依赖项填进了这两个文件中。

4.3 package相关命令

4.3.1 rospack

rospack是对package管理的工具,命令的用法如下

以上命令如果package缺省,则默认为当前目录(如果当前目录包含package.xml)

4.3.2 roscd

命令类似与Linux系统的,改进之处在于可以直接到ROS的软件包。

4.3.3 rosls

也可以视为Linux指令的改进版,可以直接ROS软件包的内容。

4.3.4 rosdep

是用于管理ROS package依赖项的命令行工具,用法如下

一个较常使用的命令是

 

05 CMakeLists.txt

5.1 CMakeLists.txt作用

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

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

5.2 CMakeLists.txt写法

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

 

如果你从未接触过CMake的语法,请阅读《CMake实践》:https://github.com/Akagi201/learning-cmake/blob/master/docs/cmake-practice.pdf 。掌握CMake语法对于理解ROS工程很有帮助。

5.3 CMakeLists例子

为了详细的解释的写法,我们以turtlesim小海龟这个pacakge为例,读者可到包下查看,在的写法如下,:

 

06 package.xml

也是一个catkin的package必备文件,它是这个软件包的描述文件,在较早的ROS版本(rosbuild编译系统)中,这个文件叫做,用于描述pacakge的基本信息。如果你在网上看到一些ROS项目里包含着,那么它多半是hydro版本之前的项目了。

6.1 package.xml作用

包含了package的名称、版本号、内容描述、维护人员、软件许可、编译构建工具、编译依赖、运行依赖等信息。 实际上、等命令之所以能快速定位和分析出package的依赖项信息,就是直接读取了每一个pacakge中的文件。它为用户提供了快速了解一个pacakge的渠道。

6.2 package.xml写法

遵循xml标签文本的写法,由于版本更迭原因,现在有两种格式并存(format1与format2,不过区别不大。老版本(format1)的通常包含以下标签:

 

说明:其中1-6为必备标签,1是根标签,嵌套了其余的所有标签,2-6为包的各种属性,7-9为编译相关信息。

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

 

由此看见新版本的格式上增加了 、、、 ,相当于将之前的build和run依赖项描述进行了细分。

目前Indigo、Kinetic、Lunar等版本的ROS都同时支持两种版本的,所以无论选哪种格式都可以。

6.3 pacakge.xml例子

为了说明pacakge.xml写法,还是以turtlesim软件包为例,其文件内容如下,我们添加了相关的注释

 

以上内容是老版本(format1)的写法,如果要写成新版本(format2)则可以改为

 

07 Metapackage

7.1 Metapackage介绍

在一些ROS的教学资料和博客里,你可能还会看到一个Stack(功能包集)的概念,它指的是将多个功能接近、甚至相互依赖的软件包的放到一个集合中去。但Stack这个概念在Hydro之后就取消了,取而代之的就是Metapackage。尽管换了个马甲,但它的作用没变,都是把一些相近的功能模块、软件包放到一起。

ROS里常见的Metapacakge有

以上列举了一些常见的功能包集,例如navigation、turtlebot,他们都是用于某一方面的功能,以navigation metapackage(官方介绍里仍然沿用stack的叫法)为例,它包括了以下软件包

这里只看一个软件包navigation。这个navigation就是一个简单的pacakge,里面只有几个文件,但由于它依赖了其他所有的软件包。Catkin编译系统会明白,这些软件包都属于navigation metapacakge。

这个道理并不难理解,比如我们在安装ROS时,用到了命令,由于它依赖了ROS所有的核心组件,我们在安装时也就能够安装整个ROS。

 

7.2 Metapackage写法

我们以ROS-Academy-for-beginners为例介绍meteapckage的写法,在教学包内,有一个软件包,该包即为一个metapacakge,其中有且仅有两个文件:和。

写法如下

 

写法如下

 

metapacakge中的以上两个文件和普通pacakge不同点是

  • :加入了catkin_metapackage()宏,指定本软件包为一个metapacakge。
  • :标签将所有软件包列为依赖项,标签中添加标签声明。

metapacakge在我们实际开发一个大工程时可能有用。

08 其他常见文件类型

在ROS的pacakge中,还有其他许多常见的文件类型,这里做个总结。

8.1 launch文件

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

8.2 msg/srv/action文件

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

8.3 urdf/xacro文件

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

8.4 yaml文件

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

8.5 dae/stl文件

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

8.6 rviz文件

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

09 参考资料

https://zhuanlan.zhihu.com/p/144600321


特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号