1. 项目概述与核心需求
在自动驾驶系统开发中,轨迹跟踪控制是最基础也是最关键的环节之一。这个项目展示了如何使用CarSim和Simulink联合仿真来实现基于PID控制的高速八字轨迹跟踪系统。八字轨迹(∞形)是自动驾驶算法测试中最常用的基准轨迹之一,它能全面验证控制器的横向和纵向控制能力。
为什么选择CarSim和Simulink的组合?CarSim提供了高精度的车辆动力学模型,而Simulink则是控制算法开发的理想环境。两者结合可以构建一个既真实又灵活的测试平台。我在实际项目中多次使用这套方案,发现它特别适合验证高速场景下的控制算法稳定性。
2. 环境配置与联合仿真设置
2.1 软件版本匹配
项目使用的是CarSim2019和MATLAB2018b的组合。这个版本搭配经过多次验证,稳定性最好。需要注意的是,不同版本的接口协议可能有细微差别,如果使用其他版本,可能需要调整部分配置。
重要提示:安装时务必确保CarSim的MATLAB接口组件已正确安装,否则联合仿真无法建立连接。
2.2 CarSim基础配置
在CarSim中新建工程时,建议选择"Sedan"车型模板,然后进行以下关键设置:
- 车辆参数:将质量设为1500kg,轴距2.7m,这些参数接近普通乘用车的典型值
- 轮胎模型:使用"MF Tire"魔术公式轮胎模型,这是最接近真实轮胎特性的选择
- 执行器限制:方向盘最大转角设为540度,转向速率限制在500度/秒
2.3 联合仿真接口配置
联合仿真的核心是正确设置CarSim的输出参数。在"Send_Values"界面中添加以下三个关键参数:
| 参数代码 | 参数含义 | 单位 | 备注 |
|---|---|---|---|
| 201 | 方向盘转角 | deg | 控制输入信号 |
| 104 | 纵向速度 | m/s | 反馈信号 |
| 14 | 横摆角速度 | rad/s | 稳定性控制关键参数 |
这些参数构成了控制系统的基本输入输出通道。漏掉任何一个都可能导致仿真失败。我曾经遇到过一个案例,由于漏掉了横摆角速度参数,车辆在仿真中完全失去了方向稳定性。
3. PID控制器设计与实现
3.1 控制架构设计
本项目采用了纵向和横向控制分离的架构,这是自动驾驶控制系统的典型设计。这种架构的优势在于:
- 解耦了速度控制和方向控制,简化了调试过程
- 可以针对不同场景分别优化控制参数
- 系统鲁棒性更好,单个控制器失效不会导致完全失控
3.2 横向控制器实现
横向控制器的核心是一个离散PID控制器,通过S函数实现。关键设计要点包括:
matlab复制function [sys,x0,str,ts] = lateral_controller(t,x,u,flag)
% 输入参数说明:
% u(1): 横向误差
% u(2): 航向误差
% u(3): 车速
% u(4): 道路曲率
% PID参数
Kp = 1.2; % 比例系数
Ki = 0.3; % 积分系数
Kd = 0.8; % 微分系数
% 动态调整积分项权重
if u(3) > 22.2 % 80km/h
Ki = Ki * 0.5; % 高速时降低积分作用
end
这个控制器的独特之处在于它根据车速动态调整积分项权重。高速行驶时,过强的积分作用容易导致方向盘振荡,这个技巧可以有效避免这个问题。
3.3 纵向控制器实现
纵向控制器负责维持设定的目标车速。考虑到高速场景的特殊性,我们采用了带前馈的PID结构:
matlab复制function [sys,x0,str,ts] = longitudinal_controller(t,x,u,flag)
% 输入参数说明:
% u(1): 速度误差
% u(2): 加速度
% 前馈补偿项
feedforward = 0.12 * u(2); % 根据加速度补偿
% PID计算
output = Kp*u(1) + Ki*x(1) + Kd*(u(1)-x(2)) + feedforward;
前馈补偿可以显著提高系统对加速度变化的响应速度,这是高速控制中常用的技巧。
4. 轨迹生成与路径规划
4.1 八字轨迹参数化设计
八字轨迹可以通过一组离散的轨迹点来定义。每个点包含两个关键参数:距离起点的路径长度和道路曲率。
matlab复制% 八字轨迹参数定义
traj_library = [
0 0 % 起点,直行
50 0.08 % 开始右转
80 -0.06 % 转为左转
120 0 % 回正
170 0.07 % 开始左转
220 -0.05 % 转为右转
260 0 % 回正,完成一个周期
];
在实际应用中,曲率值不宜超过0.1,否则在高速下容易导致轮胎失去抓地力。我曾经尝试过0.12的曲率,结果车辆在120km/h时发生了明显的侧滑。
4.2 轨迹平滑处理技巧
在轨迹转折点处,直接切换曲率会导致方向盘转角突变。解决方法是在转折点前后插入过渡段:
matlab复制% 在转折点前后各插入5米过渡段
transition_length = 5; % 过渡段长度
original_curvature = 0.08;
target_curvature = -0.06;
% 使用余弦函数实现平滑过渡
for i = 1:transition_points
ratio = 0.5*(1 - cos(pi*i/transition_points));
traj_curvature(i) = original_curvature + ratio*(target_curvature - original_curvature);
end
这种处理方法可以使方向盘转角变化更加平缓,大大提高乘坐舒适性。
5. 仿真调试与性能优化
5.1 调试步骤建议
- 先单独测试纵向控制器,确保车速能够稳定跟踪
- 固定车速,测试横向控制器的基本功能
- 逐步提高车速,观察系统稳定性
- 最后测试完整的高速八字轨迹跟踪
5.2 PID参数整定经验
基于多次实验,我总结出以下参数调整规律:
-
比例系数(Kp):
- 每增加0.5,响应速度提高约20ms
- 但超过3.5会导致明显振荡
- 高速场景建议范围:1.0-2.5
-
积分系数(Ki):
- 低速时可设大些(0.3-0.5)
- 高速时应减半(0.1-0.2)
- 主要消除稳态误差
-
微分系数(Kd):
- 对抑制振荡效果明显
- 建议从0.5开始逐步增加
- 配合低通滤波使用效果更好
5.3 常见问题排查
问题1:车辆在转弯时出现持续振荡
- 可能原因:微分项太强或滤波不足
- 解决方案:增加微分滤波时间常数(0.02→0.05)
问题2:车辆无法准确跟踪轨迹
- 可能原因:前视距离设置不当
- 解决方案:前视距离应随车速调整,建议设为车速的0.8-1.2倍
问题3:高速时方向盘抖动严重
- 可能原因:PID参数未随车速调整
- 解决方案:实现参数的自适应调整
6. 系统扩展与应用
6.1 其他轨迹的实现
这套系统可以轻松扩展到其他类型的轨迹跟踪。例如,要实现蛇形轨迹,只需修改轨迹参数:
matlab复制% 蛇形轨迹参数
traj_library = [
0 0
30 0.05
60 -0.05
90 0.05
120 -0.05
150 0
];
6.2 高速场景下的特殊考虑
高速控制与低速控制有几个关键区别:
- 控制延迟的影响更大,需要增加前馈补偿
- 轮胎非线性特性更明显,需要更谨慎的转向控制
- 安全性要求更高,需要设置合理的控制限幅
6.3 实际项目中的应用建议
在将这套系统应用到实际项目中时,建议:
- 先在仿真中充分验证各种边界条件
- 实车测试时从低速开始逐步提高
- 准备完善的安全冗余措施
- 记录详细的测试数据用于后续分析
经过多次项目实践,我发现这套基于PID的控制架构虽然在理论上不算复杂,但在实际应用中却能提供相当可靠的性能表现。特别是在高速场景下,经过精心调参的PID控制器完全可以满足基本的轨迹跟踪需求。当然,对于更复杂的场景,可能需要考虑模型预测控制等更先进的方法。