#汽车纵向和横向控制 本项目涉及在全自动驾驶框架内进行汽车纵向和横向控制。 汽车是一个具有非线性纵向和横向耦合动力学的复杂系统。 因此,自动驾驶必须与纵向和横向控制相结合。 我们研究了一种基于模型预测控制的自动转向技术。 为了解决纵向速度跟踪问题,还提出了一种纵向控制技术。 最后,统一的纵向和横向控制策略有助于提高组合控制性能。 通过仿真对整个控制策略进行了测试,表明了本方法对使用**Pure Pursuit算法**的路径跟踪任务的有效性。 ##注意: ###:red_circle:包含的PDF包含所使用的动态模型、控制器的设计及其评估和不同情况/条件下的性能分析的全部细节。 ##该项目包括: ###纵向控制:PI控制器 ###横向控制:MPC控制器 ###完全非线性动力学控制:PI+MPC ##该项目运行步骤 -运行Init.m初始化simulink模型 -运行simulink模拟 -再次运行Init.m以显示相对于参考轨迹的模拟轨迹,并重新初始化simulink模型 ##包含的Simulink模型: -Full_control_with_fixed_reference_velocity:用于测试控制器的恒定参考线速度 -Full_control_with_variable_reference_velocity:根据轨迹形状使用分段参考速度 -MPC:用于后期控制的独立MPC控制器 ##该项目模型 -完整的控制方案: 1.(图片/combined_controller.PNG) -在50km/h的恒定参考速度、干燥、平坦的道路上,使用PurevPursuit算法评估控制器的路径跟踪任务性能: 2.(图片/50km.PNG) -在90km/h的恒定参考速度、干燥、平坦的道路下,使用PurevPursuit算法评估控制器的路径跟踪任务性能: 3.(图片/90km.PNG) -使用自适应(可变/分段)参考速度解决问题: (Images/traj_and_vel_track.PNG)
方向盘握在手里的时代快过去了,现在得让代码教会钢铁猛兽怎么自己跑。自动驾驶控制的核心在于让车既跑得稳(纵向)又跑得准(横向),但这两个方向的控制就像跷跷板——油门刹车和方向盘一动,车身的姿态立马牵一发动全身。
先看纵向控制怎么玩。工程团队选择了经典的PI控制器,简单粗暴有效。打开Init.m文件能看到这样的参数设定:
Kp = 1.2; % 比例增益 Ki = 0.05; % 积分增益 max_throttle = 0.8; % 防止加速过猛这段代码藏着玄机:比例项负责快速响应速度偏差,积分项专门收拾轮胎打滑这类持续误差。但实测时发现,当车速提到90km/h,单纯PI控制会让车辆像醉汉一样在目标速度附近晃悠。解决办法是在Simulink的纵向控制模块里加了速度前馈补偿,相当于提前预判需要多少马力。
横向控制就得搬出MPC(模型预测控制)这种高端武器了。在MPC_Design.m里有个关键配置:
prediction_horizon = 20; % 预测未来20个步长 control_horizon = 5; % 只执行前5步的控制 Q = diag([10, 1]); % 状态权重:路径跟踪优先 R = 0.1; % 控制量权重这个配置让控制器像下围棋一样算好几步:预测未来2秒内的车辆轨迹,但只执行前0.5秒的方向盘指令。权重矩阵Q把路径跟踪误差的优先级调得比航向角偏差高十倍,结果就是过急弯时宁可车身有点偏也要死死咬住路径。
当PI遇上MPC,在Full_control模型里发生了奇妙的化学反应。联合仿真时出现过一个经典问题:高速过弯时纵向控制器突然降速,导致横向动力学模型参数突变。解决办法是在车速变化超过10%时触发MPC模型重配置,就像老司机换挡一样自然。联合控制的精髓在这段逻辑:
If (Vx_ref - Vx_actual) > Threshold Switch to emergency deceleration mode Else Maintain MPC lateral control End跑仿真时遇到最刺激的情况是50km/h和90km/h的对比测试。在干燥路面上,50km/h时车辆轨迹与参考路径的偏差不到10cm,但飙到90km/h后前轮时不时出现5度的滑移角。这时候Pure Pursuit算法里的look-ahead distance参数就成了救命稻草——从默认的3米调整到5米后,方向盘动作明显变柔和,虽然路径跟踪精度降了15%,但乘客的咖啡杯终于不会洒出来了。
分段速度控制更是展现了这套系统的智慧。遇到S弯时系统自动把参考速度切成三截:入弯前80km/h,过弯时降到65km/h,出弯又弹回90km/h。这背后的速度规划算法藏在trajectory_processor.m里:
curvature = compute_curvature(reference_path); speed_profile = min(90, 25./sqrt(abs(curvature)+0.1));用曲率反推安全车速,简单到令人发指却有效。不过实测中发现这套逻辑在连续急弯时会频繁加减速,后来给曲率计算加了滑动平均滤波才让车速变化顺滑起来。
折腾完这一大圈,最大的感悟是:控制算法不是越复杂越好,关键要让纵向和横向控制器说同一种语言。就像跳探戈,PI控制踩准节奏,MPC控制优雅转身,两者配合好了才能在没有驾驶座的车里,让乘客安心刷手机。