在自动驾驶系统开发中,轨迹跟踪控制是最基础也最关键的环节之一。今天我要分享的是一个使用CarSim2019和MATLAB/Simulink2018搭建的高速场景下八字形轨迹跟踪控制系统。这个系统采用了经典的PID控制算法,但针对高速行驶场景做了特殊优化,能够稳定跟踪预设轨迹,最高测试速度可达120km/h。
这个项目的独特之处在于:
提示:虽然本文以八字轨迹为例,但所有技术方案同样适用于其他轨迹类型,只需简单修改轨迹参数即可。
首先必须确保软件版本的匹配性。经过多次测试验证,CarSim2019与MATLAB2018b的组合最为稳定。安装时需要注意:
常见问题排查:
在CarSim中新建工程时,有几个关键参数必须正确设置:
plaintext复制Vehicle Model: Sedan_Class # 使用标准轿车模型
Road Condition: Dry_Asphalt # 干燥沥青路面
Simulation Mode: Interactive # 交互式仿真模式
特别要注意的是,在Send_Values中必须包含以下三个核心参数:
plaintext复制VS_COMMAND 201 // 方向盘转角(deg)
VS_COMMAND 104 // 纵向速度(m/s)
VS_COMMAND 14 // 横摆角速度(rad/s)
这三个参数构成了车辆状态反馈的基础,缺少任何一个都会导致控制失效。曾经有个案例就是因为漏掉了横摆角速度参数,导致车辆在仿真中不断原地打转。
本系统采用分层控制架构:
上层:轨迹生成器
中层:PID控制器
下层:车辆模型
横向控制器的核心是一个改进型PID算法,通过S函数实现:
matlab复制function [sys,x0,str,ts] = lateral_controller(t,x,u,flag)
switch flag
case 0
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 3; % 存储三个误差累积量
sizes.NumOutputs = 1; % 方向盘转角
sizes.NumInputs = 4; % 横向误差/航向误差/车速/曲率
sizes.DirFeedthrough = 1;
sys = simsizes(sizes);
x0 = zeros(3,1);
关键设计特点:
纵向控制器负责维持目标车速,其输出为油门/刹车指令:
matlab复制function [sys,x0,str,ts] = longitudinal_controller(t,x,u,flag)
persistent Kp Ki Kd last_error
if isempty(last_error)
Kp = 0.8; Ki = 0.1; Kd = 0.05;
last_error = 0;
end
% 根据车速动态调整参数
if u(2) > 25 % 车速>90km/h
Ki = 0.05; % 降低积分项
end
轨迹生成器采用参数化设计,核心是一个N×2的矩阵:
matlab复制traj_library = [
0 0 % 直行
50 0.08 % 右转
80 -0.06 % 左转修正
120 0 % 回正
];
参数说明:
重要经验:曲率绝对值不宜超过0.1,否则高速时容易导致轮胎打滑
在轨迹转折点处,必须进行平滑过渡处理。我们采用余弦曲线过渡算法:
matlab复制function smooth_curve = cosine_transition(start_curve, end_curve, length)
x = linspace(0, pi, length);
smooth_curve = (end_curve-start_curve)*(1-cos(x))/2 + start_curve;
end
应用示例:
matlab复制% 在50m处从直行过渡到右转
transition_length = 5; % 过渡段长度
transition_curve = cosine_transition(0, 0.08, transition_length);
调试时应遵循以下顺序:
推荐初始参数:
plaintext复制纵向控制:
Kp=0.8, Ki=0.1, Kd=0.05
横向控制:
Kp=2.5, Ki=0.3, Kd=0.2
当车速超过80km/h时,需要特别注意:
这是CarSim的默认设置导致的,解决方法:
可能原因及解决方法:
典型表现:
解决方法:
只需在traj_library中添加新的参数组合,例如:
matlab复制% 蛇形轨迹
traj_library = [
0 0
30 0.05
60 -0.05
90 0.05
120 -0.05
];
可以引入模糊逻辑或神经网络,实现PID参数的自适应调整:
matlab复制function [Kp, Ki, Kd] = adaptive_pid(error, error_rate)
% 根据误差和误差变化率动态调整参数
if abs(error) > 0.5
Kp = Kp * 1.2;
end
end
通过Simulink的TCP/IP模块,可以实现多车协同仿真:
在项目开发过程中,我总结了以下几点宝贵经验:
仿真前务必保存参数快照
调试时采用增量法
善用可视化工具
记录完整的调试日志
最后一个小技巧:在Simulink中添加一个Manual Switch模块,可以快速切换不同的控制算法进行对比测试,这在算法选型阶段特别有用。