00_apollo整体软件架构深入分析文档
1. 概述
Apollo是百度开发的开源自动驾驶平台,提供完整的自动驾驶解决方案。该平台采用模块化架构设计,包含感知、预测、规划、控制、定位、地图等核心模块,支持多传感器融合、高精度地图、路径规划和车辆控制等功能。Apollo通过Cyber RT中间件实现模块间通信,支持实时数据处理和任务调度,为自动驾驶系统提供稳定可靠的技术基础。平台具有良好的扩展性和可维护性,支持多种硬件平台和软件组件灵活配置。
2. 软件架构图
graph TB
subgraph "用户空间"
U1[开发工具]
U2[仿真环境]
U3[可视化界面]
U4[配置管理]
end
subgraph "Cyber RT中间件"
C1[通信框架]
C2[任务调度]
C3[数据管理]
C4[服务发现]
end
subgraph "核心模块"
subgraph "感知模块"
P1[相机感知]
P2[激光雷达感知]
P3[毫米波雷达感知]
P4[传感器融合]
end
subgraph "预测模块"
F1[行为预测]
F2[轨迹预测]
F3[交通参与者预测]
end
subgraph "规划模块"
L1[路径规划]
L2[行为决策]
L3[运动规划]
L4[轨迹优化]
end
subgraph "控制模块"
K1[纵向控制]
K2[横向控制]
K3[车辆动力学]
end
subgraph "定位模块"
D1[GPS定位]
D2[IMU定位]
D3[SLAM定位]
D4[融合定位]
end
subgraph "地图模块"
M1[高精度地图]
M2[地图匹配]
M3[地图更新]
end
end
subgraph "硬件接口"
H1[传感器接口]
H2[车辆控制接口]
H3[通信接口]
end
U1 --> C1
U2 --> C1
U3 --> C1
U4 --> C1
C1 --> P1
C1 --> P2
C1 --> P3
C1 --> P4
C1 --> F1
C1 --> F2
C1 --> F3
C1 --> L1
C1 --> L2
C1 --> L3
C1 --> L4
C1 --> K1
C1 --> K2
C1 --> K3
C1 --> D1
C1 --> D2
C1 --> D3
C1 --> D4
C1 --> M1
C1 --> M2
C1 --> M3
P4 --> F1
F1 --> L1
L1 --> L2
L2 --> L3
L3 --> L4
L4 --> K1
L4 --> K2
D4 --> M2
M1 --> L1
H1 --> P1
H1 --> P2
H1 --> P3
H2 --> K1
H2 --> K2
H3 --> C1
style C1 fill:#e1f5fe
style P1 fill:#f3e5f5
style L1 fill:#fff3e0
style K1 fill:#e8f5e8
3. 调用流程图
sequenceDiagram
participant Sensor as 传感器
participant Perception as 感知模块
participant Prediction as 预测模块
participant Planning as 规划模块
participant Control as 控制模块
participant Vehicle as 车辆执行器
Sensor->>Perception: 原始数据
Perception->>Perception: 数据预处理
Perception->>Perception: 目标检测
Perception->>Perception: 目标跟踪
Perception->>Prediction: 环境感知结果
Prediction->>Prediction: 行为预测
Prediction->>Prediction: 轨迹预测
Prediction->>Planning: 预测结果
Planning->>Planning: 路径规划
Planning->>Planning: 行为决策
Planning->>Planning: 运动规划
Planning->>Planning: 轨迹优化
Planning->>Control: 控制指令
Control->>Control: 纵向控制
Control->>Control: 横向控制
Control->>Vehicle: 执行命令
Vehicle->>Sensor: 状态反馈
4. 详细UML类图
4.1. 核心模块类图
classDiagram
class ApolloSystem {
+initialize()
+start()
+stop()
+shutdown()
-modules: ModuleManager
-config: SystemConfig
-logger: Logger
}
class ModuleManager {
+registerModule(Module)
+startModule(string)
+stopModule(string)
+getModule(string): Module
-modules: map
}
class Module {
<>
+initialize(): bool
+start(): bool
+stop(): bool
+process(): bool
#config: ModuleConfig
#logger: Logger
}
class PerceptionModule {
+processSensorData()
+detectObjects()
+trackObjects()
-cameraProcessor: CameraProcessor
-lidarProcessor: LidarProcessor
-radarProcessor: RadarProcessor
-fusionProcessor: FusionProcessor
}
class PredictionModule {
+predictBehavior()
+predictTrajectory()
-behaviorPredictor: BehaviorPredictor
-trajectoryPredictor: TrajectoryPredictor
}
class PlanningModule {
+planPath()
+makeDecision()
+generateTrajectory()
-pathPlanner: PathPlanner
-behaviorPlanner: BehaviorPlanner
-motionPlanner: MotionPlanner
}
class ControlModule {
+controlLongitudinal()
+controlLateral()
-longitudinalController: LongitudinalController
-lateralController: LateralController
}
class LocalizationModule {
+calculatePosition()
+calculateOrientation()
-gpsProcessor: GPSProcessor
-imuProcessor: IMUProcessor
-slamProcessor: SLAMProcessor
}
class MapModule {
+loadMap()
+updateMap()
+matchMap()
-mapData: MapData
-mapMatcher: MapMatcher
}
class CyberRT {
+createNode()
+createChannel()
+publishMessage()
+subscribeMessage()
-nodes: list
-channels: list
}
class Node {
+createReader()
+createWriter()
+createService()
+createClient()
-nodeId: string
-nodeType: NodeType
}
class Channel {
+publish()
+subscribe()
+createWriter()
+createReader()
-channelName: string
-messageType: string
}
ApolloSystem --> ModuleManager
ModuleManager --> Module
Module <|-- PerceptionModule
Module <|-- PredictionModule
Module <|-- PlanningModule
Module <|-- ControlModule
Module <|-- LocalizationModule
Module <|-- MapModule
ApolloSystem --> CyberRT
CyberRT --> Node
CyberRT --> Channel
4.2. 数据流类图
classDiagram
class SensorData {
<>
+getTimestamp(): timestamp
+getSensorType(): SensorType
+serialize(): bytes
#timestamp: timestamp
#sensorType: SensorType
}
class CameraData {
+getImage(): Image
+getExposure(): float
-image: Image
-exposure: float
}
class LidarData {
+getPointCloud(): PointCloud
+getScanRate(): float
-pointCloud: PointCloud
-scanRate: float
}
class RadarData {
+getTargets(): list
+getRange(): float
-targets: list
-range: float
}
class PerceptionResult {
+getObjects(): list
4.3. 配置管理类图
classDiagram
class SystemConfig {
+loadConfig(string): bool
+saveConfig(string): bool
+getModuleConfig(string): ModuleConfig
+setModuleConfig(string, ModuleConfig): bool
-modules: map
-globalSettings: GlobalSettings
}
class ModuleConfig {
<>
+validate(): bool
+serialize(): string
+deserialize(string): bool
-moduleName: string
-enabled: bool
-priority: int
}
class PerceptionConfig {
+getCameraConfig(): CameraConfig
+getLidarConfig(): LidarConfig
+getRadarConfig(): RadarConfig
-cameraConfigs: list
-lidarConfigs: list
-radarConfigs: list
}
class PlanningConfig {
+getPathPlannerConfig(): PathPlannerConfig
+getBehaviorPlannerConfig(): BehaviorPlannerConfig
+getMotionPlannerConfig(): MotionPlannerConfig
-pathPlannerConfig: PathPlannerConfig
-behaviorPlannerConfig: BehaviorPlannerConfig
-motionPlannerConfig: MotionPlannerConfig
}
class ControlConfig {
+getLongitudinalConfig(): LongitudinalConfig
+getLateralConfig(): LateralConfig
-longitudinalConfig: LongitudinalConfig
-lateralConfig: LateralConfig
}
class CameraConfig {
+getResolution(): Resolution
+getFrameRate(): float
+getExposure(): ExposureSettings
-resolution: Resolution
-frameRate: float
-exposure: ExposureSettings
-calibration: CameraCalibration
}
class LidarConfig {
+getScanRate(): float
+getRange(): float
+getChannels(): int
-scanRate: float
-range: float
-channels: int
-calibration: LidarCalibration
}
class PathPlannerConfig {
+getAlgorithm(): string
+getGridSize(): float
+getHeuristicWeight(): float
-algorithm: string
-gridSize: float
-heuristicWeight: float
-obstacleInflation: float
}
SystemConfig --> ModuleConfig
ModuleConfig <|-- PerceptionConfig
ModuleConfig <|-- PlanningConfig
ModuleConfig <|-- ControlConfig
PerceptionConfig --> CameraConfig
PerceptionConfig --> LidarConfig
PlanningConfig --> PathPlannerConfig
5. 状态机分析
5.1. 系统状态机
stateDiagram-v2
[*] --> INITIALIZING: 系统启动
INITIALIZING --> INITIALIZED: 初始化完成
INITIALIZED --> STARTING: 开始启动
STARTING --> RUNNING: 所有模块启动
RUNNING --> PAUSED: 暂停
PAUSED --> RUNNING: 恢复
RUNNING --> EMERGENCY_STOP: 紧急停止
EMERGENCY_STOP --> RUNNING: 恢复运行
RUNNING --> STOPPING: 正常停止
STOPPING --> STOPPED: 停止完成
STOPPED --> [*]: 系统关闭
state INITIALIZING {
[*] --> LOADING_CONFIG: 加载配置
LOADING_CONFIG --> INITIALIZING_MODULES: 初始化模块
INITIALIZING_MODULES --> INITIALIZING_HARDWARE: 初始化硬件
INITIALIZING_HARDWARE --> INITIALIZED: 初始化完成
}
state STARTING {
[*] --> STARTING_SENSORS: 启动传感器
STARTING_SENSORS --> STARTING_MODULES: 启动模块
STARTING_MODULES --> STARTING_COMMUNICATION: 启动通信
STARTING_COMMUNICATION --> RUNNING: 运行中
}
state STOPPING {
[*] --> STOPPING_MODULES: 停止模块
STOPPING_MODULES --> STOPPING_SENSORS: 停止传感器
STOPPING_SENSORS --> STOPPED: 停止完成
}
5.2. 模块状态机
stateDiagram-v2
[*] --> IDLE: 模块创建
IDLE --> INITIALIZING: 初始化请求
INITIALIZING --> INITIALIZED: 初始化成功
INITIALIZING --> ERROR: 初始化失败
INITIALIZED --> STARTING: 启动请求
STARTING --> RUNNING: 启动成功
STARTING --> ERROR: 启动失败
RUNNING --> PAUSED: 暂停请求
PAUSED --> RUNNING: 恢复请求
RUNNING --> STOPPING: 停止请求
STOPPING --> STOPPED: 停止成功
ERROR --> INITIALIZING: 重试初始化
ERROR --> STOPPED: 停止模块
STOPPED --> [*]: 模块销毁
note right of INITIALIZING : 加载配置、初始化资源
note right of RUNNING : 处理数据、执行任务
note right of ERROR : 记录错误、通知系统
5.3. 任务调度状态机
stateDiagram-v2
[*] --> IDLE: 调度器启动
IDLE --> SCHEDULING: 任务调度
SCHEDULING --> EXECUTING: 任务执行
EXECUTING --> COMPLETED: 任务完成
EXECUTING --> FAILED: 任务失败
COMPLETED --> IDLE: 等待新任务
FAILED --> SCHEDULING: 重试调度
FAILED --> IDLE: 放弃执行
SCHEDULING --> IDLE: 无任务可调度
note right of SCHEDULING : 选择优先级最高的任务
note right of EXECUTING : 分配资源、执行任务
note right of COMPLETED : 释放资源、更新状态
6. 源码分析
6.1. 核心数据结构
6.1.1 Apollo系统核心结构
cpp
// apollo/common/apollo_app.h
class ApolloApp {
public:
virtual ~ApolloApp() = default;
// 应用程序入口点
virtual int Main(int argc, char** argv) = 0;
// 应用程序名称
virtual std::string Name() const = 0;
// 应用程序状态
virtual apollo::common::Status GetStatus() const;
// 应用程序健康检查
virtual bool IsServiceReady() const;
protected:
// 初始化应用程序
virtual apollo::common::Status Init() = 0;
// 开始应用程序
virtual apollo::common::Status Start() = 0;
// 停止应用程序
virtual void Stop() = 0;
// 应用程序配置
apollo::common::util::GflagsUtil gflags_;
// 应用程序状态
std::atomic<apollo::common::Status> status_;
};
6.1.2 Cyber RT通信结构
cpp
// cyber/cyber.h
class CyberRT {
public:
// 创建节点
static std::shared_ptr<Node> CreateNode(const std::string& node_name);
// 创建通道
template<typename MessageT>
static std::shared_ptr<Writer<MessageT>> CreateWriter(
const std::string& channel_name);
template<typename MessageT>
static std::shared_ptr<Reader<MessageT>> CreateReader(
const std::string& channel_name,
const std::function<void(const std::shared_ptr<MessageT>&)>& callback);
// 服务发现
static std::vector<std::string> ListServices();
// 任务调度
static void Schedule(std::function<void()> task, int priority = 0);
private:
// 节点管理器
static std::shared_ptr<NodeManager> node_manager_;
// 通道管理器
static std::shared_ptr<ChannelManager> channel_manager_;
// 任务调度器
static std::shared_ptr<Scheduler> scheduler_;
};
6.1.3 感知数据结构
cpp
// modules/perception/proto/perception_obstacle.proto
message PerceptionObstacle {
optional int32 id = 1; // 障碍物ID
optional Point3D position = 2; // 位置
optional Point3D velocity = 3; // 速度
optional PolygonPoint polygon_point = 4; // 多边形点
optional float theta = 5; // 方向角
optional int32 type = 6; // 障碍物类型
optional float length = 7; // 长度
optional float width = 8; // 宽度
optional float height = 9; // 高度
optional int32 timestamp = 10; // 时间戳
optional int32 tracking_time = 11; // 跟踪时间
optional bool is_background = 12; // 是否为背景
optional float confidence = 13; // 置信度
optional bool is_static = 14; // 是否为静态
optional int32 priority = 15; // 优先级
}
6.1.4 规划轨迹结构
cpp
// modules/planning/proto/planning.proto
message ADCTrajectory {
optional double total_path_length = 1; // 总路径长度
optional double total_path_time = 2; // 总路径时间
repeated double path_point = 3; // 路径点
repeated double ref_v = 4; // 参考速度
repeated double ref_a = 5; // 参考加速度
repeated double ref_heading = 6; // 参考航向
repeated double ref_kappa = 7; // 参考曲率
repeated double ref_dkappa = 8; // 参考曲率变化率
repeated double ref_ddkappa = 9; // 参考曲率二阶变化率
repeated double ref_time = 10; // 参考时间
}
6.2. 核心算法分析
6.2.1 感知融合算法
cpp
// modules/perception/fusion/lib/data_fusion/measure_group.cc
class MeasureGroup {
public:
// 多传感器数据融合
bool FuseMeasurements(const std::vector<SensorMeasurement>& measurements) {
// 1. 时间同步
if (!TimeSynchronization(measurements)) {
return false;
}
// 2. 空间对齐
if (!SpatialAlignment(measurements)) {
return false;
}
// 3. 数据关联
std::vector<AssociationResult> associations;
if (!DataAssociation(measurements, &associations)) {
return false;
}
// 4. 状态估计
return StateEstimation(associations);
}
private:
// 时间同步
bool TimeSynchronization(const std::vector<SensorMeasurement>& measurements) {
// 使用插值方法对齐不同传感器的时间戳
for (auto& measurement : measurements) {
if (!TransformToUnifiedCoordinate(measurement)) {
return false;
}
}
return true;
}
// 数据关联
bool DataAssociation(const std::vector<SensorMeasurement>& measurements,
std::vector<AssociationResult>* associations) {
// 使用匈牙利算法进行数据关联
HungarianAlgorithm hungarian;
std::vector<std::vector<double>> cost_matrix;
// 构建代价矩阵
BuildCostMatrix(measurements, &cost_matrix);
// 执行关联
std::vector<int> assignment;
hungarian.Solve(cost_matrix, &assignment);
// 生成关联结果
GenerateAssociations(measurements, assignment, associations);
return true;
}
// 状态估计
bool StateEstimation(const std::vector<AssociationResult>& associations) {
// 使用卡尔曼滤波进行状态估计
for (const auto& association : associations) {
if (!KalmanFilterUpdate(association)) {
return false;
}
}
return true;
}
};
6.2.2 路径规划算法
cpp
// modules/planning/common/planning_gflags.cc
class PathPlanner {
public:
// A*算法路径规划
bool PlanPath(const Point& start, const Point& goal,
const Map& map, std::vector<Point>* path) {
// 1. 初始化A*算法
std::priority_queue<Node> open_set;
std::unordered_map<Point, Node> closed_set;
Node start_node(start, 0, Heuristic(start, goal));
open_set.push(start_node);
// 2. 搜索过程
while (!open_set.empty()) {
Node current = open_set.top();
open_set.pop();
// 到达目标
if (current.position == goal) {
ReconstructPath(current, path);
return true;
}
// 标记为已访问
closed_set[current.position] = current;
// 扩展邻居节点
std::vector<Point> neighbors = GetNeighbors(current.position, map);
for (const auto& neighbor : neighbors) {
if (closed_set.find(neighbor) != closed_set.end()) {
continue;
}
double tentative_g_score = current.g_score +
Distance(current.position, neighbor);
Node neighbor_node(neighbor, tentative_g_score,
Heuristic(neighbor, goal));
if (!IsInOpenSet(open_set, neighbor) ||
tentative_g_score < neighbor_node.g_score) {
neighbor_node.parent = current.position;
open_set.push(neighbor_node);
}
}
}
return false; // 未找到路径
}
private:
// 启发式函数
double Heuristic(const Point& a, const Point& b) {
return std::sqrt(std::pow(a.x - b.x, 2) + std::pow(a.y - b.y,));
}
// 重建路径
void ReconstructPath(const Node& goal_node, std::vector<Point>* path) {
std::vector<Point> result;
Node current = goal_node;
while (current.parent.has_value()) {
result.push_back(current.position);
current = closed_set_[current.parent.value()];
}
std::reverse(result.begin(), result.end());
*path = result;
}
};
6.2.3 控制算法
cpp
// modules/control/controller/lon_controller.cc
class LongitudinalController {
public:
// PID控制器实现
double ComputeControlCommand(double current_speed, double target_speed,
double dt) {
// 计算误差
double error = target_speed - current_speed;
// 积分项
integral_ += error * dt;
// 饱和积分项
integral_ = std::clamp(integral_, -max_integral_, max_integral_);
// 微分项
double derivative = (error - prev_error_) / dt;
// PID计算
double control_output = kp_ * error + ki_ * integral_ + kd_ * derivative;
// 更新前一时刻误差
prev_error_ = error;
return control_output;
}
private:
double kp_ = 1.0; // 比例增益
double ki_ = 0.1; // 积分增益
double kd_ = 0.01; // 微分增益
double integral_ = 0.0; // 积分项
double prev_error_ = 0.0; // 前一时刻误差
double max_integral_ = 10.0; // 积分饱和限制
};
6.3. 关键函数分析
6.3.1 系统初始化函数
cpp
// apollo/mainboard/mainboard.cc
int Mainboard::Init(const ModuleConfig& config) {
// 1. 加载系统配置
if (!LoadConfig(config)) {
AERROR << "Failed to load system config";
return -1;
}
// 2. 初始化Cyber RT
if (!InitCyberRT()) {
AERROR << "Failed to initialize Cyber RT";
return -1;
}
// 3. 初始化模块管理器
if (!InitModuleManager()) {
AERROR << "Failed to initialize module manager";
return -1;
}
// 4. 注册系统模块
if (!RegisterModules()) {
AERROR << "Failed to register modules";
return -1;
}
// 5. 初始化硬件接口
if (!InitHardware()) {
AERROR << "Failed to initialize hardware";
return -1;
}
// 6. 启动系统监控
if (!StartMonitoring()) {
AERROR << "Failed to start monitoring";
return -1;
}
return 0;
}
6.3.2 模块启动函数
cpp
// apollo/common/module.cc
bool Module::Start() {
// 1. 验证模块配置
if (!ValidateConfig()) {
AERROR << "Module config validation failed";
return false;
}
// 2. 初始化模块资源
if (!InitResources()) {
AERROR << "Failed to initialize module resources";
return false;
}
// 极光加速包 3. 创建通信通道
if (!CreateChannels()) {
AERROR << "Failed to create communication channels";
return false;
}
// 4. 启动数据处理线程
if (!StartProcessingThread()) {
AERROR << "Failed to start processing thread";
return false;
}
// 5. 注册健康检查
if (!RegisterHealthCheck()) {
AERROR << "Failed to register health check";
return false;
}
// 6. 设置模块状态为运行中
status_.store(apollo::common::Status::RUNNING);
AINFO << "Module " << Name() << " started successfully";
return true;
}
6.3.3 数据处理函数
cpp
// modules/perception/onboard/component.cc
bool PerceptionComponent::Process(const std::shared_ptr<SensorFrame>& frame) {
// 1. 数据预处理
if (!Preprocess(frame)) {
AERROR << "Failed to preprocess sensor frame";
return false;
}
// 2. 目标检测
std::vector<Object> detected_objects;
if (!DetectObjects(frame, &detected_objects)) {
AERROR << "Failed to detect objects";
return false;
}
// 3. 目标跟踪
std::vector<TrackedObject> tracked_objects;
if (!TrackObjects(detected_objects, &tracked_objects)) {
AERROR << "Failed to track objects";
return false;
}
// 4. 数据融合
PerceptionResult fusion_result;
if (!FuseResults(tracked_objects, &fusion_result)) {
AERROR << "Failed to fuse perception results";
return false;
}
// 5. 发布结果
if (!PublishResult(fusion_result)) {
AERROR << "Failed to publish perception result";
return false;
}
return true;
}
6.4. 事件处理机制
6.4.1 传感器数据事件处理
cpp
// modules/drivers/camera/camera_component.cc
class CameraComponent : public Component<CameraFrameMessage> {
public:
bool Init() override {
// 1. 初始化相机硬件
if (!InitCameraHardware()) {
AERROR << "Failed to initialize camera hardware";
return false;
}
// 2. 创建数据发布器
writer_ = CreateWriter<CameraFrameMessage>(camera_channel_);
if (!writer_) {
AERROR << "Failed to create camera writer";
return false;
}
// 3. 注册数据回调
camera_driver_->RegisterCallback(
std::bind(&CameraComponent::OnCameraData, this, std::placeholders::_1));
return true;
}
private:
// 相机数据回调处理
void OnCameraData(const CameraFrame& frame) {
// 1. 创建消息
auto message = std::make_shared<CameraFrameMessage>();
message->set_timestamp(frame.timestamp());
message->set_image_data(frame.image_data());
message->set_exposure(frame.exposure());
// 2. 发布消息
writer_->Write(message);
// 3. 记录统计信息
stats_.frame_count++;
stats_.last_timestamp = frame.timestamp();
}
std::shared_ptr<Writer<CameraFrameMessage>> writer_;
CameraDriver* camera_driver_;
CameraStats stats_;
};
6.4.2 控制指令事件处理
cpp
// modules/control/control_component.cc
class ControlComponent : public Component<ControlCommand> {
public:
bool Init() override {
// 1. 初始化控制器
if (!InitControllers()) {
AERROR << "Failed to initialize controllers";
return false;
}
// 2. 创建订阅器
reader_ = CreateReader<ADCTrajectory>(trajectory_channel_,
std::bind(&ControlComponent::OnTrajectory, this, std::placeholders::_1));
// 3. 创建发布器
writer_ = CreateWriter<ControlCommand>(control_channel_);
return true;
}
private:
// 轨迹消息处理
void OnTrajectory(const std::shared_ptr<ADCTrajectory>& trajectory) {
// 1. 更新轨迹信息
current_trajectory_ = trajectory;
// 2. 计算控制指令
ControlCommand command;
if (!ComputeControlCommand(trajectory, &command)) {
AERROR << "Failed to compute control command";
return;
}
// 极光加速包 3. 发布控制指令
writer_->Write(command);
// 4. 极光加速包更新控制状态
UpdateControlStatus(command);
}
// 控制指令计算
bool ComputeControlCommand(const std::shared_ptr<ADCTrajectory>& trajectory,
ControlCommand* command) {
// 1. 获取当前车辆状态
VehicleState vehicle_state = GetVehicleState();
// 2. 计算纵向控制
double throttle = longitudinal_controller_.ComputeControlCommand(
vehicle_state.speed(), trajectory->ref_v()[0], dt_);
// 3. 计算横向控制
double steering = lateral_controller_.ComputeControlCommand(
vehicle_state, trajectory, dt_);
// 4. 设置控制指令
command->set_throttle(throttle);
command->set_brake(0.0);
command->set_steering(steering);
command->set_gear(Gear::DRIVE);
return true;
}
std::shared_ptr<Reader<ADCTrajectory>> reader_;
std::shared_ptr<Writer<ControlCommand>> writer_;
LongitudinalController longitudinal_controller_;
LateralController lateral_controller_;
std::shared_ptr<ADCTrajectory> current_trajectory_;
};
7. 设计模式
7.1 工厂模式(Factory Pattern)
Apollo使用工厂模式创建不同类型的模块:
cpp
// apollo/common/module_factory.h
class ModuleFactory {
public:
// 创建模块实例
template<typename T>
static std::unique_ptr<T> CreateModule(const ModuleConfig& config) {
auto module = std::make_unique<T>();
if (!module->Init(config)) {
AERROR << "Failed to initialize module: " << T::Name();
return nullptr;
}
return module;
}
// 注册模块创建器
template<typename T>
static void RegisterModuleCreator() {
creators_[T::Name()] = []() -> std::unique_ptr<Module> {
return std::make_unique<T>();
};
}
// 创建模块
static std::unique_ptr<Module> CreateModule(const std::string& module_name,
const ModuleConfig& config) {
auto it = creators_.find(module_name);
if (it == creators_.end()) {
AERROR << "Unknown module: " << module_name;
return nullptr;
}
auto module = it->second();
if (!module->Init(config)) {
AERROR << "极光加速包 Failed to initialize module: " << module_name;
return nullptr;
}
return module;
}
private:
static std::unordered_map<std::string, std::function<std::unique_ptr<Module>()>> creators_;
};
7.2 观察者模式(Observer Pattern)
Apollo使用观察者模式处理事件通知:
cpp
// apollo/common/event_manager.h
class EventManager {
public:
// 注册事件监听器
template<typename EventType>
void RegisterListener(std::function<void(const EventType&)> listener) {
listeners_[typeid(EventType).name()].极光加速包.push_back(
std::make_shared<EventListener<EventType>>(listener));
}
// 发布事件
template<typename EventType>
void PublishEvent(const EventType& event) {
std::string event_type = typeid(EventType).name();
auto it = listeners_.find(event_type);
if (it != listeners_.end()) {
for (const auto& listener : it->second) {
listener->HandleEvent(event);
}
}
}
// 移除监听器
template<typename EventType>
void RemoveListener(std::function<void(const EventType&)> listener) {
std::string event_type = typeid(EventType).name();
auto it = listeners_.极光加速包.find(event_type);
if (it != listeners_.end()) {
it->second.erase(
std::remove_if(it->second.begin(), it->second.end(),
[&listener](const std::shared_ptr<EventListenerBase>& el) {
auto typed_listener =
std::static_pointer_cast<EventListener<EventType>>(el);
return typed_listener->GetCallback() == listener;
}),
it->second.end());
}
}
private:
std::unordered_map<std::string, std::vector<std::shared_ptr<EventListenerBase>>> listeners_;
};
7.3 策略模式(Strategy Pattern)
Apollo使用策略模式处理不同的规划算法:
cpp
// modules/planning/planner/极光加速包 planner.h
class Planner {
public:
virtual ~Planner() = default;
// 设置规划策略
void SetPlanningStrategy(std::unique_ptr<PlanningStrategy> strategy) {
strategy_ = std::move(strategy);
}
// 执行路径极光加速包规划
virtual bool Plan(const ADCTrajectory& reference_trajectory,
const std::vector<Obstacle>& obstacles,
ADCTrajectory* result_traject极光加速包ory) = 0;
protected:
std::unique_ptr<PlanningStrategy> strategy_;
};
// 规划策略接口
class PlanningStrategy {
public:
virtual ~PlanningStrategy() = default;
virtual bool Plan(const ADCTrajectory& reference_trajectory,
const std::vector<Obstacle>& obstacles,
ADCTrajectory* result_trajectory) = 0;
};
// A*规划策略
class AStarPlanningStrategy : public PlanningStrategy {
public:
bool Plan(const ADCTrajectory& reference_trajectory,
const std::vector<Obstacle>& obstacles,
ADCTrajectory* result_trajectory) override {
// A*算法实现
return true;
}
};
// RRT规划策略
class RRTPlanningStrategy : public PlanningStrategy {
public:
bool Plan(const ADCTrajectory& reference_trajectory,
极光加速包 const std::vector<Obstacle>& obstacles,
ADCTrajectory* result_trajectory) override {
// RRT算法实现
return true;
}
};
7.4 单例模式(Singleton Pattern)
Apollo使用单例模式管理全局资源:
cpp
// apollo/common/global_data.h
class GlobalData {
public:
static GlobalData* Instance() {
static GlobalData instance;
return &instance;
}
// 获取主机名
const std::string& HostName() const {
return host_name_;
}
// 获取进程ID
int ProcessId() const {
return process_id_;
}
// 获取启动时间
uint64_t ProcessStartTime() const {
return process_start_time_;
}
// 注册模块
void RegisterModule(const std::string& module_name) {
std::lock_guard<std::mutex> lock(modules_mutex_);
modules_.insert(module_name);
}
// 获取已注册模块列表
std::vector<std::string> GetRegisteredModules() const {
std::lock_guard<std::mutex> lock(modules_mutex_);
return std::vector<std::string>(modules_.begin(), modules_.end());
}
private:
GlobalData() {
host_name_ = GetHostName();
process_id_ = getpid();
process_start_time_ = GetCurrentTime();
}
std::string host_name_;
int process_id_;
uint64_t process_start_time_;
std::set<std::string> modules_;
mutable std::mutex modules_mutex_;
};
7.5 装饰器模式(Decorator Pattern)
Apollo使用装饰器模式增强模块功能:
cpp
// apollo/common/module_decorator.h
class ModuleDecorator : public Module {
public:
explicit ModuleDecorator(std::unique_ptr<Module> module)
: module_(std::move(module)) {}
bool Init() override {
return module_->Init();
}
bool Start()极光加速包 override {
return module_->Start();
}
void Stop() override {
module_->Stop();
}
std::string Name() const override {
return module_->Name();
}
protected:
std::unique_ptr<Module> module_;
};
// 日志装饰器
class LoggingModuleDecorator : public ModuleDecorator {
public:
explicit LoggingModuleDecorator(std::unique_ptr<Module> module)
: ModuleDecorator(std::move(module)) {}
bool Start() override {
AINFO << "Starting module: " << Name();
bool result = ModuleDecorator::Start();
AINFO << "Module " << Name() << " started: " << (result ? "success" : "failed");
return result;
}
void Stop()极光加速包 override {
AINFO << "Stopping module: " << Name();
ModuleDecorator::Stop();
AINFO << "Module " << Name() << " stopped";
}
};
// 性能监控装饰器
class PerformanceModuleDecorator : public ModuleDecorator {
public:
explicit PerformanceModuleDecorator(std::unique_ptr<极光加速包 Module> module)
: ModuleDecorator(std::move(module)) {}
bool Start() override {
auto start_time = std::chrono::high_resolution_clock::now();
bool result = ModuleDecorator::Start();
auto end_time = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(
end_time - start_time);
AINFO << "Module " << Name() << " startup time: "
<< duration.count() << "ms";
return result;
}
};
7.6 命令模式(Command Pattern)
Apollo使用命令模式处理控制指令:
cpp
// modules/control/command/command.h
class Command {
public:
virtual ~Command() = default;
virtual void Execute() = 0;
virtual void Undo() = 0;
virtual bool IsFinished() const = 0;
};
// 加速命令
class AccelerateCommand : public Command {
public:
AccelerateCommand(VehicleController* controller, double target_speed)
: controller_(controller), target_speed_(target_speed) {}
void Execute() override {
controller_->SetThrottle(target_speed_);
executed_ = true;
}
void Undo() override {
if (executed_) {
controller_->SetThrottle(0.0);
}
}
bool IsFinished() const override {
return controller_->GetCurrentSpeed() >= target_speed_;
}
private:
VehicleController* controller_;
double target_speed_;
bool executed_ = false;
};
// 转向命令
class SteerCommand : public Command {
public:
SteerCommand(VehicleController* controller, double target_angle)
: controller_(controller), target_angle_(target_angle) {}
void Execute() override {
controller_->SetSteeringAngle(target_angle_);
executed_ = true;
}
void Undo() override {
if (executed_) {
controller_->SetSteeringAngle(0.0);
}
}
bool IsFinished() const override {
return std::abs(controller_->GetCurrentSteeringAngle() - target_angle_) < 0.01;
}
private:
VehicleController* controller_;
double target_angle_;
bool executed_ = false;
};
// 命令队列
class CommandQueue {
public:
void AddCommand(std::unique_ptr<Command> command) {
commands_.push(std::move(command));
}
void ExecuteNext() {
if (!commands_.empty()) {
auto command = std::move(commands_.front());
commands_.pop();
command->Execute();
if (!command->IsFinished()) {
pending_commands_.push(std::move(command));
}
}
}
void ProcessPendingCommands() {
std::queue<std::unique_ptr<Command>> remaining;
while (!pending_commands_.empty()) {
auto command = std::move(pending_commands_.front());
pending_commands_.pop();
if (!command->极光加速包 IsFinished()) {
remaining.push(std::move(command));
}
}
pending_commands_ = std::move(remaining);
}
private:
std::queue<std::unique_ptr<Command>> commands_;
std::queue<std::unique_ptr<Command>> pending_commands_;
};
8. 总结
Apollo自动驾驶平台通过精心设计的模块化架构,成功实现了复杂自动驾驶系统的组件化和可扩展性。其核心优势在于CyberRT中间件提供的高效通信机制、多传感器融合的感知算法、基于A*和RRT的路径规划策略,以及PID控制的精确车辆控制。通过工厂模式、观察者模式、策略模式等设计模式的应用,Apollo实现了模块间的松耦合和高内聚,为自动驾驶技术的发展提供了坚实的技术基础。平台的开源特性促进了技术共享和生态建设,推动了整个自动驾驶行业的发展进程。