ROS本质上就是由一个又一个的package组成的,package可以说是ROS的细胞。在catkin_make的时候它会一个一个的去找package然后生成目标文件。一个package可以有多个节点。判断是否为Package :一个文件夹要被ROS认为是package的话,必须包含以下两个文件:CMakeList.txt和package.xml。
在一个ROS功能包中,CMakeList.txt和package.xml是不可缺少的两个文件。那么package.xml到底起到什么作用呢?
CMakeLists.txt规定catkin编译的规则。(例如:源文件,依赖项,目标文件)。而package.xml文件定义了package的属性。(例如:包名,版本号,作者,一来等等),相当于一个包的自我描述。
pacakge.xml 遵循xml标签文本的写法, 由于版本更迭原因, 现在有两种格式并存( format1与format2) , 不过区别不大。‘
<package> <!--1. 根标签-->
<name> <!--2. 包名-->
<version> <!--3. 版本号-->
<description> <!--4. 包描述-->
<maintainer> <!--5. 维护者-->
<license> <!--6. 软件许可-->
<buildtool_depend> <!--7. 编译工具-->
<build_depend> <!--8. 编译时的依赖-->
<run_depend> <!--9. 运行时的依赖-->
</package> <!--根标签-->
PS:其中1-6为必备标签,1是根标签嵌套了其余所有标签,2-6是包的各种属性,7-9是编译相关信息。
<package> <!--1. 根标签-->
<name> <!--2. 包名-->
<version> <!--3. 版本号-->
<description> <!--4. 包描述-->
<maintainer> <!--5. 维护者-->
<license> <!--6. 软件许可-->
<buildtool_depend> <!--7. 编译构建工具,通常为catkin-->
<depend> <!--8. 指定依赖项为编译、 导出、 运行需要的依赖,最常用的依赖标记。-->
<build_depend> <!--9. 编译依赖项-->
<build_export_depend> <!--10. 导出依赖项-->
<exec_depend> <!--11. 运行依赖项-->
<test_depend> <!--12. 测试用例依赖项-->
<doc_depend> <!--13. 文档依赖项-->
</package> <!--根标签-->
改为
首先在ros下创建一个名位beginner_tutorials的软件包:
$ cd ~/catkin_ws/src
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
//定义version为1.0
<package format="2">//定义format为2
<name>beginner_tutorialsname>//定义name为beginner_tutorials
<version>0.0.0version>//定义version为0.0.0
<description>The beginner_tutorials packagedescription>//定义描述为The be...
<maintainer email="[email protected]">aoyinmaintainer>//定义email
<license>TODOlicense>
//定义depend为roscpp
//定义build_depend为roscpp
//定义exec_depend为roscpp
//定义buildtool为catkin
<buildtool_depend>catkinbuildtool_depend>
<build_depend>roscppbuild_depend>
<build_depend>rospybuild_depend>
<build_depend>std_msgsbuild_depend>
<build_export_depend>roscppbuild_export_depend>
<build_export_depend>rospybuild_export_depend>
<build_export_depend>std_msgsbuild_export_depend>
<exec_depend>roscppexec_depend>
<exec_depend>rospyexec_depend>
<exec_depend>std_msgsexec_depend>
<export>
export>
package>
发现package.xml在第二步和第四步将会用到。
(1) 把包里的xml文件直接删掉:
删掉之后进行catkin_make,通过,但cpp文件并没有被编译,看上去ROS系统并没有把它当作一个功能包。这证明了package.xml文件是功能包被ROS系统识别的前提。
(2) 在xml文件中把
cpp文件被编译,整个catkin_make也能通过。
(3) 在xml文件中把
catkin_make报错:
CMake Error at /opt/ros/kinetic/share/catkin/cmake/catkin_package.cmake:116 (message):
catkin_package() ‘catkin’ must be listed as a buildtool dependency in the
package.xml
说明**
(4)删除0.0.0:
报错:
Error(s) in package ‘/home/ch/forTest/src/minimal_nodes/package.xml’:
The manifest must contain exactly one “version” tag
说明**必须包含**。
结论:删掉
参考:
package.xml使用说明
ros程序包下的package.xml是干什么的?
对ROS功能包中package.xml文件的疑问
知乎问答