第二章 系统架构总览:自动驾驶软件与硬件的骨架

各位同学,欢迎来到第二章。上一章我们聊了自动驾驶的分级和行业现状,算是打了个底。这一章,咱们直接切入核心——系统架构。

说白了,自动驾驶系统就像一个人。传感器是眼睛和耳朵,计算平台是大脑,执行器是手脚。而软件架构,就是让这些器官协同工作的神经系统。我习惯把整个架构拆成两大部分来看:软件分层和硬件概览。咱们一个一个聊。

2.1 软件架构分层:感知-预测-规划-控制

先问大家一个问题:你开车时,大脑是怎么工作的?

你看到前方有个行人(感知),你判断他下一步可能要过马路(预测),你决定减速并准备刹车(规划),最后你的脚踩下刹车踏板(控制)。

自动驾驶的软件架构,本质上就是模仿这个流程。我把它分成四个核心模块,环环相扣。

2.1.1 感知层:让车“看见”世界

感知层的任务很简单:从传感器原始数据中提取有意义的信息。比如,识别出车道线、交通标志、行人、车辆、障碍物。

我在项目中遇到过一个问题:摄像头在强光下会过曝,导致车道线丢失。后来我们加了HDR(高动态范围)处理,才解决了这个问题。嗯,这里要注意,感知层不能只依赖单一传感器,必须做传感器融合

常见的感知输出包括:

  • 目标检测结果(位置、类别、速度)
  • 可行驶区域(Free Space)
  • 车道线/路沿检测
  • 交通标志与信号灯识别
个人经验: 感知模块是整个系统中最“脆弱”的部分。我曾经因为一个雨天的反射噪声,导致车辆误识别出“幽灵障碍物”。从那以后,我坚持在感知层加入多帧校验和置信度阈值。

2.1.2 预测层:猜猜别人想干嘛

感知层告诉你“那里有辆车”,预测层要回答“这辆车接下来3秒会怎么走”。

你想想看,如果预测不准,规划层就会做出错误的决策。预测通常分为两类:

  • 基于物理模型:用卡尔曼滤波、匀速/匀加速模型预测轨迹。简单,但不够智能。
  • 基于行为模型:用神经网络预测意图,比如“这辆车可能要变道”。

我个人习惯把预测结果表示成概率分布。比如,“有80%的概率直行,15%的概率左转,5%的概率急刹”。这样规划层可以更灵活地应对不确定性。

避坑指南: 我曾经在预测模块里只用了单一模型,结果在高速场景下,预测的轨迹总是滞后。后来我改用多模态预测(同时输出多条可能轨迹),效果好了很多。

2.1.3 规划层:决定怎么走

规划层是自动驾驶的“大脑决策中心”。它接收感知和预测的结果,输出一条安全、舒适、高效的轨迹。

规划层又细分为三个层级:

  1. 全局路径规划:从A点到B点的宏观路线,通常用A*或Dijkstra算法。说白了,就是导航。
  2. 行为决策:决定下一步动作,比如“跟车”、“变道”、“停车让行”。
  3. 运动规划:生成具体的轨迹(路径+速度曲线)。常用方法有Frenet坐标系下的五次多项式、优化方法(如MPC)。

这里我分享一个代码片段,展示运动规划中常用的Frenet坐标系转换:

# Python示例:Frenet坐标系转笛卡尔坐标系
def frenet_to_cartesian(s, d, ref_path):
    """
    s: 纵向距离
    d: 横向偏移
    ref_path: 参考路径点集
    """
    # 找到最近的参考点
    nearest_idx = find_nearest_point(s, ref_path)
    ref_point = ref_path[nearest_idx]
    
    # 计算法向量方向
    theta = ref_point.yaw
    x = ref_point.x - d * sin(theta)
    y = ref_point.y + d * cos(theta)
    return x, y
核心要点: 规划层必须保证轨迹的安全性(无碰撞)、舒适性(加速度/加加速度限制)、可行性(符合车辆动力学)。

2.1.4 控制层:把想法变成动作

控制层是最后一步。它接收规划层输出的轨迹,计算出方向盘转角、油门、刹车等控制指令。

常用的控制算法有:

  • PID控制:简单、稳定,适合低速场景。我刚开始做控制时,调PID参数调了一周。
  • 模型预测控制(MPC):能处理约束,适合高速和复杂场景。但计算量大。

控制层的输出通常包括:

控制指令 描述 典型范围
方向盘转角 控制车辆转向 -720° ~ 720°
油门开度 控制加速 0% ~ 100%
制动压力 控制减速 0 ~ 200 bar
注意: 控制层是直接与物理世界交互的模块。我曾经因为控制指令的发送频率不够高(只有20Hz),导致车辆在高速时出现抖动。后来我提高到50Hz,问题解决了。

2.2 硬件架构概览:传感器、计算平台、执行器

软件跑在硬件上。硬件选型决定了系统的上限。我把它分成三大块。

2.2.1 传感器:车的“感官”

主流传感器包括:

  • 摄像头:提供丰富的语义信息(颜色、纹理、文字)。缺点是受光照影响大。
  • 激光雷达(LiDAR):提供精确的3D点云,测距远。缺点是成本高,雨雾天性能下降。
  • 毫米波雷达:测速准,全天候工作。缺点是分辨率低,无法识别物体类别。
  • 超声波雷达:用于近距离泊车,成本低。
  • IMU+GPS:提供车辆自身的位置和姿态。

我个人习惯的传感器配置是:前向长距摄像头+侧向鱼眼+顶部激光雷达+四角毫米波雷达。这个组合在成本和性能之间取得了平衡。

2.2.2 计算平台:车的“大脑”

计算平台负责运行感知、预测、规划、控制算法。常见方案有:

  • NVIDIA Drive Orin/Thor:算力强,生态好。我项目里用的就是Orin,254 TOPS,够用。
  • Qualcomm Snapdragon Ride:功耗低,适合量产车。
  • 华为MDC:国产方案,性价比高。

选型时要注意:算力不是唯一指标。内存带宽、I/O接口、散热设计同样重要。我曾经因为选了算力高但内存带宽不足的平台,导致数据搬运成了瓶颈。

2.2.3 执行器:车的“手脚”

执行器包括:线控转向、线控制动、线控油门。它们接收控制层的指令,并执行物理动作。

这里有个关键点:执行器必须有冗余设计。比如,制动系统要有两套独立的液压回路。万一主系统失效,备份系统能接管。

2.3 数据流与通信机制

最后,我们聊聊数据怎么在系统里流动。这就像人体的血液循环系统。

典型的自动驾驶数据流如下:

  1. 传感器采集原始数据(图像、点云、雷达信号)
  2. 数据通过高速接口(如GMSL、以太网)传输到计算平台
  3. 感知模块处理数据,输出结构化信息
  4. 预测模块基于感知结果,输出预测轨迹
  5. 规划模块结合预测和地图信息,输出规划轨迹
  6. 控制模块将轨迹转换为控制指令
  7. 控制指令通过CAN总线或车载以太网发送给执行器

通信机制方面,我推荐使用DDS(数据分发服务)作为中间件。它支持发布-订阅模式,实时性好,适合自动驾驶这种高带宽、低延迟的场景。

小技巧: 在调试阶段,我会在数据流的关键节点加入“数据录制”功能。这样一旦出现问题,可以回放数据,复现问题。我曾经靠这个功能,定位到一个偶发的感知延迟bug。

好了,第二章的内容就到这里。这一章我们搭建了自动驾驶系统的整体骨架。下一章,我们会深入感知模块,聊聊摄像头和激光雷达的数据处理。到时候见。