catkin軟件包的組成
一個軟件包必須滿足如下條件才能被稱之爲catkin軟件包:
- 這個軟件包必須包含一個catkin編譯文件package.xml(manifests文件),此文件包含了描述該軟件包的重要信息。
- 這個軟件包必須包含一個CMakeLists.txt文件,並且採用catkin。
- 在每個文件夾中可能只有一個軟件包,這表明沒有相互依賴的軟件包共享相同的目錄。
最簡單的可能的軟件包可能有如下文件結構:
my_package/
CMakeLists.txt
package.xml
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
創建一個catkin軟件包
利用catkin_create_pkg
命令創建一個新的catkin軟件包。
cd ~/catkin/src
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
依賴於std_msgs、rospy、roscpp在src目錄下創建一個名爲beginner_tutorials的catkin軟件包,這將會創建一個名稱爲beginner_tutorials的包含CMakeLists.txt和package.xml文件的文件夾。catkin_create_pkg命令要求提供軟件包名稱和可選擇的一系列軟件包的依賴。
注意:軟件包命名慣例是—以小寫字母開頭,只能包含小寫字母和數字以及下劃線,不符合規則的軟件包名稱將不能編譯通過。
mountzf@ubuntu:~/catkin_ws/src/beginner_tutorials$ tree
.
├── CMakeLists.txt
├── include
│ └── beginner_tutorials
├── package.xml
└── src
同時也會創建beginner_tutorials軟件包的src文件夾和include文件夾,但是此時都是空的。
編譯catkin工作空間
創建完成軟件包之後,需要在工作空間中進行編譯:
cd ~/catkin_ws
catkin_make
mountzf@ubuntu:~/catkin_ws$ catkin_make
Base path: /home/mountzf/catkin_ws
Source space: /home/mountzf/catkin_ws/src
Build space: /home/mountzf/catkin_ws/build
Devel space: /home/mountzf/catkin_ws/devel
Install space: /home/mountzf/catkin_ws/install
####
#### Running command: "cmake /home/mountzf/catkin_ws/src -DCATKIN_DEVEL_PREFIX=/home/mountzf/catkin_ws/devel -DCMAKE_INSTALL_PREFIX=/home/mountzf/catkin_ws/install -G Unix Makefiles" in "/home/mountzf/catkin_ws/build"
####
-- Using CATKIN_DEVEL_PREFIX: /home/mountzf/catkin_ws/devel
-- Using CMAKE_PREFIX_PATH: /opt/ros/indigo
-- This workspace overlays: /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/mountzf/catkin_ws/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/mountzf/catkin_ws/build
####
#### Running command: "make -j4 -l4" in "/home/mountzf/catkin_ws/build"
####
根據如上編譯信息,可以知道:
- 前面幾行是編譯文件的基本信息,base path, source sapce, build space, devel space, install space.
- 後續研究明白了再記錄。
在編譯完成工作空間之後,在devel文件夾中產生了一系列的和/opt/ros/indigo目錄中結構相似的文件,通過讀取devel文件夾中的.*sh
文件來將軟件包的工作空間添加到環境變量當中。
. ~/catkin_ws/devel/setup.bash
軟件包依賴
直接依賴
在前面利用catkin_create_pkg命令的時候,在選項中提供了一些依賴,利用rospack工具可以查看這些直接依賴。
rospack depends1 beginner_tutorials
std_msgs
rospy
roscpp
注意上面的是depends1(是阿拉伯數字1,而不是小寫字母l)。可以看出rospack工具列出了在使用catkin_create_pkg命令的時候提供的依賴,這些信息存儲在packa.xml文件中,可以cat package.xml
查看。
間接依賴
在很多情況下,我們會遇到依賴的依賴,即間接依賴。例如beginner_tutorials的依賴文件rospy也有其他依賴。
rospack depends1 rospy
genpy
rosgraph
rosgraph_msgs
roslib
std_msgs
如果我們使用rospack depends(沒有阿拉伯數字1),則會列出catkin軟件包的所有依賴文件。
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
定製catkin軟件包
主要按照自己的需要更改package.xml文件和CMakeLists.txt文件。
定製package.xml文件
描述部分description
<description>The beginner_tutorials package</description>
描述軟件包的概述,應該簡短精要。
維護者部分maintainer
<!-- One maintainer tag required, multiple allowed, one person per tag -->
<!-- Example: -->
<!-- <maintainer email="[email protected]">Jane Doe</maintainer> -->
<maintainer email="[email protected]">user</maintainer>
```
至少需要一個維護者的信息,但是也可以添加多個。維護者的名字在類別的內容之中,郵箱在類別的屬性之中。
#### 許可證部分license
```bash
<!-- 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>
<div class="se-preview-section-delimiter"></div>
一些常見的軟件使用BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv等,在這裏使用BSD,因爲ROS的其他核心部件已經使用了BSD證書。
依賴部分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>genmsg</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>python-yaml</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>
<div class="se-preview-section-delimiter"></div>
我們想在編譯和運行的時候都能夠獲得這些依賴,所以需要在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>
<div class="se-preview-section-delimiter"></div>
修改後的package.xml
<?xml version="1.0"?>
<package>
<name>beginner_tutorials</name>
<version>0.1.0</version>
<description>The beginner_tutorials package</description>
<maintainer email="[email protected]">Your Name</maintainer>
<license>BSD</license>
<url type="website">http://wiki.ros.org/beginner_tutorials</url>
<author email="[email protected]">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>
</package>
定製CMakelists.txt文件
在下一部分編譯ROS軟件包中再來修改CMakelist.txt文件。
總結
- catkin軟件包必要組成:package.xml和CMakeList.txt文件。
- 創建catkin軟件包:
catkin_create_pkg
命令創建一個新的catkin軟件包。 - 編譯catkin工作空間:
catkin_make
命令編譯catkin工作空間。 - 查看ROS軟件包依賴:rospack depends1查看直接依賴,rospack depends查看間接依賴。
- 定製catkin軟件包:修改文件package.xml和CMakeLists.txt。
祝楓
2016年7月21日於深圳