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 本章知识体系

为了让你更直观地理解,我画了一张图:

Apollo源码核心结构 apollo/ modules/ cyber/ tools/ planning control perception prediction Node / Reader / Writer Channel / QoS 代码检查工具 调试/可视化工具 业务核心 → 通信中间件 → 工具链

这张图帮你理清关系:modules是业务,cyber是血管,tools是手术刀。三者缺一不可。

好了,这一章的内容就到这里。你只要把源码拉下来,把目录结构搞明白,后面编译和开发就会顺畅很多。

可可精品资料库