ROS 学习笔记 (二)—— ros 文件系统:Catkin & 工作空间 & ROS功能包

Creating a ROS Package
Building a ROS Package
ROS学习之catkin CMakeList.txt

ROS 工作空间、package 及 catkin 编译系统

1. Catkin编译系统 & Catkin 工作空间

1.1 catkin 编译系统

源代码要经过编译才能在系统上运行。linux下的编译器有gcc、g++,随着源文件的增加,又相继发展出了Makefile、CMake编译工具。CMake简化了编译构建过程,能够管理大型项目,具有良好的扩展性。Catkin 是 ROS 基于CMake的编译构建系统。

ROS原始的编译和打包系统是rosbuild,而ROS 官方自 ROS Groovy 版本开始指定用catkin系统取代了之前的 rosbuild 。 catkin结合了CMake宏和Python脚本,以在CMake的正常工作流程之上提供一些功能。 catkin比rosbuild设计的更规范,可以更好地分发软件包,具有更好交叉编译支持和更好的可移植性。 catkin的工作流程与CMake的工作流程非常相似,但是增加了对自动“find package”基础结构的支持,并能够同时构建多个相关项目。

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

  • 软件包编译后无需安装就可使用
  • 自动生成 find_package() 代码,pkg-config文件
  • 解决了多个软件包构建顺序问题
  • 一次配置,多次使用
  • 跨依赖项目编译

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

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

如果要深入研究 catkin_make 编译方式,可以参考:ROS 编译系统 catkin 详解

1.2 使用 catkin 进行编译

参考:catkin/commands/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可执行文件。如果在~/.bashrc文件夹添加了source ~/catkin_ws/devel/setup.bash 语句,打开新终端即可刷新环境。

catkin_make 简化了catkin 的标准工作流程。你可以认为catkin_make是在CMake标准工作流程中依次调用了cmake 和 make。catkin_make命令等效于:

# cd ~/catkin_ws
cd src
catkin_init_workspace
cd ..
mkdir build
cd build
cmake ../src -DCMAKE_INSTALL_PREFIX=../install -DCATKIN_DEVEL_PREFIX=../devel
make

catkin_make,会一次性编译 src 文件夹中的所有源文件,同时生成 devel 和 build 两个文件夹。catkin编译的工作流程如下:

  1. 首先catkin编译系统会在工作空间 catkin_ws/src/ 下递归的查找编译每一个package源代码包。
  2. package中会有 package.xml 和 CMakeLists.txt 文件,Catkin(CMake)编译系统依据CMakeLists.txt文件生成makefiles(放在 catkin_ws/build/)。
  3. 然后make刚刚生成的 makefiles 等文件,编译链接生成可执行文件(放在catkin_ws/devel)。

编译过程

  • build 文件夹存放编译过程中的缓存文件和中间过渡文件
  • devel 文件夹存放编译之后生成的目标文件(包括头文件,动态链接库,静态链接库,可执行文件等)、环境变量。

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

devel文件夹中有一个比较特殊的文件 setup.(ba)sh,只要通过 source 命令加载了这个 setup 文件(source devel/setup.bash),就相当于编译之后的文件安装在了本机中,可以直接调用他们 (Sourcing any of these files will overlay this workspace on top of your environment.)。等测试没有问题了,再考虑 install 和 share with other developers.

2. catkin 工作空间

2.1 ros 文件系统

Catkin工作空间(workspace)是创建、修改、编译catkin软件包的目录。 简单地说,ros工作空间就是统一存放 ROS 文件的文件夹,一个项目的所有 ROS 文件都放在一个 workspace 中,便于统一管理、编译和调用。

catkin工作空间与编译系统
工作空间构成:

  • 源文件空间:src 文件夹,放置功能包(package)源文件。
  • 编译空间:build 文件夹,c++编译过程中产生的中间文件。基本不用关心。
  • 开发空间:devel 文件夹,保存编译后生成的目标文件和环境变量。
  • 安装空间:install文件夹,用 install 指令安装成功的包的放置位置。

2.2 创建工作空间

参考:create_a_workspace

create and build a catkin workspace:

mkdir -p ~/catkin_ws/src  # -p (parent)参数可以创建某个文件夹和它的父文件夹,也就是两层的路径
cd ~/catkin_ws/
catkin_make # 初始化工作空间

注:有些教程仍然保留了原先的初始化命令 catkin_init_workspace。 catkin_init_workspace会在src目录下创建一个CMakeLists.txt 文件,这实际上是一个链接到ROS 安装目录下的 /opt/ros/melodic/share/catkin/cmake/toplevel.cmake 一个超链接文件,对工作空间做了一些初始设置。仅当以后要手动调用cmake,make之类的内容时,才需要使用它。catkin_make命令就包含了catkin_init_workspace的工作。因此,通常不必自己调用catkin_init_workspace。

运行完 catkin_make 指令后会在工作空间出现build和 devel 两个文件夹。在 devel 文件夹中有几个 setup.*sh文件,Sourcing 该文件会将此工作空间覆盖到你的环境的最顶端:source devel/setup.bash.

为确保setup脚本正确覆盖您的工作区,请确保ROS_PACKAGE_PATH环境变量包含您所在的目录:
echo $ROS_PACKAGE_PATH /home/youruser/catkin_ws/src:/opt/ros/kinetic/share

ROS Melodic和更早版本中的Python 3用户:请注意,如果要从源代码构建ROS以实现Python 3兼容性,并已正确设置系统(即:已安装所有必需ROS Python软件包的Python 3版本,例如catkin),在干净的catkin工作区中的第一个catkin_make命令必须是:
catkin_make-DPYTHON_EXECUTABLE = /usr/bin/python3
这将使用Python 3配置catkin_make。然后,您可以继续使用catkin_make进行后续构建。

3. package 功能包

package 是 ros 软件的基本组成形式,catkin 编译的基本单元,调用 catkin_make 编译的对象就是一个个ROS的package,也就是说任何ROS程序只有组织成 package才能编译。无论是C++还是Python 源代码都要放到package中,这样才能正常的编译和运行。一个 package 包含多个可执行文件(节点)。一个package下常见的文件、路径有:
package

前面提到,catkin编译系统会在工作空间 catkin_ws/src/ 下递归的查找编译每一个package源代码包。因此可以将几个package包放到同一个src文件夹下。但要注意 package 之间不能嵌套,也就是在一个 package 中,不能再创建另一个 package ,所有 package 都必须是相对独立的目录。
src 文件
rospack是对package管理的命令行工具。rosdep 是用于管理ROS package依赖项的命令行工具,一个较常使用的命令是rosdep install --from-paths src --ignore-src --rosdistro=kinetic -y,用于安装工作空间中src路径下所有package的依赖项(由pacakge.xml文件指定)。

ROS的package编译有两种方法,一种是用rosmake,这种方法简单;另一种是用 catkin_make,这种方法相对要复杂些,但更方便包的管理和开发,因此官方也建议使用第二种方式。这两种方法都是先建立工作空间workspace(类似于vs下的解决方案,用来管理很多的项目),然后建立包package(类似于vs下的项目),最后利用rosmake或者catkin_make进行编译和运行。

下面只介绍 catkin 创建及编译 package 的方法。

catkin package 必须满足三个条件:

  1. package 中必须包含符合catkin的package.xml文件,该文件描述package的包名、版本号、作者、依赖等信息。
  2. package 中必须包含使用catkin的CMakeLists.txt。CMakeLists.txt定义package的包名、依赖、源文件、目标文件等编译规则。
  3. 每个 package 必须有自己的文件夹。即,没有嵌套软件包,也没有多个软件包共享同一目录。

最简单的package只包含两个文件:CMakeLists.txt、package.xml。

3.1 CMakeList.txt 文件解读

ros wiki CMakeList.txt
CMakeLists.txt 语法介绍与实例演练

CMakeLists.txt原本是Cmake编译系统的规则文件,而Catkin编译系统基本沿用了CMake的编译风格,只是针对ROS工程添加了一些宏定义。所以在写法上,catkin 的 CMakeLists.txt 与CMake的基本一致。
这个文件直接规定了这个package要依赖哪些package,要编译生成哪些目标,如何编译等等 流程。所以 CMakeLists.txt 非常重要,它指定了由源码到目标文件的规则,catkin编译系统在 工作时首先会找到每个package下的 CMakeLists.txt ,然后按照规则来编译构建。

CMakeLists.txt总体结构如下:
cmakelist.txt

generate_messages(DEPENDENCIES geometry_msgs std_msgs std_srvs)
#在add_message_files、add_service_files宏之后必须加上这句话,用于生成srv msg头文件/module,生成的文件位于devel/include中.

catkin_package(CATKIN_DEPENDS geometry_msgs message_runtime std_msgs std_srvs)
# catkin宏命令,用于配置ROS的package配置文件和CMake文件
# 这个命令必须在add_library()或者add_executable()之前调用,该函数有5个可选参数:
# (1) INCLUDE_DIRS - 导出包的include路径
# (2) LIBRARIES - 导出项目中的库
# (3) CATKIN_DEPENDS - 该项目依赖的其他catkin项目
# (4) DEPENDS - 该项目所依赖的非catkin CMake项目。
# (5) CFG_EXTRAS - 其他配置选项

3.2 package.xml 文件解读

ros wiki package.xml

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

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

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

在新版本(format2)中,包含的标签为:
在这里插入图片描述
<package format="2"> <!--在声明pacakge时指定format2,为新版格式-->.
用depend整合了build_depend,build_export_depend和run_depend。
run_depend 改为了exec_depend。

3.3 创建功能包

参考:CreatingPackage

创建 package 要用catkin_create_pkg指令。

cd ~/catkin_ws/src/
# 创建test_pkg功能包,同时指明依赖std_msgs rospy roscpp
catkin_create_pkg test_pkg std_msgs rospy roscpp

这将会在 src 目录下创建一个名为test_pkg的文件夹,这个文件夹里面包含一个package.xml文件和一个CMakeLists.txt文件,这两个文件都已经自动包含了部分你在执行catkin_create_pkg命令时提供的信息。创建时也可以不指明依赖关系,在后续编译 package 的时候再补上。

3.4 编译功能包

catkin_make 是一个命令行工具,它简化了catkin 的标准工作流程。你可以认为catkin_make是在CMake标准工作流程中依次调用了cmake 和 make。
catkin是ROS的官方编译系统,是原始ROS编译系统rosbuild的继承者。 catkin结合了CMake宏和Python脚本,以在CMake的正常工作流程之上提供一些功能。 catkin比rosbuild设计的更规范,可以更好地分发软件包,具有更好交叉编译支持和更好的可移植性。 catkin的工作流程与CMake的工作流程非常相似,但是增加了对自动“find package”基础结构的支持,并能够同时构建多个相关项目。

cd ~/catkin_ws/
catkin_make

上述命令将构建〜/ catkin_ws / src中的所有软件包。

如果你想只build工作空间中的某些功能包,可以设置whitelist:

cd ~/catkin_ws/
catkin_make -DCATKIN_WHITELIST_PACKAGES="package1;package2"
# or
catkin_make --pkg package1 package2  # 不过这个命令好像不太有效

不过白名单是有记忆的,如果想还原为 build 所有的 package:

catkin_make -DCATKIN_WHITELIST_PACKAGES=""

参考:How to build just one package using catkin_make?

4. pacakge中的其他文件类型

4.1 launch文件

4.2 msg/srv/action文件

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

4.3 urdf/xacro文件

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

4.4 yaml文件

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

4.5 dae/stl文件

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

4.6 rviz文件

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

猜你喜欢

转载自blog.csdn.net/zxxxiazai/article/details/108312127