在开始自动驾驶算法仿真前,需要完成Carsim和Simulink的环境配置。我建议使用Carsim 2020及以上版本配合MATLAB R2020b,这两个版本的兼容性经过实测最为稳定。安装时需要注意:
重要提示:如果遇到"Unable to locate MATLAB root directory"错误,需要手动编辑setup_sfunc.bat文件,将MATLAB路径设置为实际安装位置。
在Carsim中新建车辆模型时,有几个关键参数需要特别注意:
matlab复制% 典型乘用车参数示例
Vehicle.Mass = 1500; % kg
Vehicle.Wheelbase = 2.7; % m
Vehicle.TrackWidth = 1.55; % m
Vehicle.CgHeight = 0.55; % m
Carsim支持多种道路建模方式,对于自动驾驶仿真推荐使用:
实测发现第三种方式效率最高,以下是一个生成S形弯道的示例代码:
matlab复制road = [];
for i = 1:100
road(i,1) = i; % 道路点序号
road(i,2) = i*0.5; % X坐标
road(i,3) = 5*sin(i/10); % Y坐标
road(i,4) = 0; % Z坐标
end
dlmwrite('road.csv', road, 'precision', '%.2f');
PID控制器的性能很大程度上取决于参数整定质量。基于我的项目经验,推荐采用以下步骤:
matlab复制% 横向控制PID参数经验值(乘用车)
Kp_lat = 0.8; % 过大会导致震荡
Ki_lat = 0.05; % 过大会引起积分饱和
Kd_lat = 0.3; % 过大会放大噪声影响
实测技巧:在Carsim中可以使用Parameter Sweep工具批量测试不同参数组合,大幅提高调参效率。
传统纯跟踪算法在高速工况下表现不佳,我通过以下改进显著提升了性能:
动态前视距离调整:
python复制def get_lookahead_distance(velocity):
min_dist = 3.0 # 最小前视距离
max_dist = 15.0 # 最大前视距离
return min(max_dist, max(min_dist, 0.3*velocity))
路径平滑处理:使用三次样条插值对原始路径点进行平滑
曲率前馈补偿:根据路径曲率预先调整转向角度
LQR控制器的设计关键在于Q和R矩阵的选择。经过多次试验,我总结出以下经验:
matlab复制A = [0 1 0 0;
0 0 C_alpha_f+C_alpha_r m*Vx;
0 0 0 1;
0 0 (a*C_alpha_f-b*C_alpha_r) Izz*Vx];
B = [0; -C_alpha_f/m; 0; -a*C_alpha_f/Izz];
Q = diag([10, 5, 1, 0.1]);
R = 0.5;
[K,S,e] = lqr(A,B,Q,R);
在Carsim中模拟摄像头输入有两种方式:
我推荐第二种方案,因为它更接近实际开发流程。典型处理流程包括:
matlab复制% 车道线检测示例
grayImg = rgb2gray(cameraImg);
binaryImg = imbinarize(grayImg, 'adaptive');
edgeImg = edge(binaryImg, 'Canny');
[H,theta,rho] = hough(edgeImg);
LKA系统通常采用分层控制架构:
matlab复制function delta = lka_control(e, psi, Vx)
% 参数定义
k1 = 0.8; % 横向误差增益
k2 = 0.5; % 航向误差增益
k3 = 1.2; % 速度补偿系数
% 计算期望转向角
delta = k1*e + k2*psi + k3/Vx;
end
在Carsim中配置雷达传感器时需要注意:
ACC系统通常采用双模式控制:
matlab复制function [acc_cmd] = acc_control(v_ego, v_target, d_rel, d_desired)
% 参数定义
kp = 0.5; % 比例增益
ki = 0.1; % 积分增益
persistent integral_err;
% 计算距离误差
d_err = d_rel - d_desired;
% 计算速度误差
v_err = v_target - v_ego;
% 更新积分项
integral_err = integral_err + v_err*0.02;
% 计算加速度指令
acc_cmd = kp*v_err + ki*integral_err;
% 考虑安全距离约束
if d_err < 0
acc_cmd = min(acc_cmd, -0.5*d_err);
end
end
在仿真运行时可以动态调整参数:
车辆不响应控制指令:
仿真结果不稳定:
图像处理延迟过大:
横向控制性能:
纵向控制性能:
matlab复制% 性能评估示例
lateral_error = simout.Data(:,1);
rmse = sqrt(mean(lateral_error.^2));
max_error = max(abs(lateral_error));
fprintf('RMSE: %.3f m, Max error: %.3f m\n', rmse, max_error);
经过多个项目的实践验证,这套仿真方法可以显著缩短自动驾驶算法的开发周期。特别是在早期开发阶段,通过仿真可以快速验证算法可行性,避免实车测试的高成本和风险。建议在算法基本稳定后再进行实车测试,这样可以节省约40%的开发时间。