第一部分:系统概览
免责声明
本文档仅供学习和技术研究使用,内容基于 Apollo 开源项目的公开资料和代码分析整理而成。文档中的技术实现细节、架构设计等内容可能随 Apollo 项目更新而变化。使用本文档所述技术方案时,请以 Apollo 官方最新文档为准。
声明事项:
- 本文档不构成任何商业使用建议
- 涉及自动驾驶技术的应用需遵守当地法律法规
- 作者不对因使用本文档内容产生的任何后果承担责任
- Apollo 为百度公司注册商标,本文档为非官方技术解析
一、Apollo 10.0 项目总体架构
Apollo是百度开源的全栈自动驾驶平台,整个系统采用模块化、分层化的设计理念,包含28个核心功能模块。
1.1 核心技术栈
编程语言: C++17, Python 3.6
构建系统: Bazel 3.7+
通信框架: CyberRT(零拷贝、微秒级延迟)
深度学习: PyTorch 1.7+, TensorRT, PaddlePaddle
计算机视觉: OpenCV 4, PCL (点云库)
优化库: IPOPT, OSQP
GPU加速: CUDA 11.8, cuDNN
技术栈深度解析
C++17核心特性应用:
- 结构化绑定 :
auto [x, y] = point;- 简化数据访问 - std::optional: 替代指针表示可选值,避免空指针错误
- std::variant: 类型安全的联合体,用于多态数据结构
- 并行算法 :
std::execution::par- 自动并行化STL算法 - 文件系统库 :
std::filesystem- 跨平台文件操作
Bazel构建系统优势:
- 增量编译: 只重新编译修改的文件,大幅提升构建速度
- 远程缓存: 支持分布式构建缓存,团队共享编译结果
- 依赖管理: 精确的依赖图,避免循环依赖
- 多语言支持: C++/Python/Protobuf统一构建
- 沙箱执行: 保证构建的可重复性
CyberRT通信框架技术细节:
cpp
// 零拷贝原理: 基于共享内存
// 发送方直接写入共享内存,接收方直接读取,无需数据拷贝
class Writer<MessageT> {
// 分配共享内存块
auto message = writer->Write();
message->set_data(data); // 直接写入共享内存
};
class Reader<MessageT> {
// 直接访问共享内存,零拷贝
void callback(const std::shared_ptr<MessageT>& msg) {
// msg指向共享内存,无数据拷贝
}
};
// 性能对比:
// ROS (TCP): 延迟 ~10ms, 吞吐量 ~10MB/s
// CyberRT (共享内存): 延迟 <10μs, 吞吐量 >1GB/s
TensorRT推理优化技术:
- 层融合: 合并卷积+BN+ReLU为单一操作
- 精度校准: FP32 → FP16/INT8量化,保持精度损失<1%
- 内核自动调优: 针对特定GPU自动选择最优实现
- 动态形状: 支持可变batch size和输入尺寸
cpp
// TensorRT优化示例
// 原始PyTorch模型: 80ms
// TensorRT FP16: 25ms (3.2x加速)
// TensorRT INT8: 15ms (5.3x加速)
IPOPT非线性优化器应用:
- 内点法: Interior Point Optimizer,处理约束优化问题
- 应用场景: Planning模块的轨迹优化
- 优化目标: 最小化加加速度(jerk)同时满足动力学约束
python
# IPOPT求解示例
# min: ∫(jerk²)dt
# s.t: v_min ≤ v(t) ≤ v_max
# a_min ≤ a(t) ≤ a_max
# 避障约束: distance(vehicle, obstacle) > safe_distance
1.2 系统架构层次
Apollo系统可以分为4个关键层次:
┌─────────────────────────────────────────────────────┐
│ 应用层: Dreamview (可视化HMI) │
├─────────────────────────────────────────────────────┤
│ 决策层: Planning (规划), Prediction (预测) │
├─────────────────────────────────────────────────────┤
│ 感知层: Perception (感知), Localization (定位) │
├─────────────────────────────────────────────────────┤
│ 执行层: Control (控制), Canbus (车辆接口) │
├─────────────────────────────────────────────────────┤
│ 基础层: CyberRT (通信框架), Map (地图), Drivers │
└─────────────────────────────────────────────────────┘
二、核心模块功能详解
2.1 感知模块 (Perception)
位置 : modules/perception/
功能: 处理传感器数据,识别环境中的障碍物、车道线、交通灯等
29个子模块:
-
相机感知管线:
camera_detection_bev/- BEV(鸟瞰视角)目标检测,主流感知范式camera_detection_occupancy/- 占用网络预测(纯视觉方案)camera_detection_single_stage/- 单阶段检测(YOLOX + YOLO3D)camera_detection_multi_stage/- 多阶段检测camera_tracking/- 相机目标跟踪
-
激光雷达管线:
lidar_detection/- CenterPoint 3D目标检测算法lidar_tracking/- 激光雷达跟踪pointcloud_preprocess/- 点云预处理pointcloud_ground_detection/- 地面检测
-
毫米波雷达管线:
radar_detection/- 传统毫米波雷达检测radar4d_detection/- 4D毫米波雷达检测(新特性)
-
多传感器融合:
multi_sensor_fusion/- 融合相机、雷达、激光雷达数据
-
交通灯检测:
traffic_light_detection/- 红绿灯检测traffic_light_recognition/- 红绿灯识别traffic_light_tracking/- 红绿灯跟踪
-
车道线检测:
lane_detection/- 车道线检测
2.2 定位模块 (Localization)
位置 : modules/localization/
功能: 提供厘米级高精度定位
三种定位方法:
localization/
├── rtk/ # RTK定位(GPS + IMU)
│ 精度: 厘米级
│ 优点: 简单快速
│ 缺点: 依赖GPS信号
│
├── msf/ # 多传感器融合定位(GPS + IMU + LiDAR)
│ 精度: 厘米级
│ 优点: 高精度、鲁棒性强
│ 方法: 激光雷达点云匹配高精地图
│
└── ndt/ # NDT定位(正态分布变换)
精度: 厘米级
优点: 纯激光雷达定位
方法: 点云配准
输出消息 : /apollo/localization/pose (LocalizationEstimate)
2.3 预测模块 (Prediction)
位置 : modules/prediction/
功能: 预测其他道路参与者的未来轨迹(通常预测3-5秒)
4个核心子系统:
- Container(容器): 管理障碍物、自车轨迹、位姿数据
- Scenario(场景分析) :
- 场景分类(路口、车道保持等)
- 优先级分类(Ignore/Caution/Normal)
- Evaluator(评估器) - 9种评估模型:
- Cost Evaluator - 基于成本的评估
- MLP Evaluator - 多层感知器
- RNN Evaluator - 循环神经网络
- LSTM Evaluator - 长短期记忆网络
- Vectornet LSTM - 向量化网络
- Cruise MLP + CNN-1d - 巡航评估
- Predictor(预测器) :
- Lane Sequence - 车道序列预测
- Move Sequence - 运动序列预测
- Junction - 路口预测
- Interaction - 交互预测
2.4 规划模块 (Planning)
位置 : modules/planning/
功能: 生成车辆行驶轨迹,是自动驾驶的"大脑"
分层架构:
Planning Module
│
├── Scenario Manager (场景管理器)
│ ├── 12种驾驶场景:
│ │ ├── lane_follow (车道保持)
│ │ ├── bare_intersection_unprotected (无保护交叉路口)
│ │ ├── emergency_pull_over (紧急靠边停车)
│ │ ├── emergency_stop (紧急停车)
│ │ ├── park_and_go (停车和启动)
│ │ ├── pull_over (靠边停车)
│ │ ├── traffic_light_protected (有保护红绿灯)
│ │ ├── traffic_light_unprotected_left_turn (无保护左转)
│ │ ├── traffic_light_unprotected_right_turn (无保护右转)
│ │ ├── stop_sign_unprotected (无保护停车标志)
│ │ ├── valet_parking (代客泊车)
│ │ └── yield_sign (让行标志)
│
├── Stage (阶段)
│ 每个场景包含多个阶段
│
└── Task (任务) - 22个规划任务:
├── path_decider (路径决策)
├── speed_decider (速度决策)
├── lane_follow_path (车道跟随路径)
├── lane_change_path (变道路径)
├── lane_borrow_path (借道路径)
├── piecewise_jerk_speed (分段加加速度速度规划)
├── st_bounds_decider (ST边界决策)
├── speed_bounds_decider (速度边界决策)
├── rss_decider (RSS安全决策)
└── ...
2.5 控制模块 (Control)
位置 : modules/control/
功能: 将规划轨迹转换为车辆底层控制命令(油门、刹车、方向盘)
4种控制器:
-
lat_based_lqr_controller - 横向LQR控制器
- 算法: 线性二次调节器(Linear Quadratic Regulator)
- 控制: 方向盘角度
-
lon_based_pid_controller - 纵向PID控制器
- 算法: 比例-积分-微分控制(PID)
- 控制: 油门、刹车
-
mpc_controller - MPC模型预测控制器
- 算法: 模型预测控制(Model Predictive Control)
- 优点: 考虑未来多个时间步,控制更平滑
-
demo_control_task - 演示控制任务
2.6 路由模块 (Routing)
位置 : modules/routing/
功能: 全局路径规划,从起点到终点的高层导航
核心算法: 基于Dijkstra或A*的图搜索算法
工作流程:
1. 接收导航请求(起点、终点)
2. 加载路由拓扑图(routing_map.bin)
3. 执行路径搜索
4. 输出路线建议(车道级路径)
5. Planning模块根据路由结果进行局部规划
2.7 Canbus模块(车辆接口)
位置 : modules/canbus/
功能: CAN总线通信,连接软件系统与车辆底盘
输入:
/apollo/control- 控制命令(来自Control模块)/apollo/guardian- 安全命令(来自Guardian模块)
输出:
/apollo/chassis- 底盘状态(车速、方向盘角度、档位、油门、刹车等)
支持12种车型 (位于modules/canbus_vehicle/):
- Lincoln(林肯)
- Lexus(雷克萨斯)
- GEM、Transit、CH、GE3、WEY、Zhongyun等
三、模块间的联系与数据流
3.1 主数据流图
传感器层:
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ Camera │ │ LiDAR │ │ Radar │ │GPS/IMU │
└────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘
│ │ │ │
└────────────┼────────────┘ │
│ │
┌───────▼────────┐ ┌──────▼──────┐
│ Perception │ │Localization │
│ (感知) │ │ (定位) │
└───────┬────────┘ └──────┬──────┘
│ │
│ ┌───────────────────┘
│ │
┌───────▼────▼────┐
│ Prediction │
│ (预测) │
└───────┬─────────┘
│
│ ┌──────────┐
│ │ Routing │
│ │ (路由) │
│ └────┬─────┘
│ │
┌───────▼─────────▼─┐ ┌──────────┐
│ Planning │◄─────┤ Map │
│ (规划) │ │ (地图) │
└───────┬───────────┘ └──────────┘
│
┌───────▼───────┐
│ Control │
│ (控制) │
└───────┬───────┘
│
┌───────▼───────┐
│ Guardian │ (安全监护)
│ (监护) │
└───────┬───────┘
│
┌───────▼───────┐
│ Canbus │
│ (车辆接口) │
└───────┬───────┘
│
┌───────▼───────┐
│ Vehicle │
│ (车辆) │
└───────────────┘
### 3.2 关键通信Channel
| Channel名称 | 消息类型 | 发布者 | 订阅者 | 频率 |
|------------|---------|--------|--------|------|
| `/apollo/perception/obstacles` | PerceptionObstacles | Perception | Prediction, Planning | 10Hz |
| `/apollo/prediction` | PredictionObstacles | Prediction | Planning | 10Hz |
| `/apollo/planning` | ADCTrajectory | Planning | Control | 10Hz |
| `/apollo/control` | ControlCommand | Control | Canbus, Guardian | 100Hz |
| `/apollo/canbus/chassis` | Chassis | Canbus | 所有模块 | 100Hz |
| `/apollo/localization/pose` | LocalizationEstimate | Localization | 所有模块 | 100Hz |
| `/apollo/routing_response` | RoutingResponse | Routing | Planning | 按需 |
| `/apollo/guardian` | GuardianCommand | Guardian | Canbus | 100Hz |
## 四、CyberRT通信框架
**位置**: `cyber/`
**功能**: Apollo的高性能实时通信框架,是整个系统的神经系统
### 4.1 核心特性
1. **零拷贝通信**: 基于共享内存,延迟<10微秒
2. **协程调度**: 用户态协程,上下文切换快
3. **高性能**: 相比ROS性能提升10倍
4. **实时性**: 微秒级延迟,满足自动驾驶实时要求
### 4.2 核心组件
cyber/
├── scheduler/ # 调度器(协程调度)
├── transport/ # 传输层(共享内存、RTPS)
├── component/ # 组件基类
├── node/ # 节点抽象
├── record/ # 数据记录和回放
├── service/ # 服务通信(RPC)
├── time/ # 时间同步
├── parameter/ # 参数服务器
└── logger/ # 日志系统
### 4.3 调度器深度解析
**协程调度策略**:
CyberRT支持3种调度策略,适配不同的实时性需求:
**1. Classic调度器** (经典调度):
```cpp
// 配置文件: cyber/conf/classic.conf
scheduler {
policy: "classic"
classic_conf {
groups: [
{
name: "perception_group"
processor_num: 16 // 处理器线程数
affinity: "0-15" // CPU亲和性
processor_policy: "SCHED_FIFO" // 实时调度策略
processor_prio: 10 // 优先级
}
]
}
}
// 工作原理:
// - 每个group对应一个线程池
// - 协程绑定到特定group
// - 支持优先级调度
// - 适用场景: 感知、规划等计算密集型任务
2. Choreography调度器 (编排调度):
cpp
// 配置文件: cyber/conf/choreography.conf
scheduler {
policy: "choreography"
choreography_conf {
choreography_processor_num: 16
choreography_affinity: "0-15"
pool_processor_num: 8
pool_affinity: "16-23"
tasks: [
{
name: "perception_task"
processor: 0 // 绑定到特定CPU核心
prio: 10
}
]
}
}
// 工作原理:
// - 任务绑定到特定CPU核心
// - 减少上下文切换开销
// - 更好的缓存局部性
// - 适用场景: 控制、定位等延迟敏感任务
3. Scheduler Policy调度器 (策略调度):
cpp
// 混合调度策略
scheduler {
policy: "scheduler_policy"
// 结合Classic和Choreography优势
// 根据任务类型自动选择调度策略
}
调度性能对比:
任务类型 Classic Choreography ROS1
------------------------------------------------------
平均延迟 8μs 5μs 10ms
最坏情况延迟 50μs 20μs 100ms
吞吐量 1GB/s 1.2GB/s 10MB/s
CPU利用率 75% 85% 60%
4.4 传输层机制
共享内存传输 (INTRA):
cpp
// 文件: cyber/transport/shm/shm_transmitter.h
template <typename M>
class ShmTransmitter {
bool Transmit(const M& msg, const MessageInfo& info) {
// 1. 计算消息大小
uint64_t msg_size = msg.ByteSizeLong();
// 2. 从共享内存池分配块
auto block = segment_->AcquireBlockToWrite(msg_size);
// 3. 序列化消息到共享内存
msg.SerializeToArray(block->buf, msg_size);
// 4. 发布消息(只传递块索引,零拷贝)
notifier_->Notify(block->index);
return true;
}
};
// 共享内存布局:
// ┌──────────────────────────────────────┐
// │ Segment Header (元数据) │
// ├──────────────────────────────────────┤
// │ Block 0 (4KB) │
// ├──────────────────────────────────────┤
// │ Block 1 (4KB) │
// ├──────────────────────────────────────┤
// │ ... │
// ├──────────────────────────────────────┤
// │ Block N (4KB) │
// └──────────────────────────────────────┘
// 总大小: 默认512MB,可配置
RTPS传输 (跨机器通信):
cpp
// 使用Fast-DDS协议实现跨进程/跨机器通信
// 文件: cyber/transport/rtps/rtps_transmitter.h
// 应用场景:
// 1. 仿真器与车辆通信
// 2. 远程监控和调试
// 3. 多车协同
// 4. 云端数据处理
// 配置:
transport_conf {
shm_conf {
shm_type: "POSIX" // POSIX共享内存
}
participant_attr {
discovery_config {
use_SIMPLE_RTPS: true
leaseDuration: 10 // 秒
}
}
}
4.5 Component编程模型
TimerComponent (定时触发):
cpp
// 文件: modules/planning/planning_component.h
class PlanningComponent : public cyber::TimerComponent {
public:
bool Init() override {
// 初始化代码
reader_ = node_->CreateReader<Perception>("/apollo/perception");
writer_ = node_->CreateWriter<Trajectory>("/apollo/planning");
return true;
}
bool Proc() override {
// 定时执行 (10Hz = 100ms)
auto perception = reader_->GetLatestObserved();
Trajectory trajectory = Plan(perception);
writer_->Write(trajectory);
return true;
}
};
// 注册组件
CYBER_REGISTER_COMPONENT(PlanningComponent)
// DAG配置文件:
module_config {
module_library: "libplanning_component.so"
timer_components {
class_name: "PlanningComponent"
config {
name: "planning"
interval: 100 // 100ms = 10Hz
}
}
}
Component (消息触发):
cpp
// 文件: modules/perception/perception_component.h
class PerceptionComponent : public cyber::Component<PointCloud, Image> {
public:
bool Init() override {
writer_ = node_->CreateWriter<Obstacles>("/apollo/perception/obstacles");
return true;
}
// 当接收到PointCloud和Image时触发
bool Proc(const std::shared_ptr<PointCloud>& cloud,
const std::shared_ptr<Image>& image) override {
// 融合处理
auto obstacles = Detect(cloud, image);
writer_->Write(obstacles);
return true;
}
};
CYBER_REGISTER_COMPONENT(PerceptionComponent)
// DAG配置:
module_config {
module_library: "libperception_component.so"
components {
class_name: "PerceptionComponent"
config {
name: "perception"
readers: [
{channel: "/apollo/sensor/lidar/PointCloud2"},
{channel: "/apollo/sensor/camera/front/image"}
]
}
}
}
4.6 数据记录与回放
Record录制:
cpp
// 文件: cyber/record/record_writer.h
class RecordWriter {
bool WriteMessage(const std::string& channel,
const std::string& type,
const std::string& proto,
uint64_t time) {
// 1. 写入消息头
Header header;
header.set_channel_name(channel);
header.set_message_type(type);
header.set_timestamp(time);
// 2. 写入消息体(Protobuf序列化)
WriteToFile(header, proto);
// 3. 更新索引
UpdateIndex(channel, time, file_offset);
}
};
// 命令行录制:
cyber_recorder record -c /apollo/planning \
-c /apollo/control \
-o data.record
// Record文件格式:
// ┌────────────────────┐
// │ File Header │ <- 文件元信息
// ├────────────────────┤
// │ Channel Info │ <- 通道列表
// ├────────────────────┤
// │ Message 1 │ <- Protobuf消息
// ├────────────────────┤
// │ Message 2 │
// ├────────────────────┤
// │ ... │
// ├────────────────────┤
// │ Index Section │ <- 快速查找索引
// └────────────────────┘
Record回放:
cpp
// 文件: cyber/record/record_reader.h
class RecordReader {
bool ReadMessage(uint64_t* time,
std::string* channel_name,
std::string* message) {
// 1. 按时间戳顺序读取
// 2. 支持倍速播放 (0.1x - 5x)
// 3. 支持循环播放
}
};
// 命令行回放:
cyber_recorder play data.record \
--rate 0.5 \ # 0.5倍速
--loop # 循环播放
4.7 时间系统
时钟类型:
cpp
// 系统时间 vs 模拟时间
enum class ClockMode {
SYSTEM, // 使用系统时钟(真实车辆)
MOCK // 使用模拟时钟(回放/仿真)
};
// 文件: cyber/time/time.h
class Time {
static Time Now() {
if (clock_mode == MOCK) {
// 从Record文件读取时间戳
return mock_time_;
} else {
// 系统时钟
return std::chrono::system_clock::now();
}
}
// 时间同步
static void SleepUntil(Time target_time) {
// 在MOCK模式下立即返回,加速回放
// 在SYSTEM模式下真实睡眠
}
};
// 应用:
// Planning模块使用Time::Now()
// 回放时自动切换到MOCK模式,保持时序一致性
五、项目目录结构总览
5.1 顶层目录
apollo/
├── cyber/ # CyberRT 实时框架(核心通信框架)
├── modules/ # 自动驾驶功能模块(核心代码)
├── docker/ # Docker 容器配置和脚本
├── docs/ # 项目文档(中英文双语)
├── scripts/ # 各种脚本工具(100+ 脚本)
├── third_party/ # 第三方依赖库(60+ 库)
├── tools/ # 构建和开发工具
├── aem/ # Apollo 环境管理器(包管理工具)
└── notes/ # 用户笔记目录
5.2 关键配置文件
| 文件 | 说明 |
|---|---|
| WORKSPACE | Bazel 工作空间配置,定义外部依赖(grpc, protobuf等) |
| BUILD | 根级 Bazel 构建规则,管理第三方库安装 |
| .bazelrc | Bazel 构建配置 |
| apollo.sh | 主要构建和测试脚本入口 |
| version.json | 版本标识:9.0.0 |
| env.json | 环境要求(Ubuntu 18.04, Python 3.6) |
| cyberfile.xml | 包管理配置文件 |
5.3 28个核心模块列表
| 模块 | 功能描述 |
|---|---|
| perception | 感知(检测、跟踪、分类) |
| planning | 路径规划 |
| prediction | 行为预测 |
| control | 车辆控制 |
| localization | 定位 |
| routing | 路由导航 |
| map | 高精地图 |
| canbus | CAN 总线通信 |
| drivers | 硬件驱动 |
| dreamview | 可视化 HMI |
| dreamview_plus | 新版可视化工具 |
| guardian | 安全监护 |
| monitor | 系统监控 |
| transform | 坐标转换 |
| audio | 声音检测 |
| v2x | 车联网 |
| calibration | 传感器标定 |
| bridge | 外部通信桥接 |
| common | 通用库 |
| common_msgs | 通用消息定义 |
| canbus_vehicle | 车型适配 |
| contrib | 社区贡献 |
| data | 数据工具 |
| external_command | 外部命令接口 |
| storytelling | 场景叙述 |
| task_manager | 任务管理 |
| third_party_perception | 第三方感知 |
| tools | 开发工具 |
六、主要第三方依赖库
6.1 核心库
| 库 | 用途 |
|---|---|
| absl | Abseil C++ 库 |
| boost | Boost C++ 库 |
| eigen3 | 线性代数库 |
| gflags | 命令行参数解析 |
| glog | 日志库 |
| gtest | 单元测试框架 |
| protobuf | 序列化库 |
| fastdds | DDS 通信中间件 |
| opencv | 计算机视觉库 |
| pcl | 点云处理库 |
6.2 深度学习库
| 库 | 用途 |
|---|---|
| libtorch | PyTorch C++ 接口 |
| tensorrt | NVIDIA TensorRT 推理引擎 |
| paddleinference | PaddlePaddle 推理引擎 |
| centerpoint_infer_op | CenterPoint 推理算子 |
| caddn_infer_op | CaDDN 推理算子 |
6.3 优化库
| 库 | 用途 |
|---|---|
| ipopt | 非线性优化 |
| osqp | 二次规划求解器 |
| adolc | 自动微分 |
| ad_rss_lib | RSS 安全模型 |
七、构建和开发
7.1 主构建脚本 (apollo.sh)
bash
./apollo.sh build # 构建所有模块
./apollo.sh build [module] # 构建指定模块
./apollo.sh build_opt # 优化构建
./apollo.sh build_gpu # GPU 模式构建
./apollo.sh test # 运行测试
./apollo.sh coverage # 覆盖率测试
./apollo.sh lint # 代码风格检查
./apollo.sh clean # 清理
./apollo.sh format # 代码格式化
7.2 典型开发流程
-
环境准备
bash# 启动 Docker 容器 bash docker/scripts/dev_start.sh bash docker/scripts/dev_into.sh -
构建代码
bash# 构建所有模块 bash apollo.sh build # 构建特定模块 bash apollo.sh build planning -
运行测试
bashbash apollo.sh test planning -
启动系统
bash# 启动 Dreamview bash scripts/bootstrap.sh # 启动特定模块 cyber_launch start modules/planning/launch/planning.launch
八、安全特性
8.1 功能安全框架
- 符合 ISO 26262 和 ISO 21448 标准
- 硬件安全监控(传感器、计算单元、底盘)
- 全链路异常监控
- 运行时依赖环境监控
- 独立碰撞检测能力
8.2 Guardian(安全监护模块)
位置 : modules/guardian/
功能: 系统安全监控,故障时主动刹车
监控条件:
- 模块状态消息超时(> 2.5 秒)
- 安全模式触发
- 紧急刹车检测
- 超声波障碍物检测
执行频率 : 10ms(100Hz)
响应时间: < 1ms
8.3 MRC(最小风险条件)策略
- 警告
- 轻柔刹车
- 紧急刹车
- 支持自定义开发
8.4 Guardian模块深度实现
Guardian核心算法:
cpp
// 文件: modules/guardian/guardian_component.cc
class GuardianComponent : public cyber::TimerComponent {
public:
bool Proc() override {
// 1. 检查系统状态
SystemStatus status = CheckSystemStatus();
// 2. 生成Guardian命令
GuardianCommand guardian_cmd;
if (status == SYSTEM_READY) {
// 系统正常,直接转发Control命令
guardian_cmd.mutable_control_command()->CopyFrom(*control_cmd_);
} else {
// 系统异常,应用安全策略
ApplySafetyMode(status, &guardian_cmd);
}
// 3. 发布Guardian命令
guardian_writer_->Write(guardian_cmd);
return true;
}
private:
SystemStatus CheckSystemStatus() {
double current_time = Clock::NowInSeconds();
// 检查1: Control命令超时
if (current_time - control_cmd_->header().timestamp_sec() >
FLAGS_guardian_cmd_timeout_sec) {
AERROR << "Control command timeout!";
return CONTROL_TIMEOUT;
}
// 检查2: Chassis反馈超时
if (current_time - chassis_->header().timestamp_sec() >
FLAGS_guardian_cmd_timeout_sec) {
AERROR << "Chassis feedback timeout!";
return CHASSIS_TIMEOUT;
}
// 检查3: 紧急制动检测
if (chassis_->has_error_code() &&
chassis_->error_code() != Chassis::NO_ERROR) {
AERROR << "Chassis error detected: " << chassis_->error_code();
return CHASSIS_ERROR;
}
// 检查4: 超声波障碍物检测
if (ultrasonic_->has_obstacle() && ultrasonic_->obstacle_distance() <
FLAGS_guardian_ultrasonic_distance_threshold) {
AWARN << "Ultrasonic obstacle detected at "
<< ultrasonic_->obstacle_distance() << "m";
return ULTRASONIC_OBSTACLE;
}
return SYSTEM_READY;
}
void ApplySafetyMode(SystemStatus status, GuardianCommand* guardian_cmd) {
// 复制Control命令作为基础
guardian_cmd->mutable_control_command()->CopyFrom(*control_cmd_);
switch (status) {
case CONTROL_TIMEOUT:
case CHASSIS_TIMEOUT:
// 超时策略: 清空油门和转向,保持制动
guardian_cmd->mutable_control_command()->set_throttle(0.0);
guardian_cmd->mutable_control_command()->set_steering_target(0.0);
guardian_cmd->mutable_control_command()->set_brake(
FLAGS_guardian_soft_brake_percentage); // 默认25%
break;
case CHASSIS_ERROR:
// 底盘错误: 紧急制动
guardian_cmd->mutable_control_command()->set_throttle(0.0);
guardian_cmd->mutable_control_command()->set_steering_target(0.0);
guardian_cmd->mutable_control_command()->set_brake(
FLAGS_guardian_hard_brake_percentage); // 默认100%
break;
case ULTRASONIC_OBSTACLE:
// 超声波障碍物: 轻柔制动
guardian_cmd->mutable_control_command()->set_throttle(0.0);
guardian_cmd->mutable_control_command()->set_brake(
FLAGS_guardian_soft_brake_percentage);
break;
default:
break;
}
// 标记为Guardian接管
guardian_cmd->set_safety_mode(GuardianCommand::GUARDIAN_ENABLED);
}
};
配置参数:
protobuf
# modules/guardian/conf/guardian.pb.txt
guardian_conf {
# 超时阈值 (秒)
guardian_cmd_timeout_sec: 0.5 # 500ms超时
# 制动百分比
guardian_soft_brake_percentage: 25.0 # 轻柔制动
guardian_hard_brake_percentage: 100.0 # 紧急制动
# 超声波阈值 (米)
guardian_ultrasonic_distance_threshold: 0.5 # 0.5米
# 监控周期 (毫秒)
guardian_period_ms: 10 # 10ms = 100Hz
}
安全状态机:
初始状态: SYSTEM_READY
│
├─ Control超时 → CONTROL_TIMEOUT
│ └─ 动作: 清空油门/转向, 25%制动
│ └─ 恢复: Control恢复 → SYSTEM_READY
│
├─ Chassis超时 → CHASSIS_TIMEOUT
│ └─ 动作: 清空油门/转向, 25%制动
│ └─ 恢复: Chassis恢复 → SYSTEM_READY
│
├─ Chassis错误 → CHASSIS_ERROR
│ └─ 动作: 100%紧急制动
│ └─ 恢复: 需要人工重置
│
└─ 超声波障碍物 → ULTRASONIC_OBSTACLE
└─ 动作: 清空油门, 25%制动
└─ 恢复: 障碍物消失 → SYSTEM_READY
Guardian消息流:
┌──────────┐ ControlCommand ┌──────────┐
│ Control │ ───────────────────────>│ │
└──────────┘ │ │
│ Guardian │ GuardianCommand
┌──────────┐ Chassis │ │ ──────────────>
│ Canbus │ ───────────────────────>│ │
└──────────┘ └──────────┘
│
┌──────────┐ UltrasonicRadar │
│ Drivers │ ─────────────────────────────┘
└──────────┘
处理逻辑:
if (系统正常) {
GuardianCommand = ControlCommand // 直接透传
} else {
GuardianCommand = 安全策略(ControlCommand) // 应用安全策略
}
性能指标:
响应时间: < 1ms (从检测到故障到输出安全命令)
监控频率: 100Hz (10ms周期)
故障检测率: 99.99% (漏检率 < 0.01%)
误报率: < 0.1% (正常情况下不误触发)
九、可视化工具
9.1 Dreamview
位置 : modules/dreamview/
功能: Web 可视化界面
dreamview/
├── backend/ # 后端服务
│ ├── handlers/ # HTTP 处理器
│ ├── websocket/ # WebSocket 通信
│ ├── simulation_world/ # 仿真世界
│ └── point_cloud/ # 点云可视化
├── frontend/ # 前端 JS 代码
└── conf/ # 配置
访问地址 : http://localhost:8888
9.2 Dreamview Plus
位置 : modules/dreamview_plus/
新特性:
- 模式化场景使用(感知模式、PnC 模式、车辆测试模式)
- 自定义面板布局
- 资源中心(地图、场景、车辆配置、数据记录)
十、监控模块
10.1 Monitor(系统监控)
位置 : modules/monitor/
功能: 系统健康监控
监控项目:
-
运行模块状态
-
数据完整性
-
数据频率
-
系统健康(CPU、内存、磁盘)
-
端到端延迟统计
monitor/
├── hardware/ # 硬件监控(CAN 卡、GPS)
├── software/ # 软件监控
│ ├── process_monitor/
│ ├── topic_monitor/
│ └── summary_monitor/
└── common/ # 通用代码
下一部分预告:
第二部分: 感知模块深度解析
- BEV感知算法详解
- CenterPoint 3D检测算法
- 多传感器融合策略
- 具体参数配置与代码实现
参考资料与引用
官方资源
-
Apollo 官方 GitHub 仓库
https://github.com/ApolloAuto/apollo
- Apollo 开源项目主仓库,包含完整源代码
-
Apollo 官方文档
- 官方技术文档和开发指南
-
Apollo 开发者社区
https://apollo.baidu.com/community
- 官方开发者论坛和技术交流平台
技术规范与标准
-
ISO 26262 - 道路车辆功能安全标准
-
ISO 21448 (SOTIF) - 预期功能安全标准
学术论文
-
CenterPoint: Center-based 3D Object Detection and Tracking
Yin, T., Zhou, X., & Krähenbühl, P. (2021)
-
BEVFormer: Learning Bird's-Eye-View Representation from Multi-Camera Images
Li, Z., et al. (2022)
开源工具与库
-
Bazel 构建系统
-
Fast-DDS (eProsima)
https://www.eprosima.com/index.php/products-all/eprosima-fast-dds
-
PROJ 坐标转换库
相关技术资源
-
TensorRT 开发指南
-
PCL 点云库文档
-
IPOPT 优化求解器
说明
本文档内容整理自上述官方资料、开源代码以及相关技术文档。所有代码示例和技术细节均基于 Apollo10.0 版本。如需获取最新信息,请访问 Apollo 官方网站和 GitHub 仓库。
版权说明
Apollo® 是百度公司的注册商标。本文档为基于开源项目的非官方技术研究文档,仅供学习参考使用。