# 2.2 Catkin工作空間
Catkin工作空間是創建、修改、編譯catkin軟件包的目錄。catkin的工作空間,直觀的形容就是一個倉庫,里面裝載著ROS的各種項目工程,便于系統組織管理調用。在可視化圖形界面里是一個文件夾。我們自己寫的ROS代碼通常就放在工作空間中,本節就來介紹catkin工作空間的結構。
## 2.2.1 初始化catkin工作空間
介紹完catkin編譯系統,我們來建立一個catkin的工作空間。首先我們要在計算機上創建一個初始的`catkin_ws/`路徑,這也是catkin工作空間結構的最高層級。輸入下列指令,完成初始創建。
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin_make #初始化工作空間
第一行代碼直接創建了第二層級的文件夾src,這也是我們放ROS軟件包的地方。第二行代碼使得進程進入工作空間,然后再是catkin_make。
**注意**:1. catkin_make命令必須在工作空間這個路徑上執行 2.原先的初始化命令catkin_init_workspace仍然保留
## 2.2.2 結構介紹
catkin的結構十分清晰,具體的catkin工作空間結構圖如下。初看起來catkin工作空間看起來極其復雜,其實不然,catkin工作空間的結構其實非常清晰。
在工作空間下用tree命令,顯示文件結構。
```bash
$ cd ~/catkin_ws
$ sudo apt install tree
$ tree
```
結果為:
─ build
│?? ├── catkin
│?? │?? └── catkin_generated
│?? │?? └── version
│?? │?? └── package.cmake
│?? ├──
......
│?? ├── catkin_make.cache
│?? ├── CMakeCache.txt
│?? ├── CMakeFiles
│?? │?? ├──
......
├── devel
│?? ├── env.sh
│?? ├── lib
│?? ├── setup.bash
│?? ├── setup.sh
│?? ├── _setup_util.py
│?? └── setup.zsh
└── src
└── CMakeLists.txt -> /opt/ros/kinetic/share/catkin/cmake/toplevel.cmake
通過tree命令可以看到catkin工作空間的結構,它包括了`src`、`build`、`devel`三個路徑,在有些編譯選項下也可能包括其他。但這三個文件夾是catkin編譯系統默認的。它們的具體作用如下:
* src/: ROS的catkin軟件包(源代碼包)
* build/: catkin(CMake)的緩存信息和中間文件
* devel/: 生成的目標文件(包括頭文件,動態鏈接庫,靜態鏈接庫,可執行文件等)、環境變量
在編譯過程中,它們的工作流程如圖:

后兩個路徑由catkin系統自動生成、管理,我們日常的開發一般不會去涉及,而主要用到的是src文件夾,我們寫的ROS程序、網上下載的ROS源代碼包都存放在這里。
在編譯時,catkin編譯系統會**遞歸**的查找和編譯`src/`下的每一個源代碼包。因此你也可以把幾個源代碼包放到同一個文件夾下,如下圖所示:

## 小結
catkin工作空間基本就是以上的結構,package是catkin工作空間的**基本單元**,我們在ROS開發時,寫好代碼,然后catkin_make,系統就會完成所有編譯構建的工作。至于更詳細的package內容,我們將在下節繼續介紹。
- 前言
- 第一章 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