二、创建ROS程序包
0.1 catkin软件包组成
-
该程序包必须包含catkin compliant package.xml文件
- 这个package.xml文件提供有关程序包的元信息。
-
程序包必须包含一个catkin 版本的CMakeLists.txt文件,而Catkin metapackages中必须包含一个对CMakeList.txt文件的引用。
-
每个目录下只能有一个程序包。
- 意味着在同一个目录下不能有嵌套的或者多个程序包存在。
0.2 在catkin工作空间中的程序包
开发catkin程序包的一个推荐方法是使用catkin工作空间,但是你也可以单独开发(standalone)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
0.3 创建一个catkin程序包
- 安装catkin
$ sudo apt-get install ros-melodic-catkin
- sourced your environment
$ source /opt/ros/melodic/setup.bash
- 创建catkin workspace
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin_make
- 创建一个catkin程序包
1.catkin工作空间中的src目录下:
# You should have created this in the Creating a Workspace Tutorial
$ cd ~/catkin_ws/src
2.使用catkin_create_pkg命令来创建一个名为'beginner_tutorials'的新程序包,这个程序包依赖于std_msgs、roscpp和rospy:
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
0.4 程序包依赖关系
- 一级依赖
$ rospack depends1 beginner_tutorials
"显示:"
roscpp
rospy
std_msgs
"rospack列出了在运行catkin_create_pkg命令时作为参数的依赖包,这些依赖包随后保存在package.xml文件中,可通过如下命令查看:"
$ roscd beginner_tutorials
$ cat package.xml
- 间接依赖
在很多情况中,一个依赖包还会有它自己的依赖包,比如,rospy还有其它依赖包。
$ rospack depends1 rospy
会显示如下信息:
genpy
roscpp
rosgraph
rosgraph_msgs
roslib
std_msgs
一个程序包还可以有好几个间接的依赖包,幸运的是使用rospack可以递归检测出所有的依赖包:
$ rospack depends beginner_tutorials
cpp_common
rostime
roscpp_traits
roscpp_serialization
genmsg
genpy
message_runtime
rosconsole
std_msgs
rosgraph_msgs
xmlrpcpp
roscpp
rosgraph
catkin
rospack
roslib
rospy
0.5 自定义软件包
- 自定义 package.xml
进入已生成的文件夹,按着提示修改即可。
示例如下,保存即可:
<?xml version="1.0"?>
<package format="2">
<name>beginner_tutorials</name>
<version>0.0.0</version>
<description>The beginner_tutorials package</description>
<maintainer email="[email protected]">li</maintainer>
<license>BSD</license>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<build_export_depend>roscpp</build_export_depend>
<build_export_depend>rospy</build_export_depend>
<build_export_depend>std_msgs</build_export_depend>
<exec_depend>roscpp</exec_depend>
<exec_depend>rospy</exec_depend>
<exec_depend>std_msgs</exec_depend>
<export>
</export>
</package>