02_apollo_modules子模块整体软件架构深入分析文档

1. 概述

Apollo Modules是百度Apollo自动驾驶平台的核心功能模块集合,涵盖了感知、规划、控制、定位、地图等关键功能模块。该模块集合通过Cyber RT中间件实现模块间高效通信,采用模块化设计支持独立开发、测试和部署。架构遵循高内聚、低耦合原则,为自动驾驶系统提供完整功能实现,确保实时性、可靠性和安全性。

2. 软件架构图

graph TB subgraph "应用层" A1[DreamView可视化] A2[仿真系统] A3[调试工具] A4[监控系统] A5[远程诊断] A6[数据记录] end subgraph "功能模块层" subgraph "感知模块组" P1[perception感知] P2[camera视觉感知] P3[lidar激光雷达感知] P4[radar毫米波雷达感知] P5[fusion传感器融合] P6[traffic_light交通灯识别] end subgraph "预测模块组" F1[prediction预测] F2[行为预测] F3[轨迹预测] F4[场景分析] end subgraph "规划模块组" L1[planning规划] L2[路径规划] L3[行为决策] L4[运动规划] L5[轨迹优化] end subgraph "控制模块组" K1[control控制] K2[纵向控制] K3[横向控制] K4[车辆动力学] end subgraph "定位模块组" D1[localization定位] D2[RTK定位] D3[MSF多传感器融合] D4[NDT匹配定位] end subgraph "地图模块组" M1[map地图] M2[routing路径规划] M3[transform坐标变换] M4[relative_map相对地图] end subgraph "车辆接口模块组" V1[canbus车辆总线] V2[车辆控制] V3[车辆状态] V4[车辆校准] end subgraph "其他功能模块组" O1[audio音频] O2[monitor监控] O3[guardian守护] O4[drivers驱动] O5[third_party_perception第三方感知] O6[v2x车联网] end end subgraph "通用模块层" C1[common通用组件] C2[common_msgs消息定义] C3[data数据管理] C4[tools工具集] C5[contrib贡献模块] C6[external_command外部命令] end subgraph "Cyber RT中间件" CB1[通信框架] CB2[任务调度] CB3[服务发现] CB4[参数管理] CB5[记录回放] end A1 --> CB1 A2 --> CB1 A3 --> CB1 A4 --> CB1 A5 --> CB1 A6 --> CB1 P1 --> CB1 P2 --> P1 P3 --> P1 P4 --> P1 P5 --> P1 P6 --> P1 F1 --> CB1 F2 --> F1 F3 --> F1 F4 --> F1 L1 --> CB1 L2 --> L1 L3 --> L1 L4 --> L1 L5 --> L1 K1 --> CB1 K2 --> K1 K3 --> K1 K4 --> K1 D1 --> CB1 D2 --> D1 D3 --> D1 D4 --> D1 M1 --> CB1 M2 --> M1 M3 --> M1 M4 --> M1 V1 --> CB1 V2 --> V1 V3 --> V1 V4 --> V1 O1 --> CB1 O2 --> CB1 O3 --> CB1 O4 --> CB1 O5 --> CB1 O6 --> CB1 C1 --> CB1 C2 --> CB1 C3 --> CB1 C4 --> CB1 C5 --> CB1 C6 --> CB1 style P1 fill:#f9e79f style F1 fill:#d5f4e6 style L1 fill:#85c1e9 style K1 fill:#f8c486 style D1 fill:#e6b0aa style M1 fill:#bb8fce style V1 fill:#7fb3d3 style CB1 fill:#a3e4d7

3. 调用流程图

sequenceDiagram participant Boot as 系统启动 participant Common as common模块 participant Transform as transform模块 participant Map as map模块 participant Localization as localization模块 participant Perception as perception模块 participant Prediction as prediction模块 participant Routing as routing模块 participant Planning as planning模块 participant Control as control模块 participant CanBus as canbus模块 participant Drivers as drivers模块 participant ThirdParty as third_party_perception participant DreamView as DreamView participant Monitor as monitor模块 participant Guardian as guardian模块 Boot->>Common: 初始化通用组件 Common->>Boot: 通用组件初始化完成 Boot->>Transform: 启动坐标变换服务 Transform->>Boot: 坐标变换服务启动完成 Boot->>Map: 启动地图服务 Map->>Boot: 地图服务启动完成 par 并行启动 Boot->>Localization: 启动定位模块 Boot->>Perception: 启动感知模块 Boot->>Routing: 启动路由模块 Boot->>Drivers: 启动传感器驱动 end Localization->>Boot: 定位模块启动完成 Perception->>Boot: 感知模块启动完成 Routing->>Boot: 路由模块启动完成 Drivers->>Boot: 传感器驱动启动完成 par 第二阶段启动 Boot->>Prediction: 启动预测模块 Boot->>ThirdParty: 启动第三方感知 Boot->>Planning: 启动规划模块 end Prediction->>Boot: 预测模块启动完成 ThirdParty->>Boot: 第三方感知启动完成 Planning->>Boot: 规划模块启动完成 Boot->>Control: 启动控制模块 Control->>Boot: 控制模块启动完成 Boot->>CanBus: 启动车辆CAN总线接口 CanBus->>Boot: CAN总线接口启动完成 Boot->>DreamView: 启动可视化界面 DreamView->>Boot: 可视化界面启动完成 Boot->>Monitor: 启动监控模块 Monitor->>Boot: 监控模块启动完成 Boot->>Guardian: 启动守护模块 Guardian->>Boot: 守护模块启动完成 par 运行时数据流 Localization->>Transform: 当前位置信息 Perception->>Prediction: 感知结果 ThirdParty->>Prediction: 第三方感知结果 Prediction->>Planning: 预测轨迹 Map->>Planning: 高精地图数据 Routing->>Planning: 导航路线 Planning->>Control: 控制指令 Control->>CanBus: 车辆控制命令 CanBus->>Drivers: 车辆状态 Drivers->>Perception: 传感器数据 DreamView->>Monitor: 系统状态 Guardian->>Safety: 安全监控 end

4. 详细UML类图

4.1. 核心模块类图

classDiagram class ModuleBase { <> +ModuleBase() +virtual ~ModuleBase() +Init(): bool +Start(): bool +Stop(): bool +GetState(): ModuleState #node_: std::shared_ptr~Node~ #module_name_: std::string #state_: ModuleState #worker_thread_: std::thread #is_shutdown_: std::atomic_bool } class PerceptionModule { +PerceptionModule() +virtual ~PerceptionModule() +Init(): bool +Start(): bool +Stop(): bool -InitAlgorithm(): bool -ProcessCameraData(): void -ProcessLidarData(): void -ProcessRadarData(): void -FuseSensors(): void -camera_process_thread_: std::thread -lidar_process_thread_: std::thread -radar_process_thread_: std::thread -fusion_thread_: std::thread -camera_process_func_: std::function~void()~ -lidar_process_func_: std::function~void()~ -radar_process_func_: std::function~void()~ -fusion_func_: std::function~void()~ -camera_objs_: std::shared_ptr~PerceptionObstacles~ -lidar_objs_: std::shared_ptr~PerceptionObstacles~ -radar_objs_: std::shared_ptr~PerceptionObstacles~ } class PredictionModule { +PredictionModule() +virtual ~PredictionModule() +Init(): bool +Start(): bool +Stop(): bool -ProcessPrediction(): void -GenerateScenario(): Scenario -GenerateTrajectory(): vector~Trajectory~ -prediction_thread_: std::thread -prediction_func_: std::function~void()~ -scenario_analyzer_: std::unique_ptr~ScenarioAnalyzer~ -analyzer_thread_: std::thread } class PlanningModule { +PlanningModule() +virtual ~PlanningModule() +Init(): bool +Start(): bool +Stop(): bool -InitFrame(): bool -ProcessPlanning(): void -RunTaskOnThreadPool(): void -RunReplanTask(): void -RunPlanningOnMainThread(): void -frame_: std::unique_ptr~Frame~ -planning_thread_pool_: std::unique_ptr~ThreadPool~ -replan_thread_: std::thread -reference_line_provider_: std::unique_ptr~ReferenceLineProvider~ -navigator_: std::unique_ptr~Navigator~ } class ControlModule { +ControlModule() +virtual ~ControlModule() +Init(): bool +Start(): bool +Stop(): bool -ProduceControlCommand(): common::Status -ComputeControlCommand(): common::Status -control_core_thread_: std::thread -control_reference_publisher_: std::unique_ptr~ReferenceLineProvider~ -lon_controller_: std::unique_ptr~LonController~ -lat_controller_: std::unique_ptr~LatController~ -controller_agent_: std::unique_ptr~ControllerAgent~ } class LocalizationModule { +LocalizationModule() +virtual ~LocalizationModule() +Init(): bool +Start(): bool +Stop(): bool -InitLocalizationCore(): bool -ProcessLocalization(): void -PublishPose(): void -localization_core_: std::unique_ptr~LocalizationBase~ -pose_publisher_: std::unique_ptr~Publisher~Gps~, Publisher~Imu~, Publisher~InsStat~, Publisher~Odometry~~ -localization_filter_: std::unique_ptr~LocalizationFilter~ } class RoutingModule { +RoutingModule() +virtual ~RoutingModule() +Init(): bool +Start(): bool +Stop(): bool -InitRouter(): bool -ProcessRoutingRequest(): void -router_processor_: std::unique_ptr~Router~ -routing_response_publisher_: std::unique_ptr~Publisher~RoutingResponse~~ -topo_graph_: std::unique_ptr~TopoGraph~ -routing_map_: std::unique_ptr~RoutingMap~ } class CanbusModule { +CanbusModule() +virtual ~CanbusModule() +Init(): bool +Start(): bool +Stop(): bool -InitCanbus(): bool -CheckChassis(): bool -PublishChassis(): bool -vehicle_controller_agent_: std::unique_ptr~VehicleControllerAgent~ -chassis_publisher_: std::unique_ptr~Publisher~Chassis~~ -chassis_created_time_: double -can_sender_thread_: std::thread } class TransformModule { +TransformModule() +virtual ~TransformModule() +Init(): bool +Start(): bool +Stop(): bool -InitTf2Buffer(): bool -PublishStaticTransform(): void -tf2_buffer_: std::unique_ptr~tf2_ros::Buffer~ -tf2_static_broadcaster_: std::unique_ptr~tf2_ros::StaticTransformBroadcaster~ -transform_handler_: std::unique_ptr~TransformHandler~ } class MonitorModule { +MonitorModule() +virtual ~MonitorModule() +Init(): bool +Start(): bool +Stop(): bool -LogMessage(const MonitorMessage&): void -PublishMonitor(): void -message_buffer_: std::vector~MonitorMessage~ -monitor_publisher_: std::unique_ptr~Publisher~MonitorMessage~~ } class GuardianModule { +GuardianModule() +virtual ~GuardianModule() +Init(): bool +Start(): bool +Stop(): bool -CheckEmergency(): bool -PublishEmergencyStop(): void -emergency_stop_publisher_: std::unique_ptr~Publisher~EmergencyStop~~ -safety_mode_: SafetyMode } ModuleBase <|-- PerceptionModule ModuleBase <|-- PredictionModule ModuleBase <|-- PlanningModule ModuleBase <|-- ControlModule ModuleBase <|-- LocalizationModule ModuleBase <|-- RoutingModule ModuleBase <|-- CanbusModule ModuleBase <|-- TransformModule ModuleBase <|-- MonitorModule ModuleBase <|-- GuardianModule class Common { +math: 数学计算工具 +util: 通用工具函数 +adapter: 数据适配器 +config: 配置管理 +vehicle_state: 车辆状态 +helpers: 辅助函数 } class CommonMessages { +Chassis: 底盘消息 +Localization: 定位消息 +Perception: 感知消息 +Prediction: 预测消息 +Planning: 规划消息 +TrafficLight: 交通灯消息 +Routing: 路由消息 +PadMessage: Pad消息 } class ComponentBase { <> +ComponentBase() +virtual ~ComponentBase() +Init(): bool +Process(): bool #node_: std::shared_ptr~Node~ } class Component~M0, M1, M2~ { +Component() +Init(const ComponentConfig&, std::shared_ptr~Node~): bool +Process(const std::shared_ptr~M0~&, const std::shared_ptr~M1~&, const std::shared_ptr~M2~&): bool -RegisterMessageReaders(): void -Proc(const std::shared_ptr~M0~&, const std::shared_ptr~M1~&, const std::shared_ptr~M2~&): bool } PerceptionModule ..> Common PredictionModule ..> Common PlanningModule ..> Common ControlModule ..> Common LocalizationModule ..> Common Common ..> CommonMessages ModuleBase <|-- ComponentBase ComponentBase <|-- Component

4.2. 感知模块详细类图

classDiagram class Perception { +Perception() +virtual ~Perception() +Init(): common::Status +Run(const SensorFramePtr&): common::Status +Stop(): void -InitAlgorithm(): common::Status -ProcessLidarData(): common::Status -ProcessCameraData(): common::Status -ProcessRadarData(): common::Status -sensor_process_timer_: std::unique_ptr~Timer~ -lidar_process_subscriber_: std::unique_ptr~Subscriber~PointCloud~~ -camera_process_subscriber_: std::unique_ptr~Subscriber~Image~~ -radar_process_subscriber_: std::unique_ptr~Subscriber~ContiRadar~~ -perception_writer_: std::unique_ptr~Writer~PerceptionObstacles~~ -hdmap_input_: std::unique_ptr~HDMapInput~ } class ObstaclePerception { <> +ObstaclePerception() +virtual ~ObstaclePerception() +Process(const SensorFramePtr&, cv::Mat*, std::vector~cv::Rect2f~*): common::Status +GetType(): PerceptronType } class LidarProcessBase { <> +LidarProcessBase() +virtual ~LidarProcessBase() +Init(): common::Status +Process(const pcl_util::PointCloudConstPtr&, std::vector~base::ObjectPtr~*): common::Status -Configure(const libconfig::Config&): common::Status } class CnnLidarDetection { +CnnLidarDetection() +virtual ~CnnLidarDetection() +Init(): common::Status +Process(const pcl_util::PointCloudConstPtr&, std::vector~base::ObjectPtr~*): common::Status -CropGround(): common::Status -Cluster(): common::Status -Classify(): common::Status -ground_detector_: std::unique_ptr~GroundDetector~ -clusterer_: std::unique_ptr~EuclideanCluster~ -classifier_: std::unique_ptr~Classifier~ } class CameraProcessBase { <> +CameraProcessBase() +virtual ~CameraProcessBase() +Init(): common::Status +Process(const cv::Mat&, std::vector~base::ObjectPtr~*): common::Status } class CameraDetector { +CameraDetector() +virtual ~CameraDetector() +Init(): common::Status +Detect(const cv::Mat&, std::vector~base::ObjectPtr~*): common::Status -detect_model_: std::unique_ptr~BaseImageModel~ -tracker_: std::unique_ptr~BaseTracker~ } class FuseProcessBase { <> +FuseProcessBase() +virtual ~FuseProcessBase() +Init(): common::Status +Process(const SensorFramePtr&, std::vector~base::ObjectPtr~*): common::Status } class SensorDataSync { +SensorDataSync() +virtual ~SensorDataSync() +AddSensorFrame(const SensorFramePtr&): void +GetFusedFrame(SensorFramePtr*): bool -sensor_frame_buff_: std::deque~SensorFramePtr~ -sync_strategy_: std::unique_ptr~BaseSyncStrategy~ } class BaseSyncStrategy { <> +BaseSyncStrategy() +virtual ~BaseSyncStrategy() +Sync(const std::vector~SensorFramePtr~&, SensorFramePtr*): bool } class ExactSyncStrategy { +ExactSyncStrategy() +virtual ~ExactSyncStrategy() +Sync(const std::vector~SensorFramePtr~&, SensorFramePtr*): bool -exact_time_diff_threshold_: double } class ApproxSyncStrategy { +ApproxSyncStrategy() +virtual ~ApproxSyncStrategy() +Sync(const std::vector~SensorFramePtr~&, SensorFramePtr*): bool -approx_time_diff_threshold_: double } class GroundDetector { <> +GroundDetector() +virtual ~GroundDetector() +Detect(const pcl_util::PointCloudPtr&, pcl_util::PointIndicesPtr): bool } class EuclideanCluster { +EuclideanCluster() +virtual ~EuclideanCluster() +SetInputCloud(const pcl_util::PointCloudConstPtr&): void +SetClusterSize(const std::pair~int, int~&): void +Cluster(std::vector~pcl_util::IndicesPtr~*): bool -cluster_min_size_: int -cluster_max_size_: int } class Classifier { <> +Classify(const base::ObjectPtr&, FeatureVector*): bool } Perception ..> ObstaclePerception ObstaclePerception <|-- LidarProcessBase ObstaclePerception <|-- CameraProcessBase LidarProcessBase <|-- CnnLidarDetection CameraProcessBase <|-- CameraDetector Perception ..> FuseProcessBase FuseProcessBase <|-- SensorDataSync SensorDataSync ..> BaseSyncStrategy BaseSyncStrategy <|-- ExactSyncStrategy BaseSyncStrategy <|-- ApproxSyncStrategy CnnLidarDetection ..> GroundDetector CnnLidarDetection ..> EuclideanCluster CnnLidarDetection ..> Classifier

5. 状态机

5.1. 模块生命周期状态机

stateDiagram-v2 [*] --> UNINITIALIZED: 模块创建 UNINITIALIZED --> INITIALIZING: 初始化请求 INITIALIZING --> INITIALIZED: 初始化成功 INITIALIZING --> ERROR: 初始化失败 INITIALIZED --> STARTING: 启动请求 STARTING --> RUNNING: 启动成功 STARTING --> ERROR: 启动失败 RUNNING --> PAUSED: 暂停请求 PAUSED --> RUNNING: 恢复请求 RUNNING --> STOPPING: 停止请求 STOPPING --> STOPPED: 停止完成 STOPPED --> SHUTDOWN: 关闭请求 SHUTDOWN --> TERMINATED: 关闭完成 ERROR --> SHUTDOWN: 关闭请求 TERMINATED --> [*]: 模块销毁 note right of INITIALIZED 模块已初始化 资源已分配 准备进入运行状态 end note note right of RUNNING 模块正在运行 接收和处理数据 发布输出消息 end note note right of STOPPED 模块已停止 不再处理数据 保持资源状态 end note

5.2. 感知模块状态机

stateDiagram-v2 [*] --> IDLE: 初始化完成 IDLE --> WAITING_SENSOR_DATA: 等待传感器数据 WAITING_SENSOR_DATA --> PROCESSING_LIDAR: 接收到激光雷达数据 WAITING_SENSOR_DATA --> PROCESSING_CAMERA: 接收到摄像头数据 WAITING_SENSOR_DATA --> PROCESSING_RADAR: 接收到雷达数据 PROCESSING_LIDAR --> FUSION: 完成激光雷达处理 PROCESSING_CAMERA --> FUSION: 完成摄像头处理 PROCESSING_RADAR --> FUSION: 完成雷达处理 FUSION --> OBJECT_DETECTION: 融合完成 OBJECT_DETECTION --> PUBLISHING: 检测到物体 PUBLISHING --> WAITING_SENSOR_DATA: 发布完成 PROCESSING_LIDAR --> ERROR: 处理失败 PROCESSING_CAMERA --> ERROR: 处理失败 PROCESSING_RADAR --> ERROR: 处理失败 FUSION --> ERROR: 融合失败 ERROR --> RECOVERY: 恢复尝试 RECOVERY --> IDLE: 恢复成功 RECOVERY --> FAULT: 恢复失败 FAULT --> [*]: 模块故障 state RECOVERY { [*] --> CHECK_SENSOR_HEALTH CHECK_SENSOR_HEALTH --> RESTART_SENSOR_PROCESS RESTART_SENSOR_PROCESS --> CHECK_DATA_FLOW CHECK_DATA_FLOW --> IDLE: 数据流恢复正常 CHECK_DATA_FLOW --> FAULT: 数据流未恢复 }

5.3. 规划模块状态机

stateDiagram-v2 [*] --> IDLE: 规划模块初始化完成 IDLE --> RECEIVING_INPUT: 接收输入数据 RECEIVING_INPUT --> CHECKING_AVAILABILITY: 检查规划可用性 CHECKING_AVAILABILITY --> LOCALIZATION_OK: 定位正常 CHECKING_AVAILABILITY --> LOCALIZATION_ERROR: 定位异常 LOCALIZATION_OK --> PERCEPTION_OK: 感知正常 LOCALIZATION_ERROR --> WAITING_RECOVERY: 等待恢复 PERCEPTION_OK --> ROUTING_OK: 路由正常 PERCEPTION_OK --> PERCEPTION_ERROR: 感知异常 ROUTING_OK --> PLANNING: 开始规划 PERCEPTION_ERROR --> WAITING_RECOVERY: 等待恢复 ROUTING_OK --> ROUTING_ERROR: 路由异常 ROUTING_ERROR --> WAITING_RECOVERY: 等待恢复 PLANNING --> PATH_GENERATION: 路径生成阶段 PATH_GENERATION --> BEHAVIOR_DECISION: 行为决策阶段 BEHAVIOR_DECISION --> MOTION_PLANNING: 运动规划阶段 MOTION_PLANNING --> TRAJECTORY_OPTIMIZATION: 轨迹优化阶段 TRAJECTORY_OPTIMIZATION --> PLANNING_SUCCESS: 规划成功 TRAJECTORY_OPTIMIZATION --> PLANNING_FAILED: 规划失败 PLANNING_SUCCESS --> PUBLISHING_TRAJECTORY: 发布轨迹 PUBLISHING_TRAJECTORY --> IDLE: 发布完成 PLANNING_FAILED --> REPLANNING_CHECK: 检查重规划 REPLANNING_CHECK --> PLANNING: 重新规划 REPLANNING_CHECK --> IDLE: 放弃规划 WAITING_RECOVERY --> LOCALIZATION_OK: 定位恢复 WAITING_RECOVERY --> TIMEOUT: 恢复超时 TIMEOUT --> EMERGENCY_STOP: 紧急停车 EMERGENCY_STOP --> [*]: 紧急停车状态 state PLANNING { [*] --> GENERATE_PATH GENERATE_PATH --> MAKE_BEHAVIOR_DECISION MAKE_BEHAVIOR_DECISION --> GENERATE_MOTION GENERATE_MOTION --> OPTIMIZE_TRAJECTORY OPTIMIZE_TRAJECTORY --> [*] }

6. 源码分析

6.1. Common 模块分析

6.1.1. 通用工具类

Common模块是Apollo系统的基础模块,提供了大量通用功能:

cpp 复制代码
// modules/common/util/util.h
namespace common {
namespace util {

// 成对值创建函数
template <typename T1, typename T2>
inline std::pair<T1, T2> MakeVal(T1 &&first, T2 &&second) {
  return std::make_pair(first, second);
}

// 指针唯一性检查
template <typename T, typename... Args>
typename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type
MakeUnique(Args &&... args) {
  return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

// 字符串分割函数
std::vector<std::string> StringSplit(const std::string &str,
                                     const std::string &delim) {
  std::vector<std::string> tokens;
  if (str.empty()) {
    return tokens;
  }

  size_t start = 0;
  size_t end = str.find(delim);
  while (end != std::string::npos) {
    tokens.push_back(str.substr(start, end - start));
    start = end + delim.length();
    end = str.find(delim, start);
  }
  tokens.push_back(str.substr(start));

  // Remove empty strings
  auto it = std::remove_if(tokens.begin(), tokens.end(),
                           [](const std::string &s) { return s.empty(); });
  tokens.erase(it, tokens.end());

  return tokens;
}

// 文件路径处理
std::string GetFileName(const std::string &path, bool remove_extension) {
  std::string result = path;
  // Remove directory part
  size_t pos = result.find_last_of("/\\");
  if (pos != std::string::npos) {
    result = result.substr(pos + 1);
  }

  // Remove extension if required
  if (remove_extension) {
    pos = result.find_last_of(".");
    if (pos != std::string::npos) {
      result = result.substr(0, pos);
    }
  }

  return result;
}

}  // namespace util
}  // namespace common

6.1.2. 数学工具

cpp 复制代码
// modules/common/math/math_utils.h
namespace common {
namespace math {

// Sigmoid函数
double Sigmoid(double x) {
  return 1.0 / (1.0 + std::exp(-x));
}

// 限制值在范围内
double Clamp(double val, double min_val, double max_val) {
  return std::min(max_val, std::max(min_val, val));
}

// 角度归一化到[-π, π]
double NormalizeAngle(const double angle) {
  double a = std::fmod(angle + M_PI, 2.0 * M_PI);
  if (a < 0.0) {
    a += (2.0 * M_PI);
  }
  return a - M_PI;
}

// 笛卡尔坐标转极坐标
std::pair<double, double> Cartesian2Polar(double x, double y) {
  double r = std::sqrt(x * x + y * y);
  double theta = std::atan2(y, x);
  return std::make_pair(r, theta);
}

// 二维向量叉积
double CrossProd(const Vec2d &start_point, const Vec2d &end_point_1,
                 const Vec2d &end_point_2) {
  return (end_point_1 - start_point).CrossProd(end_point_2 - start_point);
}

// 二维向量点积
double InnerProd(const Vec2d &start_point, const Vec2d &end_point_1,
                 const Vec2d &end_point_2) {
  return (end_point_1 - start_point).InnerProd(end_point_2 - start_point);
}

}  // namespace math
}  // namespace common

6.2. Perception 模块分析

6.2.1. 感知主类

Perception模块是Apollo的感知模块,负责处理来自各种传感器的数据并检测周围环境中的障碍物。

cpp 复制代码
// modules/perception/lib/lidar/process_base.h
class ProcessBase {
 public:
  virtual ~ProcessBase() = default;
  virtual bool Init(const libconfig::Config& config) = 0;
  virtual bool Process(const pcl_util::PointCloudConstPtr& cloud,
                       std::vector<base::ObjectPtr>* objects) = 0;
  virtual std::string name() const = 0;
};

6.2.2. 点云处理

cpp 复制代码
// modules/perception/lidar/lib/segmentation/cnnseg/segmentation.h
class Segmentation {
 public:
  virtual ~Segmentation() = default;
  virtual bool Init(const SegmentOption& option) = 0;
  virtual bool Segment(const SegmentData& data,
                       SegmentResult* result) = 0;
};

6.2.3. 感知主处理流程

cpp 复制代码
// modules/perception/obstacle/onboard/subnode.h
class PerceptorSSD : public Subnode {
 public:
  apollo::common::Status Init() override;
  apollo::common::Status ProcEvents() override;

 private:
  bool InitFrame();
  bool Process();
  void Publish();

  std::unique_ptr<PerceptionFactory> detector_factory_ = nullptr;
  std::unique_ptr<PerceptionFactory> tracker_factory_ = nullptr;
  std::unique_ptr<PerceptionFactory> obstacle_postprocessor_factory_ = nullptr;

  std::unique_ptr<base::BaseObstacleDetector> detector_ = nullptr;
  std::unique_ptr<base::BaseObstacleTracker> tracker_ = nullptr;
  std::unique_ptr<base::BaseObstaclePostprocessor> obstacle_postprocessor_ = nullptr;

  std::unique_ptr<base::Frame> frame_ = nullptr;
  std::shared_ptr<base::SensorFrame> sensor_frame_ = nullptr;
  std::shared_ptr<base::SyncedMultiSensorFrame> synced_multi_sensor_frame_ = nullptr;
  std::shared_ptr<base::SensorManager> sensor_manager_ = nullptr;

  std::unique_ptr<base::BaseObstacleProcessor> obstacle_processor_ = nullptr;
};

6.3. Planning 模块分析

6.3.1. 规划主类

Planning模块负责根据当前环境和导航信息生成安全舒适的行驶轨迹。

cpp 复制代码
// modules/planning/planning_base.h
class Planning {
 public:
  struct ADCTrajectory {
    double total_path_length = 0.0;
    double total_path_time = 0.0;
    std::vector<TrajectoryPoint> trajectory_point;
    std::string gear;
    LatencyStats latency_stats;
  };

  virtual ~Planning() = default;
  virtual common::Status Init() = 0;
  virtual common::Status Start() = 0;
  virtual void Stop() = 0;
  virtual std::string Name() const = 0;
  virtual common::Status Plan(const planning_internal::PlanningData& planning_data,
                              ADCTrajectory* adc_trajectory) = 0;
};

6.3.2. 规划流程

cpp 复制代码
// modules/planning/common/planning_gflags.h
// 规划模块的全局配置参数
DECLARE_string(localization_topic);
DECLARE_string(chaos_topic);
DECLARE_double(planning_upper_speed_limit);
DECLARE_int32(planning_thread_num);

// modules/planning/on_lane_planning.cc
class OnLanePlanning : public Planning {
 public:
  common::Status Init() override;
  common::Status Start() override;
  void Stop() override;
  std::string Name() const override;
  common::Status Plan(const common::TrajectoryPoint& planning_start_point,
                      const ADCTrajectory* reference_line_info,
                      ADCTrajectory* ptr_trajectory) override;

 private:
  std::unique_ptr<Frame> CreateFrame(
      const common::TrajectoryPoint& planning_start_point,
      const ADCTrajectory* reference_line_info);
  void RebuildLaneStitcher(const ADCTrajectory* reference_line_info);
  void ComposeTrajectory(const STGraph& speed, const Path& path,
                         ADCTrajectory* ptr_trajectory);

  std::unique_ptr<Frame> frame_ = nullptr;
  std::unique_ptr<ReferenceLineProvider> reference_line_provider_ = nullptr;
  std::unique_ptr<STGraph> st_graph_ = nullptr;
  std::unique_ptr<PathTimeGraph> path_time_graph_ = nullptr;
  std::unique_ptr<Planner> planner_ = nullptr;
  std::unique_ptr<Controller> controller_ = nullptr;
};

6.4. Control 模块分析

6.4.1. 控制主类

Control模块负责将规划模块产生的轨迹转化为具体的车辆控制指令。

cpp 复制代码
// modules/control/control_base.h
class Control {
 public:
  struct ControlCommand {
    double steering_target = 0.0;
    double steering_rate = 0.0;
    double throttle = 0.0;
    double brake = 0.0;
    bool parking_brake = false;
    Header header;
  };

  virtual ~Control() = default;
  virtual common::Status Init(const ControlDtcz& control_dtcz) = 0;
  virtual common::Status ComputeControlCommand(
      const localization::LocalizationEstimate* localization,
      const canbus::Chassis* chassis,
      const planning::ADCTrajectory* trajectory,
      ControlCommand* cmd) = 0;
  virtual void Reset() = 0;
  virtual std::string Name() const = 0;
};

6.4.2. 控制算法实现

cpp 复制代码
// modules/control/controller/lon_controller.h
class LonController {
 public:
  LonController();
  virtual ~LonController() = default;

  common::Status Init(const ControllerConf& controller_conf) override;
  common::Status ComputeControlCommand(
      const localization::LocalizationEstimate& localization,
      const canbus::Chassis& chassis,
      const planning::ADCTrajectory& trajectory,
      ControlCommand* cmd) override;
  void Reset() override;

 private:
  double ComputeLongitudinalErrors(const TrajectoryAnalyzer& trajectory_analyzer,
                                   const localization::LocalizationEstimate& pose,
                                   const canbus::Chassis& chassis);

  // Control command computation
  double ComputeLongitudinalAcc(const TrajectoryAnalyzer& trajectory_analyzer,
                                const localization::LocalizationEstimate& pose,
                                const canbus::Chassis& chassis,
                                const double preview_time);

  // Input and gain scheduling
  double QueryLatencyCompensation(
      const TrajectoryAnalyzer& trajectory_analyzer,
      const localization::LocalizationEstimate& pose,
      const double preview_time);

  ControllerConf controller_conf_;
  std::unique_ptr<PidController> speed_pid_controller_;
  std::unique_ptr<PidController> station_pid_controller_;
  std::unique_ptr<LeadlagController> feedforward_controller_;

  // Vehicle parameter
  double vehicle_mass_ = 0.0;
  double wind_resistance_coefficient_ = 0.0;
  double rolling_resistance_coefficient_ = 0.0;
  double gravity_ = 0.0;

  // Control state
  double previous_latacc_ = 0.0;
  double previous_acceleration_ = 0.0;
  double previous_speed_ = 0.0;
  double previous_station_reference_ = 0.0;
  double previous_speed_reference_ = 0.0;
  double current_station_error_ = 0.0;
  double current_speed_error_ = 0.0;
  double current_acceleration_reference_ = 0.0;
  double current_speed_reference_ = 0.0;
  double current_station_reference_ = 0.0;
};

6.5. Localization 模块分析

6.5.1. 定位主类

Localization模块负责确定车辆的精确位置。

cpp 复制代码
// modules/localization/localization_base.h
class Localization {
 public:
  struct LocalizedEstimate {
    localization::LocalizationEstimate pose;
    double local_time = 0.0;
    double received_time = 0.0;
    double delay_time = 0.0;
  };

  virtual ~Localization() = default;
  virtual bool Init() = 0;
  virtual void Start() = 0;
  virtual void Stop() = 0;
  virtual void GetLocalization(LocalizedEstimate* estimate) = 0;
  virtual std::string Name() = 0;
};

6.5.2. MSF融合定位

cpp 复制代码
// modules/localization/msf/localization_msf.h
class LocalizationMsf {
 public:
  LocalizationMsf();
  virtual ~LocalizationMsf();

  bool Init(const LocalizationMsfConfig& config);
  bool Process(const msf_gnss::Gnss& gnss_msg,
               const msf_gnss::InsStat& ins_stat,
               const drivers::gnss::EpochObservation& obs_msg,
               const drivers::gnss::GnssEphemeris& eph_msg,
               const localization::CorrectedImu& imu_msg,
               const localization::Gps& gps_msg,
               const std::string& time_span,
               localization::LocalizationEstimate* localization);

 private:
  bool InitLocalizationBase(const LocalizationMsfConfig& config);
  bool InitGnssLocalization(const GnssConfiguration& config);
  bool InitRtkLocalization(const RtkConfiguration& config);
  bool InitLocalVisualizer(const LocalizationMsfConfig& config);

  std::unique_ptr<GnssRtkCorrector> gnss_rtk_corrector_;
  std::unique_ptr<LocalCartesian> local_cartesian_ptr_;
  std::unique_ptr<ImuInitializer> imu_initializer_;
  std::unique_ptr<MsdekfLocVelFusor> msdekf_loc_vel_fusor_;
  std::unique_ptr<ImuFactor> imu_factor_;
  std::unique_ptr<MeasurePointFactor> measure_point_factor_;
  std::unique_ptr<MeasureVelocityFactor> measure_velocity_factor_;

  LocalizationMsfConfig config_;
  std::mutex mutex_;
};

7. 设计模式

7.1. 工厂模式

在各个模块中广泛使用了工厂模式来创建不同类型的实例:

cpp 复制代码
// 感知模块中的检测器工厂
class DetectorFactory {
 public:
  template <typename T>
  static bool Register(const std::string& type, Creator creator) {
    creators_[type] = creator;
    return true;
  }

  static std::unique_ptr<Detector> Create(const std::string& type) {
    auto it = creators_.find(type);
    if (it != creators_.end()) {
      return it->second();
    }
    return nullptr;
  }

 private:
  using Creator = std::function<std::unique_ptr<Detector>()>;
  static std::map<std::string, Creator> creators_;
};

// 使用示例
class CNNDetector : public Detector {
  // 实现细节
};

// 注册
DetectorFactory::Register<CNNDetector>("cnn_detector", 
    []() { return std::make_unique<CNNDetector>(); });

// 创建实例
auto detector = DetectorFactory::Create("cnn_detector");

7.2. 观察者模式

Cyber RT的发布-订阅机制本质上是观察者模式的实现:

cpp 复制代码
// 消息订阅
auto listener = [](const std::shared_ptr<PerceptionObstacles>& obstacles) {
    // 处理感知障碍物消息
    ProcessPerceptionObstacles(*obstacles);
};

auto perception_reader = 
    node->CreateReader<PerceptionObstacles>(FLAGS_perception_obstacle_topic, listener);

7.3. 单例模式

许多全局管理类使用单例模式:

cpp 复制代码
class Singleton {
 public:
  static Singleton* Instance() {
    static Singleton instance;
    return &instance;
  }

 private:
  Singleton() = default;
  ~Singleton() = default;
};

7.4. 策略模式

控制模块中使用策略模式实现不同的控制算法:

cpp 复制代码
class Controller {
 public:
  virtual ~Controller() = default;
  virtual common::Status Init(const ControlConf& control_conf) = 0;
  virtual common::Status ComputeControlCommand(
      const localization::LocalizationEstimate& localization,
      const canbus::Chassis& chassis,
      const planning::ADCTrajectory& trajectory,
      ControlCommand* cmd) = 0;
  virtual void Reset() = 0;
  virtual std::string Name() const = 0;
};

class LonController : public Controller {
  // 纵向控制策略实现
};

class LatController : public Controller {
  // 横向控制策略实现
};

// 控制器管理器
class ControllerAgent {
 public:
  void InitController() {
    // 根据配置创建不同的控制器
    lon_controller_ = Factory::Create(FLAGS_lon_controller);
    lat_controller_ = Factory::Create(FLAGS_lat_controller);
  }
  
 private:
  std::unique_ptr<Controller> lon_controller_;
  std::unique_ptr<Controller> lat_controller_;
};

8. 总结

Apollo Modules子模块通过高度模块化的设计,将复杂的自动驾驶系统分解为多个功能明确、接口清晰的模块。每个模块都可以独立开发、测试和优化,同时通过Cyber RT中间件实现高效的通信和协作。这种架构不仅提高了系统的可维护性和可扩展性,也为自动驾驶技术的快速发展提供了坚实的基础。

相关推荐
Coder个人博客2 小时前
00_apollo整体软件架构深入分析文档
架构
Coder个人博客2 小时前
01_apollo_cyber子模块整体软件架构深入分析文档
架构
lifallen3 小时前
Agent plantask 的架构推导
人工智能·语言模型·架构
实在智能RPA3 小时前
实在 Agent 支持本地化部署吗?深度解析企业级私有化 AI 智能助理的技术架构与落地实践
人工智能·ai·架构
飞Link4 小时前
LangChain 核心链式架构演进史:从顺序链到企业级路由兜底实战
python·架构·langchain
周淳APP4 小时前
【React Fiber架构+React18知识点+浏览器原生帧流程和React阶段流程相串】
前端·javascript·react.js·架构
一水鉴天4 小时前
智能代理体系 20260325(腾讯元宝)
人工智能·架构
LONGZETECH5 小时前
新能源汽车动力蓄电池仿真教学软件技术解析——职教数字化解决方案
架构·汽车·汽车仿真教学软件·汽车教学软件·新能源汽车仿真教学软件
智慧化智能化数字化方案5 小时前
架构进阶——解读数据中台与业务中台架构设计方案【附全文阅读】
大数据·微服务·架构·数据中台·业务中台架构设计