news 2026/9/8 1:23:55

车辆二/三自由度模型推导与Simulink仿真搭建指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
车辆二/三自由度模型推导与Simulink仿真搭建指南

很多刚接触车辆动力学仿真的朋友,一上来就问我:“Simulink里怎么搭一个整车模型?”这个问题其实挺难回答的,因为整车模型本身是个很庞大的工程,涉及悬架、轮胎、转向、制动等一大堆子系统。但如果把问题聚焦在“理解车辆运动的基本规律”上,那答案就简单多了——从二自由度和三自由度模型入手。这两个模型虽然结构简单,但把车辆横向、纵向、横摆这几个最核心的运动状态都涵盖进去了,是理解ESP、ABS、四轮转向这些上层控制算法的基础。

这篇文章就是写给初学者的,我会从模型本身的物理意义讲起,推导过程尽量写得通俗,然后给出Simulink里的具体搭建方法,包括直接积分法、状态空间法,以及从二自由度扩展到三自由度时要注意的问题。文章里所有内容我都用实际跑过的模型验证过,参数也给了参考值,你照着搭就能跑起来。

1. 为什么先学二自由度模型:操纵稳定性分析的最小完整系统

很多初学者容易犯一个错误,就是上来就追求模型“越复杂越真实”,结果模型建到一半,参数标定出了问题,仿真结果一团糟,还不知道是哪里错了。我个人的建议是:先踏踏实实把二自由度模型吃透,它虽然舍弃了很多细节,但保留了车辆操纵稳定性分析中最核心的矛盾——轮胎侧偏力与横摆运动的耦合关系。

1.1 二自由度模型到底忽略了什么,保留了什举

二自由度模型通常指包含横摆角速度质心侧偏角两个自由度的“自行车模型”。它做了一系列人为简化:

  • 忽略悬架运动,认为车身只做平面运动;
  • 忽略空气阻力、滚动阻力等纵向力;
  • 把左右车轮合并为一个车轮,所以叫“自行车模型”;
  • 认为轮胎工作在线性区,即侧偏力与侧偏角成线性关系。

这些简化听起来“很不真实”,但恰恰是这些简化让我们能用一组常系数线性微分方程来描述车辆运动。而线性系统的好处是:可以用解析方法求解,可以用状态空间理论分析稳定性,这也是后续所有车辆稳定性控制算法的理论基石。

举一个具体的例子:ESP系统在判断车辆是否失稳时,核心依据就是“实际横摆角速度与理想横摆角速度的偏差”。而这个“理想横摆角速度”从哪里来?就是从二自由度模型的稳态响应里推出来的。你说这个简单模型重不重要?

1.2 两个自由度各自的物理含义

第一个自由度是横摆角速度,记为 \(\omega_r\),描述的是车辆绕垂直轴旋转的快慢,单位是rad/s。你开车打方向盘,车头开始转动,这个转动的快慢就是横摆角速度。它是衡量车辆“灵活性”最直接的指标。

第二个自由度是质心侧偏角,记为 \(\beta\),描述的是车辆质心速度方向与车身纵轴方向的夹角。这个量稍微抽象一点,你可以这样理解:车头指向的方向和车实际上在移动的方向之间,存在一个夹角。正常直线行驶时这个角接近零,高速过弯时这个角会明显增大。质心侧偏角过大,说明车辆正在失去轨迹保持能力,这是非常危险的工况。

这两个自由度不是独立的,它们通过轮胎侧偏力互相耦合——横摆角速度影响前轮侧偏角,前轮侧偏角产生的前轮侧偏力又会影响质心侧偏角的变化率,而质心侧偏角又反过来影响后轮侧偏角。这一组耦合关系,就是二自由度模型的核心内容。

2. 从牛顿第二定律到状态方程:二自由度模型的完整推导

我见过不少同学,Simulink模型搭得很熟练,但你问他“这个增益模块里的数值是怎么算出来的”,他就答不上来了。这是很危险的——模型的正确性无法验证,参数一改就出错。所以这一节我们把推导过程完整走一遍,我保证每一步都写得足够清楚。

2.1 坐标系约定与关键变量定义

在推导之前,先约定坐标系。采用车辆坐标系:x轴沿车辆纵轴向前,y轴垂直于纵轴指向左侧(或者右侧,不同教材约定不同,我这里采用向左为正,但这不影响最终结果的形式),z轴垂直向上。坐标原点位于质心。

符号含义单位
\(m\)整车质量kg
\(V\)质心速度(沿轨迹方向)m/s
\(\beta\)质心侧偏角rad
\(\omega_r\)横摆角速度rad/s
\(\delta\)前轮转角rad
\(k_1\)前轮侧偏刚度(负值)N/rad
\(k_2\)后轮侧偏刚度(负值)N/rad
\(a\)质心到前轴距离m
\(b\)质心到后轴距离m
\(I_z\)绕z轴的转动惯量kg·m²
\(L\)轴距,\(L = a + b\)m

这里需要提醒一下:侧偏刚度的符号约定在不同的教材里不一样。有些教材定义为正值,有些定义为负值(因为侧偏力与侧偏角方向相反)。我这里采用负值约定,即 \(k_1 < 0\),这在后续推导里会体现出来。如果读者看到其他教材里的符号和你预期的不一样,请先确认它的符号约定,这是初学者最容易搞混的地方。

2.2 侧偏角的几何关系:前轮和后轮各有各的侧偏角

轮胎侧偏角的定义是:轮胎接地印迹中心的速度方向与轮胎旋转平面(即车轮平面)之间的夹角。我们要做的第一步,是把前轮和后轮的侧偏角用状态变量 \(\beta\)、\(\omega_r\) 和前轮转角 \(\delta\) 表示出来。

先看前轮。前轮中心点的速度由两部分组成:质心速度 \(V\) 加上由于横摆运动产生的相对速度。前轮中心的横向速度为:

\[ v_{y1} = V\sin\beta + a\omega_r \]

纵向速度为:

\[ v_{x1} = V\cos\beta \]

前轮中心处的速度方向角为 \(\arctan\left(\frac{V\sin\beta + a\omega_r}{V\cos\beta}\right)\)。在侧偏角较小的情况下(\(\beta\) 和 \(\omega_r\) 都不大),可以近似为:

\[ \arctan\left(\frac{V\sin\beta + a\omega_r}{V\cos\beta}\right) \approx \beta + \frac{a\omega_r}{V} \]

而前轮的速度方向与轮胎平面之间的夹角,还要减去前轮转角 \(\delta\)(因为轮胎平面已经相对车身转了 \(\delta\) 角)。所以前轮侧偏角为:

\[ \alpha_1 = \delta - \left(\beta + \frac{a\omega_r}{V}\right) \]

注意这里符号的选择:当 \(\delta > \beta + \frac{a\omega_r}{V}\) 时,\(\alpha_1 > 0\),此时前轮侧偏力为负(指向右侧,在左侧为正的约定下),产生顺时针横摆力矩。这个细节很重要,后面列方程时要保持符号一致。

再看后轮。后轮没有转角,所以:

\[ \alpha_2 = -\left(\beta - \frac{b\omega_r}{V}\right) \]

这里的负号来自速度方向的近似计算。很多初学者容易漏掉这个负号,导致后轮侧偏力的方向搞反。

2.3 力与力矩方程:两个方程,两个未知数

有了侧偏角,就可以计算侧偏力了:

\[ F_{y1} = k_1\alpha_1 = k_1\left(\delta - \beta - \frac{a\omega_r}{V}\right) \]

\[ F_{y2} = k_2\alpha_2 = k_2\left(-\beta + \frac{b\omega_r}{V}\right) \]

接下来对车辆列写牛顿第二定律。沿y轴方向的力平衡方程:

\[ m\left(\dot{V}\sin\beta + V\cos\beta\cdot\dot{\beta}\right) = F_{y1}\cos\delta + F_{y2} \]

在小角度假设下,\(\cos\beta \approx 1\),\(\sin\beta \approx \beta\),且认为 \(\dot{V} = 0\)(匀速行驶),上式简化为:

\[ mV\left(\dot{\beta} + \omega_r\right) = F_{y1} + F_{y2} \]

这里用到了一个重要关系:质心速度方向角的变化率等于横摆角速度。具体推导是:\(\dot{\beta} + \omega_r\) 实际上是车辆加速度在y轴方向的分量除以速度后得到的“横向加速度变化率”形式。初学者可以先记住这个结论,理解时抓住“横向动力学”的本质即可。

绕z轴的力矩平衡方程:

\[ I_z\dot{\omega}r = aF{y1}\cos\delta - bF_{y2} \]

小角度下 \(\cos\delta \approx 1\),所以:

\[ I_z\dot{\omega}r = aF{y1} - bF_{y2} \]

注意后轮侧偏力那一项的符号:后轮侧偏力方向和前轮相反,所以对质心产生的力矩方向也相反,用减号。

2.4 整理成状态空间形式

把 \(F_{y1}\) 和 \(F_{y2}\) 的代达式代入,整理成关于 \(\dot{\beta}\) 和 \(\dot{\omega}_r\) 的方程:

\[ mV(\dot{\beta} + \omega_r) = k_1\left(\delta - \beta - \frac{a\omega_r}{V}\right) + k_2\left(-\beta + \frac{b\omega_r}{V}\right) \]

展开并移项:

\[ mV\dot{\beta} + mV\omega_r = -(k_1 + k_2)\beta - \frac{ak_1 - bk_2}{V}\omega_r + k_1\delta \]

\[ \dot{\beta} = \frac{k_1 + k_2}{mV}\beta + \left(\frac{ak_1 - bk_2}{mV^2} - 1\right)\omega_r + \frac{k_1}{mV}\delta \]

第二个方程:

\[ I_z\dot{\omega}_r = ak_1\left(\delta - \beta - \frac{a\omega_r}{V}\right) - bk_2\left(-\beta + \frac{b\omega_r}{V}\right) \]

展开整理:

\[ \dot{\omega}_r = \frac{ak_1 - bk_2}{I_z}\beta + \frac{a^2k_1 + b^2k_2}{I_z V}\omega_r + \frac{ak_1}{I_z}\delta \]

写成矩阵形式就是标准的二自由度车辆模型状态方程:

\[ \begin{bmatrix} \dot{\beta} \\ \dot{\omega}_r \end{bmatrix}

\begin{bmatrix} \frac{k_1 + k_2}{mV} & \frac{ak_1 - bk_2}{mV^2} - 1 \\ \frac{ak_1 - bk_2}{I_z} & \frac{a^2k_1 + b^2k_2}{I_z V} \end{bmatrix} \begin{bmatrix} \beta \\ \omega_r \end{bmatrix} + \begin{bmatrix} \frac{k_1}{mV} \\ \frac{ak_1}{I_z} \end{bmatrix} \delta \]

这套方程就是整个二自由度模型的核心。后面在Simulink里搭建时,本质上就是在用积分器、增益模块和加法模块来“复现”这两个方程。

3. Simulink里的第一种搭法:按微分方程直接搭积分模块

现在进入实操环节。我先介绍最直观、最适合初学者理解的一种方式——直接根据状态方程搭建积分模块。这种方式的好处是:每个模块对应方程里的一项,你能清楚地看到“哪个增益是干什么的”,对理解模型本身帮助很大。

3.1 从方程到方块图的映射思路

先看状态方程的结构。第一个方程告诉我们 \(\dot{\beta}\) 由三部分线性叠加而成:一项是 \(\beta\) 的倍数,一项是 \(\omega_r\) 的倍数,还有一项是 \(\delta\) 的倍数。第二个方程同理。所以整个Simulink模型的基本骨架应该是:

  1. 两个积分器,分别输出 \(\beta\) 和 \(\omega_r\);
  2. 积分器的输入分别是 \(\dot{\beta}\) 和 \(\dot{\omega}_r\);
  3. \(\dot{\beta}\) 由三个支路求和得到,\(\dot{\omega}_r\) 也是由三个支路求和得到;
  • 支路来自状态变量经过增益模块的输出以及外部输入 \(\delta\) 经过增益模块的输出。

用一句话概括就是:“状态变量的导数由状态变量和输入的线性组合决定”,这本质上是线性系统理论里“状态方程决定状态导数”的直接体现。想通了这一点,整个模型结构的草图就能在脑子里画出来。

3.2 参数设置:用一组真实感强的车辆参数

在开始搭建之前,先给出一组参考参数。这些参数来自我平时用的一辆类似家用轿车的简化数据,量级是合理的,你可以直接拿来用。

参数单位
\(m\)1500kg
\(I_z\)2500kg·m²
\(a\)1.2m
\(b\)1.4m
\(k_1\)-60000N/rad
\(k_2\)-80000N/rad
\(V\)20m/s(约72km/h)
\(L\)2.6m

在Simulink里,增益模块的参数就是直接填入根据这些值计算出的数字。你在建模时可以把这些增益的计算用MATLAB脚本算好,也可以直接在增益模块里写入表达式,比如(k1+k2)/(m*V)。我建议在模型里用变量名,然后在模型回调或MATLAB脚本里赋值,这样改参数时不用改模型,更灵活。

3.3 搭建步骤详解

打开Simulink,新建一个空白模型。我按步骤带你走一遍。

第一步:添加积分器和输出接口。

从Simulink库浏览器里拖入两个Integrator模块。为清晰起见,把第一个积分器重命名为“beta”,第二个重命名为“omega_r”。这不仅仅是命名规范的问题,更重要的是当模型越来越复杂时,清晰的命名能让你快速定位。另外,给积分器设置初始条件:\(\beta(0) = 0\),\(\omega_r(0) = 0\),对应车辆从直线行驶状态开始运动。

第二步:构建 \(\dot{\beta}\) 的求和单元。

拖入一个Sum模块,设置符号为“+++”(三个输入都为正),输入数量改为3。三条输入支路分别是:

  • \(\beta \times \frac{k_1 + k_2}{mV}\)
  • \(\omega_r \times \left(\frac{ak_1 - bk_2}{mV^2} - 1\right)\)
  • \(\delta \times \frac{k_1}{mV}\)

这三个增益模块分别连接对应的信号源(beta积分器输出、omega_r积分器输出、外部输入delta),输出端都接到Sum模块的输入端。

第三步:构建 \(\dot{\omega}_r\) 的求和单元。

同样拖入一个Sum模块,符号“+++”,输入数3。增益分别为:

  • \(\frac{ak_1 - bk_2}{I_z}\)
  • \(\frac{a^2k_1 + b^2k_2}{I_z V}\)
  • \(\frac{ak_1}{I_z}\)

三个支路同样取自对应的状态量和输入。注意第二项 \(\omega_r\) 前的系数中 \(a^2k_1 + b^2k_2\) 依然是负值(因为 \(k_1,k_2\) 都是负值),所以积分器omega_r的输出经过这个增益模块后,对 \(\dot{\omega}_r\) 的贡献是负反馈。

第四步:连接积分器形成闭环。

这是最关键的一步。Sum模块的输出是 \(\dot{\beta}\),把它接到beta积分器的输入;beta积分器的输出再次分支,一路作为状态变量引出,一路返回给增益模块用于计算 \(\dot{\beta}\) 和 \(\dot{\omega}_r\)。omega_r同理。千万注意:积分器输出到增益模块再到求和模块再到积分器输入,这个闭环绝对不能断,否则状态量无法更新,仿真结果就是错的。

第五步:添加输入和显示输出。

用一个Step模块作为前轮转角输入 \(\delta\),步长设为0.02rad(约1.15度,这是个中等强度的转向输入)。输出方面,可以接Scope查看 \(\beta\) 和 \(\omega_r\) 的时间历程。如果你想看车辆的行驶轨迹,可以额外计算 \(x\) 和 \(y\) 方向的速度再积分。

3.4 调试中的常见错误

我见过很多初学者在搭建这个模型时遇到以下几个问题,提前帮你排掉:

  • 增益符号写反:侧偏刚度用了正值,导致整个系统的极点跑到右半平面,仿真结果直接发散。记住,在我们这套约定下,\(k_1, k_2\) 必须为负。
  • 闭环没连上:积分器输入悬空,状态量永远不变,输出始终是初始值,图形是一条平线。
  • 单位搞混:角度用弧度而不是度。如果你用角度制输入Step模块,结果会大得离谱,因为38度的转向输入在实际车辆上是不可能出现的。
  • 求解器步长太大:如果默认的求解器自动步长下结果出现锯齿形的抖动,手动将最大步长调到0.001s左右。

4. 更工程化的第二种搭法:状态空间模块与S函数的对比

直接按方程搭建的方法优点是直观,缺点是当你想修改参数、批量仿真时不太方便。工程上更常用的是利用MATLAB强大的矩阵运算能力,把整个状态方程封装成一个状态空间模块,或者用S函数实现更复杂的变参数仿真。

4.1 用State-Space模块一行代码搞定

MATLAB/Simulink自带State-Space模块,它直接接受A、B、C、D四个矩阵作为参数,内部帮你完成连续系统的仿真。对二自由度模型来说,这个模块的参数设置比手动搭积木简单得多。

% 参数定义 m = 1500; % 整车质量 kg I_z = 2500; % 转动惯量 kg.m^2 a = 1.2; % 质心到前轴距离 m b = 1.4; % 质心到后轴距离 m k1 = -60000; % 前轮侧偏刚度 N/rad k2 = -80000; % 后轮侧偏刚度 N/rad V = 20; % 纵向速度 m/s % 状态矩阵 A = [(k1+k2)/(m*V), (a*k1-b*k2)/(m*V^2)-1; ... (a*k1-b*k2)/I_z, (a^2*k1+b^2*k2)/(I_z*V)]; B = [k1/(m*V); a*k1/I_z]; C = eye(2); D = zeros(2,1);

把这些矩阵填入State-Space模块的参数对话框中,输入信号仍然是 \(\delta\),输出就是 \(\beta\) 和 \(\omega_r\)。这种方式的好处是代码可读性高,参数集中管理,后续做参数扫描优化时非常方便——只需要在m脚本里改参数,然后调用sim()函数批量仿真。

4.2 用S函数实现变参数模型

如果你的仿真里 \(V\)(车速)是变化的,那二自由度模型就不能再用定常矩阵A、B来描述,因为矩阵元素里含有 \(V\)。这时候两种方案:一是用“变参数状态空间”的积分方式手动搭建,把 \(V\) 作为一个外部输入信号接入增益模块;二是用S函数,在代码里动态计算 \(A\)、\(B\) 矩阵。

用Level-2 MATLAB S函数实现的核心伪代码如下:

function update(block) % 获取输入信号:delta, V delta = block.InputPort(1).Data; V = block.InputPort(2).Data; % 从对话框参数中获取固定参数 m = block.DialogPrm(1).Data; Iz = block.DialogPrm(2).Data; a = block.DialogPrm(3).Data; b = block.DialogPrm(4).Data; k1 = block.DialogPrm(5).Data; k2 = block.DialogPrm(6).Data; % 连续状态方程 f1 = (k1+k2)/(m*V) * block.ContStates(1) + ... ((a*k1-b*k2)/(m*V^2) - 1) * block.ContStates(2) + ... k1/(m*V) * delta; f2 = (a*k1-b*k2)/Iz * block.ContStates(1) + ... (a^2*k1+b^2*k2)/(Iz*V) * block.ContStates(2) + ... a*k1/Iz * delta; block.Derivatives.Data = [f1; f2]; end

这里我把车速 \(V\) 也当作输入信号了,这样你可以模拟“匀减速过弯”“加速出弯”等更接近真实工况的场景。需要注意的是,当 \(V = 0\) 时方程奇异(矩阵元素分母为零),所以仿真起始时刻要设置一个很小的初值比如 \(V = 0.1\) m/s,或者用条件判断防止除零错误。

4.3 两种实现方式的对比与选型建议

维度直接搭建积分模块使用State-Space模块使用S函数
直观性高,每个增益对应一项中,矩阵封装了细节低,需要阅读代码
适合人群初学者理解原理快速搭建、参数扫描变参数、复杂仿真
扩展性低,状态增加时模型膨胀中,修改矩阵即可高,可灵活控制
调试难度低,容易定位问题中,矩阵数值错误难查高,需要代码调试经验

我的建议是:学习阶段用第一种,把每个增益算一遍、查一遍,模型自然就懂了。做课题或项目时用第二种,把参数集中到脚本里,后续做批量仿真、参数优化、蒙特卡洛分析时省事很多。如果涉及变车速、变载荷等非线性情况,直接用S函数,一步到位。

5. 三自由度模型:加入纵向运动后的动力学扩展

二自由度模型把车速 \(V\) 当作常数,这在分析稳态转向特性时够用了。但如果你想研究车辆在驱动/制动过程中的横摆稳定性,或者模拟ESP介入时的整车响应,就必须要考虑纵向车速的变化。这时就需要把模型从二自由度扩展到三自由度。

5.1 第三个自由度选什么:纵向车速 \(V_x\)

一种最常见的扩展方式是:保留横摆角速度 \(\omega_r\) 和质心侧偏角 \(\beta\),再加上纵向车速 \(V_x\)作为第三个自由度。这样状态变量就是 \([V_x,\ \beta,\ \omega_r]^T\)。相比于二自由度模型,它不再假设 \(V\) 为常数,而是通过纵向力平衡方程显式地计算 \(V_x\) 的变化。

需要注意的是,严格来说这里的状态变量采用 \(V_x\)(纵向速度)而不是标量车速 \(V\) 更合适,因为车辆存在侧偏时,\(V = \sqrt{V_x^2 + V_y^2}\),而 \(\beta = \arctan(V_y/V_x)\)。在Simulink中要么同时计算 \(V_x\) 和 \(V_y\),要么用 \(V\) 和 \(\beta\) 作为一组广义坐标。下面我以 \(V_x, V_y, \omega_r\) 三者的方式推导,这样物理含义更直接。

5.2 三自由度模型的运动微分方程

在车辆坐标系下,列写x方向、y方向的力平衡和绕z轴的力矩平衡。注意:因为坐标系本身在旋转,加速度项里会出现额外的“哥氏项”。

x方向:

\[ m(\dot{V}x - V_y\omega_r) = F{x1} + F_{x2} \]

y方向:

\[ m(\dot{V}y + V_x\omega_r) = F{y1} + F_{y2} \]

z方向(横摆):

\[ I_z\dot{\omega}r = aF{y1} - bF_{y2} \]

其中 \(F_{y1}, F_{y2}\) 仍然由侧偏角决定:

\[ \alpha_1 = \delta - \arctan\left(\frac{V_y + a\omega_r}{V_x}\right) \]

\[ \alpha_2 = -\arctan\left(\frac{V_y - b\omega_r}{V_x}\right) \]

小角度下近似为:

\[ \alpha_1 = \delta - \frac{V_y + a\omega_r}{V_x} \]

\[ \alpha_2 = -\frac{V_y - b\omega_r}{V_x} \]

纵向力 \(F_{x1}, F_{x2}\) 由驾驶员模型或控制策略给定。如果要模拟简单的驱动/制动工况,可以直接设定一个纵向力输入;如果是整车联合仿真,这些纵向力可以由发动机模型或制动系统模型提供。

5.3 从二自由度到三自由度的递进理解

二自由度模型实际上是三自由度模型在 \(\dot{V}x = 0\) 且 \(V_x\) 恒为常数的特殊情况。把三自由度方程中的 \(V_x\) 固定,且令 \(F{x1} = F_{x2} = 0\),就退化为二自由度模型。

这个递进关系很重要。初学者往往容易把“自由度”理解为“模型复杂度越高越高级”,但实际上更应该把它理解为“对问题分析尺度的选择”。研究稳态转向特性,二自由度足够了,还便于解析求解;研究驱动制动与转向的耦合,就必须用三自由度以上模型。选哪个,取决于你要回答什么问题,而不是追求参数多。

5.4 三自由度模型的Simulink实现要点

三自由度模型的Simulink搭建和二自由度类似,仍然用积分器 + 增益 + 求和的方式,但增加了几个关键处理:

  • 额外添加一个积分器用于 \(V_x\),其输入是纵向加速度 \(\dot{V}x = (F{x1} + F_{x2}) / m + V_y\omega_r\)。
  • \(V_x\) 不再是常数,而是积分器的输出,必须把它作为信号引到侧偏角的计算模块中,因为 \(\alpha_1, \alpha_2\) 的分母里有 \(V_x\)。
  • \(\beta\) 不再直接积分输出,而是通过 \(V_y\) 和 \(V_x\) 计算:\(\beta = \arctan(V_y / V_x)\)。因此你可以直接对 \(V_y\) 积分,然后在需要输出质心侧偏角时用一个三角函数模块计算。

在Simulink里的具体连接思路如下:

  1. 三个积分器分别对应 \(V_x\)、\(V_y\)、\(\omega_r\);
  2. \(V_x\) 和 \(V_y\) 共同通过一个Atan2模块计算 \(\beta\)(注意用Atan2而不是Atan,因为 \(V_x\) 可能为负或者接近零时,Atan会出问题);
  3. \(V_x\)、\(V_y\)、\(\omega_r\) 一起进入侧偏角计算子系统,输出 \(\alpha_1, \alpha_2\);
  4. \(\alpha_1, \alpha_2\) 乘以侧偏刚度得到 \(F_{y1}, F_{y2}\),再加上纵向力输入 \(F_x\),分别计算出三个状态变量的导数,回到积分器。

这套结构如果手动搭起来比较繁琐(尤其是侧偏角计算部分),后续代码比较长。我建议用Simulink的“子系统”功能把侧偏角计算封装起来,保持模型整体整洁。

6. 仿真验证与调参:如何判断你的模型没有搭错

模型搭建完成后,最重要的一步是验证。我见得太多了——模型跑出来的曲线看起来“像那么回事”,但仔细一算数值完全不守恒。下面给出几个判断模型是否正确的经典手段。

6.1 稳态横摆角速度增益:一个可以手算的对照值

对于二自由度模型,在阶跃转向输入下,经过足够长的时间,系统达到稳态。此时 \(\dot{\beta} = 0\)、\(\dot{\omega}_r = 0\),可以从方程组直接解出稳态横摆角速度与方向盘输入(这里指前轮转角)的比值。经过计算,稳态横摆角速度增益为:

\[ \frac{\omega_r}{\delta}\Bigg|_{ss} = \frac{V / L}{1 + K V^2} \]

其中稳定性因数 \(K\) 为:

\[ K = \frac{m}{L^2}\left(\frac{a}{k_2} - \frac{b}{k_1}\right) \]

代入前面的参数:

\[ K = \frac{1500}{2.6^2}\left(\frac{1.2}{-80000} - \frac{1.4}{-60000}\right) \approx 221.9 \times (-6.67 \times 10^{-6}) \approx -0.00148 \]

\(K < 0\),说明这辆车是“不足转向”的,这一点和大多数家用轿车一致。稳态增益为:

\[ \frac{\omega_r}{\delta}\Bigg|_{ss} = \frac{20 / 2.6}{1 + (-0.00148) \times 400} = \frac{7.69}{1 - 0.592} \approx 18.85 \]

这意味着每1弧度前轮转角,稳态横摆角速度约为18.85 rad/s。看起来数值很大,但别忘了 \(\delta = 0.02\) rad 时,稳态 \(\omega_r \approx 0.377\) rad/s,约21.6°/s,很合理。

跑完Simulink仿真后,看一下 \(\omega_r\) 的稳态值,如果和这个手算值误差在1%以内,模型基本搭建正确。

6.2 对比不同车速下的响应特性

改变 \(V\) 的值,观察横摆角速度响应曲线的变化趋势。车辆动力学的一个经典结论是:随着车速增加,不足转向车辆的稳态横摆角速度增益先增大后减小,特征车速时增益达到最大。特征车速:

\[ V_{ch} = \sqrt{1/K},\quad K > 0 \]

但本参数下 \(K < 0\),车辆属于不足转向吗?实际上 \(K < 0\) 对应的是“过多转向”,这在车辆设计中是不希望的。重新检查参数:\(K\) 为负意味着 \(\frac{a}{k_2} < \frac{b}{k_1}\),在负数刚度下,\(a/k_2\) 是“较大的负数”(因为 \(k_2 = -80000\) 比分母 \(k_1 = -60000\) 更负),所以确实是过多转向。如果你想要不足转向(大多数民用车的设定),可以调整参数让 \(k_1\) 的绝对值比 \(k_2\) 更大,或者调整质心位置。这个调整过程本身就是理解模型参数影响的好练习。

6.3 用Simulink的线性化工具验证状态矩阵

还有一个高大上但很实用的验证方法:Simulink Control Design工具箱可以对非线性模型做线性化,然后把线性化得到的A矩阵和你手算的A矩阵对比。如果两者一致,说明你的模型搭建没有问题。

% 在模型运行点线性化,假设模型名为 'vehicle_2dof' [A_lin, B_lin, C_lin, D_lin] = linmod('vehicle_2dof'); % 对比 A_lin 与手算的 A 矩阵

不过要提醒:linmod线性化对模型的纯数学运算块(增益、求和、积分)是精确的,但如果模型里有查表、饱和等非线性块,线性化结果会依赖于工作点的选择。初学者先把纯线性模型验证好,再加非线性。

7. 从验证到进阶:模型建好之后还能做什么

模型搭完、验证通过之后,这个二/三自由度模型的用途才刚刚开始。我根据自己的使用经验,简单列几个比较容易上手的扩展方向。

第一个方向是控制器设计。模型本身是线性的,你可以用经典的PID控制、LQR控制,或者现代控制里的模型预测控制(MPC)来设计一个横摆稳定性控制器。控制器输出就是附加横摆力矩,可以理解成ESP系统在单侧车轮施加制动力差产生的力矩。在Simulink里,把控制器封装成一个子系统,接在模型之前或反馈回路上,就可以做闭环仿真。

第二个方向是参数敏感性分析。利用三自由度模型,研究质心位置(\(a, b\))、侧偏刚度(\(k_1, k_2\))、车速 \(V\) 对车辆稳定性的影响。你可以用MATLAB脚本批量仿真,画出不同参数下横摆角速度响应的对比曲线。这种分析在车辆概念设计阶段很有价值。

第三个方向是联合仿真。虽然二/三自由度模型本身很简单,但把它和更复杂的车辆模型(比如CarSim)联合使用,可以作为“参考模型”或“降阶模型”,用于实时估计、故障诊断、控制算法验证等场景。工业界经常用简化模型做快速原型验证,再用高保真模型做最终确认,两者配合效率最高。

关于模型后续的扩展,这里再说一个我在实际项目中经常用的操作:给模型加上轮胎非线性。做法是把线性侧偏刚度 \(k_1\alpha_1\) 替换成Pacejka魔术公式或简化的Fiala轮胎模型,同时保持整车二自由度的结构不变。这样模型从线性变成非线性,但自由度没增加,非常适合初学者理解非线性轮胎与整车稳定性的关系。具体做法是在侧偏角 \(\alpha\) 之后插入一个MATLAB Function模块,输入 \(\alpha\)、垂直载荷 \(F_z\),输出 \(F_y\)。模型整体仍然只包含三个积分器,但已经能模拟极限工况下的侧偏力饱和现象。

关于二自由度模型,还有一个小技巧值得分享——在Simulink中把 \(\beta\) 和 \(\omega_r\) 的输出用Bus的方式打包成结构体,后续无论接示波器还是做数据处理都方便很多。尤其是当你用sim()函数做批量仿真时,能从输出结构体里直接提取logsout,不需要在模型里堆一堆Scope。这些习惯可能比较微观,但对提升仿真效率帮助很大。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 1:21:53

三相有源电力滤波器APF仿真:从谐波检测到SVPWM的完整实现

做电力电子仿真的朋友&#xff0c;十有八九都被谐波电流折腾过。三相不控整流桥带一个电容滤波负载&#xff0c;电网电流就会变成那种只在峰值附近才出现的窄尖脉冲&#xff0c;畸变率随随便便上30%。我这次要聊的“三相有源电力滤波器APF仿真”&#xff0c;就是把治理谐波这件…

作者头像 李华
网站建设 2026/9/8 1:20:06

Qt FTP上传:QNetworkAccessManager与QFtp对比

简介&#xff1a;Qt开发者可参考的一份FTP上传Demo&#xff0c;使用QNetworkAccessManager实现文件上传&#xff0c;解决在Qt应用中直接与FTP服务器交互的需求。资源面向具备基础Qt编程经验的开发者&#xff0c;聚焦FTP上传的完整实现&#xff0c;便于快速集成或二次扩展。压缩…

作者头像 李华
网站建设 2026/9/8 1:19:25

开发板调试一站式平台:串口助手与硬件测试的整合实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/8 1:17:43

SMT贴片加工避坑指南:从选厂到验货的完整流程与工艺纪律

做硬件这几年&#xff0c;我越来越确认一句话&#xff1a;SMT贴片加工这个环节&#xff0c;才是很多产品项目真正"翻车"的重灾区。原理图可以改&#xff0c;固件可以调&#xff0c;但板子贴出来焊点虚、物料错、批次不稳定&#xff0c;后面所有的调试都是在地基上盖危…

作者头像 李华
网站建设 2026/9/8 1:16:53

Xilinx Vivado永久许可证技术解析与工程实践

1. Xilinx Vivado永久许可证深度解析作为FPGA开发领域的工业标准工具&#xff0c;Xilinx Vivado的授权问题一直是工程师关注的焦点。最近业内流传的"永久许可证"概念&#xff0c;本质上是通过特定技术手段生成的授权文件&#xff0c;其核心特征是突破官方订阅制的版本…

作者头像 李华