尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

二自由度车辆模型传递函数:横摆角速度与侧偏角建模及频域验证

发布时间:2026/9/23 21:00:24

资讯中心
01
ARTICLE

二自由度车辆模型传递函数:横摆角速度与侧偏角建模及频域验证

二自由度车辆模型传递函数:横摆角速度与侧偏角建模及频域验证
简介这份资源面向车辆动力学学习者、汽车工程师与自动驾驶系统开发者聚焦二自由度车辆模型的建模与分析。内容以状态空间方法为基础将车辆动力学方程线性化后转换为传递函数形式用于研究横摆角速度与车辆侧偏角在不同输入下的动态响应规律可支撑急转弯、紧急避障等工况下的稳定性评估与操控性分析。压缩包共2个文件约74KB包含1个m脚本与1个fig图形文件脚本承载状态空间到传递函数的转换算法及仿真分析代码图形文件则用于展示波特图、阶跃响应等可视化结果便于直观理解模型动态特性。目前已有643人学习下载。借助这套源码读者可复现横摆角速度与侧偏角的响应曲线理解传递函数参数对车辆稳定性的影响并为进一步设计优化操控性能的控制器提供可运行的参考基础。1. 二自由度车辆模型传递函数从横摆角速度到侧偏角的建模路径做车辆动力学控制的人迟早会撞上同一个问题明明在 CarSim 里跑得好好的横摆角速度响应换到自己搭的控制器里就相位对不上。根子往往出在 plant model 上——你用的传递函数到底是从方向盘转角到横摆角速度还是到侧偏角这两个通道的零极点分布完全不同混用必翻车。二自由度2-DOF车辆模型就是解决这件事的起点把四轮车压缩成自行车模型保留横摆和侧偏两个自由度推导出横摆角速度与车辆侧偏角对前轮转角的传递函数。它适合做 ESP、AFS、后轮转向等底盘电控算法的工程师也适合刚接触车辆动力学、想从公式推到仿真跑通一遍的学生。核心价值在于你拿到的不只是一组公式而是一条从参数表到 Bode 图再到控制器整定的完整链路。2. 二自由度模型怎么推状态方程与传递函数矩阵2.1 从牛顿-欧拉方程到两自由度状态空间先把假设说清楚车辆只做平面运动忽略侧倾、俯仰和垂向跳动轮胎侧偏力与侧偏角呈线性关系即 F Cα · α前轮转角 δ 直接作为输入不考虑转向系统柔度。在这个前提下车辆被简化为一个具有纵向速度 u 的自行车模型状态量取横摆角速度 r 和车辆侧偏角 β。侧偏角 β 定义为车辆速度矢量与车身纵轴的夹角横摆角速度 r 是车身绕 z 轴的旋转速率。对整车列侧向力平衡和绕质心的力矩平衡# 二自由度车辆模型状态方程推导符号形式 # 参数说明 # m 整车质量 (kg) # Iz 绕z轴转动惯量 (kg·m^2) # a 质心到前轴距离 (m) # b 质心到后轴距离 (m) # u 纵向车速 (m/s) # Cf 前轴等效侧偏刚度 (N/rad) # Cr 后轴等效侧偏刚度 (N/rad) import sympy as sp m, Iz, a, b, u, Cf, Cr sp.symbols(m Iz a b u Cf Cr, positiveTrue) beta, r, delta sp.symbols(beta r delta) # 侧向力平衡m*u*(beta_dot r) Cf*(delta - beta - a*r/u) Cr*(-beta b*r/u) # 横摆力矩平衡Iz*r_dot a*Cf*(delta - beta - a*r/u) - b*Cr*(-beta b*r/u) # 整理成状态空间形式 x_dot A*x B*delta, x [beta, r]^T # 这里直接给出整理后的系数矩阵元素 A11 -(Cf Cr) / (m * u) A12 -1 - (a * Cf - b * Cr) / (m * u**2) A21 -(a * Cf - b * Cr) / Iz A22 -(a**2 * Cf b**2 * Cr) / (Iz * u) B1 Cf / (m * u) B2 a * Cf / Iz print(A矩阵) print(fA11 {A11}) print(fA12 {A12}) print(fA21 {A21}) print(fA22 {A22}) print(B矩阵) print(fB1 {B1}) print(fB2 {B2})这段代码的作用是把推导结果符号化方便你代入不同车型参数快速验证。注意 A12 里出现了 1/u² 项这是二自由度模型在低速时数值条件变差的根源之一。参数 u 不能取零仿真时通常从 1 m/s 起步。2.2 传递函数矩阵横摆角速度通道与侧偏角通道有了状态空间传递函数就是 G(s) C(sI - A)⁻¹B D。对横摆角速度 r 和侧偏角 β 分别取输出矩阵横摆角速度通道C_r [0, 1]得到 G_r(s) r(s)/δ(s)侧偏角通道C_β [1, 0]得到 G_β(s) β(s)/δ(s)两个通道的分母相同都是二阶特征多项式import numpy as np from scipy import signal # 车型参数示例某C级轿车 m 1500.0 # kg Iz 2500.0 # kg·m^2 a 1.2 # m b 1.5 # m Cf 80000.0 # N/rad Cr 85000.0 # N/rad u 20.0 # m/s # 状态矩阵 A np.array([ [-(CfCr)/(m*u), -1-(a*Cf-b*Cr)/(m*u**2)], [-(a*Cf-b*Cr)/Iz, -(a**2*Cfb**2*Cr)/(Iz*u)] ]) B np.array([[Cf/(m*u)], [a*Cf/Iz]]) # 横摆角速度通道 Cr_out np.array([[0.0, 1.0]]) Dr np.array([[0.0]]) sys_r signal.ss2tf(A, B, Cr_out, Dr) # 侧偏角通道 Cb_out np.array([[1.0, 0.0]]) Db np.array([[0.0]]) sys_b signal.ss2tf(A, B, Cb_out, Db) print(横摆角速度传递函数分子:, sys_r[0]) print(侧偏角传递函数分子:, sys_b[0]) print(公共分母:, sys_r[1])运行后会看到横摆角速度通道的分子含有一个零点侧偏角通道的分子也含有一个零点但两者零点位置不同。这个差异直接决定了两个通道的幅频特性在低频段的表现——横摆角速度通道在低频增益趋于稳态值而侧偏角通道在低频段会随车速变化出现符号翻转。很多人在做前馈补偿时只看了横摆角速度通道结果侧偏角在高速下反向车头指向和实际轨迹对不上这就是没把两个通道分开处理的代价。提示分母特征多项式决定了系统的自然频率和阻尼比两个通道共享。如果你只关心稳定性看分母就够了但要做通道解耦或前馈必须把两个分子分别拿出来对比。3. 从传递函数到频域验证Bode 图、零极点与稳态增益3.1 用 Python 画 Bode 图并读取关键参数推导对不对画一张 Bode 图就能验证大半。下面这段代码同时画出横摆角速度通道和侧偏角通道的幅频、相频曲线并标注自然频率和稳态增益。import matplotlib.pyplot as plt from scipy import signal # 沿用上一节的 sys_r 和 sys_b # sys_r[0] 是分子系数sys_r[1] 是分母系数 sys_r_tf signal.TransferFunction(sys_r[0], sys_r[1]) sys_b_tf signal.TransferFunction(sys_b[0], sys_b[1]) w np.logspace(-1, 2, 500) # 横摆角速度通道 w_r, mag_r, phase_r signal.bode(sys_r_tf, w) # 侧偏角通道 w_b, mag_b, phase_b signal.bode(sys_b_tf, w) fig, (ax1, ax2) plt.subplots(2, 1, figsize(10, 8)) ax1.semilogx(w_r, mag_r, labelr/delta (yaw rate)) ax1.semilogx(w_b, mag_b, labelbeta/delta (sideslip)) ax1.set_ylabel(Magnitude (dB)) ax1.legend() ax1.grid(True, whichboth) ax2.semilogx(w_r, phase_r, labelr/delta) ax2.semilogx(w_b, phase_b, labelbeta/delta) ax2.set_ylabel(Phase (deg)) ax2.set_xlabel(Frequency (rad/s)) ax2.legend() ax2.grid(True, whichboth) plt.tight_layout() plt.show() # 读取稳态增益低频渐近值 dc_gain_r sys_r[0][-1] / sys_r[1][-1] dc_gain_b sys_b[0][-1] / sys_b[1][-1] print(f横摆角速度稳态增益: {dc_gain_r:.4f}) print(f侧偏角稳态增益: {dc_gain_b:.4f})代码里 dc_gain 的计算方式是分子常数项除以分母常数项对应 s→0 时的传递函数值。横摆角速度稳态增益的物理意义是单位前轮转角下车辆最终稳定的横摆角速度。侧偏角稳态增益则告诉你车身最终以多大角度斜着走。这两个值在车辆工程里分别对应不足转向梯度和侧偏角梯度是底盘调校的核心指标。3.2 零极点分布与车速敏感性把不同车速下的极点画到复平面上你会看到二自由度模型的一个关键特性随着车速升高极点逐渐向虚轴靠近阻尼比下降。当车速超过临界车速实部可能变为正系统失稳——这就是过多转向的数学表现。speeds [5, 10, 20, 30, 40] # m/s fig, ax plt.subplots(figsize(8, 6)) for u in speeds: A np.array([ [-(CfCr)/(m*u), -1-(a*Cf-b*Cr)/(m*u**2)], [-(a*Cf-b*Cr)/Iz, -(a**2*Cfb**2*Cr)/(Iz*u)] ]) poles np.linalg.eigvals(A) ax.plot(poles.real, poles.imag, o, labelfu{u} m/s) ax.axvline(0, colork, linestyle--, linewidth0.8) ax.set_xlabel(Real (1/s)) ax.set_ylabel(Imag (1/s)) ax.set_title(Pole migration vs vehicle speed) ax.legend() ax.grid(True) plt.show()参数怎么改Cf 和 Cr 的比值决定了不足转向/过多转向倾向。Cf/Cr 减小前轴侧偏刚度相对后轴降低车辆趋向过多转向临界车速下降。实际调校中轮胎气压、载荷分配、悬架 KC 特性都会影响这两个值。仿真时如果发现极点实部为正先别急着改控制器回头检查轮胎侧偏刚度是不是设得太离谱。注意二自由度模型的线性假设在侧向加速度超过 0.4g 后误差明显增大。如果你做的是极限工况控制这个传递函数只能当参考不能当 plant model 直接用。4. 避坑与排查传递函数建模中最容易翻车的五个地方4.1 现象仿真出来的横摆角速度稳态值与实车差一倍原因单位搞错了。前轮转角输入 δ 用的是弧度但参数表里轮胎侧偏刚度给的是 N/deg。Cf 和 Cr 必须统一到 N/rad否则传递函数增益整体偏移 57.3 倍。解决在代码开头加一行单位检查把所有角度相关参数显式转换。我一般会在参数定义区写注释标明单位并在代入前用 assert 检查量级。4.2 现象Bode 图在低频段相位是 0 度但实车数据在 0.5 Hz 附近就有明显相位滞后原因忽略了转向系统柔度和轮胎松弛长度。二自由度模型假设前轮转角瞬时到位但实际转向机有刚度、轮胎有松弛。这个额外滞后在 1 Hz 以上才显著但如果你用二自由度模型整定了一个高带宽控制器装车后就会振荡。解决在传递函数前串一个一阶惯性环节近似转向系统动态时间常数取 0.05~0.1 s。或者把轮胎松弛长度等效为一阶滞后加在侧偏力计算之前。4.3 现象侧偏角通道的稳态增益符号和直觉相反原因侧偏角 β 的正方向定义与横摆角速度 r 的正方向定义不一致。SAE 坐标系下β 的正方向是车辆速度矢量指向车身纵轴左侧而 r 的正方向是绕 z 轴逆时针。如果你在推导时混用了 ISO 和 SAE 的符号约定分子符号就会翻。解决从头检查一遍状态方程里每一项的符号。一个快速验证方法低速大转角时车辆应该向转弯内侧偏β 的符号应该与 δ 相反。如果仿真结果同号符号约定错了。4.4 现象用 ss2tf 得到的分子系数和手推的不一样原因ss2tf 返回的分子系数是按降幂排列的但有些教材按升幂写。另外ss2tf 可能返回接近零的高阶项看起来像多了一个零点。解决用 np.round 把接近零的系数截掉再和手推结果对比。手推时建议用 sympy 做符号化简避免算术错误。4.5 现象不同车速下传递函数分母常数项变化很大稳态增益跟着变原因这是正常的。二自由度模型的稳态增益本身就随车速变化横摆角速度稳态增益大致与 u/(1K·u²) 成正比其中 K 是不足转向系数。如果你期望一个恒定增益那说明你需要的不是 plant model而是带前馈补偿的参考模型。解决把稳态增益随车速的变化曲线画出来作为前馈表的基础。常见做法是在控制器里按车速查表补偿增益而不是改传递函数本身。5. 进阶用法用传递函数做前馈补偿与控制器带宽校核5.1 从传递函数反推期望横摆角速度与前馈转角理想情况下驾驶员期望的横摆角速度由方向盘转角和车速决定。用二自由度传递函数的稳态增益作为前馈项可以构造一个参考横摆角速度def desired_yaw_rate(delta, u, K_understeer): 参考横摆角速度模型 delta: 前轮转角 (rad) u: 车速 (m/s) K_understeer: 不足转向系数 (s^2/m^2) L a b # 轴距 r_des (u / (L K_understeer * u**2)) * delta return r_des # 前馈转角由期望横摆角速度反推所需前轮转角 def feedforward_steer(r_des, u, K_understeer): L a b delta_ff r_des * (L K_understeer * u**2) / u return delta_ff这段代码里的 K_understeer 可以从传递函数稳态增益反推K (m/(L²)) * (b/Cf - a/Cr)。前馈项的作用是让车辆在稳态时不需要反馈修正就能跟上期望横摆角速度反馈控制器只负责修正瞬态误差。这样整定出来的控制器增益可以低一些对噪声和模型误差的鲁棒性更好。5.2 用闭环传递函数校核控制器带宽上限假设你设计了一个反馈控制器 C(s)闭环传递函数为 T(s) C(s)G(s) / (1 C(s)G(s))。二自由度模型的自然频率通常落在 1~2 Hz取决于车速和轮胎刚度这意味着你的控制器带宽不应该超过自然频率的 1/3~1/2否则会激发车辆动力学共振。一个实用的校核方法把开环传递函数 L(s) C(s)G(s) 的 Bode 图画出来看穿越频率处的相位裕度。如果相位裕度低于 45 度装车后大概率会抖。我一般会把穿越频率压在 0.5~0.8 Hz相位裕度留到 60 度以上给未建模动态留足余量。提示不同车速下 G(s) 的幅频特性变化很大控制器如果按单一车速整定在低速和高速两端都会出问题。常见做法是按车速做增益调度或者用 H∞ 方法设计一个对参数摄动鲁棒的控制器。5.3 一个我常犯的错误早年做后轮转向控制时我直接用横摆角速度通道的传递函数整定了控制器仿真里横摆角速度跟踪得漂亮装车后侧偏角在高速变道时大得吓人。后来才意识到横摆角速度和侧偏角是两个耦合通道只控一个另一个必然失控。正确的做法是把两个通道的传递函数矩阵都拿出来做解耦或者至少做联合约束。现在我的习惯是任何底盘控制项目先把 G_r(s) 和 G_β(s) 的 Bode 图并排画出来看两个通道在目标带宽内的幅值比和相位差再决定控制结构。这个习惯帮我省了很多次返工。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。