第2章:车辆参考模型——二自由度单轨模型推导与参考值计算

各位同学,欢迎来到第二章。

上一章我们聊了车辆稳定性控制的大致框架。今天要啃的这块骨头,是整个算法的“基准尺”——二自由度单轨模型。说白了,就是给车辆画一个简化版的“数学替身”,用它来算出我们想要的理想状态。

我个人习惯把这一章叫做“定调子”。因为后面所有的控制逻辑,都要拿这个模型算出来的参考值去比对。模型不准,后面全白搭。

2.1 为什么要用二自由度模型?

你想想看,一辆真车有多少个自由度?四个轮子跳动、车身俯仰、侧倾、横摆……加起来十几个。如果全算进去,控制器还没跑起来,芯片先烧了。

所以,我们得做简化。二自由度模型只保留两个最关键的运动:

  • 横摆运动:绕Z轴的转动,也就是车头左右摆
  • 侧向运动:沿Y轴的平移,也就是车身侧滑

嗯,这里要注意:我们假设车速是常数,忽略俯仰和侧倾。这个假设在大多数稳定性控制场景下是成立的——因为ESC介入时,通常是在紧急工况,车速变化不大。

核心思想:用最简单的模型,抓住车辆失稳时最本质的两个物理量——横摆角速度 r 和质心侧偏角 β。

2.2 二自由度单轨模型推导

好,开始推公式。我尽量不跳步,因为当年我学的时候,最烦老师直接给结论。

先画个图。我们把左右轮合并到中心线上,变成“单轨”。前轮一个点,后轮一个点。

前轮 后轮 CG L = a + b a b V δ β r

图中: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 本章小结

这一章我们做了三件事:

  1. 推导了二自由度单轨模型的微分方程
  2. 确定了质心侧偏角的参考值为0
  3. 给出了横摆角速度参考值的计算公式,并考虑了路面附着限制

嗯,到这里,我们的“基准尺”已经做好了。下一章,我们会用这把尺子去量实际车辆的状态,看看偏差有多大——那就是控制器的输入信号了。

记住:模型是死的,但脑子是活的。实际项目中,参数C_f、C_r会随着轮胎磨损、载荷变化而改变。我建议你在标定阶段,多测几组不同工况下的数据,把参数表做扎实。


公众号:蓝海资料掘金营,微信deep3321