写个自己学习的笔记,方便回查
一个程序包要想称为catkin程序包必须符合以下要求:
程序包必须包含catkin compliant package.xml
文件
package.xml
文件提供有关程序包的元信息。程序包必须包含一个catkin 版本的CMakeLists.txt
文件,而Catkin metapackages
中必须包含一个对CMakeList.txt
文件的引用。???
每个目录下只能有一个程序包。
最简单的程序包也许看起来就像这样:
my_package/
CMakeLists.txt
package.xml
开发catkin程序包的一个推荐方法是使用catkin工作空间,一个简单的工作空间结构看起来像这样:
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_create_pkg命令来创建一个新的catkin程序包以及创建之后都能做些什么.
我为了方便学习, 先装一个tree命令好打印文件目录结构
sudo apt-get install tree
cd ~catkin_ws
tree
或者
tree -L N N 为子文件夹显示到第几层
可以看到整个工作空间的树状文件结构
首先切换到之前通过创建catkin工作空间教程创建的catkin工作空间中的src目录下:
cd ~/catkin_ws/src
现在使用catkin_create_pkg命令来创建一个名为'beginner_tutorials'的新程序包,这个程序包依赖于std_msgs、roscpp和rospy:
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
这将会创建一个名为beginner_tutorials的文件夹,这个文件夹里面包含一个package.xml文件和一个CMakeLists.txt文件,这两个文件都已经自动包含了部分你在执行catkin_create_pkg命令时提供的信息。 如图:
catkin_create_pkg命令会要求你输入package_name,如果有需要你还可以在后面添加一些需要依赖的其它程序包, 下面是命令的示例:
# 只是示范不要运行
catkin_create_pkg [depend1] [depend2] [depend3]
之前在使用catkin_create_pkg命令时提供了几个程序包作为依赖包,现在我们可以使用rospack命令工具来查看一级依赖包。
rospack depends1 beginner_tutorials
就像你看到的,rospack列出了在运行catkin_create_pkg命令时作为参数的依赖包,这些依赖包随后保存在 package.xml
文件中。 查看一下:
roscd beginner_tutorials
cat package.xml
在很多情况中,一个依赖包还会有它自己的依赖包,比如,rospy还有其它依赖包。
rospack depends1 rospy
一个程序包还可以有好几个间接的依赖包,幸运的是使用rospack可以递归检测出所有的依赖包。这里注意是depends
而非 depends1
了
rospack depends beginner_tutorials
本部分教程将剖析catkin_create_pkg命令生成的每个文件并详细描述这些文件的组成部分以及如何自定义这些文件。
自动生成的package.xml
文件应该在你的新程序包中。现在让我们一起来看看新生成的package.xml
文件以及每一个需要你注意的标签元素。
先查看一下xml文件
~/Desktop/catkin_ws/src/beginner_tutorials$ gedit package.xml
首先更新描述标签:
The beginner_tutorials package</description>
将描述信息修改为任何你喜欢的内容,但是按照约定第一句话应该简短一些,因为它覆盖了程序包的范围。如果用一句话难以描述完全那就需要换行了。
这是package.xml中要求填写的一个重要标签,因为它能够让其他人联系到程序包的相关人员。至少需要填写一个维护者名称,但如果有需要的话你可以添加多个。除了在标签里面填写维护者的名称外,还应该在标签的email属性中填写邮箱地址:
你应该选择一种许可协议并将它填写到这里。一些常见的开源许可协议有BSD、MIT、Boost Software License、GPLv2、GPLv3、LGPLv2.1和LGPLv3。你可以在Open Source Initiative中阅读其中的若干个许可协议的相关信息。对于本教程我们将使用BSD协议,因为ROS核心组件的剩余部分已经使用了该协议.
除了catkin中默认提供的buildtool_depend,所有我们列出的依赖包都已经被添加到build_depend标签中。在本例中,因为在编译和运行时我们需要用到所有指定的依赖包,因此还需要将每一个依赖包分别添加到exec_depend标签中
老规矩, 记得事先source你的环境配置(setup)文件,在Ubuntu中的操作指令如下:
source /opt/ros/melodic/setup.bash
以下代码皆无效因为只做讲解
catkin_make 是一个命令行工具,它简化了catkin的标准工作流程。你可以认为catkin_make是在CMake标准工作流程中依次调用了cmake 和 make。
# 在catkin工作空间下
catkin_make [make_targets] [-DCMAKE_VARIABLES=...]
CMake标准工作流程主要可以分为以下几个步骤:
# 在一个CMake项目里
mkdir build
cd build
cmake ..
make
make install # (可选)
每个CMake工程在编译时都会执行这个操作过程。相反,多个catkin项目可以放在工作空间中一起编译,工作流程如下:
# In a catkin workspace
catkin_make
catkin_make install # (可选)
上述命令会编译src文件夹下的所有catkin工程。想更深入了解请参考REP128。 如果你的源代码不在默认工作空间中(~/catkin_ws/src),比如说存放在了my_src中,那么你可以这样来使用catkin_make:
# In a catkin workspace
catkin_make --source my_src
catkin_make install --source my_src # (optionally)
对于catkin_make更高级的使用方法,请参考catkin/commands/catkin_make
按照之前的创建一个ROS程序包教程,你应该已经创建好了一个catkin 工作空间 和一个名为beginner_tutorials的catkin 程序包。现在切换到catkin workspace 并查看src文件夹:
cd ~/catkin_ws/
ls src
你可以看到一个名为beginner_tutorials的文件夹,这就是你在之前的catkin_create_pkg 教程里创建的。现在我们可以使用catkin_make来编译它了:
catkin_make
报错:
'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
把 之前修改的package.xml
文件中的中文(只用标签中的就好,注释的无所谓) 改成英文再编译
catkin_make
catkin_make首先输出它所使用到的每个空间所在的路径。更多关于空间的信息,请参考REP128和catkin/workspaces。需要注意的是由于这些空间存在默认配置的原因,有几个文件夹已经在catkin工作空间自动生成了,使用ls查看:
ls
build
目录是build space
的默认所在位置,同时cmake 和 make也是在这里被调用来配置并编译你的程序包。devel
目录是devel space
的默认所在位置, 同时也是在你安装程序包之前存放可执行文件
和库文件
的地方。
Ros官方