01.Apollo10.0系统概览

第一部分:系统概览

免责声明

本文档仅供学习和技术研究使用,内容基于 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个子模块:

  1. 相机感知管线:

    • camera_detection_bev/ - BEV(鸟瞰视角)目标检测,主流感知范式
    • camera_detection_occupancy/ - 占用网络预测(纯视觉方案)
    • camera_detection_single_stage/ - 单阶段检测(YOLOX + YOLO3D)
    • camera_detection_multi_stage/ - 多阶段检测
    • camera_tracking/ - 相机目标跟踪
  2. 激光雷达管线:

    • lidar_detection/ - CenterPoint 3D目标检测算法
    • lidar_tracking/ - 激光雷达跟踪
    • pointcloud_preprocess/ - 点云预处理
    • pointcloud_ground_detection/ - 地面检测
  3. 毫米波雷达管线:

    • radar_detection/ - 传统毫米波雷达检测
    • radar4d_detection/ - 4D毫米波雷达检测(新特性)
  4. 多传感器融合:

    • multi_sensor_fusion/ - 融合相机、雷达、激光雷达数据
  5. 交通灯检测:

    • traffic_light_detection/ - 红绿灯检测
    • traffic_light_recognition/ - 红绿灯识别
    • traffic_light_tracking/ - 红绿灯跟踪
  6. 车道线检测:

    • 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个核心子系统:

  1. Container(容器): 管理障碍物、自车轨迹、位姿数据
  2. Scenario(场景分析) :
    • 场景分类(路口、车道保持等)
    • 优先级分类(Ignore/Caution/Normal)
  3. Evaluator(评估器) - 9种评估模型:
    • Cost Evaluator - 基于成本的评估
    • MLP Evaluator - 多层感知器
    • RNN Evaluator - 循环神经网络
    • LSTM Evaluator - 长短期记忆网络
    • Vectornet LSTM - 向量化网络
    • Cruise MLP + CNN-1d - 巡航评估
  4. 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种控制器:

  1. lat_based_lqr_controller - 横向LQR控制器

    • 算法: 线性二次调节器(Linear Quadratic Regulator)
    • 控制: 方向盘角度
  2. lon_based_pid_controller - 纵向PID控制器

    • 算法: 比例-积分-微分控制(PID)
    • 控制: 油门、刹车
  3. mpc_controller - MPC模型预测控制器

    • 算法: 模型预测控制(Model Predictive Control)
    • 优点: 考虑未来多个时间步,控制更平滑
  4. 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 典型开发流程

  1. 环境准备

    bash 复制代码
    # 启动 Docker 容器
    bash docker/scripts/dev_start.sh
    bash docker/scripts/dev_into.sh
  2. 构建代码

    bash 复制代码
    # 构建所有模块
    bash apollo.sh build
    
    # 构建特定模块
    bash apollo.sh build planning
  3. 运行测试

    bash 复制代码
    bash apollo.sh test planning
  4. 启动系统

    bash 复制代码
    # 启动 Dreamview
    bash scripts/bootstrap.sh
    
    # 启动特定模块
    cyber_launch start modules/planning/launch/planning.launch

八、安全特性

8.1 功能安全框架

  • 符合 ISO 26262ISO 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/
功能: 系统健康监控

监控项目:

  1. 运行模块状态

  2. 数据完整性

  3. 数据频率

  4. 系统健康(CPU、内存、磁盘)

  5. 端到端延迟统计

    monitor/
    ├── hardware/ # 硬件监控(CAN 卡、GPS)
    ├── software/ # 软件监控
    │ ├── process_monitor/
    │ ├── topic_monitor/
    │ └── summary_monitor/
    └── common/ # 通用代码

下一部分预告:

第二部分: 感知模块深度解析

  • BEV感知算法详解
  • CenterPoint 3D检测算法
  • 多传感器融合策略
  • 具体参数配置与代码实现

参考资料与引用

官方资源

  1. Apollo 官方 GitHub 仓库

    https://github.com/ApolloAuto/apollo

    • Apollo 开源项目主仓库,包含完整源代码
  2. Apollo 官方文档

    https://apollo.baidu.com/docs

    • 官方技术文档和开发指南
  3. Apollo 开发者社区

    https://apollo.baidu.com/community

    • 官方开发者论坛和技术交流平台

技术规范与标准

  1. ISO 26262 - 道路车辆功能安全标准

    https://www.iso.org/standard/68383.html

  2. ISO 21448 (SOTIF) - 预期功能安全标准

    https://www.iso.org/standard/77490.html

学术论文

  1. CenterPoint: Center-based 3D Object Detection and Tracking

    Yin, T., Zhou, X., & Krähenbühl, P. (2021)

    https://arxiv.org/abs/2006.11275

  2. BEVFormer: Learning Bird's-Eye-View Representation from Multi-Camera Images

    Li, Z., et al. (2022)

    https://arxiv.org/abs/2203.17270

开源工具与库

  1. Bazel 构建系统

    https://bazel.build/

  2. Fast-DDS (eProsima)

    https://www.eprosima.com/index.php/products-all/eprosima-fast-dds

  3. PROJ 坐标转换库

    https://proj.org/

相关技术资源

  1. TensorRT 开发指南

    https://docs.nvidia.com/deeplearning/tensorrt/

  2. PCL 点云库文档

    https://pointclouds.org/

  3. IPOPT 优化求解器

    https://coin-or.github.io/Ipopt/

说明

本文档内容整理自上述官方资料、开源代码以及相关技术文档。所有代码示例和技术细节均基于 Apollo10.0 版本。如需获取最新信息,请访问 Apollo 官方网站和 GitHub 仓库。

版权说明

Apollo® 是百度公司的注册商标。本文档为基于开源项目的非官方技术研究文档,仅供学习参考使用。