本节主要介绍如何用 catkin 来创建一个新的功能包,并且使用前面介绍的 rospack 命令去查看功能包的依赖。
一个完整的 catkin 功能包需要具备以下几个条件:
所以一个最简单的功能包应该是如下所示:
my_package/
CMakeLists.txt
package.xml
这里我们将演示如何使用 catkin_create_pkg 脚本创建一个新的catkin包,以及创建后的处理方法。catkin_create_pkg 的语法规则如下, package_name 是指功能包的名称, depend 是指该功能包编译所需要的依赖:
catkin_create_pkg [depend1] [depend2] [depend3]
首先进入我们之前创建的工作空间目录下的 src 目录中:
cd ~/catkin_ws/src
然后使用 catkin_create_pkg 命令来创建一个名为 beginner_tutorial 的功能包,假设功能包会依赖 std_msgs , rospy ,roscpp 。
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
根据上图 log 中的显示内容我们可以看到,这里创建了一个 beginner_tutorials 文件夹,其中包含package.xml和CMakeLists.txt,已经部分填充了一些功能包的描述信息。
进入工作空间目录,输入 catkin_make 命令即可完成对整个工作空间内所有功能包的编译。
cd ~/catkin_ws
catkin_make
为了能让 ROS 系统中的命令行工具能够找到我们自己创建的功能包,需要设置一下环境。这里我们再介绍一下 home 目录下的 .bashrc 这个文件,它其实是 shell 的配置文件,通俗一点讲也就是我们每次打开一个终端都会默认运行一次 .bashrc,我们使用 gedit 编辑器打开这个文件,看一下里面的内容:
gedit ~/.bashrc
大家看到最后一行应该有似曾相识的感觉了,这行命令是我们安装 ROS 并且设置环境变量(1.2.6节)时通过 echo 命令添加到 .bashrc 文件中的。所以通俗点描述就是每次打开终端都会默认执行一次 ROS 环境的设置,这也是就为什么我们每次打开终端后我们输入 ROS 相关的命名系统都能够理解。同样道理,我们希望每次打开终端后,系统也能够找到我们自己创建的 ROS 功能包的位置,那就需要再添加一行命令,如下所示:
保存并退出,然后重新打开一个终端(这里要注意一点最好重新打开一个终端,否则当前终端启动的其实还是修改前的 .bashrc),即可完成环境配置。
前面我们使用 catkin_create_pkg 命令时,提供了一些功能包依赖项。 现在可以使用rospack工具查看这些一级依赖项,输入如下指令:
rospack depends1 beginner_tutorials
如上图所示,rospack 列出了运行 catkin_create_pkg 时用作参数的依赖项。程序包的这些依赖项存储在 package.xml 文件中:
roscd beginner_tutorials
cat package.xml
很多情况下,依赖包本身也会依赖其他包,就像 rospy 本身也依赖多个包,这些依赖被称为 beginner_tutorials 的非直接依赖:
rospack depends1 rospy
一个包可以有很多间接依赖。rospack depends 不加任何参数项就可以递归列出所有嵌套的依赖项,如下所示:
rospack depends beginner_tutorials
接下来我们来看一下 catkin_create_pkg 生成的文件 package.xml,并逐行描述这些文件的每个组件,以及如何根据程序包定义它们。使用gedit打开 package.xml 文件:
roscd beginner_tutorials/
gedit package.xml
将描述更改为您喜欢的任何内容,包括版本号以及功能包的简短描述。
这个标签是非常重要的,这里描述的是维护者的信息,如果我们这个功能包未来可能会分享给同学、同事或者开源社区,那么这个信息可以方便被分享人联系维护者。
这部分需要填写一个许可证信息,一些常见的开源许可证是 BSD ,MIT ,Boost Software License,GPLv2,GPLv3,LGPLv2.1和LGPLv3等等。读者可以自行查询相关开源协议的说明,并选择一个适合自己的。这里我们选择 BSD 协议,因为 ROS 中的其他核心组件大部分也是采用的 BSD 协议。BSD 开源协议是一个给于使用者很大自由的协议,BSD 开源协议鼓励代码共享,但需要尊重代码作者的著作权。BSD 允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销售,因此是对商业集成很友好的协议。很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。
这一组信息描述了功能包的依赖。后面的章节我们会对这些依赖展开更为详细的描述,读者在这里可以不做修改。
最后我们把注释信息都删除掉,可以看到一个更简洁的 package.xml 文件。