贡献指南
欢迎参与 Apollo 开源自动驾驶平台的建设!无论你是经验丰富的开发者还是刚接触自动驾驶领域的新人,我们都非常欢迎你的贡献。本文档将帮助你了解如何参与 Apollo 项目。
项目愿景与目标
Apollo 是百度推出的高性能、灵活架构的开源自动驾驶平台,旨在加速自动驾驶车辆的开发、测试和部署。项目的核心理念是:
- 构建一个充满活力的自动驾驶生态系统,提供全面、安全、可靠的解决方案
- 让每个生态成员专注于自身擅长的领域,避免重复造轮子,从而大幅提升创新速度
- 通过开源代码和开放能力,让任何人都可以使用、修改和再分发 Apollo 的组件
- 形成"软件部署 → 数据采集 → 系统迭代"的良性循环,加速自动驾驶技术的成熟
Apollo 欢迎所有形式的技术和非技术贡献。高质量的数据是驱动创新的燃料,也是最有价值的贡献之一。
治理模型
Apollo 采用开放治理模型,社区角色分为以下几个层级:
维护者(Maintainers)
- 由百度 Apollo 核心团队成员担任
- 负责项目的整体架构决策、版本发布和长期路线图
- 拥有代码仓库的合并权限
- 负责阐明行为准则标准,并对违规行为采取纠正措施
- 为保障架构完整性、系统可靠性和快速演进,百度在必要时会行使领导权推动重要决策
提交者(Committers)
- 在特定模块有持续高质量贡献的开发者
- 拥有特定模块的代码审查权限
- 协助维护者进行代码审查和技术讨论
- 由维护者根据贡献记录提名
(此角色基于开源社区通行实践描述,Apollo 仓库中暂未有正式文档定义)
贡献者(Contributors)
- 任何向项目提交过被合并的 Pull Request 的人
- 包括代码、文档、测试、Bug 报告等各类贡献
- 所有贡献者需同意 Apollo 个人贡献者许可协议(CLA)
贡献方式
代码贡献
这是最直接的贡献方式。你可以:
- 修复已知 Bug
- 实现新功能
- 优化现有模块的性能
- 查找标记为 "help wanted" 的 Issue,这些是适合新贡献者入手的任务
文档贡献
- 改进现有文档的准确性和可读性
- 补充缺失的 API 文档和使用教程
- 翻译文档(中英文互译)
- Apollo 使用 Doxygen 生成 API 文档,可通过
bash apollo.sh doc generate生成
问题报告
- 在 GitHub Issues 提交 Bug 报告或功能请求
- Bug 报告请包含:问题描述、复现步骤、期望行为、系统环境信息和截图
- 功能请求请描述:要解决的问题、期望的方案、考虑过的替代方案
社区支持
- 在 Issue 中回答其他用户的问题
- 参与技术讨论和方案评审
- 分享使用经验和最佳实践
开发环境搭建
系统要求
- 8 核以上处理器,16GB 以上内存
- 推荐 NVIDIA Turing 架构 GPU 或 AMD GFX9/RDNA/CDNA GPU
- 支持 Ubuntu 18.04、20.04、22.04
- NVIDIA 驱动版本 520.61.05 及以上
- Docker-CE 19.03 及以上
- NVIDIA Container Toolkit
环境搭建步骤
- Fork 并克隆仓库
git clone https://github.com/<你的用户名>/apollo.git
cd apollo- 启动开发容器
bash docker/scripts/dev_start.sh- 进入容器
bash docker/scripts/dev_into.sh- 构建项目
bash apollo.sh build技术栈概览
| 技术 | 说明 |
|---|---|
| C++ | 主要开发语言 |
| Python | 工具和脚本 |
| Bazel | 构建系统 |
| CyberRT | 自研实时通信中间件 |
| CUDA 11.8 | GPU 加速 |
| PyTorch / TensorFlow 2 | 深度学习框架 |
贡献工作流
第一步:签署 CLA
在提交任何贡献之前,请先签署 Apollo 个人贡献者许可协议。
第二步:选择任务
- 浏览 Issues 列表,特别关注 "help wanted" 标签
- 如果你正在处理某个 Issue,请留言告知其他人,避免重复工作
- 如果你有新的想法,先创建 Issue 讨论,获得社区反馈后再开始编码
第三步:创建分支并开发
# 从最新的 master 分支创建你的工作分支
git checkout master
git pull upstream master
git checkout -b feature/your-feature-name第四步:编写代码
请遵循以下规范:
许可证头部:每个新文件顶部必须包含 Apache 2.0 许可证声明。参考示例:
- C++ 文件:
modules/common/util/util.h - Python 文件:
modules/tools/vehicle_calibration/process.py - Bash 文件:
scripts/apollo_base.sh
编码风格:
- C/C++:遵循 Google C++ Style Guide
- Python:遵循 Google Python Style Guide,可使用
yapf -i --style='{based_on_style: google}' foo.py格式化 - BUILD 文件:使用
bash apollo.sh format path/to/BUILD/files格式化 - 更多实践请参考 Apollo Best Coding Practice 文档
单元测试:
- 所有代码贡献必须包含对应的单元测试
- 测试文件命名以
_test.cc结尾 - BUILD 文件中的测试目标以
test结尾 - 运行全部测试:
bash apollo.sh test
第五步:编写提交信息
提交信息的第一行应为一句话的变更摘要,之后可以添加段落详细说明变更内容。如果修复了某个 Issue,请在提交信息中引用 Issue 编号。示例:
Control: Replaced algorithm A with algorithm B in modules/control.
Algorithm B is faster than A because it uses binary search. The runtime is
reduced from O(N) to O(log(N)).
Fixes #1234第六步:提交前检查
在创建 Pull Request 之前,请确保你的变更通过所有检查:
# 一键运行构建、测试和代码风格检查
bash apollo.sh check这等同于依次执行:
bash apollo.sh build # 构建
bash apollo.sh test # 测试
bash apollo.sh lint # 代码风格检查第七步:创建 Pull Request
- 将你的分支推送到你 Fork 的仓库
- 在 GitHub 上创建 Pull Request,目标分支为
master - 填写清晰的 PR 描述,说明变更内容和原因
- 关联相关的 Issue
- 等待 CI 检查通过和代码审查
代码审查流程
所有提交到 Apollo 的代码都需要经过代码审查:
- 提交 PR 后,CI 系统会自动运行构建和测试
- 至少一名维护者或提交者会审查你的代码
- 审查者可能会提出修改建议,请积极回应并更新代码
- 所有审查意见解决后,维护者会合并你的 PR
审查关注点包括:
- 代码是否符合编码规范
- 是否包含充分的单元测试
- 是否有清晰的文档和注释
- 架构设计是否合理
- 是否存在性能或安全隐患
提示
如果你的代码逻辑不够直观,建议以清晰高效的方式实现,并提供充分的注释和文档。代码注释请遵循 Doxygen 格式规范。
行为准则
Apollo 社区致力于营造一个开放、友好的环境。我们承诺:无论参与者的年龄、体型、身体状况、种族、性别认同、经验水平、国籍、外貌、宗教或性取向如何,都能在项目和社区中享有免于骚扰的自由。
我们鼓励的行为
- 使用友好和包容性的语言
- 尊重不同的观点和经历
- 得体地接受建设性批评
- 关注对社区有益的事情
- 友善地对待社区其他成员
不可接受的行为
- 使用与性有关的言语或图像,以及不受欢迎的性骚扰
- 捣乱、煽动、造谣,或含有侮辱/贬损的评论
- 公开或私下的骚扰
- 未经许可发布他人的个人信息
- 个人或政治攻击
- 其他可以被合理地认为不适合专业环境的行为
冲突解决
- 直接与冲突当事人私下沟通,最好是实时沟通
- 如果不行,请求第三方出面调解
- 如果仍无法解决,向项目团队举报:apollo-beijing@baidu.com
完整的行为准则请参阅项目根目录下的 CODE_OF_CONDUCT_cn.md。
社区渠道
- GitHub Issues — 提交问题和 Bug 报告
- GitHub Pull Requests — 代码贡献和审查
- Twitter @apolloplatform — 项目动态
- YouTube — 技术视频和教程
- Medium Blog — 技术博客
- Newsletter — 订阅项目通讯
- Apollo 官网 — 商务合作和更多信息
- 商务合作邮箱:apollopartner@baidu.com
许可证
Apollo 基于 Apache 2.0 许可证 开源。所有贡献的代码将以相同许可证发布。
常见问题 FAQ
Q1: 什么是 Apollo?它能做什么?
Apollo(阿波罗)是百度开源的自动驾驶平台,旨在为开发者提供一套高性能、灵活的自动驾驶软件框架,加速自动驾驶车辆的开发、测试和部署。
Apollo 的核心能力包括:
- 感知(Perception):融合 LiDAR、Camera、Radar 等多传感器数据,实现障碍物检测、车道线识别、交通信号灯识别等
- 预测(Prediction):预测周围交通参与者的未来轨迹和行为意图
- 规划(Planning):基于场景化的路径和速度规划,支持变道、掉头、无保护转弯等复杂场景
- 控制(Control):通过线控系统精准控制车辆的转向、油门和制动
- 高精地图(HD Map):提供厘米级精度的高精地图服务
- 定位(Localization):融合 GNSS/IMU 和 LiDAR 点云匹配实现高精度定位
- 仿真(Simulation):通过 Dreamview 和 Dreamview Plus 提供可视化和仿真调试工具
Apollo 从 1.0 版本逐步发展到 11.0 版本,已覆盖从封闭园区到复杂城市道路的多种自动驾驶场景。
Q2: Apollo 支持哪些硬件平台?系统要求是什么?
最低硬件要求:
- CPU:8 核处理器
- 内存:16GB RAM 以上
- GPU:NVIDIA Turing 架构及以上(如 RTX 20/30/40 系列),或 AMD GFX9/RDNA/CDNA 架构
- 磁盘:建议预留充足空间(Docker 镜像 + 编译缓存较大)
支持的操作系统:
- Ubuntu 18.04
- Ubuntu 20.04
- Ubuntu 22.04
GPU 驱动要求:
- NVIDIA 驱动版本 >= 520.61.05(CUDA 11.8)
- 或 AMD ROCm v5.1 及以上
CPU 架构支持:
- x86_64(主要开发平台)
- aarch64 / ARM64(Apollo 9.0+ 支持在 NVIDIA Orin 等 ARM 平台上编译运行)
实车部署额外硬件:
- 线控车辆(brake-by-wire、steering-by-wire、throttle-by-wire、shift-by-wire),Apollo 主要在 Lincoln MKZ 上测试
- LiDAR(如 Velodyne HDL-64E S3、Hesai 等)
- 摄像头(支持多种工业相机)
- 毫米波雷达(Apollo 9.0+ 支持 4D 毫米波雷达)
- GNSS/IMU 组合惯导(如 NovAtel SPAN)
Q3: 如何搭建 Apollo 开发环境?Docker 还是本地编译?
推荐方式:Docker 容器开发环境。 Apollo 官方维护了预构建的 Docker 镜像,包含所有依赖库,避免环境配置问题。
Docker 环境搭建步骤:
- 安装 Docker-CE 19.03+:
# 参考 Docker 官方安装文档
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io- 安装 NVIDIA Container Toolkit(GPU 支持):
# 参考 NVIDIA 官方文档安装 nvidia-docker- 克隆 Apollo 代码:
git clone https://github.com/ApolloAuto/apollo.git
cd apollo- 启动开发容器:
bash docker/scripts/dev_start.sh- 进入容器:
bash docker/scripts/dev_into.sh- 在容器内编译:
bash apollo.sh build关于本地编译: 虽然理论上可以在宿主机直接编译,但由于 Apollo 依赖链极其庞大(包括 CUDA、PCL、OpenCV、Protobuf、Eigen 等数十个库),不推荐本地编译。Docker 方式可以确保一致的编译环境。
Apollo 9.0+ 包管理方式: 从 Apollo 9.0 开始引入了包管理工具,支持以 Package 方式安装和使用各功能模块,降低了二次开发门槛。
Q4: CyberRT 是什么?它和 ROS 有什么区别?
CyberRT 是 Apollo 自研的高性能运行时通信框架,从 Apollo 3.5 版本开始取代 ROS 成为 Apollo 的底层通信中间件。
CyberRT 的核心特性:
- 高性能通信:基于共享内存的进程间通信,降低数据拷贝开销
- 确定性调度:支持协程(Coroutine)调度,可配置调度策略,满足自动驾驶实时性要求
- 组件化架构:通过 Component 机制组织算法模块,每个 Component 处理输入数据并产生输出
- 丰富的开发工具:提供
cyber_monitor、cyber_recorder、cyber_channel、cyber_node、cyber_launch等命令行工具 - Python API 支持:提供 Python 接口用于快速原型开发和脚本编写
CyberRT 与 ROS 的主要区别:
| 对比维度 | CyberRT | ROS |
|---|---|---|
| 通信机制 | 共享内存 + 进程内通信 | 基于 TCP/UDP 的话题通信 |
| 调度 | 协程调度,支持确定性调度策略 | 基于回调的线程模型 |
| 实时性 | 针对自动驾驶优化,延迟更低 | 通用设计,实时性较弱 |
| 序列化 | Protobuf | 自定义 msg 格式 |
| 服务发现 | 自研的 Topology Manager | ROS Master |
| 数据录制 | cyber_recorder(Record 格式) | rosbag |
CyberRT 核心概念:
- Node:通信的基本单元,类似 ROS 中的 Node
- Channel:数据通信的通道,类似 ROS 中的 Topic
- Component:封装算法逻辑的组件,由框架调度执行
- DAG(有向无环图):描述 Component 的依赖关系和数据流
- Launch 文件:启动配置文件,定义要加载的 DAG 和进程信息
Q5: 如何创建自定义模块/Component?
创建一个 CyberRT Component 需要以下步骤:
1. 创建目录结构:
my_component/
├── my_component.h # 头文件
├── my_component.cc # 源文件
├── BUILD # Bazel 构建文件
├── my_component.dag # DAG 配置
└── my_component.launch # Launch 启动文件2. 实现 Component 类(头文件):
#include "cyber/component/component.h"
#include "my_component/proto/my_message.pb.h"
using apollo::cyber::Component;
class MyComponent : public Component<MyInputMsg> {
public:
bool Init() override;
bool Proc(const std::shared_ptr<MyInputMsg>& msg) override;
};
CYBER_REGISTER_COMPONENT(MyComponent)3. 实现 Init 和 Proc 函数(源文件):
Init():初始化时调用一次,用于加载配置、初始化资源Proc():每次收到输入数据时被框架调度调用
4. 配置 DAG 文件:
module_config {
module_library : "/apollo/bazel-bin/my_component/libmy_component.so"
components {
class_name : "MyComponent"
config {
name : "my_component"
readers {
channel: "/apollo/my_input_channel"
}
}
}
}5. 配置 Launch 文件:
<cyber>
<module>
<name>my_component</name>
<dag_conf>/apollo/my_component/my_component.dag</dag_conf>
<process_name>my_component</process_name>
</module>
</cyber>6. 编译与运行:
# 编译
bash apollo.sh build
# 配置环境
source cyber/setup.bash
# 启动(二选一)
cyber_launch start my_component/my_component.launch
# 或
mainboard -d my_component/my_component.dag除了标准 Component(数据触发),CyberRT 还支持 TimerComponent(定时触发),适用于不依赖外部消息、按固定频率执行的算法模块。
Q6: Dreamview 是什么?如何使用?
Dreamview 是 Apollo 的可视化与仿真调试工具,提供基于 Web 的图形界面,用于查看车辆状态、传感器数据、规划轨迹等信息。
Dreamview 版本:
- Dreamview(经典版):Apollo 早期版本提供的可视化工具,默认端口 8888
- Dreamview Plus(新版):Apollo 9.0 引入的全新开发者工具,提供模式切换、面板自定义布局、资源中心等增强功能
Dreamview 的主要功能:
- 可视化显示:实时显示车辆位置、障碍物、规划轨迹、车道线、交通信号灯等
- 模块管理:启动/停止各个功能模块(感知、规划、控制等)
- 仿真调试:在 Apollo 8.0+ 集成了本地仿真器,支持 PnC(Planning and Control)开发者直接在 Dreamview 中进行仿真调试
- 数据回放:加载 Record 文件进行离线数据回放和分析
- 车辆配置:选择和切换车辆配置、地图等
启动 Dreamview:
# 在 Apollo Docker 容器内
bash scripts/bootstrap.sh启动后在浏览器访问 http://localhost:8888 即可打开 Dreamview。如果从远程主机访问,需将 localhost 替换为 Apollo 主机的实际 IP 地址。
常见问题:
- 无法访问页面:检查 Dreamview 进程是否正常运行(
ps aux | grep dreamview) - 页面空白:确认编译成功,且
bootstrap.sh执行无报错 - 远程访问被拒:检查防火墙是否放行 8888 端口
Q7: Apollo 如何处理传感器数据(LiDAR、Camera、Radar)?
Apollo 的感知模块(Perception)采用多传感器融合架构处理各类传感器数据:
LiDAR 处理流程:
- 驱动层通过 CyberRT Channel 发布原始点云数据
- 点云预处理:地面检测(
pointcloud_ground_detection)、ROI 过滤(pointcloud_map_based_roi) - 目标检测:支持多种检测模型,包括
lidar_detection、lidar_cpdet_detection、lidar_segmentation等 - 目标跟踪:
lidar_tracking模块对检测结果进行多帧关联和跟踪
Camera 处理流程:
- 驱动层发布图像数据
- 目标检测:支持单阶段(
camera_detection_single_stage)和多阶段(camera_detection_multi_stage)检测 - Apollo 9.0+ 新增 BEV(Bird's Eye View)视角检测(
camera_detection_bev)和 Occupancy 检测(camera_detection_occupancy) - 位置估计和精细化:
camera_location_estimation和camera_location_refinement - 目标跟踪:
camera_tracking
Radar 处理流程:
- 毫米波雷达数据通过
third_party_perception模块或直接融合处理 - Apollo 9.0+ 新增对 4D 毫米波雷达的支持
多传感器融合:
multi_sensor_fusion 模块将来自 LiDAR、Camera、Radar 的检测结果进行时空对齐和融合,输出统一的障碍物列表,包含位置、速度、类别、置信度等信息,供下游预测和规划模块使用。
附加功能:
lane_detection:车道线检测barrier_recognition:护栏识别motion_service:运动状态服务
Q8: 如何运行仿真测试?
Apollo 提供多种仿真测试方式:
方式一:Dreamview 数据回放仿真
最常用的方式,通过回放预录制的 Record 数据来验证算法:
# 在 Docker 容器内启动 Dreamview
bash scripts/bootstrap.sh
# 回放 Record 文件
cyber_recorder play -f /path/to/your_record_file -l # -l 表示循环播放在 Dreamview 界面中可以实时查看回放数据的感知结果、规划轨迹等。
方式二:Dreamview 内置仿真器(Apollo 8.0+)
Apollo 8.0 在 Dreamview 中集成了本地仿真器,主要面向 PnC(规划与控制)开发者:
- 在 Dreamview 中选择仿真模式
- 选择测试场景
- 启动仿真,观察规划和控制模块的表现
方式三:Apollo 云端仿真平台
百度 Apollo 提供云端仿真服务(Apollo Studio),支持:
- 大规模场景测试
- 自动化回归测试
- 多种天气和光照条件模拟
仿真调试技巧:
- 使用
cyber_monitor工具实时监控各 Channel 的数据频率和内容 - 使用
cyber_recorder录制特定 Channel 的数据用于后续分析 - 结合日志(AINFO、ADEBUG、AERROR)定位问题
Q9: 如何进行传感器标定(Calibration)?
传感器标定是实车部署前的关键步骤,用于确定各传感器之间以及传感器与车辆之间的空间变换关系。
Apollo 支持的标定类型:
- LiDAR 到 IMU/GNSS 的外参标定
- Camera 到 LiDAR 的外参标定
- Radar 到 Camera 的外参标定
- Camera 内参标定
标定前置条件:
- 所有传感器正常输出数据(可通过
cyber_channel echo命令验证):
# 检查 LiDAR 数据
cyber_channel echo /apollo/sensor/velodyne64/VelodyneScanUnified- 定位状态良好(RTK_FIXED,pos_type = 56):
cyber_channel echo /apollo/sensor/gnss/ins_stat- 在开阔、特征丰富的场地采集标定数据
标定流程:
- 按照要求采集标定数据(通常需要驾驶车辆以特定模式行驶)
- 使用 Apollo 标定工具处理数据
- 检查标定结果质量:良好的标定会产生锐利清晰的拼接点云,可清楚反映建筑立面、路灯杆、路沿等细节
- 将标定结果(extrinsics 文件)放置到对应的车辆配置目录
标定质量检查:
- 观察点云拼接结果,好的标定结果会产生清晰的点云,差的标定会出现模糊、重影
- 以建筑立面、灯杆、路沿等直线特征作为参照物
常见问题:
- 标定程序权限错误:为输出目录添加写权限
sudo chmod a+w /apollo/modules/calibration/data/<vehicle> -R - 日志权限错误:
sudo chmod a+x /apollo/data/log
Q10: Apollo 的地图格式是什么?如何制作高精地图?
Apollo 高精地图格式:
Apollo 使用自定义的 OpenDRIVE 扩展格式(通常称为 Apollo OpenDRIVE 或 Apollo HD Map 格式),以 Protobuf 二进制或 XML 格式存储。地图数据位于 modules/map/ 目录下。
地图核心数据结构包括:
- Road:道路信息
- Lane:车道信息,包括车道线类型、限速、转向等
- Junction:交叉路口
- Signal:交通信号灯
- StopSign:停止标志
- Crosswalk:人行横道
- ParkingSpace:停车位
- SpeedBump:减速带
地图相关工具(modules/tools/ 目录):
create_map:地图创建工具map_gen:地图生成工具mapshow/mapviewers:地图可视化查看工具map_datachecker:地图数据检查工具
高精地图制作流程概述:
- 使用搭载 LiDAR 和 GNSS/IMU 的采集车辆在目标区域行驶,采集点云和定位数据
- 对采集的点云数据进行拼接,生成高精度三维点云地图
- 在点云地图基础上标注车道线、交通标志、信号灯等语义信息
- 导出为 Apollo 兼容的地图格式
- 使用地图检查工具验证地图质量
使用现有地图:
Apollo 附带了若干示例地图(位于 modules/map/data/ 目录),可直接用于仿真和测试。在 Dreamview 中可以切换不同的地图。
Q11: 如何在实车上部署 Apollo?
实车部署是一个系统工程,主要步骤如下:
1. 硬件准备:
- 线控车辆(Apollo 主要在 Lincoln MKZ 上验证)
- 工控机(IPC),满足算力要求
- 传感器套件(LiDAR、Camera、Radar、GNSS/IMU)
- CAN 卡(用于车辆线控通信)
2. 硬件安装与接线:
按照 Apollo 硬件安装指南完成传感器安装、接线和供电配置。
3. 软件环境部署:
# 在工控机上安装 Docker 和 NVIDIA 驱动
# 启动 Apollo 运行时容器
bash docker/scripts/runtime_start.sh
# 进入容器
bash docker/scripts/runtime_into.sh注意:实车部署使用 runtime_start.sh(运行时容器),而非开发时使用的 dev_start.sh(开发容器)。
4. 传感器标定:
完成所有传感器的外参标定(参见 Q9)。
5. 车辆适配与配置:
- 配置 CAN 总线通信参数(
modules/canbus/) - 配置车辆动力学参数
- 在 Dreamview 中选择正确的车辆配置
6. 分步验证:
强烈建议按照 Apollo 版本路线逐步验证:
- 先验证 GPS 循迹(Apollo 1.0 级别功能)
- 再验证带感知的固定车道巡航
- 最后进行复杂场景测试
安全注意事项:
- 始终确保安全员在驾驶位
- 初次测试应在封闭场地进行
- 确认紧急停车机制(E-Stop)可靠
Q12: Bazel 构建系统的常见问题
Apollo 使用 Bazel 作为构建系统。以下是常见问题和解决方法:
问题:编译缓存占用空间过大
Bazel 的编译缓存默认存储在 /apollo/.cache/ 目录下,大型项目可能占用数十 GB 空间。
# 清除编译缓存
rm -rf /apollo/.cache/{bazel,build,repos}问题:编译速度慢
- 确保分配了足够的内存(建议 16GB+)
- 使用
--jobs参数控制并行编译数:bazel build --jobs=8 //modules/planning/... - 增量编译:只编译修改过的模块,而非全量编译
问题:依赖下载失败
Bazel 需要从网络下载外部依赖,在国内网络环境下可能遇到超时:
- 使用 Apollo Docker 镜像(已预置大部分依赖)
- 配置代理或使用国内镜像源
问题:BUILD 文件语法错误
# 检查 BUILD 文件格式
# Apollo 使用 Starlark 语法(类 Python),注意使用 load() 导入规则
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")问题:Protobuf 编译错误
Apollo 大量使用 Protobuf 定义数据结构。如果修改了 .proto 文件:
- 确保
BUILD文件中正确声明了proto_library和对应的cc_proto_library - 检查
proto文件的import路径是否正确
常用编译命令:
# 全量编译
bash apollo.sh build
# 编译特定模块
bazel build //modules/planning/...
# 编译并运行测试
bazel test //modules/planning/...
# 清除编译输出
bazel clean --expungeQ13: 如何切换/适配不同的车辆平台?
Apollo 支持适配不同的线控车辆平台,主要涉及以下配置:
车辆适配的核心模块:
modules/canbus/:CAN 总线通信模块,处理与车辆底盘的通信modules/canbus_vehicle/:各车辆平台的具体协议实现modules/control/:控制模块,需要根据车辆动力学特性调整参数
适配步骤:
实现 CAN 协议:根据目标车辆的 CAN 通信协议,在
modules/canbus_vehicle/下创建新的车辆协议实现。Apollo 提供了协议生成工具(modules/tools/gen_vehicle_protocol/)辅助生成协议代码框架。配置车辆参数:包括车辆长宽高、轮距、轴距、最大转向角、最大加减速度等物理参数。
调整控制参数:根据车辆的响应特性调整 PID 控制器参数或 MPC 控制器参数。
配置传感器布局:根据传感器在新车辆上的实际安装位置,更新传感器外参配置。
在 Dreamview 中注册:将新车辆配置注册到 Dreamview 中,使其可以在界面中选择。
注意事项:
- 不同车辆平台的线控响应特性差异较大,控制参数需要在实车上反复调试
- 建议先在低速封闭场地验证基本的线控功能(油门、刹车、转向)
- 安全起见,初次调试时应限制最大车速和最大转向角
Q14: Apollo 支持哪些深度学习模型?如何替换?
Apollo 感知模块集成了多种深度学习模型:
LiDAR 检测模型:
- PointPillars 系列
- CenterPoint 系列
- 自研的 CPDET(
lidar_cpdet_detection)模型 - LiDAR 分割模型(
lidar_segmentation)
Camera 检测模型:
- 单阶段检测(
camera_detection_single_stage) - 多阶段检测(
camera_detection_multi_stage) - BEV 检测(
camera_detection_bev)— Apollo 9.0+ 新增 - Occupancy 检测(
camera_detection_occupancy)— Apollo 9.0+ 新增
车道线检测模型:
lane_detection模块中的深度学习模型
模型替换方法:
使用 Apollo 增量训练:Apollo 9.0+ 开放了 LiDAR 和 Camera 检测模型的增量训练方法,可以在已有模型基础上用自己的数据进行微调。
替换推理模型:
- 将训练好的模型导出为 Apollo 支持的推理格式(通常为 ONNX 或 LibTorch)
- 替换对应模块
data/或model/目录下的模型文件 - 修改对应的配置文件,指定新模型路径和参数
自定义感知插件:Apollo 9.0+ 通过
perception_plugin机制支持以插件方式扩展感知算法,无需修改主干代码。
模型推理框架:
- x86_64 平台:LibTorch 1.7.0
- aarch64 平台:LibTorch 1.11.0(Apollo 2024 年 11 月更新)
- 同时支持 TensorRT 加速推理
Q15: 常见编译错误和解决方法
错误:CUDA 相关编译失败
nvcc fatal: Unsupported gpu architecture 'compute_XX'确认 CUDA 版本与 GPU 架构匹配。Apollo 当前使用 CUDA 11.8,支持 NVIDIA Ada Lovelace(40 系列)及之前的 GPU。确保 NVIDIA 驱动版本 >= 520.61.05。
错误:内存不足(OOM)
C++ compilation of rule ... failed: (Exit 137)Bazel 并行编译可能耗尽内存。解决方法:
# 减少并行 job 数
bazel build --jobs=4 //modules/...
# 或为容器分配更多内存错误:Docker 容器内 GPU 不可用
# 确认 NVIDIA Container Toolkit 已安装
nvidia-smi # 在容器内执行,应能看到 GPU 信息
# 如果无法看到,重启容器
bash docker/scripts/dev_start.sh错误:Protobuf 版本冲突
如果引入第三方库导致 Protobuf 版本冲突,需确保所有依赖使用 Apollo 内置的 Protobuf 版本。
错误:source cyber/setup.bash 失败
确保在 Apollo Docker 容器内执行,且已完成编译。该脚本设置 CyberRT 相关的环境变量和路径。
升级后编译失败:
拉取新版本代码后,建议清除旧的编译缓存:
rm -rf /apollo/.cache/{bazel,build,repos}
# 重启容器
bash docker/scripts/dev_start.sh
bash docker/scripts/dev_into.sh
# 重新编译
bash apollo.sh build调试建议:
- 使用
AINFO、ADEBUG、AERROR等日志宏输出调试信息 - 大多数问题可以通过日志定位,如需更详细调试可使用 GDB(Apollo 提供了
dev_start_gdb_server.sh脚本)
Q16: 如何使用 Record 进行数据回放?
Record 是 CyberRT 的数据录制和回放格式(类似 ROS 中的 rosbag),用于记录和重放各 Channel 上的消息数据。
录制数据:
# 录制所有 Channel
cyber_recorder record -a -o /path/to/output.record
# 录制指定 Channel
cyber_recorder record -c /apollo/sensor/lidar128/compensator/PointCloud2 \
-c /apollo/localization/pose \
-c /apollo/perception/obstacles \
-o /path/to/output.record查看 Record 信息:
# 查看 Record 文件的基本信息
cyber_recorder info /path/to/your.record该命令会显示 Record 文件的时长、消息数量、包含的 Channel 列表及每个 Channel 的消息类型和数量。
回放数据:
# 基本回放
cyber_recorder play -f /path/to/your.record
# 循环回放
cyber_recorder play -f /path/to/your.record -l
# 指定回放速率(0.5 表示半速)
cyber_recorder play -f /path/to/your.record -r 0.5
# 回放指定 Channel
cyber_recorder play -f /path/to/your.record -c /apollo/sensor/lidar128/compensator/PointCloud2配合 Dreamview 使用:
- 启动 Dreamview:
bash scripts/bootstrap.sh - 在 Dreamview 中选择对应的地图和车辆配置
- 启动需要测试的模块(如 Perception、Planning)
- 在另一个终端回放 Record 文件
- 在 Dreamview 界面中实时查看各模块的处理结果
其他 CyberRT 工具:
cyber_monitor:实时监控各 Channel 的数据频率和内容cyber_channel list:列出当前活跃的 Channelcyber_channel echo <channel_name>:打印指定 Channel 的实时数据cyber_node list:列出当前活跃的 Nodecyber_launch start <launch_file>:通过 Launch 文件启动组件
常见问题:
- 回放时模块未收到数据:检查 Record 中的 Channel 名称是否与模块订阅的 Channel 一致
- 回放数据时间戳过旧:某些模块可能会丢弃时间戳过旧的数据,使用 Dreamview 的 "Sim Control" 模式可以解决此问题
版本更新日志
Apollo 自动驾驶开放平台自 2017 年首次发布以来,经历了从基础 GPS 循迹到城市复杂道路全场景自动驾驶的完整演进。以下按版本梳理各阶段的核心变更与架构演进。
Apollo 11.0(2026 年 1 月)
Apollo 11.0 聚焦功能型无人车在高价值场景中的大规模部署,全面升级感知、定位、规划与开发工具链,显著降低软硬件开发门槛。
- 面向快递配送、清扫、安防巡逻、园区接驳等高价值场景,新增坡道起停、自动恢复、贴边行驶等关键能力
- 支持端到端运营闭环:车辆准备 → 路线规划 → 自动驾驶 → 任务执行 → 异常处理 → 回场泊车
- 工业级高精度定位:融合 RTK、SLAM、视觉与轮速计,在城市峡谷、地下车库、全室内等 GNSS 受限环境实现厘米级精度
- 新增闸机识别能力,打通公共道路与封闭园区的无缝衔接
- 升级 BEV + OCC 感知架构,深度集成百度百舸 AI 算力平台,支持增量训练
Apollo 10.0(2024 年 12 月)
Apollo 10.0 面向大规模场景化应用进行全面升级,在性能、成本和安全三个维度同步发力。
- CyberRT 框架升级:零拷贝通信,微秒级传输延迟,性能提升 10 倍
- 全新性能分析工具:实时监控 CPU、GPU、内存、显存、IO 五大资源,支持函数级精准定位
- 纯视觉感知方案:引入 BEV 目标检测与占用网络,单 Orin 平台推理帧率达 5Hz
- 框架层对接 ROS 生态,插件化工程设计简化扩展,降低软件复用成本
- 硬件生态扩展至 32+ 厂商、73+ 设备,核心设备数量翻倍
- 功能安全体系:遵循 ISO 26262 与 ISO 21448 标准,从异常检测到 MRC 策略执行延迟低于 1ms
Apollo 9.0(2023 年 12 月)
Apollo 9.0 引入包管理 2.0,重塑 PnC 与感知的扩展开发模式,让开发者更便捷地基于 Apollo 构建自己的自动驾驶应用。
- PnC 扩展开发模式:统一外部接口解耦操作层与 PnC 模块,新增插件扩展方式,全局/局部参数分离
- 感知扩展开发模式:按功能粒度重新拆分感知组件,新增插件开发模式便于替换算法,简化统一配置
- 全新 Dreamview Plus 开发者工具:基于"模式"组织使用场景,面板自定义布局,资源中心提供地图、场景、车辆配置等
- 感知模型全面升级:LiDAR 默认采用 CenterPoint 替代 CNNSeg,Camera 默认采用 YOLOX + YOLO3D 替代原 YOLO 模型
- 支持增量训练与 4D 毫米波雷达
- 适配 ARM 架构,支持在 Orin 上编译运行
Apollo 8.0(2022 年 12 月)
Apollo 8.0 引入包管理(Package)概念,为自动驾驶开发者提供可扩展的软件框架与完整开发周期。
- 基于 Package 重组模块,支持自定义、发布与共享,提供快速安装体验
- 三个全新深度学习模型:CenterPoint(3D 障碍物检测)、CaDDN(相机障碍物检测)、BEV PETR(相机障碍物检测)
- 完整感知开发流程:Paddle3D 模型训练 → 模型部署工具 → Dreamview 可视化验证
- PnC 仿真服务升级:Dreamview 集成本地仿真器,支持在线场景编辑与下载
Apollo 7.0(2021 年 12 月)
Apollo 7.0 引入三个全新深度学习模型,并推出 Apollo Studio 一站式在线开发平台。
- Mask-Pillars 障碍物检测模型(基于 PointPillars)
- Inter-TNT 交互式预测模型
- SMOKE 相机障碍物检测模型
- Apollo Studio:练习环境服务、车辆管理服务
- PnC 强化学习服务:智能训练与评估闭环
- 感知模块代码结构升级
Apollo 6.0(2020 年 9 月)
Apollo 6.0 引入新的深度学习模型与数据流水线服务,并首次集成无人驾驶研究功能。
- PointPillars 障碍物检测模型、语义地图行人预测模型、基于学习的轨迹规划模型
- 数据流水线服务:低速障碍物预测模型训练、PointPillars 模型训练、控制标定、车辆动力学模型训练、开放空间规划标定、控制参数自动调优
- 无人驾驶研究:DreamView 集成远程控制接口、基于音频的紧急车辆检测
Apollo 5.5(2020 年 1 月)
Apollo 5.5 引入路沿到路沿(curb-to-curb)驾驶支持,向全自动城市道路驾驶迈进关键一步。
- 全新 Storytelling 模块
- 场景化规划新增 Park-and-go、Emergency 场景
- 预测模型:Semantic LSTM 评估器、Extrapolation 预测器
- 控制模块:模型参考自适应控制(MRAC)、控制标定服务
- 数据流水线:传感器标定服务
Apollo 5.0(2019 年 6 月)
Apollo 5.0 面向地理围栏自动驾驶的量产支持,车辆具备 360 度感知能力。
- 场景化规划升级:新增 Open Space Planner,支持交叉路口(停车标志、红绿灯、无保护路口)、泊车(代客泊车、靠边停车)
- 全新感知算法与传感器标定服务
- 仿真平台 Dreamland:场景编辑器、控制在环仿真
- Apollo 合成数据集发布
Apollo 3.5(2019 年 1 月)
Apollo 3.5 是架构演进的里程碑版本,引入全新运行时框架 CyberRT,具备 360 度感知能力,可在住宅区和市中心等复杂场景中自动驾驶。
- Apollo CyberRT:专为自动驾驶设计的全新运行时框架,替代此前基于 ROS 的架构,显著提升实时性与可靠性
- 传感器套件升级:VLS-128 线激光雷达、FPD-Link 相机、大陆远程毫米波雷达、Apollo 扩展单元(AXU)
- 场景化规划与 Open Space Planner
- V2X 车路协同能力
- 开放车辆认证平台新增 GAC GE3、GWM WEY VV6
Apollo 3.0(2018 年 7 月)
Apollo 3.0 实现 L4 级产品化方案,支持封闭场地低速自动驾驶,车企可直接使用而无需自行定制。
- 全新安全模块 Guardian,增强监控模块 Monitor
- 硬件服务层平台化改造,开发者可灵活集成自有硬件
- Apollo 传感器单元(ASU)与超声波传感器
- 感知模块重大升级:
- CIPV(最近车道内车辆)检测与跟车
- 异步传感器融合:LiDAR、Radar、Camera 数据异步融合
- 在线位姿估计:逐帧估计自车位姿,提升坡道场景 3D 理解
- 超声波传感器支持,可用于 AEB 与垂直泊车
- 完整车道线检测与视觉定位
- 16 线激光雷达支持
Apollo 2.5(2018 年 4 月)
Apollo 2.5 支持地理围栏高速公路自动驾驶,车辆可进行车道保持巡航并避免与前车碰撞。
- 多传感器融合(MSF)定位升级
- DreamView 可视化功能增强
- 高精地图数据采集工具
- 基于视觉的感知:障碍物与车道线检测
- 相对地图支持 ACC 与车道保持
- Docker 镜像支持
Apollo 2.0(2017 年 12 月)
Apollo 2.0 支持简单城市道路自动驾驶,车辆可巡航、避障、识别红绿灯并变道到达目的地。
- 红绿灯检测
- 障碍物分类:车辆、行人、骑行者、未知
- 规划模块升级:支持变道到达目的地
- 点云定位算法融合 RTK
- MPC 控制算法
- RNN 交通预测模型
- HMI 与 DreamView 整合重构,新增调试可视化工具
- Docker 镜像安全 OTA 升级、USB 相机与雷达驱动支持
Apollo 1.5(2017 年 9 月)
Apollo 1.5 支持固定车道巡航,首次引入感知、预测、规划等核心模块。
- 感知:基于 3D 点云的障碍物检测与跟踪(GPU 加速)
- 预测:深度神经网络 MLP 预测模型,多预测器处理不同类别障碍物
- 规划:交通法规模块,DP/QP 多轮优化路径与速度
- 端到端:卷积 LSTM(纵向)+ FCNN(横向)混合深度神经网络
- HD Map 引擎 API
- Velodyne 64 线激光雷达驱动
- DreamView 实时交通显示与场景回放
Apollo 1.0(2017 年 7 月)
Apollo 的首个版本,实现基于 GPS 航点的自动循迹,适用于测试场或停车场等封闭场地。
- 定位:RTK
- 控制:纵向标定表 + 横向 LQR
- GPS/IMU GNSS 驱动
- HMI 轨迹录制与回放,DreamView 轨迹可视化

Steven Moder