# 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