Creating a ROS Package
Building a ROS Package
ROS学习之catkin CMakeList.txt
ROS 工作空间、package 及 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有比较突出的优点,主要是:
一个Catkin的软件包(package)必须要包括两个文件:
如果要深入研究 catkin_make 编译方式,可以参考:ROS 编译系统 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编译的工作流程如下:
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.
Catkin工作空间(workspace)是创建、修改、编译catkin软件包的目录。 简单地说,ros工作空间就是统一存放 ROS 文件的文件夹,一个项目的所有 ROS 文件都放在一个 workspace 中,便于统一管理、编译和调用。
参考: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进行后续构建。
package 是 ros 软件的基本组成形式,catkin 编译的基本单元,调用 catkin_make 编译的对象就是一个个ROS的package,也就是说任何ROS程序只有组织成 package才能编译。无论是C++还是Python 源代码都要放到package中,这样才能正常的编译和运行。一个 package 包含多个可执行文件(节点)。一个package下常见的文件、路径有:
前面提到,catkin编译系统会在工作空间 catkin_ws/src/ 下递归的查找编译每一个package源代码包。因此可以将几个package包放到同一个src文件夹下。但要注意 package 之间不能嵌套,也就是在一个 package 中,不能再创建另一个 package ,所有 package 都必须是相对独立的目录。
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 必须满足三个条件:
最简单的package只包含两个文件:CMakeLists.txt、package.xml。
ros wiki CMakeList.txt
CMakeLists.txt 语法介绍与实例演练
CMakeLists.txt原本是Cmake编译系统的规则文件,而Catkin编译系统基本沿用了CMake的编译风格,只是针对ROS工程添加了一些宏定义。所以在写法上,catkin 的 CMakeLists.txt 与CMake的基本一致。
这个文件直接规定了这个package要依赖哪些package,要编译生成哪些目标,如何编译等等 流程。所以 CMakeLists.txt 非常重要,它指定了由源码到目标文件的规则,catkin编译系统在 工作时首先会找到每个package下的 CMakeLists.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 - 其他配置选项
ros wiki package.xml
package.xml也是一个catkin的package必备文件,它是这个软件包的描述文件,在较早的 ROS版本(rosbuild编译系统)中,这个文件叫做 manifest.xml ,用于描述pacakge的基本信息。
pacakge.xml包含了package的名称、版本号、内容描述、维护人员、软件许可、编译构建工具、编译依赖、运行依赖等信息。 实际上rospack find
、 rosdep
等命令之所以能快速定位和分析出package的依赖项信息,就是直接读取了每一个pacakge中的 package.xml 的渠道。
pacakge.xml遵循xml标签文本的写法,由于版本更迭原因,现在有两种格式并存(format1与 format2),不过区别不大。老版本(format1)的 pacakge.xml 通常包含以下标签:
在新版本(format2)中,包含的标签为:
.
用depend整合了build_depend,build_export_depend和run_depend。
run_depend 改为了exec_depend。
参考: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 的时候再补上。
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?
ROS程序中有可能有一些自定义的消息/服务/动作文件,为程序的发者所设计的数据结构,这 类的文件以 .msg , .srv , .action 结尾,通常放在package的 msg/ , srv/ , action/ 路径下。
urdf/xacro文件是机器人模型的描述文件,以.urdf或.xacro结尾。它定义了机器人的连杆和关 节的信息,以及它们之间的位置、角度等信息,通过urdf文件可以将机器人的物理连接信息表 示出来。并在可视化调试和仿真中显示。
yaml文件一般存储了ROS需要加载的参数信息,一些属性的配置。通常在launch文件或程序 中读取.yaml文件,把参数加载到参数服务器上。通常我们会把yaml文件存放在 param/ 路径 下
dae或stl文件是3D模型文件,机器人的urdf或仿真环境通常会引用这类文件,它们描述了机器 人的三维模型。相比urdf文件简单定义的性状,dae/stl文件可以定义复杂的模型,可以直接从 solidworks或其他建模软件导出机器人装配模型,从而显示出更加精确的外形
rviz文件本质上是固定格式的文本文件,其中存储了RViz窗口的配置(显示哪些控件、视角、 参数)。通常rviz文件不需要我们去手动修改,而是直接在RViz工具里保存,下次运行时直接读取。