# 2.3 Package軟件包
在1.6節我們曾對package軟件包進行了分類,分別介紹了二進制包和源代碼包。而ROS中的package的定義更加具體,它不僅是Linux上的軟件包,更是catkin編譯的基本單元,我們調用`catkin_make`編譯的對象就是一個個ROS的package,也就是說任何ROS程序只有組織成package才能編譯。所以package也是ROS源代碼存放的地方,任何ROS的代碼無論是C++還是Python都要放到package中,這樣才能正常的編譯和運行。
一個package可以編譯出來多個目標文件(ROS可執行程序、動態靜態庫、頭文件等等)。
## 2.3.1 package結構
一個package下常見的文件、路徑有:
```
├── CMakeLists.txt #package的編譯規則(必須)
├── package.xml #package的描述信息(必須)
├── src/ #源代碼文件
├── include/ #C++頭文件
├── scripts/ #可執行腳本
├── msg/ #自定義消息
├── srv/ #自定義服務
├── models/ #3D模型文件
├── urdf/ #urdf文件
├── launch/ #launch文件
```
其中定義package的是`CMakeLists.txt`和`package.xml`,這兩個文件是package中必不可少的。catkin編譯系統在編譯前,首先就要解析這兩個文件。這兩個文件就定義了一個package。
* CMakeLists.txt: 定義package的包名、依賴、源文件、目標文件等編譯規則,是package不可少的成分
* package.xml: 描述package的包名、版本號、作者、依賴等信息,是package不可少的成分
* src/: 存放ROS的源代碼,包括C++的源碼和\(.cpp\)以及Python的module\(.py\)
* include/: 存放C++源碼對應的頭文件
* scripts/: 存放可執行腳本,例如shell腳本\(.sh\)、Python腳本\(.py\)
* msg/: 存放自定義格式的消息\(.msg\)
* srv/: 存放自定義格式的服務\(.srv\)
* models/: 存放機器人或仿真場景的3D模型\(.sda, .stl, .dae等\)
* urdf/: 存放機器人的模型描述\(.urdf或.xacro\)
* launch/: 存放launch文件\(.launch或.xml\)
通常ROS文件組織都是按照以上的形式,這是約定俗成的命名習慣,建議遵守。以上路徑中,只有`CMakeLists.txt`和`package.xml`是必須的,其余路徑根據軟件包是否需要來決定。
## 2.3.2 package的創建
創建一個package需要在`catkin_ws/src`下,用到`catkin_create_pkg`命令,用法是:
`catkin_create_pkg package depends`
其中package是包名,depends是依賴的包名,可以依賴多個軟件包。
例如,新建一個package叫做`test_pkg`,依賴roscpp、rospy、std\_msgs\(常用依賴\)。
```bash
$ catkin_create_pkg test_pkg roscpp rospy std_msgs
```
這樣就會在當前路徑下新建`test_pkg`軟件包,包括:
```
├── CMakeLists.txt
├── include
│ └── test_pkg
├── package.xml
└── src
```
`catkin_create_pkg`幫你完成了軟件包的初始化,填充好了`CMakeLists.txt`和`package.xml`,并且將依賴項填進了這兩個文件中。
## 2.3.3 package相關命令
### rospack
rospack是對package管理的工具,命令的用法如下:
| rostopic命令 | 作用 |
| :---: | :---: |
| `rospack help` | 顯示rospack的用法 |
| `rospack list` | 列出本機所有package |
| `rospack depends [package]` | 顯示package的依賴包 |
| `rospack find [package]` | 定位某個package |
| `rospack profile` | 刷新所有package的位置記錄 |
以上命令如果package缺省,則默認為當前目錄\(如果當前目錄包含package.xml\)
### roscd
`roscd`命令類似與Linux系統的`cd`,改進之處在于`roscd`可以直接`cd`到ROS的軟件包。
| rostopic命令 | 作用 |
| :---: | :---: |
| `roscd [pacakge]` | cd到ROS package所在路徑 |
### rosls
`rosls`也可以視為Linux指令`ls`的改進版,可以直接`ls`ROS軟件包的內容。
| rosls命令 | 作用 |
| :---: | :---: |
| `rosls [pacakge]` | 列出pacakge下的文件 |
### rosdep
`rosdep`是用于管理ROS package依賴項的命令行工具,用法如下:
| rosdep命令 | 作用 |
| :---: | :---: |
| `rosdep check [pacakge]` | 檢查package的依賴是否滿足 |
| `rosdep install [pacakge]` | 安裝pacakge的依賴 |
| `rosdep db` | 生成和顯示依賴數據庫 |
| `rosdep init` | 初始化/etc/ros/rosdep中的源 |
| `rosdep keys` | 檢查package的依賴是否滿足 |
| `rosdep update` | 更新本地的rosdep數據庫 |
一個較常使用的命令是`rosdep install --from-paths src --ignore-src --rosdistro=kinetic -y`,用于安裝工作空間中`src`路徑下所有package的依賴項(由pacakge.xml文件指定)。
- 前言
- 第一章 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