1. 自动驾驶避障规划技术概述
在自动驾驶系统中,路径规划与速度决策是两大核心模块,它们共同决定了车辆如何在复杂环境中安全、高效地行驶。这就像一位经验丰富的司机在拥挤的市区驾驶时,既要规划最优路线避开固定障碍物,又要实时调整车速应对突发状况。
当前主流的解决方案采用二次规划(QP)与ST图相结合的方式。QP负责生成几何空间中的平滑路径,而ST图则专注于时间维度上的速度决策。这种组合方式能够有效处理以下典型场景:
- 静态障碍物规避(如路障、施工区域)
- 动态障碍物应对(如行人横穿、车辆加塞)
- 复杂路况适应(如窄路通行、弯道行驶)
关键提示:在实际工程实现中,路径规划和速度规划通常采用分层处理架构,先由QP生成空间路径,再由ST图进行时间维度优化,这种解耦设计能显著降低问题复杂度。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. QP路径规划核心技术解析
2.1 二次规划数学模型构建
二次规划在路径规划中的应用,本质上是求解一个带约束的优化问题。其标准形式可表示为:
minimize (1/2)xᵀHx + fᵀx
subject to Ax ≤ b
其中,H矩阵的设计尤为关键,它直接影响路径的平滑特性。典型的H矩阵构造方式如下:
python复制H = matrix([
[w_smooth, 0.5*w_curve],
[0.5*w_curve, w_deviation]
])
- w_smooth:路径平滑项权重,值越大生成的路径曲率越小
- w_curve:路径曲率变化率权重,影响转弯的平顺性
- w_deviation:路径偏离参考线惩罚项
2.2 障碍物约束处理技巧
对于静态障碍物,需要将其转化为线性约束条件。假设障碍物在车辆坐标系中的表示为凸多边形,约束构建过程如下:
- 计算车辆轮廓与障碍物的最小距离向量
- 提取障碍物边界法向量
- 根据安全距离阈值生成不等式约束
python复制# 障碍物约束示例
A_constraints = []
b_constraints = []
for obs in detected_obstacles:
normal_vector = obs.get_normal_vector()
safe_dist = obs.radius + ego_vehicle.safety_margin
A_constraints.append(normal_vector)
b_constraints.append(safe_dist - dot(normal_vector, obs.position))
2.3 工程实现中的关键参数
在实际项目中,以下参数的调校对系统性能影响显著:
| 参数名称 | 典型值范围 | 影响效果 | 调整建议 |
|---|---|---|---|
| 平滑权重 | 1.0-5.0 | 路径曲率大小 | 高速场景取高值 |
| 曲率权重 | 0.1-1.0 | 转向平顺性 | 连续弯道适当增加 |
| 松弛因子 | 0.05-0.3 | 求解成功率 | 狭窄区域需增大 |
| 最大曲率 | 0.05-0.15 | 最小转弯半径 | 根据车型调整 |
实测经验:在停车场等狭窄场景中,建议将平滑权重降低至1.5左右,同时适当增加松弛因子到0.2以上,可显著提高路径可行性。
3. ST图速度规划深度剖析
3.1 ST图基本原理与构建
ST图是一种将时间(T)作为横轴、路径距离(S)作为纵轴的二维表示方法。动态障碍物在其中表现为具有斜率的带状区域,其斜率反映障碍物相对速度。
构建ST图的关键步骤:
- 预测障碍物运动轨迹
- 转换到ST坐标系
- 计算安全边界
- 生成禁行区域
python复制def build_st_graph(dynamic_obstacles, prediction_horizon=5.0):
st_graph = np.zeros((100, 100)) # 100x100的ST网格
for obs in dynamic_obstacles:
traj = predict_trajectory(obs)
for t in range(100):
s_min, s_max = get_occupancy_range(traj, t*prediction_horizon/100)
st_graph[t, s_min:s_max] = 1 # 标记障碍区域
return st_graph
3.2 速度曲线优化方法
在ST图中规划速度曲线,本质上是寻找一条从起点到终点的路径,避开所有禁行区域。常用的优化目标包括:
- 加速度最小化(舒适性)
- 行程时间最短(效率)
- 速度变化平缓(能耗)
典型的速度规划问题建模:
python复制def optimize_speed_profile(st_graph):
# 定义优化问题
problem = {
'cost': lambda x: sum(x[2]**2), # 最小化加速度平方和
'constraints': [
{'type': 'ineq', 'fun': lambda x: x[0] - st_graph[x[1]]}, # 避障约束
{'type': 'eq', 'fun': lambda x: x[-1] - target_s} # 终点约束
]
}
result = minimize(**problem)
return result.x
3.3 动态障碍物处理策略
对于不同类型的动态障碍物,ST图处理策略有所差异:
| 障碍物类型 | ST图形状特征 | 处理策略 | 时间裕度 |
|---|---|---|---|
| 同向慢车 | 小斜率带状 | 跟车或超车 | 0.5-1.0s |
| 对向来车 | 负斜率带状 | 提前减速 | 1.0-1.5s |
| 横穿行人 | 垂直带状 | 紧急制动 | 0.3-0.5s |
| 随机障碍 | 不规则区域 | 保守规避 | 1.0s+ |
避障技巧:对于不确定性的行人横穿场景,建议采用"渐进式约束"策略,即随着时间临近逐步收紧安全边界,既保证安全又避免过度保守。
4. 多场景应用与系统集成
4.1 典型场景参数配置
不同驾驶场景需要调整规划参数以获得最佳表现:
城市道路场景:
- 路径规划:中等平滑权重(2.0),关注障碍物躲避
- 速度规划:高时间分辨率(0.1s),快速响应
- 安全距离:1.5-2.0m
高速公路场景:
- 路径规划:高平滑权重(4.0),优化曲率
- 速度规划:长预测时域(8-10s)
- 安全距离:3.0m+
停车场场景:
- 路径规划:低平滑权重(1.0),允许急转弯
- 速度规划:低速限制(5-10km/h)
- 安全距离:0.5-1.0m
4.2 系统容错机制设计
在实际部署中,必须考虑规划失败的应对策略:
- 约束松弛机制:
python复制def solve_with_fallback(constraints, max_retry=3):
for i in range(max_retry):
try:
return qp_solver(constraints)
except InfeasibleError:
constraints = relax_constraints(constraints, factor=0.1*(i+1))
return emergency_plan()
- 多目标优先级管理:
- 第一优先级:碰撞避免
- 第二优先级:交通规则遵守
- 第三优先级:乘坐舒适性
- 第四优先级:路径最优性
- 实时性能监控:
- 单次求解时间监控(<50ms)
- 迭代次数统计
- 约束违反检测
4.3 实际部署中的经验教训
经过多个项目的实践验证,我们总结了以下宝贵经验:
- 参数敏感性测试:
- 在不同场景下系统测试参数变化的影响
- 建立参数自动调优框架
- 记录异常情况下的参数表现
- 边缘场景处理:
- 针对极端情况设计专用约束
- 建立场景库持续回归测试
- 实现场景识别与参数自动切换
- 性能优化技巧:
- 采用热启动加速QP求解
- 使用稀疏矩阵存储约束
- 实现并行化规划架构
- 实测数据分析:
- 收集真实场景下的规划数据
- 分析失败案例的根本原因
- 持续迭代优化算法参数
在最后需要强调的是,任何规划算法都需与实际控制系统紧密配合。我们建议在算法开发阶段就建立完整的硬件在环测试环境,将规划模块与车辆动力学模型闭环验证,这能提前发现约80%的集成问题。
