catkin軟件包的組成
一個軟件包必須滿足如下條件才能被稱之為catkin軟件包:
- 必須包含一個catkin編譯文件package.xml(manifests文件),此文件包含了描述該軟件包的重要信息。
- 必須包含一個catkin 版本的CMakeLists.txt文件,而Catkin metapackages中必須包含一個對CMakeList.txt文件的引用。
- 每個目錄下只能有一個程序包。 這意味着在同一個目錄下不能有嵌套的或者多個程序包存在。
最簡單的可能的軟件包可能有如下文件結構:
my_package/
CMakeLists.txt
package.xml
1.catkin工作空間中的程序包
最好利用catkin工作空間來處理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
1.創建程序包
【1】先創建一個catkin 工作空間:(復習上一節)
$ mkdir -p ~/catkin_ws2/src //在home中創建catkin_ws2/src $ cd ~/catkin_ws2 $ catkin_make $ source devel/setup.bash //配置環境變量 $ echo $ROS_PACKAGE_PATH //檢查工作空間是否已配置環境變量
【2】創建一個catkin程序包(catkin_create_pkg
命令)
cd ~/catkin_ws2/src
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
依賴於std_msgs、rospy、roscpp在src目錄下創建一個名為beginner_tutorials的catkin軟件包,這將會創建一個名稱為beginner_tutorials的包含CMakeLists.txt和package.xml文件的文件夾,及src文件夾和include文件夾,但是此時都是空的。(catkin_create_pkg命令要求提供軟件包名稱和可選擇的一系列軟件包的依賴。 )
注意:軟件包命名慣例是—以小寫字母開頭,只能包含小寫字母和數字以及下划線,不符合規則的軟件包名稱將不能編譯通過。
安裝樹枝干 sudo apt-get install tree,為了更清楚顯示。
wj@wj-Inspiron-5437:~/catkin_ws2/src/beginner_tutorials$ tree . ├── CMakeLists.txt ├── include │ └── beginner_tutorials ├── package.xml └── src
3 directories, 2 files
2.編譯catkin工作空間(程序包)
按照之前的應該已經創建好了一個catkin 工作空間 和一個beginner_tutorials的catkin 程序包。
進行編譯:
wj@wj-Inspiron-5437:~/catkin_ws2
$ catkin_make
Base path: /home/wj/catkin_ws2 Source space: /home/wj/catkin_ws2/src Build space: /home/wj/catkin_ws2/build Devel space: /home/wj/catkin_ws2/devel Install space: /home/wj/catkin_ws2/install #### #### Running command: "cmake /home/wj/catkin_ws2/src -DCATKIN_DEVEL_PREFIX=/home/wj/catkin_ws2/devel -DCMAKE_INSTALL_PREFIX=/home/wj/catkin_ws2/install -G Unix Makefiles" in "/home/wj/catkin_ws2/build" #### -- Using CATKIN_DEVEL_PREFIX: /home/wj/catkin_ws2/devel -- Using CMAKE_PREFIX_PATH: /home/wj/catkin_ws2/devel;/opt/ros/indigo -- This workspace overlays: /home/wj/catkin_ws2/devel;/opt/ros/indigo -- Using PYTHON_EXECUTABLE: /usr/bin/python -- Using Debian Python package layout -- Using empy: /usr/bin/empy -- Using CATKIN_ENABLE_TESTING: ON -- Call enable_testing() -- Using CATKIN_TEST_RESULTS_DIR: /home/wj/catkin_ws2/build/test_results -- Found gtest sources under '/usr/src/gtest': gtests will be built -- Using Python nosetests: /usr/bin/nosetests-2.7 -- catkin 0.6.18 -- BUILD_SHARED_LIBS is on -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- ~~ traversing 1 packages in topological order: -- ~~ - beginner_tutorials -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- +++ processing catkin package: 'beginner_tutorials' -- ==> add_subdirectory(beginner_tutorials) -- Configuring done -- Generating done -- Build files have been written to: /home/wj/catkin_ws2/build #### #### Running command: "make -j4 -l4" in "/home/wj/catkin_ws2/build" ####
前面幾行是編譯文件的基本信息,每個空間所在的路徑。
3.軟件包依賴
【1】直接依賴:
(利用rospack工具可以查看這些直接依賴。)
$ source devel/setup.bash
$ rospack depends1 beginner_tutorials
roscpp
rospy
std_msgs
可以看出rospack工具列出了在使用catkin_create_pkg命令的時候提供的依賴,這些信息存儲在packa.xml文件中,可以cat package.xml
查看。
wj@wj-Inspiron-5437:~/catkin_ws2/src/beginner_tutorials$ cat package.xml
【2】間接依賴:
在很多情況下,我們會遇到依賴的依賴,即間接依賴。例如beginner_tutorials的依賴文件rospy也有其他依賴。
$ rospack depends1 rospy
genpy
roscpp
rosgraph
rosgraph_msgs
roslib
std_msgs
如果我們使用rospack depends(沒有阿拉伯數字1),則會列出catkin軟件包的所有依賴文件。
wj@wj-Inspiron-5437:~/catkin_ws2$ rospack depends beginner_tutorials
4.定制catkin軟件包
主要按照自己的需要更改package.xml文件和CMakeLists.txt文件
【1】定制package.xml文件
描述部分description
<package> <name>beginner_tutorials</name> <version>0.0.0</version> <description>The beginner_tutorials package</description>
維護者部分maintainer
<!-- One maintainer tag required, multiple allowed, one person per tag --> <!-- Example: --> <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> --> <maintainer email="wj@todo.todo">wj</maintainer>至少需要一個維護者的信息,但是也可以添加多個。維護者的名字在類別的內容之中,郵箱在類別的屬性之中。
許可證部分license
<!-- One license tag required, multiple allowed, one license per tag -->
<!-- Commonly used license strings: -->
<!-- BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
<license>TODO</license>
依賴部分dependencies
依賴在這里被分為build_depend, buildtool_depend, run_depend, test_depend, 更加詳細的信息見此link。當前package.xml中的依賴部分如下:
<!-- The *_depend tags are used to specify dependencies --> <!-- Dependencies can be catkin packages or system dependencies --> <!-- Examples: --> <!-- Use build_depend for packages you need at compile time: --> <!-- <build_depend>message_generation</build_depend> --> <!-- Use buildtool_depend for build tool packages: --> <!-- <buildtool_depend>catkin</buildtool_depend> --> <!-- Use run_depend for packages you need at runtime: --> <!-- <run_depend>message_runtime</run_depend> --> <!-- Use test_depend for packages you need only for testing: --> <!-- <test_depend>gtest</test_depend> --> <buildtool_depend>catkin</buildtool_depend> <build_depend>roscpp</build_depend> <build_depend>rospy</build_depend> <build_depend>std_msgs</build_depend>
我們想在編譯和運行的時候都能夠獲得這些依賴,所以需要在run_depend中添加那些依賴,結果如下:
<buildtool_depend>catkin</buildtool_depend> <build_depend>roscpp</build_depend> <build_depend>rospy</build_depend> <build_depend>std_msgs</build_depend> <run_depend>roscpp</run_depend> <run_depend>rospy</run_depend> <run_depend>std_msgs</run_depend>
最后完成的 package.xml
現在看下面最后去掉了注釋和未使用標簽后的package.xml文件就顯得更加簡潔了:
<?xml version="1.0"?> <package> <name>beginner_tutorials</name> <version>0.0.0</version> <description>The beginner_tutorials package</description> <maintainer email="wj@todo.todo">wj</maintainer> <license>TODO</license> <url type="website">http://wiki.ros.org/beginner_tutorials</url> <author email="jane.doe@example.com">Jane Doe</author> <buildtool_depend>catkin</buildtool_depend> <build_depend>roscpp</build_depend> <build_depend>rospy</build_depend> <build_depend>std_msgs</build_depend> <run_depend>roscpp</run_depend> <run_depend>rospy</run_depend> <run_depend>std_msgs</run_depend>
【2】定制CMakelists.txt文件
3.總結
- catkin軟件包必要組成:package.xml和CMakeList.txt文件(src目錄下)
- 創建catkin軟件包:
catkin_create_pkg
命令。 - 編譯catkin工作空間:
catkin_make
命令。 - 查看ROS軟件包依賴:rospack depends1查看直接依賴,rospack depends查看間接依賴。
- 定制catkin軟件包:修改文件package.xml和CMakeLists.txt。