ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Matlab/Simulink下基于运动学模型的LQR轨迹跟踪控制

Matlab/Simulink下基于运动学模型的LQR轨迹跟踪控制 简介本资源是一套面向自动驾驶控制初学者与进阶研究者的基于运动学建模的LQR轨迹跟踪控制器实现方案专为弥补网上普遍缺失的运动学层级LQR控制案例而设计适用于无人驾驶车辆路径跟踪算法学习、课程设计及仿真验证。压缩包共3个核心文件1个MATLAB数据文件用于路径输入、1个M脚本封装控制器逻辑、1个Simulink模型实现车辆运动学建模与闭环控制可视化总大小仅341KB轻量易部署。已有15351人下载学习反映出其在高校教学与自学实践中的广泛认可度。用户可直接运行Simulink模型观察车辆沿预设轨迹如autocross_2020赛道的实时跟踪效果完整复现从状态方程推导、权重矩阵整定、反馈增益计算到闭环响应分析的全过程配套M脚本清晰呈现LQR求解逻辑便于理解算法本质并拓展至其他运动学控制场景。 做移动机器人路径跟踪和自动驾驶横向控制的工程师大概率都经历过这样一段“调参地狱”PID解决不了弯道画龙纯跟踪算法参数全靠试MPC效果是好但工作量和解释成本都压得人喘不过气。我当时接手一个AGV轨迹跟踪项目前两版控制方案就是PID和纯跟踪直线路段都能看但一进S弯就原形毕露。后来我把方案换成了Matlab/Simulink环境下基于运动学模型的LQR轨迹跟踪控制算法才真正把弯道横向误差从十几厘米压到几厘米以内而且整个控制器的参数从“玄学”变成了有物理含义的设计值。这篇文章就是那次项目切换的完整记录。我会把这套方案从数学模型推导、Simulink模型搭建、参数整定到常见问题排查全部讲一遍尤其会把“为什么LQR比PID更适合轨迹跟踪”“运动学模型什么时候能用”“Q和R到底怎么调”这些很多人卡住的地方展开说。适合正在做智能车控制、低速无人车横向控制或者课程设计里需要Matlab/Simulink仿真验证LQR轨迹跟踪的同学参考。1. 轨迹跟踪控制问题的本质与方案选型逻辑1.1 三个候选方案我为什么选LQR轨迹跟踪控制的核心矛盾在于车辆模型是强耦合的横向偏差和航向偏差会互相影响而传统PID本质上是单变量控制它假设每个误差都可以独立调节这在非线性耦合系统里很容易出现“调好方向就压线、调好横向就抖动”的现象。纯跟踪算法虽然利用了几何关系但它把车辆简化为一个可以任意转向的点对前视距离Ld的依赖非常大车速一变原本好用的Ld就不再适用。MPC能同时考虑约束和预测但算法复杂度高在Simulink里实现一轮完整迭代的工作量足够让一个初学者崩溃一周。LQR恰好站在一个非常合适的位置它基于线性状态空间模型能同时处理横向和航向两个状态的耦合又因为目标是二次型代价函数最小数学上存在闭式解MATLAB一行lqr就能求出最优反馈增益。整个控制器的可调参数只有Q和R两个权重矩阵每个参数的物理意义都很明确调参时不会像PID那样“动了P就得跟着动D动完D又要回头动P”。对我来说LQR的意义不在于它比MPC先进而在于它把“控制器好不好用”从调参运气问题变成了模型准确性问题。1.2 运动学模型的适用边界这套算法里面用的是车辆运动学模型也就是俗称的自行车模型。它假设轮胎始终无侧偏、车速较低、车辆运动满足纯滚动约束本质上是把车辆位姿变化看成几何关系。这个假设在低速场景下非常合理我的AGV项目车速大约在2到5 m/s之间轮胎侧偏角很小运动学模型和真车的误差完全可以忽略。园区配送车、仓储AGV、服务机器人、比赛用智能车基本都属于这个范围。但如果你做的是高速公路场景车速到了20 m/s以上车辆在转向时会产生明显的侧偏力运动学模型就不再成立此时需要换用包含侧向动力学、轮胎侧偏刚度的动力学模型。LQR本身并不挑模型换掉A和B矩阵后流程完全相同。所以我在做这个项目时明确把“控制算法”和“被控模型”分开看本文重点讲运动学模型但LQR的设计方法和代码框架直接迁移到动力学模型上也能用。2. 运动学模型与LQR核心推导2.1 前轮转向车辆运动学模型自行车模型的核心简化思路是把车辆左右侧车轮分别合并到前后轴中心线得到一辆只有前轮转向、后轮驱动的“自行车”。状态量取后轴中心位置x、y和航向角φ控制量是车速v和前轮转角δ轴距记为L。模型的状态方程是x_dot v * cos(φ) y_dot v * sin(φ) φ_dot v * tan(δ) / L很多初学者会问为什么用后轴中心而不是车辆质心作为位置点。因为运动学模型假设后轮没有侧偏后轴中心的运动方向与车辆航向角严格一致数学上最干净。用质心位置建模当然也可以但质心会随载荷和车辆姿态移动反而把模型搞复杂。这里我固定车速v只把前轮转角δ作为唯一控制量相当于把车辆的纵向控制交给另一个模块处理。这样LQR的设计对象就变成“定速巡航下的横向跟踪控制问题”。2.2 误差状态方程与线性化LQR是线性控制理论必须先把非线性模型在参考轨道的邻域内线性化然后基于误差状态设计反馈增益。设参考轨迹上有与车辆当前位置最近的点该点的航向为φ_r曲率为κ_r。我定义两个误差状态e_y车辆位置相对参考轨迹最近点的侧向偏差车辆在参考轨迹左侧时为正e_φ车辆航向与参考航向的偏差即φ - φ_r在车辆坐标系下考察误差变化率。车辆前进方向与参考轨迹切向的夹角就是e_φ所以侧向偏差的变化率近似为v * sin(e_φ)小角度下写成v * e_φ。再看向航向误差的变化率e_φ_dot φ_dot - φ_r_dot v * tan(δ) / L - v * κ_r对前轮转角做小角度近似tan(δ) ≈ δ并把κ_r写成δ_r / L的形式其中δ_r L * κ_r得到误差状态方程e_y_dot v * e_φ e_φ_dot v * (δ - δ_r) / L写成矩阵形式[ e_y_dot ] [ 0 v ] [ e_y ] [ 0 ] [ e_φ_dot ] [ 0 0 ] [ e_φ ] [ v/L ] * (δ - δ_r)这里δ_r就是让车辆沿当前参考点曲率行驶所需的前馈转角。如果参考轨迹是直线曲率为0δ_r 0如果是半径R的圆弧则κ_r 1/Rδ_r L/R。A矩阵和B矩阵都包含车速v所以只要车速不变这是一个定常线性系统LQR增益可以离线算好如果车速会变化需要在线重新计算A、B和K。2.3 从LQR代价函数到反馈增益求解LQR不直接设计极点而是通过最小化一个二次型代价函数来确定反馈增益。代价函数定义为J ∫ ( e^T * Q * e Δδ^T * R * Δδ ) dt其中e [e_y; e_φ]是误差状态Δδ δ - δ_r是控制量增量。Q矩阵衡量对状态误差的重视程度R矩阵衡量对控制量增量变化的限制。直观理解Q越大系统越努力减少误差R越大系统越不愿意大幅改变控制量。最优反馈形式是Δδ -K * eK由黎卡提方程解出。在MATLAB中连续时间LQR用K lqr(A, B, Q, R)离散时间则用K dlqr(Ad, Bd, Q, R)。我建议工程上优先用离散方式因为数字控制器本身就是按采样周期工作的c2d离散化后再求dlqr得到的增益在离散控制实现下才是局部最优。代码如下A [0, v; 0, 0]; B [0; v / L]; % 连续到离散 sys_c ss(A, B, eye(2), 0); sys_d c2d(sys_c, Ts); % 离散LQR Q [10, 0; 0, 1]; R 2; [K, S, e] dlqr(sys_d.A, sys_d.B, Q, R);这里K是一个1×2矩阵K(1)作用在侧向误差K(2)作用在航向误差。实际控制律为δ δ_r - K(1) * e_y - K(2) * e_φ注意控制的是实际前轮转角δ不是转角增量。很多实现把Δδ当成实际输出结果模型里加一个积分器才能对上反而绕远了。3. Simulink实测搭建完整实现步骤3.1 Simulink整体架构与模块清单Simulink里搭建这套系统最少需要四个部分参考轨迹源、车辆运动学子系统、LQR控制器、数据记录。我把模块清单列在下面模块作用关键设置MATLAB FunctionLQR控制器计算前轮转角输入车辆状态和参考点信息输出deltaIntegrator车辆模型状态积分初始值设为车辆起点位姿From Workspace加载参考轨迹把工作区的轨迹结构体导入To Workspace导出simout数据记录时间、状态、控制量Clock提供仿真时间作为控制器的输入之一控制器和车辆模型之间要注意采样频率差异。车辆模型是连续积分器用ode4固定步长求解步长1e-3就够LQR控制器实际是按20 Hz频率工作也就是Ts 0.05秒所以在MATLAB Function的Sample time中填0.05。这样控制器输出会保持50毫秒不变更接近真实嵌入式控制器的行为。3.2 参考轨迹生成双移线和圆轨迹我建议先用圆形轨迹验证算法正确性再用双移线测试复杂工况。圆轨迹的好处是曲率恒定前馈量δ_r是常量如果跟踪误差收敛说明LQR增益正确双移线能考察算法在曲率变化时的动态响应。生成圆形轨迹的代码R 10; % 半径10m theta linspace(0, 2*pi, 1000); x_ref R * cos(theta); y_ref R * sin(theta); phi_ref theta pi/2; % 逆时针行驶航向为切向方向 kappa_ref ones(size(theta)) / R;生成双移线轨迹的代码我用了一个sigmoid形状作为横向偏移s (0:0.1:120); d 3.5; % 偏移量 y_ref d * (0.5 0.5 * tanh((s - 40) / 6)); x_ref s; phi_ref atan2(gradient(y_ref, s), gradient(x_ref, s)); kappa_ref gradient(phi_ref, s) ./ gradient(x_ref, s);严格来说用s作为自变量时参考轨迹的等间隔采样点不是等弧长的但当横向偏移相对行进方向较小、曲率不大时这个近似足够Simulink仿真使用。如果要做更高精度的跟踪需要用三次样条插值后按弧长重采样。3.3 车辆运动学子系统的搭建车辆模型不需要用Simulink内置的车辆模块三个积分器加两个三角函数就够了。子系统内部结构如下输入端口1车速v常量或者外部信号输入端口2前轮转角delta积分器1对v*cos(phi)积分得到x初始值0积分器2对v*sin(phi)积分得到y初始值0积分器3对v*tan(delta)/L积分得到phi初始值设为车辆初始航向把积分器的初始条件设置为车辆起始位姿比如[0; 0; pi/2]也就是起点在原点、朝向正北用来匹配圆形轨迹的起始点。三角函数模块从Simulink Math Operations库拖出来即可。轴距L我建议用Constant常量模块方便后续直接改参数。这个小子系统是整个方案的“被控对象”后续想对比不同模型时只要替换这个子系统内部实现控制器完全不用动。3.4 LQR控制器MATLAB Function实现控制器核心逻辑分四步找最近参考点、计算误差状态、计算前馈转角、施加反馈并限幅。我先把完整代码贴出来function delta lqr_controller(x, y, phi, v, L, Ts, ref) % ref为结构体包含x, y, phi, kappa四个字段 % 1. 找最近点 dist2 (ref.x - x).^2 (ref.y - y).^2; [~, idx] min(dist2); % 2. 参考状态 phi_r ref.phi(idx); kappa_r ref.kappa(idx); % 3. 误差状态注意wrapToPi处理角度环绕 e_y -(x - ref.x(idx)) * sin(phi_r) (y - ref.y(idx)) * cos(phi_r); e_phi wrapToPi(phi - phi_r); % 4. 线性化矩阵并离散化求K A [0, v; 0, 0]; B [0; v / L]; sys_c ss(A, B, eye(2), 0); sys_d c2d(sys_c, Ts); Q [10, 0; 0, 1]; R 2; K dlqr(sys_d.A, sys_d.B, Q, R); % 5. 前馈 反馈 delta_r L * kappa_r; delta delta_r - K(1) * e_y - K(2) * e_phi; % 6. 限幅假设前轮转角范围 ±35度 delta max(min(delta, 35 * pi / 180), -35 * pi / 180); end这里e_y的符号要反复对照定义检查车辆在参考轨迹左侧时e_y为正如果方向搞反车辆会往反方向打角。wrapToPi是MATLAB自带函数必须用来处理phi - phi_r的角度差否则角度从179度跳到-179度时控制器会误判为相差358度输出一个巨大的转角。3.5 连接、仿真参数与数据导出把车辆模型的x、y、phi引出三根线接到控制器输入参考轨迹通过一个Constant结构体或者From Workspace传入控制器控制器的输出delta接回车辆模型。车速v可以暂时用Constant固定为2 m/s轴距L设2.7 m。仿真配置建议求解器固定步长ode4步长1e-3控制器采样时间0.05秒仿真时长60秒让车辆至少完整跑一圈圆形轨迹数据导出用To Workspace记录x、y、phi、delta和时间或者直接用Scope观察仿真跑通后会看到车辆慢慢从初始位姿收敛到参考轨迹上。如果初始位姿离轨迹太远比如横向偏差超过5米LQR第一个控制周期会打出一个很大的转角所以初始位姿尽量设置得离参考轨迹近一些或者对误差先做一个限幅。4. 参数整定实操与效果分析4.1 Q和R矩阵的设计思路很多初学者拿到LQR的第一反应是“Q和R怎么给”。我的经验是先给一组保守值比如Q [1, 0; 0, 1]、R 1把仿真跑通确认系统稳定然后围绕现象调参。Q矩阵对角线元素表示对不同误差状态的惩罚强度权重元素对应状态调大后的效果调太大可能出现的问题Q(1,1)侧向偏差e_y横向误差收敛更快航向抖动、转向频繁Q(2,2)航向偏差e_phi航向跟踪更紧横向大偏差时修正缓慢R控制量增量转向更平缓跟踪变慢、稳态误差变大在误差状态方程中e_y_dot v * e_phi也就是说侧向偏差的修正必须通过改变航向偏差来完成这是个积分链结构。LQR配出来的增益本质上是在“横向偏差产生后航向偏差应该先偏多少、再拉回多少”之间做权衡。如果Q(1,1)设置得太极端比如100横向偏差一旦出现控制器会立刻要求航向偏差变大去修正但因为被控对象是积分环节结果就是超调振荡。我最终在圆轨迹测试中选用的参数是Q [10, 0; 0, 1]、R 2。调参过程是先固定R不变逐步增大Q(1,1)从1到10观察横向误差峰值变化再固定Q增大R从1到2压掉高频抖动。整个过程大概半小时比PID调参快一个数量级。4.2 圆轨迹跟踪前馈是关键圆形轨迹是最能暴露出“只做反馈不做前馈”问题的场景。如果控制律只写成δ -K * e仿真结果会是车辆始终跟踪在参考圆的内部存在一个稳定的横向偏差。原因是车辆要转一个固定曲率必须有一个基本的稳态转角δ_r L / R这个转角不来自误差反馈而是来自参考轨迹的几何信息。加入前馈后稳态横向误差基本为零剩余误差主要是数值离散误差和最近点定位误差。在我设定的R10m、v2m/s、L2.7m的工况下稳态横向误差大约在2到4厘米转弯过程最大误差不超过8厘米。这个精度对大多数AGV应用场景已经够用。4.3 双移线跟踪动态性能的试金石双移线的曲率变化很快车辆需要不断调整方向盘。这里最容易出现两个现象一是弯道前半段切内侧弯道后半段冲外侧二是出弯后横向误差出现持续振荡。前者通常是前馈δ_r对曲率响应太慢可以在参考轨迹生成时把曲率做一阶滤波避免曲率突变后者通常是Q(1,1)权重过高R又太小导致系统阻尼不足。我的双移线实测结果离线生成的参考轨迹弧长80米车速2.5 m/s双移线横向偏移3.5米整个过程中的最大横向误差在15厘米以内主要集中在曲率变化最剧烈的S弯衔接处。如果把控制器采样频率从20 Hz提高到50 Hz最大误差能进一步降到10厘米左右。这说明在低速场景下控制器频率对跟踪精度的影响比Q/R参数更明显。5. 常见问题与排查技巧实录5.1 车辆反向打角越跟越偏这个问题的根源几乎都是e_y或e_phi的符号定义不一致。e_y用车辆位置减参考点位置后投影到法向量上得到如果法向量方向定义成右侧为正而代价函数里依然按左侧为正处理符号就反了。排查方法是先设车辆在参考轨迹右侧0.5米航向角相同看控制器输出应该是正转角还是负转角根据车辆几何关系就能判断符号对不对。5.2 圆形轨迹跟踪存在恒定横向偏差不加前馈或者前馈量计算错是圆轨迹稳态偏差最常见的来源。验证方法很简单把delta_r从控制率中去掉跑一段仿真会看到横向误差始终朝一个方向偏。反过来如果kappa_r的符号取反车辆会往弯道外侧跑偏。圆形轨迹的曲率符号和行驶方向有关逆时针为正、顺时针为负要跟轨迹生成时的方向一致。5.3 最近点匹配跳变导致控制量抖动当参考轨迹有交叉或者车辆初始误差较大时min全局搜索可能把最近点匹配到轨迹另一段的相近位置导致delta_r突然跳变。我的做法是限制搜索范围以上一时刻的索引为中心在前后50个点内搜索同时把参考轨迹点间距控制均匀。这个方法在连续跟踪时非常稳但启动时需要全局搜索一次来初始化索引。persistent idx_prev if isempty(idx_prev) [~, idx_prev] min(dist2); else lower max(idx_prev - 50, 1); upper min(idx_prev 50, length(ref.x)); [~, offset] min(dist2(lower:upper)); idx_prev lower offset - 1; end5.4 系统发散方向盘来回甩控制量限幅不足和Q/R权重不当是最常见原因。如果仿真模型没有限幅LQR在初始误差较大时会计算出几十度的转角车辆在极限位置来回弹跳看起来就像发散。先加Saturation限幅再把R调大、Q调小系统稳定后逐步加压。另外如果采样周期太大离散化后系统相角裕度下降也会导致高频振荡Ts不要超过0.05秒。5.5 采样频率与实际执行频率不匹配Simulink仿真默认模型里每个模块都可以连续执行但控制器在硬件上通常以固定周期运行。如果MATLAB Function的采样时间没有设置Simulink会当作连续模块处理仿真结果和实际嵌入式的行为差异很大。一定把控制器模块的采样时间显式设置为TsSimulink会自动对它做零阶保持。还要注意车辆模型里的连续积分器用固定步长ode4求解避免变步长求解器在控制器采样点附近产生额外插值误差。这套算法后续做扩展的空间很大。如果车辆速度变化明显可以把速度作为外部参数在线更新A、B矩阵实时计算K就变成LTV-LQR如果参考轨迹不是平滑曲线可以加一个一阶惯性环节对delta_r做平滑如果想消除模型失配带来的稳态误差可以在误差模型里增加一个侧向偏差积分项扩展成三阶LQR。我个人在项目中的最大感受是LQR的价值不只是那个控制率公式而在于它逼着我把“车辆怎么运动、误差怎么定义、控制量怎么施加”三件事想清楚。先跑通再调参不要一开始就沉迷理论最优这套方案能省下的时间绝对值得你花一个下午把它搭起来。本文还有配套的精品资源点击获取
返回列表