1. 自动驾驶避障系统开发概述
在自动驾驶系统开发中,避障功能是最基础也最关键的环节之一。我最近完成了一个基于Prescan、Simulink和CarSim联合仿真的避障系统开发项目,主要目标是让测试车辆能够在包含静态障碍物的复杂场景中实现安全避障。这个项目看似只是简单的几个软件联调,但实际操作中遇到的坑比想象中多得多。
为什么选择这三个工具组合?Prescan擅长场景建模,可以快速构建包含各种道路类型和障碍物的测试环境;Simulink是算法开发的黄金标准,特别适合控制算法的快速原型开发;CarSim则提供了高精度的车辆动力学模型。三者结合,正好覆盖了从环境感知到决策控制再到车辆执行的完整闭环。
注意:联仿调试前务必确认各软件版本兼容性,我曾因为CarSim 2020与Simulink 2021b的接口不兼容浪费了两天时间。
2. 场景搭建与Prescan配置
2.1 测试场景设计
在Prescan中搭建测试场景时,我设计了一个包含以下元素的复合道路:
- 300米直线段(用于初始加速)
- 90度直角弯(测试转向控制)
- 连续S弯(验证横向控制稳定性)
- 随机分布的静态障碍物(水泥墩子,尺寸2m×0.5m)
障碍物布置有几个关键点:
- 部分障碍物位于参考路径上,强制车辆进行避障
- 部分障碍物偏离路径但接近车道边缘,测试系统是否会过度反应
- 在弯道入口/出口处设置障碍,增加决策难度
python复制# Prescan场景生成脚本示例
import prescan
scenario = prescan.create_scenario(name="ObstacleAvoidanceTest")
road = scenario.add_road(type="compound", length=500)
road.add_straight_segment(length=300)
road.add_curve_segment(angle=90, radius=30)
road.add_s_curve_segment(length=150, offset=3.5)
# 添加障碍物
obstacles = [
{"pos": (120, -1.5), "size": (2,0.5)}, # 直线段右侧障碍
{"pos": (350, 0.8), "size": (2,0.5)}, # 弯道内侧障碍
{"pos": (420, -1.2), "size": (2,0.5)} # S弯出口障碍
]
for obs in obstacles:
scenario.add_obstacle(
position=obs["pos"],
size=obs["size"],
type="concrete_barrier"
)
2.2 坐标系对齐问题
最大的坑出现在坐标系转换上。Prescan使用右手坐标系,而CarSim使用左手坐标系,Simulink中的算法又可能有自己的坐标系定义。如果不统一,轻则路径跟踪偏差,重则直接撞墙。
解决方案:
- 在Prescan导出时明确指定坐标系类型
- 在Simulink中添加坐标转换模块
- 在CarSim接口配置中检查坐标系标志位
实测发现:Y轴方向定义不一致会导致横向控制完全反向,表现为方向盘打角方向与预期相反。
3. Simulink控制算法开发
3.1 MPC控制器设计
采用模型预测控制(MPC)作为核心算法,主要考虑其能够:
- 处理多输入多输出系统
- 显式考虑约束条件(如转向角限制)
- 天然适合预测性控制场景
代价函数设计为三项加权和:
- 路径跟踪误差(横向偏差+航向角偏差)
- 控制量变化率(防止方向盘抖动)
- 障碍物距离惩罚项
matlab复制% MPC参数配置示例
mpc = nlmpc(4,2,1); % 4状态, 2输出, 1输入
mpc.PredictionHorizon = 20;
mpc.ControlHorizon = 5;
% 权重设置
mpc.Weights.OutputVariables = [3.0 1.0]; % 路径跟踪优先
mpc.Weights.ManipulatedVariablesRate = [0.1 0.1];
mpc.Weights.ECR = 100; % 障碍物排斥项权重
% 约束条件
mpc.ManipulatedVariables.Min = -0.5; % 最小转向角
mpc.ManipulatedVariables.Max = 0.5; % 最大转向角
3.2 避障逻辑实现
障碍物信息通过Prescan的传感器模型获取,处理流程:
- 点云聚类:将激光雷达原始数据聚类为障碍物对象
- 轨迹预测:静态障碍物无需预测运动状态
- 碰撞检测:基于车辆边界框与障碍物的距离计算
- 避障路径生成:在参考路径基础上施加横向偏移
关键参数:
- 安全距离 = 车辆长度 × 0.3 + 车速 × 反应时间(默认1.2s)
- 最大避障偏移量 ≤ 车道宽度 - 车宽 - 0.5m余量
4. CarSim车辆模型配置
4.1 动力学参数匹配
CarSim模型配置不当会导致控制失效,几个关键参数:
- 轮胎模型:建议使用Pacejka魔术公式
- 质量分布:影响转向特性
- 转向系统延迟:实测约0.1-0.2s
bash复制# CarSim车辆模型关键参数
Vehicle.Mass = 1500 # kg
Vehicle.Izz = 2500 # yaw inertia
Tire.Pacejka.B = 10 # stiffness factor
Steering.Speed = 50 # deg/s
4.2 与Simulink的接口配置
联仿时最容易出问题的环节:
- 采样时间必须一致(建议0.01s)
- 信号名称和单位要匹配
- 初始状态对齐(车速、挡位等)
调试技巧:
- 先单独验证CarSim模型开环响应
- 再测试Simulink控制器输出
- 最后进行闭环联调
5. 联合仿真与问题排查
5.1 典型问题及解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 车辆无故抖动 | 控制周期不一致 | 检查各子系统采样时间 |
| 避障反应延迟 | 传感器更新慢 | 调整Prescan传感器频率 |
| 弯道推头 | 轮胎参数不准 | 重新标定CarSim轮胎模型 |
| 制动距离不足 | ABS干预过早 | 调整制动力分配系数 |
5.2 性能优化记录
-
60km/h紧急避障场景优化:
- 初始制动距离差0.5m
- 发现是ABS模型与避障指令冲突
- 将制动力分配系数从0.7调至0.6
- 制动距离改善0.8m
-
S弯路径跟踪优化:
- 横向误差超0.3m
- 调整MPC预测时域从20步到15步
- 误差降至0.1m以内
6. 实测经验与心得
经过这个项目,我总结了几个避障系统开发的黄金法则:
-
先简后繁:先从直线避障开始测试,再逐步增加弯道、连续障碍等复杂场景
-
分步验证:不要直接进行全系统联调,每个模块先独立验证
-
安全第一:在联仿接口中加入速度限制和紧急停止逻辑
-
参数敏感度:MPC的权重参数对性能影响往往大于算法结构本身
最后要提醒的是,仿真环境再完美也无法完全复现真实路况。我们后来在实车测试中遇到了仿真中从未出现过的传感器噪声问题,这再次证明了虚实结合测试的重要性。下一步计划加入动态障碍物和更复杂的交通场景,让系统具备更强的适应能力。