# 2.1 Catkin編譯系統
對于源代碼包,我們只有編譯才能在系統上運行。而Linux下的編譯器有gcc、g++,隨著源文件的增加,直接用gcc/g++命令的方式顯得效率低下,人們開始用Makefile來進行編譯。然而隨著工程體量的增大,Makefile也不能滿足需求,于是便出現了Cmake工具。CMake是對make工具的生成器,是更高層的工具,它簡化了編譯構建過程,能夠管理大型項目,具有良好的擴展性。對于ROS這樣大體量的平臺來說,就采用的是CMake,并且ROS對CMake進行了擴展,于是便有了Catkin編譯系統。

早期的ROS編譯系統是rosbuild,但隨著ROS的不斷發展,rosbuild逐漸暴露出許多缺點,不能很好滿足系統需要。在Groovy版本面世后,Catkin作為rosbuild的替代品被正式投入使用。Catkin操作更加簡化且工作效率更高,可移植性更好,而且支持交叉編譯和更加合理的功能包分配。目前的ROS同時支持著rosbuild和Catkin兩種編譯系統,但ROS的核心軟件包也已經全部轉換為Catkin。rosbuild已經被逐步淘汰,所以建議初學者直接上手Catkin。
本節我們主要來介紹catkin的編譯系統。
## 2.1.1 Catkin特點
Catkin是基于CMake的編譯構建系統,具有以下特點:
* Catkin沿用了包管理的傳統像 `find_package()`基礎結構,`pkg-config`
* 擴展了CMake,例如
* 軟件包編譯后無需安裝就可使用
* 自動生成`find_package()`代碼,`pkg-config`文件
* 解決了多個軟件包構建順序問題
一個Catkin的軟件包(package)必須要包括兩個文件:
* package.xml: 包括了package的描述信息
* name, description, version, maintainer(s), license
* opt. authors, url's, dependencies, plugins, etc...
* CMakeLists.txt: 構建package所需的CMake文件
* 調用Catkin的函數/宏
* 解析`package.xml`
* 找到其他依賴的catkin軟件包
* 將本軟件包添加到環境變量
## 2.1.2 Catkin工作原理
catkin編譯的工作流程如下:
1. 首先在工作空間`catkin_ws/src/`下遞歸的查找其中每一個ROS的package。
2. package中會有`package.xml`和`CMakeLists.txt`文件,Catkin(CMake)編譯系統依據`CMakeLists.txt`文件,從而生成`makefiles`(放在`catkin_ws/build/`)。
3. 然后`make`剛剛生成的`makefiles`等文件,編譯鏈接生成可執行文件(放在`catkin_ws/devel`)。
也就是說,Catkin就是將`cmake`與`make`指令做了一個封裝從而完成整個編譯過程的工具。catkin有比較突出的優點,主要是:
* 操作更加簡單
* 一次配置,多次使用
* 跨依賴項目編譯
## 2.1.3 使用`catkin_make`進行編譯
要用catkin編譯一個工程或軟件包,只需要用`catkin_make`指令。一般當我們寫完代碼,執行一次`catkin_make`進行編譯,調用系統自動完成編譯和鏈接過程,構建生成目標文件。編譯的一般性流程如下,在1.5節我們編譯ROS-Academy-for-Beginners教學包就是這樣的流程。
```bash
$ cd ~/catkin_ws #回到工作空間,catkin_make必須在工作空間下執行
$ catkin_make #開始編譯
$ source ~/catkin_ws/devel/setup.bash #刷新壞境
```
**注意:** catkin編譯之前需要回到工作空間目錄,`catkin_make`在其他路徑下編譯不會成功。編譯完成后,如果有新的目標文件產生(原來沒有),那么一般緊跟著要source刷新環境,使得系統能夠找到剛才編譯生成的ROS可執行文件。這個細節比較容易遺漏,致使后面出現可執行文件無法打開等錯誤。
`catkin_make`命令也有一些可選參數,例如:
```
catkin_make [args]
-h, --help 幫助信息
-C DIRECTORY, --directory DIRECTORY
工作空間的路徑 (默認為 '.')
--source SOURCE src的路徑 (默認為'workspace_base/src')
--build BUILD build的路徑 (默認為'workspace_base/build')
--use-ninja 用ninja取代make
--use-nmake 用nmake取'make
--force-cmake 強制cmake,即使已經cmake過
--no-color 禁止彩色輸出(只對catkin_make和CMake生效)
--pkg PKG [PKG ...] 只對某個PKG進行make
--only-pkg-with-deps ONLY_PKG_WITH_DEPS [ONLY_PKG_WITH_DEPS ...]
將指定的package列入白名單CATKIN_WHITELIST_PACKAGES,
之編譯白名單里的package。該環境變量存在于CMakeCache.txt。
--cmake-args [CMAKE_ARGS [CMAKE_ARGS ...]]
傳給CMake的參數
--make-args [MAKE_ARGS [MAKE_ARGS ...]]
傳給Make的參數
--override-build-tool-check
用來覆蓋由于不同編譯工具產生的錯誤
```
- 前言
- 第一章 ROS簡介
- 機器人時代的到來
- ROS發展歷程
- 什么是ROS
- 安裝ROS
- 安裝ROS-Academy-for-Beginners教學包
- 二進制與源碼包
- 安裝RoboWare Studio
- 單元測試一
- 第二章 ROS文件系統
- Catkin編譯系統
- Catkin工作空間
- Package軟件包
- CMakeLists.txt
- package.xml
- Metapacakge軟件元包
- 其他常見文件類型
- 單元測試二
- 第三章 ROS通信架構(一)
- Node & Master
- Launch文件
- Topic
- Msg
- 常見msg類型
- 單元測試三
- 第四章 ROS通信架構(二)
- Service
- Srv
- Parameter server
- Action
- 常見srv類型
- 常見action類型
- 單元測試四
- 第五章 常用工具
- Gazebo
- RViz
- Rqt
- Rosbag
- Rosbridge
- moveit!
- 單元測試五
- 第六章 roscpp
- Client Library與roscpp
- 節點初始、關閉與NodeHandle
- Topic in roscpp
- Service in roscpp
- Param in roscpp
- 時鐘
- 日志與異常
- 第七章 rospy
- Rospy與主要接口
- Topic in rospy
- Service in rospy
- Param與Time
- 第八章 TF與URDF
- 認識TF
- TF消息
- tf in c++
- tf in python
- 統一機器人描述格式
- 附錄:TF數學基礎
- 三維空間剛體運動---旋轉矩陣
- 三維空間剛體運動---歐拉角
- 三維空間剛體運動---四元數
- 第九章 SLAM
- 地圖
- Gmapping
- Karto
- Hector
- 第十章 Navigation
- Navigation Stack
- move_base
- costmap
- Map_server & Amcl
- 附錄:Navigation工具包說明
- amcl
- local_base_planner
- carrot_planner
- clear_costmap_recovery
- costmap_2d
- dwa_local_planner
- fake_localization
- global_planner
- map_server
- move_base_msg
- move_base
- move_slow_and_clear
- navfn
- nav_core
- robot_pose_ekf
- rotate_recovery