2. 源码获取与目录结构
好,咱们正式开始动手了。这一章我带你搞定两件事:把Apollo源码拉到本地,以及搞懂它到底长什么样。
说实话,我第一次接触Apollo时,光是看目录就懵了半小时。modules、cyber、tools……这些文件夹到底干嘛的?别急,我踩过的坑,你就不用再踩了。
2.1 Git拉取Apollo源码
先说说拉代码。Apollo官方推荐用Git,这个没得选。我个人习惯用SSH方式,省得每次输密码。
核心命令:
git clone git@github.com:ApolloAuto/apollo.git
cd apollo
git checkout v9.0.0 # 我建议用稳定版本
嗯,这里要注意:不要直接拉master分支。为什么?因为master是开发分支,可能今天能编译,明天就挂了。我在项目中遇到过两次,拉完master编译到一半报错,查了半天发现是依赖版本没对齐。后来我就学乖了,只拉release标签。
你想想看,一个自动驾驶系统,代码量动辄几百万行。如果分支选错了,光是排查问题就能耗掉半天。所以我的建议是:
- 初学者:用
v9.0.0或v8.0.0,文档最全 - 进阶者:可以试试
master,但要做好心理准备
拉完代码后,记得检查一下完整性:
git status
git log --oneline -5 # 看看最近的提交记录
我曾经遇到过网络中断导致代码没拉全的情况。所以建议你拉完后,用 git fsck 检查一下对象完整性。别嫌麻烦,这步能省掉后面很多莫名其妙的编译错误。
2.2 核心目录解析
好,代码拉下来了。现在咱们看看它肚子里都有什么。我直接说重点,三个核心目录:modules、cyber、tools。
2.2.1 modules —— 功能模块大本营
这是Apollo的业务核心。说白了,所有跟自动驾驶功能相关的代码,都在这里。
我列几个你一定会打交道的子目录:
| 目录名 | 功能 | 我踩过的坑 |
|---|---|---|
planning |
轨迹规划 | 参数调不好,车会画龙 |
control |
控制算法 | PID参数没调对,起步就窜 |
perception |
感知模块 | 相机标定不准,障碍物识别全歪 |
prediction |
行为预测 | 行人突然变向,模型没跟上 |
localization |
定位 | GPS信号丢失,车直接懵了 |
每个子目录内部,结构基本一致:
modules/planning/
├── conf/ # 配置文件
├── dag/ # 数据流图
├── proto/ # protobuf定义
├── tools/ # 调试工具
└── main.cc # 入口文件
我个人习惯,拿到一个新模块,先看 proto/ 和 conf/。为什么?因为数据结构决定了代码逻辑。你搞懂了消息定义,基本就理解了模块的输入输出。
2.2.2 cyber —— 通信中间件
这是Apollo的神经系统。所有模块之间的数据交换,都靠它。
cyber 的核心概念就三个:
- Node:一个进程就是一个Node
- Reader/Writer:读写通道
- Channel:数据传输通道
举个例子,感知模块检测到障碍物,通过 channel 发给规划模块。这个过程就像水管一样——Writer 是水龙头,Reader 是水杯,Channel 就是水管。
避坑指南:我曾经在cyber的QoS配置上栽过跟头。如果你发现某个模块收不到数据,先检查 cyber/conf/ 下的QoS策略。默认是BEST_EFFORT,但有些场景需要RELIABLE。
2.2.3 tools —— 工具箱
这个目录容易被忽略,但实际很实用。里面包含:
- 代码检查工具:比如
cpplint、buildifier - 可视化工具:比如
dreamview的前端资源 - 调试工具:比如
cyber_monitor、cyber_recorder
我强烈建议你花10分钟看看 tools/ 下的README。里面有些小工具能帮你省不少事。比如 cyber_recorder 可以录制和回放数据,调试时特别好用。
2.3 代码版本管理
Apollo的版本号规则很简单:v主版本.次版本.修订号。比如 v9.0.0。
但实际开发中,你可能会遇到多个版本并存的情况。我的做法是:
# 创建本地分支管理不同版本
git checkout -b my_v9_dev v9.0.0
git checkout -b my_v8_dev v8.0.0
这样切换版本很方便。而且每个分支独立,不会互相污染。
注意:不要直接在master上改代码。我曾经犯过这个错,结果git pull时冲突一堆,差点把代码搞丢。正确的做法是:永远在功能分支上开发。
另外,Apollo的代码更新很快。我建议你每周至少拉一次最新代码:
git fetch --all
git log --oneline origin/master..HEAD # 看看本地落后了多少
如果落后太多,合并时冲突会很大。所以及时同步是个好习惯。
2.4 本章知识体系
为了让你更直观地理解,我画了一张图:
这张图帮你理清关系:modules是业务,cyber是血管,tools是手术刀。三者缺一不可。
好了,这一章的内容就到这里。你只要把源码拉下来,把目录结构搞明白,后面编译和开发就会顺畅很多。
可可精品资料库