说明:本文主要是结合 ROS 官网的相关内容以及自己的相应操作心得整理而成,记录在此处仅仅是为了自己查找方便!
ROS 官网相关参考内容网址:http://wiki.ros.org/ROS/Tutorials/CreatingPackage
一个 package 被认为是 catkin package,必须要满足下面几个条件:
最简单的 package 可能是这样的结构:
my_package/
CMakeLists.txt
package.xml
使用 catkin package 的推荐方法是使用 catkin 工作区,但是也可以直接 build catkin package。简单的工作区可能像下面这样:
workspace_folder/ -- WORKSPACE
src/ -- SOURCE SPACE
CMakeLists.txt -- 'Toplevel' CMake file, provided by catkin
package_1/
CMakeLists.txt -- CMakeLists.txt file for package_1
package.xml -- Package manifest for package_1
...
package_n/
CMakeLists.txt -- CMakeLists.txt file for package_n
package.xml -- Package manifest for package_n
一般 catkin 已经默认安装好了,只需要 source 一下:
source /opt/ros/melodic/setup.bash
然后就可以直接 create catkin 工作区
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make
catkin_make 命令是用于处理 catkin 工作区的便捷工具。 第一次在工作区中运行它,将在“src”文件夹中创建一个 CMakeLists.txt 链接。
系统默认的 Python 版本是 Python2,Python3 的用户还需要进行额外操作,参见:
http://wiki.ros.org/catkin/Tutorials/create_a_workspace
此外,如果查看当前目录,可以看到“build”和“devel”文件夹。 在“devel”文件夹中,可以看到现在有几个 setup.*sh 文件, source 这些文件中的任何一个都会将此工作区覆盖在环境之上。想了解更多信息可查看:
http://wiki.ros.org/catkin
在继续 source 新的 setup.*sh 文件之前:
source devel/setup.bash
为确保安装脚本正确覆盖工作区,需确保 ROS_PACKAGE_PATH 环境变量包含所在的目录:
echo $ROS_PACKAGE_PATH
本文将演示如何使用 catkin_create_pkg 脚本来 create 新的 catkin package,以及在 create 后可以使用它来做什么。
首先切换到在 create catkin 工作区一文中 create 的 catkin 工作区的源空间目录:
cd ~/catkin_ws/src
现在使用 catkin_create_pkg 脚本 create 一个名为“beginner_tutorials”的新 package,它依赖于 std_msgs、roscpp 和 rospy:
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
这将 create 一个名为 beginner_tutorials 的文件夹,包含一个 package.xml 和一个 CMakeLists.txt,其中部分填充了提供给 catkin_create_pkg 的信息。
catkin_create_pkg 需要给它一个 package_name 和可能存在的依赖:
catkin_create_pkg [depend1] [depend2] [depend3]
catkin_create_pkg 还有更多的功能,可参考:http://wiki.ros.org/catkin/commands/catkin_create_pkg
在 catkin 工作区中 build package:
cd ~/catkin_ws
catkin_make
工作区 build 好后就会在 devel 的子文件夹中 create 类似 /opt/ros/melodic 下类似的结构。
要将工作区添加到 ROS 环境,需要 source 生成的设置文件:
. ~/catkin_ws/devel/setup.bash
之前使用 catkin_create_pkg 时,提供了一些 package 依赖。 现在可以使用 rospack 工具查看这些一阶依赖。
rospack depends1 beginner_tutorials
rospack 列出了在运行 catkin_create_pkg 时用作参数的相同依赖,这些依赖存储在 package.xml 文件中:
roscd beginner_tutorials
cat package.xml
在许多情况下,依赖也会有它自己的依赖。 例如,rospy 有其他依赖项。
rospack depends1 rospy
一个 package 可以有很多间接依赖,幸运的是 rospack 可以递归地确定所有嵌套的依赖。
rospack depends beginner_tutorials
这一部分将查看由 catkin_create_pkg 生成的每个文件,并逐行描述这些文件的每个组件以及如何为自己的 package 自定义它们。
新 package 中应该包含生成的 package.xml,现在查看新的 package.xml 并修改需要注意的任何元素。下面是上文 5.1 执行了“cat package.xml”命令后的结果,供参考:
rokin@OMEN:~/catkin_ws/src/beginner_tutorials$ cat package.xml
beginner_tutorials
0.0.0
The beginner_tutorials package
rokin
TODO
catkin
roscpp
rospy
std_msgs
roscpp
rospy
std_msgs
roscpp
rospy
std_msgs
The beginner_tutorials package
可以把描述改成喜欢的任何东西,但按照惯例,第一句话应该简短,同时涵盖了 package 的范围。如果很难用一句话来描述这个 package,那么它可能需要被分解。
user
这是 package.xml 的必需且重要的标签,因为它让其他人知道该 package 的相关事宜。 至少需要一名 maintainer;但如果愿意,也可以拥有许多 maintainers。 maintainer 的名字进入标签正文,还有一个 email 属性需要填写:
Your Name
TODO
需要选择并填写一个 license 在此处。 一些常见的开源 license 是 BSD、MIT、Boost Software License、GPLv2、GPLv3、LGPLv2.1 和 LGPLv3,可以在开源计划中阅读其中的一些内容,网址为:https://opensource.org/licenses/alphabetical
在本文中,我们将使用 BSD 许可证,因为其余的核心 ROS 组件已经使用它:
BSD
这一组标签描述了 package 的依赖关系。 依赖分为build_depend、buildtool_depend、exec_depend、test_depend。 有关这些标签的更详细说明,请参阅有关 Catkin 依赖的文档(http://wiki.ros.org/catkin/package.xml#Build.2C_Run.2C_and_Test_Dependencies)。 由于我们将 std_msgs、roscpp 和 rospy 作为参数传递给 catkin_create_pkg,因此依赖将如下所示:
catkin
roscpp
rospy
std_msgs
除了 catkin 上的默认 buildtool_depend 之外,列出的所有依赖都已添加为 build_depend。 在这种情况下,我们希望所有指定的依赖在 build 和 run 时都可用,因此我们还将为每个依赖添加一个 exec_depend 标记:
catkin
roscpp
rospy
std_msgs
roscpp
rospy
std_msgs
如果没有注释和未使用的标签,完整的 package.xml 将会更加简洁:
1
2
3 beginner_tutorials
4 0.1.0
5 The beginner_tutorials package
6
7 Your Name
8 BSD
9 http://wiki.ros.org/beginner_tutorials
10 Jane Doe
11
12 catkin
13
14 roscpp
15 rospy
16 std_msgs
17
18 roscpp
19 rospy
20 std_msgs
21
22
catkin_create_pkg create 的 CMakeLists.txt 文件将在后面关于 build ROS 代码的文章中介绍。