第2章:车辆参考模型——二自由度单轨模型推导与参考值计算
各位同学,欢迎来到第二章。
上一章我们聊了车辆稳定性控制的大致框架。今天要啃的这块骨头,是整个算法的“基准尺”——二自由度单轨模型。说白了,就是给车辆画一个简化版的“数学替身”,用它来算出我们想要的理想状态。
我个人习惯把这一章叫做“定调子”。因为后面所有的控制逻辑,都要拿这个模型算出来的参考值去比对。模型不准,后面全白搭。
2.1 为什么要用二自由度模型?
你想想看,一辆真车有多少个自由度?四个轮子跳动、车身俯仰、侧倾、横摆……加起来十几个。如果全算进去,控制器还没跑起来,芯片先烧了。
所以,我们得做简化。二自由度模型只保留两个最关键的运动:
- 横摆运动:绕Z轴的转动,也就是车头左右摆
- 侧向运动:沿Y轴的平移,也就是车身侧滑
嗯,这里要注意:我们假设车速是常数,忽略俯仰和侧倾。这个假设在大多数稳定性控制场景下是成立的——因为ESC介入时,通常是在紧急工况,车速变化不大。
核心思想:用最简单的模型,抓住车辆失稳时最本质的两个物理量——横摆角速度 r 和质心侧偏角 β。
2.2 二自由度单轨模型推导
好,开始推公式。我尽量不跳步,因为当年我学的时候,最烦老师直接给结论。
先画个图。我们把左右轮合并到中心线上,变成“单轨”。前轮一个点,后轮一个点。
图中:CG是质心,a是质心到前轴距离,b是到后轴距离。δ是前轮转角,β是质心侧偏角,r是横摆角速度。
现在,我们根据牛顿第二定律和转动定律,列方程。
侧向力平衡方程:
m * V * (β_dot + r) = F_yf + F_yr
横摆力矩平衡方程:
I_z * r_dot = a * F_yf - b * F_yr
这里,F_yf和F_yr是前后轮的侧向力。I_z是横摆转动惯量。
接下来,我们需要把侧向力表达成侧偏角的函数。在轮胎线性区,有:
F_yf = -C_f * α_f
F_yr = -C_r * α_r
C_f和C_r是前后轮的侧偏刚度。α_f和α_r是前后轮的侧偏角。
侧偏角怎么算?看几何关系:
α_f = β + (a * r) / V - δ
α_r = β - (b * r) / V
把上面这些代入,整理后得到状态方程:
β_dot = -(C_f + C_r)/(m*V) * β - [1 + (a*C_f - b*C_r)/(m*V²)] * r + (C_f/(m*V)) * δ
r_dot = -(a*C_f - b*C_r)/I_z * β - (a²*C_f + b²*C_r)/(I_z*V) * r + (a*C_f/I_z) * δ
我的小经验:这个方程组看着复杂,但你可以把它写成矩阵形式 x_dot = A*x + B*u。其中状态量 x = [β, r]ᵀ,输入 u = δ。后面做状态观测器的时候,这个形式非常有用。
2.3 质心侧偏角参考值计算
好,模型有了。现在我们要回答一个问题:什么样的β和r才是“理想”的?
对于质心侧偏角,我的观点很明确:理想值就是0。
为什么?因为车辆稳定行驶时,我们希望车头始终指向车辆实际运动的方向。β不为0,意味着车在“横着走”——这在正常行驶中是不允许的。
当然,严格来说,在极限工况下,β可以允许一个小范围。但作为参考模型,我们取:
β_ref = 0
我曾经在一个项目中,尝试过用非线性模型计算β_ref,结果发现控制器反而更不稳定。后来我明白了:参考模型的作用是提供一个“理想标杆”,而不是精确复现真实车辆。越简单,越鲁棒。
2.4 横摆角速度参考值计算
横摆角速度的参考值,就要讲究一些了。
在稳态转向时(也就是方向盘固定、车辆匀速转弯),横摆角速度应该满足:
r_ref = (V / L) * δ
但这是理想情况。实际车辆有不足转向或过度转向特性。所以我们要引入一个修正项——稳定性因子 K:
K = (m / L²) * (b/C_f - a/C_r)
r_ref = (V / L) * δ / (1 + K * V²)
这里K的正负决定了车辆转向特性:
| K 值 | 转向特性 | 表现 |
|---|---|---|
| K > 0 | 不足转向 | 车头往外推,需要多打方向 |
| K = 0 | 中性转向 | 理想状态,但实际很难达到 |
| K < 0 | 过度转向 | 车尾往外甩,危险! |
另外,还要考虑路面附着系数的限制。轮胎能提供的侧向力是有限的,所以横摆角速度不能无限大:
r_max = μ * g / V
最终,参考横摆角速度取两者中的较小值:
r_ref = min( |r_ref_steady|, r_max ) * sign(δ)
注意:我曾经在实车测试时,忽略了r_max的限制,结果控制器在低附着路面(比如冰雪路面)上疯狂输出,差点让车原地掉头。从那以后,我每次都会检查:参考值是否被路面附着系数“削顶”了。
2.5 代码实现示例
下面给出一段C代码,实现参考值的计算。这是我在一个量产项目中用过的简化版本:
/* 二自由度参考模型计算 */
typedef struct {
float m; // 整车质量 [kg]
float Iz; // 横摆转动惯量 [kg*m²]
float a; // 质心到前轴距离 [m]
float b; // 质心到后轴距离 [m]
float Cf; // 前轮侧偏刚度 [N/rad]
float Cr; // 后轮侧偏刚度 [N/rad]
float mu; // 路面附着系数
} VehicleParams;
void CalcReferenceValues(VehicleParams *p, float Vx, float delta,
float *beta_ref, float *r_ref) {
float L = p->a + p->b;
float K = (p->m / (L * L)) * (p->b/p->Cf - p->a/p->Cr);
// 稳态横摆角速度参考值
float r_steady = (Vx / L) * delta / (1.0f + K * Vx * Vx);
// 路面附着限制
float r_max = p->mu * 9.81f / Vx;
// 取较小值,保留符号
*r_ref = (fabsf(r_steady) < r_max) ? r_steady :
(r_steady > 0 ? r_max : -r_max);
// 质心侧偏角参考值:理想为0
*beta_ref = 0.0f;
}
避坑指南:注意Vx不能为0。我一般会在调用前加一个判断:if(Vx < 0.5f) 直接返回上一帧的值。否则除零错误会让你的控制器瞬间“放飞自我”。
2.6 本章小结
这一章我们做了三件事:
- 推导了二自由度单轨模型的微分方程
- 确定了质心侧偏角的参考值为0
- 给出了横摆角速度参考值的计算公式,并考虑了路面附着限制
嗯,到这里,我们的“基准尺”已经做好了。下一章,我们会用这把尺子去量实际车辆的状态,看看偏差有多大——那就是控制器的输入信号了。
记住:模型是死的,但脑子是活的。实际项目中,参数C_f、C_r会随着轮胎磨损、载荷变化而改变。我建议你在标定阶段,多测几组不同工况下的数据,把参数表做扎实。
公众号:蓝海资料掘金营,微信deep3321