资讯动态

二自由度车辆相平面分析实战:β-r稳定边界与鞍点求解

发布时间:2026/10/9 6:33:36 来源:尧图企业网站定制
做车辆稳定性控制的人几乎都绕不开“质心侧偏角-横摆角速度相平面”。在做ESC匹配或者车辆动力学课程设计时大家普遍用二自由度车辆模型在MATLAB里跑仿真把β和r画在一张相平面图上再标出鞍点、画出临界轨迹据此判断车辆什么时候会甩尾、失稳边界到底在哪。这篇文章我就把我常用的整套流程从模型搭建、相平面绘制到鞍点与临界轨迹的计算完整过一遍适合正在做二自由度车辆仿真、底盘稳定性分析或者刚开始接触相平面方法的朋友参考。1. 为什么相平面能看出车辆失稳1.1 二自由度车辆模型就是“车轮上的自行车”二自由度车辆模型也叫自行车模型它把前轴两个轮子合并成一个轮、后轴两个轮子合并成一个轮同时默认车身不发生侧倾和俯仰纵向速度V恒定。这样一来整车运动就剩下两个自由度沿着车身横向的侧向运动和绕质心的横摆运动状态量正好是质心侧偏角β和横摆角速度r。模型的运动方程可以写成m·V·(dβ/dt r) Fyf Fyr Iz·dr/dt a·Fyf - b·Fyr其中m是整车质量Iz是绕质心铅垂轴的转动惯量a和b分别是质心到前、后轴的距离Fyf和Fyr是前、后轴等效侧偏力。这个模型虽然很简化但在轮胎侧偏特性还没有严重进入非线性区时它对车辆横摆响应和稳定边界的预测精度相当高。日常做相平面分析用这个模型作为母本足够。相平面方法则是把β和r看成平面上的两个坐标。平面上的每一个点代表车辆一个瞬间的运动状态点上的箭头代表这个状态下质心侧偏角和横摆角速度正在如何变化。把无数个点的变化方向连起来就变成了一幅“状态流场”。车辆从某个初始状态出发沿着流场走出来的曲线就是相轨迹整张图就是β-r相平面。1.2 相平面里的三张脸稳定点、鞍点、临界轨迹相平面上最值得关注的不是某一条轨迹而是几类特殊的点和线。第一类是平衡点。让dβ/dt0、dr/dt0同时成立的状态点就是系统的平衡点。在平衡点附近状态要么收敛进去要么发散出去。如果所有方向的轨迹都朝它收敛就是一个稳定平衡点对应车辆正常直行的稳态如果所有方向都发散就是不稳定的平衡点车辆完全无法保持。第二类是鞍点。鞍点这个名字很像山路中的垭口。在这个点上系统有一个方向的特征值是收敛的另一个方向是发散的。状态要是正好落在收敛方向上会被吸向鞍点但只要偏一点点就会顺着发散方向滑出去。在车辆稳定性分析里鞍点正是“能稳住和不能稳住”的临界位置。第三类是临界轨迹。临界轨迹本质上是鞍点的稳定流形也就是那些从鞍点延伸出去、恰好把相平面分成两个区域的分界线。分界线以内的初始状态轨迹最终会回到稳定平衡点车辆是稳定的分界线以外轨迹会发散到β和r持续增大的区域表现为甩尾或者激转。临界轨迹在ESC标定里常被当作稳定边界的几何近似。有了这三样东西相平面就能很直观地回答车辆当前状态离“悬崖”还有多远。2. 从车辆参数到MATLAB状态方程2.1 车辆参数与轮胎非线性模型选型在MATLAB里复现这个仿真第一步是确定车辆参数。我常用一组紧凑型轿车的参数贴近常见文献值参数数值说明m1500 kg整车质量Iz2500 kg·m²横摆转动惯量a1.2 m质心到前轴距离b1.8 m质心到后轴距离V25 m/s纵向车速Cf120000 N/rad前轴等效侧偏刚度Cr180000 N/rad后轴等效侧偏刚度μ0.4路面附着系数有一点必须强调为了画出带鞍点和临界轨迹的相平面轮胎模型绝对不能简单地取线性假设Fy-C·α。线性模型在零转向输入下只有一个平衡点整个相平面是收敛的鞍点根本不会出现。我采用一种工程上很好用的简化饱和模型Fy -C·α / (1 |α| / α_sat)其中α_sat μ·Fz / CFz是轴荷。前、后轴荷分别按照 Fzf m·g·b/(ab)、Fzr m·g·a/(ab) 计算。这个模型的物理含义很直白小侧偏角时接近线性侧偏侧偏角一旦增大轮胎力进入饱和区不再无限增长。正是这种饱和特性让系统在高β、大r区域出现非线性平衡点进而形成鞍点。如果你手头有魔术公式也可以直接用但画相平面时计算量会大不少而且参数标定麻烦。简化的双曲饱和模型已经能抓住稳定边界的定性行为做课程设计和前期标定足够。2.2 ODE函数怎么写才不容易翻车我习惯把所有参数放进一个结构体params里然后写一个独立的状态方程函数。这样后面做网格遍历、平衡点搜索和相轨迹积分时只需要调用同一个函数避免参数不一致。params.m 1500; params.Iz 2500; params.a 1.2; params.b 1.8; params.V 25; params.Cf 120000; params.Cr 180000; params.mu 0.4; params.g 9.81; params.Fzf params.m * params.g * params.b / (params.a params.b); params.Fzr params.m * params.g * params.a / (params.a params.b); params.alpha_sat_f params.mu * params.Fzf / params.Cf; params.alpha_sat_r params.mu * params.Fzr / params.Cr;状态方程函数的写法要特别注意状态向量的顺序。我把X(1)定义为质心侧偏角βX(2)定义为横摆角速度r。前轮转角δ暂时设为0表示车辆正在直线行驶、没有主动转向输入。function dX vehicleDynamics(t, X, params) beta X(1); r X(2); delta 0; % 零转向相平面分析常用工况 alpha_f beta params.a * r / params.V - delta; alpha_r beta - params.b * r / params.V; Fyf -params.Cf * alpha_f / (1 abs(alpha_f) / params.alpha_sat_f); Fyr -params.Cr * alpha_r / (1 abs(alpha_r) / params.alpha_sat_r); dbeta (Fyf Fyr) / (params.m * params.V) - r; dr (params.a * Fyf - params.b * Fyr) / params.Iz; dX [dbeta; dr]; end为什么侧偏角写成alpha_f beta a*r/V - delta这是从运动学关系推出来的。前轴轮心处的侧向速度约等于V·β a·r除以纵向速度V再减去前轮转角δ就得到前轮侧偏角。后轮同理。这样定义的侧偏角代入饱和模型后前、后轴力都是负反馈形式β和r增大时会产生抑制力符合真实车辆力学特性。2.3 模型自检两步走写完函数后不要急着画相平面先做两个快速自检。第一把X[0;0]、δ0代入状态导数应该是[0;0]。如果这里不为零说明公式里有符号错误或者参数没平衡。第二给一个很小的初始扰动比如β0.01、r0.01做一次短时间积分观察响应是否逐渐衰减。衰减说明车辆处于稳定区域模型大方向正确发散则要怀疑侧偏角公式或者轮胎力符号写反了。这两步看着简单但能省掉后面调试相平面图时的大量时间。3. 相平面绘制实操3.1 向量场让每个状态点告诉你下一秒去哪相平面里最基础的是向量场。做法是在β-r平面里布置一个网格对每个网格点调用状态方程得到导数向量然后用quiver画箭头。我一般让β范围取[-0.4, 0.4] radr范围取[-1, 1] rad/s。这个范围对V25 m/s、μ0.4的工况足够看到稳定边界和发散轨迹。网格密度方面绘制向量场时取25×27左右就够太密会糊成一片太疏看不清流场走向。beta_vec linspace(-0.4, 0.4, 27); r_vec linspace(-1.0, 1.0, 25); [Beta, R] meshgrid(beta_vec, r_vec); dBeta zeros(size(Beta)); dR zeros(size(Beta)); for i 1:numel(Beta) dX vehicleDynamics(0, [Beta(i), R(i)], params); dBeta(i) dX(1); dR(i) dX(2); end L sqrt(dBeta.^2 dR.^2); L(L 1e-8) 1e-8; quiver(Beta, R, dBeta./L, dR./L, 0.6, Color, [0.7 0.7 0.7], LineWidth, 0.5); xlabel(质心侧偏角 \beta (rad)); ylabel(横摆角速度 r (rad/s)); axis equal; grid on;箭头为什么要归一化因为平衡点附近导数很小非平衡点附近导数可能很大直接画quiver会出现一个长箭头贯穿全图、其余箭头短得看不见的情况。归一化后每个箭头只表示方向长度统一流场走势一目了然。用axis equal是为了保证β和r坐标比例真实避免图被压扁。需要说明的是这套循环写法虽然直观但网格只有几百个点MATLAB完全跑得动。如果后面把网格加密到100×100建议把函数向量化或者用arrayfun否则循环会明显变慢。3.2 相轨迹多条初始状态曲线叠加向量场只是背景真正能说明问题是相轨迹。从一组初始状态出发让ODE45沿时间积分把轨迹画在相平面上就能看到哪些初始状态能收敛回原点哪些会跑飞出去。tspan [0 4]; options odeset(RelTol, 1e-6, AbsTol, 1e-8, MaxStep, 0.05); initialStates [ -0.05, 0.05; -0.10, 0.10; -0.20, 0.20; -0.25, 0.30; 0.30, -0.35; 0.15, -0.15; -0.08, 0.25; 0.10, -0.25; ]; hold on; for k 1:size(initialStates, 1) [~, X_traj] ode45((t, x) vehicleDynamics(t, x, params), tspan, initialStates(k, :), options); plot(X_traj(:, 1), X_traj(:, 2), LineWidth, 1.2); end hold off;积分时间tspan我取[0 4]秒。车辆失稳轨迹通常几秒内就会发散到图框外面所以4秒足够展示趋势。你要是发现轨迹还没画出完整走向就飞出边界可以把tspan缩短到2秒或者把β、r绘图范围放宽。相轨迹的初值选择不是随机的。我建议先围绕原点附近布几条再在预计边界内外各布几条。边界外的初始状态轨迹会明显向大β、大r方向跑这样与边界内的轨迹放在一起稳定域的范围就自然显现出来。3.3 绘图参数与展示技巧实际出图时有几个小细节会影响可读性。轨迹颜色可以按是否稳定来区分。积分结束后判断轨迹终点是否在稳定平衡点附近比如范数小于某个阈值稳定则画成蓝色失稳则画成红色。这样整张图会立刻呈现出“蓝色收拢、红色发散”的效果比统一颜色直观得多。向量场箭头密度不要和轨迹线抢视觉优先级。我习惯把quiver箭头颜色调成浅灰线宽调小轨迹线用深色粗线鞍点和平衡点再做特殊标记。这样读者第一眼看到的是轨迹走向其次才是流场方向。另外不要在还没找到鞍点之前就急着出最终图。先把向量场和几条典型轨迹画出来确认大趋势合理再进入鞍点计算否则后期反复调图很浪费时间。4. 鞍点定位与临界轨迹绘制4.1 鞍点的数学判别鞍点本质上是一个特殊的平衡点。要找到它先解方程组f1(β, r) 0 f2(β, r) 0其中f1、f2分别是状态方程里的dβ/dt和dr/dt。找到所有平衡点后再计算每个平衡点处状态方程的雅可比矩阵J [[∂f1/∂β, ∂f1/∂r], [∂f2/∂β, ∂f2/∂r]]雅可比矩阵的特征值决定了平衡点类型。二维系统中如果两个特征值都是负实数是稳定节点都是正实数是不稳定节点一正一负就是鞍点。我只需要一个简单判据特征值实部乘积小于0即视为鞍点。这里有个常见陷阱如果用的是解析公式直接把tanh或者饱和模型手工求导很容易算错。我通常用数值雅可比用中心差分近似导数。二阶系统矩阵只有2×2数值差分精度足够而且代码通用。4.2 多初值搜索平衡点的MATLAB实现非线性系统无法解析求解平衡点只能数值搜索。fsolve是一个局部搜索算法初值给不同可能收敛到不同解。我采用多初值扫描把均匀网格上的点作为初值批量求解再把重复解去掉。func (X) vehicleDynamics(0, X, params); guesses [0, 0; -0.2, 0.3; 0.2, -0.3; -0.3, 0.5; 0.3, -0.5; -0.25, -0.2; 0.25, 0.2]; opts optimoptions(fsolve, Display, off, Algorithm, trust-region-dogleg); equilibria []; for k 1:size(guesses, 1) [xeq, fval, exitflag] fsolve(func, guesses(k, :), opts); if exitflag 0 norm(fval) 1e-6 if isempty(equilibria) || ~any(vecnorm(equilibria - xeq, 2, 2) 1e-6) equilibria [equilibria; xeq]; end end endnorm(fval) 1e-6是硬条件。fsolve有时exitflag大于0但残差还是不小这种解不能要。去重时我用向量二范数阈值1e-6threshold太小会把本应重合的解重复保留太大又会误删真正不同的平衡点实际调试时留意一下即可。得到平衡点集合后逐个分类function J numericJacobian(func, x) h 1e-7; fx func(x); J zeros(2, 2); for i 1:2 xp x; xp(i) xp(i) h; fxp func(xp); J(:, i) (fxp - fx) / h; end end以上是前向差分。如果想更稳健用中心差分for i 1:2 xp x; xp(i) xp(i)h; xm x; xm(i) xm(i)-h; J(:,i) (func(xp) - func(xm)) / (2*h); end中心差分的误差比前向差分小一个量级绘图精度要求高时推荐使用。h取1e-7左右即可太大导数近似失真太小会引入数值消减。分类逻辑很简单for i 1:size(equilibria, 1) J numericJacobian(func, equilibria(i, :)); lambda real(eig(J)); if all(lambda 0) disp([平衡点 (, num2str(equilibria(i,1)), , , num2str(equilibria(i,2)), ) 是稳定点]); elseif lambda(1) * lambda(2) 0 disp([平衡点 (, num2str(equilibria(i,1)), , , num2str(equilibria(i,2)), ) 是鞍点]); else disp([平衡点 (, num2str(equilibria(i,1)), , , num2str(equilibria(i,2)), ) 是不稳定点]); end end注意eig返回的特征值顺序不固定lambda(1)*lambda(2)0这个判据只对实特征值有效。二阶系统在这类模型中一般不会出现复特征值但要是你的模型参数特殊出现共轭复根应该改用all(real(lambda) 0)、all(real(lambda) 0)、prod(real(lambda)) 0三种判断避免从复根里取不出乘积符号。4.3 用稳定流形画出临界轨迹鞍点求出来后就要画临界轨迹。临界轨迹是鞍点处的稳定流形W^s也就是那些在正时间收敛到鞍点的轨迹。数值做法是取鞍点附近沿稳定特征向量方向的微小偏移作为初值然后对原系统反向积分。为什么反向积分稳定流形上的轨迹当t→∞时收敛到鞍点所以当t→-∞时必然远离鞍点。换句话说从离鞍点很近的点出发把时间倒着走轨迹就会沿着稳定流形向外延伸画出来的正是分界线。首先拿到鞍点处的雅可比和特征向量J numericJacobian(func, saddle); [V, D] eig(J); lambda diag(D); [~, idxStable] min(real(lambda)); % 负特征值对应稳定方向 vStable V(:, idxStable);然后从稳定特征向量方向的两个微小偏移出发用[0 -3]秒反向积分eps0 1e-4; saddleX saddle(1); saddleY saddle(2); figure; hold on; colors [1 0 0; 0.8 0 0; 0 0 1; 0 0 0.8]; for direction [1, -1] x0 saddle direction * eps0 * vStable; [~, X_crit] ode45((t, x) vehicleDynamics(t, x, params), [0 -3], x0, options); plot(X_crit(:, 1), X_crit(:, 2), r, LineWidth, 2); end这一段代码画出来就是两条从鞍点出发的红色临界轨迹分支。之所以取0到-3秒是因为反向积分时间太长轨迹会快速发散到图外太短分支延伸不完整。3秒在V25 m/s、μ0.4时基本能把稳定边界延伸至图框边缘。如果想画出完整的“X”型分界线还可以沿不稳定特征向量方向正向积分画出不稳定流形W^u。做法完全一样只是把特征向量换成正实部对应的vUnstable时间方向改为[0 3]秒。不过工程上判稳主要看稳定流形分支W^u更多是辅助理解失稳后轨迹的走向我通常画出来但不作为阈值依据。关于eps0的选择我经验是取鞍点到稳定平衡点距离的1/1000左右大约10^-4量级。太小了远离鞍点后数值误差会主导轨迹可能明显偏离真实流形太大了初值已经落到非线性区漂离流形。画完后检查一下临界轨迹是否平滑经过鞍点附近如果出现明显“拐弯”或“偏离”把eps0缩小一个数量级再试。5. 读图与标定相平面怎么用起来5.1 稳定域边界与失稳模式画出相平面并叠加上临界轨迹后读图的核心就一句话看初始状态落在临界轨迹内侧还是外侧。以内侧为起点相轨迹最终会绕着稳定平衡点转几圈后收敛β和r的幅值逐渐衰减车辆恢复稳定行驶。外侧的轨迹则相反β持续增长、r持续增长车辆进入大侧偏的甩尾状态。注意这里不能说“外侧轨迹一定发散到无穷”因为大幅侧偏下轮胎力也会饱和轨迹可能收敛到另一个平衡点但在可控意义下已经不可接受。这张图对底盘工程师的价值在于当ESC系统接收到当前β和r的估计值时本质上就是在相平面里判断当前状态点与临界轨迹的位置关系。越接近边界控制越要激进远离边界则尽量减少干预。5.2 车速与附着系数如何移动“悬崖”相平面不是一成不变的它随车速V和路面附着系数μ变化非常敏感。我自己跑过几组对比规律很明显工况变化鞍点位置变化稳定域表现V从20提高到30鞍点向原点靠近稳定区域明显变窄μ从0.85降到0.4鞍点显著向原点靠近边界内缩小扰动也易失稳前轮转角δ增大整张相平面和鞍点偏移稳定域向转向方向迁移这个规律直接解释了为什么雨天、雪天更容易甩尾附着系数降低后临界轨迹围出来的稳定域缩小同一个β-r状态在干路面上可能很安全在湿滑路面上已经到了边界外。做仿真的朋友可以自己验证一下把params.mu改成0.85重新跑一遍鞍点搜索和临界轨迹绘制会发现有时候甚至搜不到鞍点全相平面只有一个稳定平衡点。这表示车辆在良好路面上具有全局渐近稳定性。反过来把V调到30 m/s、μ调到0.3鞍点会非常靠近原点稳定域小得可怜这时候控制系统必须尽早介入。5.3 从临界轨迹到车辆稳定性控制阈值很多人画完相平面就停了但实际工程里相平面最终要落到控制阈值上。最常用的做法是把临界轨迹在β-r平面上包络成一个多边形或者一组分段直线ESC控制模块只要判断当前状态点是否越过多边形边界。比如我在临界轨迹上取一组特征点然后计算出每个点对应的β阈值。由于相平面图左右不一定对称通常分别处理β0和β0两个半区。对横摆角速度r也做同样处理得到一张“r阈值随β变化”的查表。控制时看到状态偏差超过阈值就输出修正横摆力矩。这种阈值标定比单纯用固定β门限、固定r门限要准得多因为它把两个状态之间的耦合关系纳入了考虑。相平面分析的核心产出其实就是这条边界线。6. 常见问题与调试实录6.1 永远找不到鞍点如果你把平衡点搜索跑完结果只有原点一个平衡点大概率是你的轮胎模型还停在线性段。检查一下参数μ是不是设得太高V是不是太低这两个参数只要让轮胎力没有进入饱和系统就是全局稳定的自然没有鞍点。习惯性做法是把μ设为0.4以下、V保持25 m/s以上。这样前轮侧偏角在β0.2 rad时已经明显超过α_sat轮胎力饱和非线性平衡点才能出现。还有一个隐蔽问题如果你的饱和模型用了atan或者tanh这类光滑函数要注意侧偏角是否已经算错。我调试时遇到过把alpha_f符号弄反导致相平面整个翻转鞍点跑到很怪的位置去重后看着像是没有鞍点。此时先用前面说的自检流程确认原点处导数是否为0再检查一个小初始扰动的响应方向。6.2 轨迹飞出图框、漂到天边反向积分画临界轨迹时经常会出现轨迹在远离鞍点后快速发散。这很正常因为稳定流形外的轨迹本来就趋于发散。问题在于发散太早边界还没延伸到图框边缘就消失图不完整。解决办法有三个。第一把反向积分时间从-3秒缩短到-1.5秒或-1秒让轨迹“冻结”在合理范围内。第二在ODE45选项里设置MaxStep0.02限制步长防止反向积分时步长太大跳出了真实流形。第三扩大β和r的画图范围比如β扩大到[-0.6, 0.6]r扩大到[-1.5, 1.5]给轨迹留出延伸空间。我实际最常用的组合是tspan[0 -2]配合MaxStep0.02稳定性和图幅控制效果都不错。6.3 相平面箭头乱成一团向量场要是乱多半是网格太密或者箭头没有归一化。网格太密时反复交叉的箭头会让整张图黑乎乎一片。网格太疏时关键区域的流向又看不出来。我最常用的密度是β方向27个点、r方向25个点在常规图幅下线条清晰又不失细节。箭头归一化后quiver的缩放参数取0.5到0.7比较合适。颜色要浅否则后面叠加的轨迹线会被箭头淹没。如果矢量场在某个区域出现小范围“漩涡”先不要急着怀疑代码先确认鞍点是否就在附近。鞍点附近的流场本身就会形成收敛和发散交叉的结构看着像乱其实是物理真实。6.4 鞍点重复、伪鞍点剔除多初值搜索必然会出现重复解。如果去重做得不严后续分类会乱套。去重阈值我取1e-6并且先判断norm(fval)1e-6再把重复解过滤掉。注意fsolve收敛到同一个解fval可能略有差异所以阈值不能太严格。伪鞍点也很常见某点虽然是平衡点但特征值一正一负不怎么明显比如一个特征值是5另一个是-0.001。这种“准鞍点”数值上很敏感积分画临界轨迹时会剧烈偏离。遇到这种情况我建议把特征值实部接近零的平衡点单列出来不要当作有效鞍点用于控制标定否则标出来的边界不可靠。6.5 代码可复现的三个小建议最后分享三个让我少熬夜的小习惯。第一所有参数集中在文件顶部不要散落在脚本中间。每次改完μ或者V运行一遍完整脚本就能对比不同工况的相平面不用满文件找参数。第二把平衡点搜索、雅可比计算、临界轨迹绘制封装成函数。这样做课程报告时要重复画几十张工况图不用反复复制粘贴代码。第三保存图时同时保存数据和代码版本。我踩过不少次坑图一样但数据是用旧参数跑的写报告时根本回忆不起来。在脚本开头加一行fprintf(V%.1f mu%.2f\n, params.V, params.mu)出图前打印当前工况能省掉很多返工。二自由度车辆相平面分析这套流程做到这里基本就完整了。真正在工程中用起来时你会发现临界轨迹的形状、鞍点的位置都在随工况漂移背后的物理过程远比一张静态图复杂但方法论是相通的。把MATLAB里的这套仿真工具打磨顺了后续做ESC阈值设计、稳定域估计都会顺手很多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑