做四轮转向(4WS)整车控制,没个靠谱的参考模型打底,后面全是在空中盖楼。我刚接触4WS那会儿,最头疼的不是控制算法本身,而是找不到一个既简单又能说清楚问题本质的仿真模型。后来把二自由度线性模型在Simulink里搭稳了,整个项目的推进速度才真正提上来。
这个模型解决的核心问题很简单:在只考虑车辆侧向运动和横摆运动的前提下,把4WS车辆的前后轮转角输入,映射到车辆的横向加速度、横摆角速度等关键状态上。它不追求还原每一个细节,而是用最少的参数抓住车辆操纵稳定性的主要矛盾,特别适合做控制策略的前期验证、状态观测器设计,以及给学生或者刚入门的工程师讲清楚4WS的基础机理。
这篇文章我会把我自己踩过的坑、验证过的方法、以及模型背后的推导逻辑都整理出来,从动力学方程到Simulink模块搭建,再到测试工况设计和常见报错排查,一次说透。
1. 整体设计与思路拆解
1.1 为什么是“二自由度”,而不是更复杂的模型
二自由度模型在车辆动力学里属于“地基层”的存在。它把整车简化成只有两个运动自由度:侧向速度 ( v )(沿车辆坐标系y轴)和横摆角速度 ( r )(绕z轴旋转)。纵向速度 ( u ) 被当成一个常量参数来处理,不做动态求解。
3个自由度的模型已经把侧倾加进来了,7自由度、17自由度模型更是把每个车轮的旋转、悬架的运动都包含进去。层级越高,仿真精度越高,但对参数的要求也越苛刻。整车质量、转动惯量、质心位置、轮胎侧偏刚度,这些参数在项目早期经常是拍脑袋估出来的,用高自由度模型去跑,结果看起来精细,实际上哪哪都不对,根本没法指导控制算法设计。
二自由度模型最大的价值在于“用最少的参数,暴露最核心的问题”。它抓住了车辆响应中最重要的两个状态:横摆运动和侧向运动。对于4WS控制算法的初步验证来说,这两个自由度已经足够了。后续如果要把算法放到硬件在环(HIL)里跑,再切换到Carsim这类高精度车辆模型做联合仿真,二自由度模型作为算法开发阶段的“快跑骨架”,效率优势非常明显。
1.2 线性化假设的适用范围
这个模型全称里的“线性”两个字,指的是轮胎侧偏特性被线性化了。真实轮胎的侧偏力与侧偏角之间是典型的非线性关系,在小侧偏角(通常小于4度到5度)范围内,可以近似认为侧偏力与侧偏角成正比,比例系数就是侧偏刚度 ( C )。
线性模型把轮胎力简化为一条过原点的直线,这意味着它天然不适用于极限工况,比如急打方向、湿滑路面、轮胎接近附着极限的场景。在这些情况下,模型输出的状态会与实车差异巨大,拿它做控制验证就会出问题。
它的适用场景非常明确:正常行驶工况下的操纵稳定性分析、4WS控制算法的初步设计与验证、状态观测器的设计与调参。做这些工作的时候,线性模型提供的是一个“标准答案”式的基准平台,让算法开发可以快速迭代,这才是它在工程实践中的正确打开方式。
2. 模型推导与参数选择
2.1 动力学方程推导详解
建模时采用车身坐标系,原点位于车辆质心,x轴指向车辆前进方向,y轴指向驾驶员左侧。前轮转角为 ( \delta_f ),后轮转角为 ( \delta_r ),都规定逆时针为正。
首先定义前后轴的侧偏角。侧偏角的物理意义是轮胎实际运动方向与轮胎朝向之间的夹角。前轮侧偏角 ( \alpha_f ) 的表达式为:
[ \alpha_f = \delta_f - \frac{v + a \cdot r}{u} ]
后轮侧偏角 ( \alpha_r ) 的表达式为:
[ \alpha_r = \delta_r - \frac{v - b \cdot r}{u} ]
要注意的是,括号里的 ( (v + a \cdot r) ) 是质心侧偏角在前轴处产生的侧向速度分量,除以纵向速度 ( u ) 之后得到的是该处的运动方向角。
根据牛顿第二定律和力矩平衡,可以写出侧向力平衡方程和横摆力矩平衡方程。侧向力平衡方程描述的是车辆整体侧向运动:
[ m \cdot (\dot{v} + r \cdot u) = 2 \cdot C_f \cdot \alpha_f + 2 \cdot C_r \cdot \alpha_r ]
横摆力矩平衡方程描述的是车辆绕z轴的旋转运动:
[ I_z \cdot \dot{r} = 2 \cdot a \cdot C_f \cdot \alpha_f - 2 \cdot b \cdot C_r \cdot \alpha_r ]
把侧偏角表达式代入,可以整理成以 ( v ) 和 ( r ) 为状态变量的状态方程形式。整理后得到的 ( \dot{v} ) 方程和 ( \dot{r} ) 方程的系数如下:
[ \dot{v} = \frac{2 \cdot C_f + 2 \cdot C_r}{m \cdot u} \cdot v + \left( \frac{2 \cdot a \cdot C_f - 2 \cdot b \cdot C_r}{m \cdot u} - u \right) \cdot r + \frac{2 \cdot C_f}{m} \cdot \delta_f + \frac{2 \cdot C_r}{m} \cdot \delta_r ]
[ \dot{r} = \frac{2 \cdot a \cdot C_f - 2 \cdot b \cdot C_r}{I_z \cdot u} \cdot v + \frac{2 \cdot a^2 \cdot C_f + 2 \cdot b^2 \cdot C_r}{I_z \cdot u} \cdot r + \frac{2 \cdot a \cdot C_f}{I_z} \cdot \delta_f - \frac{2 \cdot b \cdot C_r}{I_z} \cdot \delta_r ]
这两个方程就是4WS二自由度模型的核心。注意 ( \delta_r ) 的符号:后轮转角的正方向定义在4WS控制中是一个容易出错的地方,后轮转角为正时,后轴产生的侧偏角减小,横摆力矩方向与前轮相反,所以方程中 ( \delta_r ) 相关项带负号。
2.2 关键参数表与单位陷阱
建模前先把参数表准备好,这是整个模型的地基。以下是我常用的一个典型B级车参数表,直接可以作为初版仿真参数的起点:
| 参数符号 | 物理含义 | 数值 | 单位 |
|---|---|---|---|
| ( m ) | 整车质量 | 1500 | kg |
| ( I_z ) | 绕z轴转动惯量 | 2500 | kg·m² |
| ( a ) | 质心到前轴距离 | 1.2 | m |
| ( b ) | 质心到后轴距离 | 1.4 | m |
| ( C_f ) | 前轴等效侧偏刚度 | 80000 | N/rad |
| ( C_r ) | 后轴等效侧偏刚度 | 90000 | N/rad |
| ( u ) | 纵向速度(常数) | 20 | m/s |
单位陷阱是新手最容易栽跟头的地方。侧偏刚度的常用单位是N/rad,但在有些资料里,特别是面向工程测试的资料里,侧偏刚度会以N/deg给出。如果直接把N/deg的数值代入方程,结果会差57.3倍,整个模型输出完全失真。换算方法很简单:1 rad约等于57.3 deg,N/rad的数值等于N/deg数值乘以57.3。
车速用km/h还是m/s也是一个高频问题。状态方程推导过程中 ( u ) 出现在分母位置,方程中的侧向速度 ( v ) 必须使用与 ( u ) 相同的单位体系。推荐在Simulink模型内部统一使用m/s,只有模型输入输出接口处做单位换算。我在模型的输入输出口各放一个Gain增益模块,专门处理km/h和m/s之间的换算,这样外部信号直接用km/h给,内部计算保持m/s,既直观又不容易出错。
2.3 参数获取的工程途径
如果手头没有整车参数,也不要卡在参数上,可以按下面几个途径来获取:
第一种是翻厂家公告和底盘调校资料。很多车辆的技术参数表里会给出轴距、质量、质心位置等信息,这些都是可以查到的。轮胎侧偏刚度可以查阅轮胎供应商的技术手册,或者参考同级别车型的公开论文数据。第二种是用Carsim软件自带车型的参数。Carsim的数据库里有大量车型的完整参数,可以直接借用它的B级车或者运动型轿车参数,这些参数经过了标定验证,可信度很高。第三种是通过辨识实验获取。这是最费时但最准确的方式,通过阶跃转向试验或者扫频转向试验实测车辆的横摆角速度响应,再用最小二乘法拟合模型参数。这个方法对设备和场地要求高,项目早期通常不需要这么做。
3. Simulink建模实操
3.1 两种建模路线:直接积分 vs 状态空间
Simulink里搭这个模型有两条路线,各有适用场景。
路线一是直接积分法。把 ( \dot{v} ) 和 ( \dot{r} ) 各自用积分器Integrator模块积分一次,得到状态变量,然后通过Gain模块和Sum模块将方程中的各个项连接起来。这种搭法非常直观,每个增益模块对应方程里的一个系数,信号流向和公式一一对应,排查问题时很容易定位。适合教学演示和状态量需要单独引出的场景。
路线二是状态空间法。把整车模型写成 ( \dot{x} = A \cdot x + B \cdot u ) 的标准形式,式中 ( x = [v, r]^T ),输入 ( u = [\delta_f, \delta_r]^T )。状态矩阵A和输入矩阵B的具体形式可以直接从上面的推导结果中读取。Simulink里用State-Space模块或者直接用矩阵增益模块加积分器来搭,一行模块就解决问题,维护成本极低。
我个人的惯例是:开发阶段用直接积分法搭,验证无误后切换到状态空间法封装成子系统,这样后续无论是做线性化分析还是做C代码生成,都非常方便。
3.2 面向4WS的模型搭建细节(状态空间法)
我这里详细展开状态空间法的搭建步骤,因为它和4WS的适配性最好。先创建一个新模型文件,打开Simulink Library Browser,把State-Space模块拖入模型。双击模块,在A、B、C、D矩阵对话框中填写参数。
State-Space模块默认的C矩阵对应输出方程 ( y = C \cdot x + D \cdot u )。如果想输出横向加速度 ( a_y ),需要留意横向加速度不只是一个状态量的直接输出,它还包含 ( r \cdot u ) 这一项。输出方程需要额外处理:
[ a_y = \dot{v} + r \cdot u ]
这里有个常见的错误:有些初学者直接把 ( v ) 或者 ( r ) 当输出,然后说模型响应不对。其实横向加速度才是车身真正感受到的侧向过载,是评价操纵稳定性的关键量。我的做法是在State-Space模块的C矩阵中直接把横向加速度纳入输出,这样外部不需要额外计算。具体C矩阵可以写成:
[ y = \begin{bmatrix} v \ r \ a_y \end{bmatrix} ]
其中第三行用动力学方程的关系式展开即可。更通用的做法是从模块输出 ( v ) 和 ( r ),外面再用Sum和Gain模块计算 ( a_y ),这样信号更灵活,想观测哪个量都能接出来。
输入端口方面,4WS模型比传统前轮转向模型多一个输入量 ( \delta_r )。用Constant模块或Signal Editor来产生后轮转角信号。4WS的后轮转角控制策略通常与车速有关,所以我会在主输入通道前加一个查表模块,根据当前车速给后轮转角加一个比例系数或目标转角值,这样可以非常方便地对比不同的4WS控制逻辑。
模型里还需要把纵向速度 ( u ) 作为常量处理。如果计划保留改变车速的可能性,可以把精度更高的变速模型稍作扩展:将 ( u ) 用参数方式定义(比如用Model Explorer里的Parameter),后续需要在不同车速下自动化批量仿真时,可以结合Simulink的parsim并行仿真工具或写循环脚本修改参数,批量运行分析不同车速下的车辆稳定性。这一招在控制参数标定时特别实用。
3.3 集成到现有项目的接口设计
模型搭好之后,考虑到4WS控制项目里模型通常不是孤立的,上游需要接收传感器信号或控制指令,下游需要输出状态给控制器或显示模块。建议把二自由度模型封装成一个子系统,用Inport和Outport做标准接口。封装的接口可以这样设计:
输入端口有前轮转角信号(单位deg)、后轮转角信号(单位deg)、纵向速度信号(单位km/h,可选)。输出端口有横摆角速度(单位deg/s)、侧向速度(单位m/s)、横向加速度(单位m/s²)。
子系统内部做单位和坐标系的统一换算,外部接口采用工程上最常用的单位,方便后期和Carsim或者其他车辆模型对接。这样封装之后,模型变成一个标准组件,后续做联合仿真时可以直接用。
接口对接时要特别注意信号类型的匹配。Carsim联合仿真时,Carsim输出的横摆角速度单位通常是deg/s,而Simulink模型内部计算用rad/s,接错单位输出直接爆炸。我在所有接口处都放一个带注释的Gain模块做单位换算,注释上写明换算关系,后来自己回看模型时省了非常多的时间。
4. 仿真测试与结果分析
4.1 测试信号设计:三种典型工况
模型搭好之后,第一件事不是急着跑结果,而是设计合理的测试信号。我自己常用的三种典型工况如下。
第一种是前轮角阶跃输入,这是操纵稳定性分析最经典的工况。模拟驾驶员瞬间把方向盘打到某个角度然后保持不动,观察车辆的横摆角速度和横向加速度如何从零过渡到稳态值。这个工况可以快速看出模型的稳态增益和响应快慢是否符合预期。4WS模型里,可以同时给前轮和后轮分别施加阶跃信号,实现前后轮同时转向的仿真,这是4WS模型区别于传统前轮转向模型的特有测试。
第二种是正弦扫频输入,用来分析系统的频率响应特性。在输入端口施加频率从0.1Hz到5Hz连续变化的正弦转角信号,记录横摆角速度输出的幅值和相位变化。扫频结果可以画出伯德图,这非常直观地反映了模型在不同频率下的跟随能力,对分析车辆的操纵稳定性很有帮助。
第三种是双移线工况,模拟车辆高速变道后再快速变回原车道。这个工况最接近实际驾驶中的紧急避障场景,前轮的转角信号可以按标准双移线测试规范生成。对于4WS车辆,后轮转角可以按同向比例控制生成,对比有后轮转向和没有后轮转向时车辆的横摆角速度峰值,差异一目了然。
4.2 4WS与传统前轮转向的特性对比
测试的核心价值在于通过仿真揭示4WS相对传统前轮转向(2WS)的特性差异。具体做法是搭两个模型:一个只有前轮转向输入,后轮转角恒为0;另一个同时输入前后轮转角。用同一个角阶跃信号激励,对比横摆角速度响应。
低速工况下(比如10m/s),4WS采用逆向转向策略,也就是后轮转角方向与前轮相反,可以显著减小车辆的转弯半径,横摆角速度响应更快,车辆灵活性明显提升。这个特性在城市低速掉头、窄路转弯时非常实用。
高速工况下(比如30m/s),4WS采用同向转向策略,也就是后轮转角方向与前轮相同,这时车辆的质心侧偏角明显减小,横摆角速度增益下降,车辆如同整体平移一般完成变道,横摆响应更平缓,稳定性更好。这个现象背后是后轮同向偏转产生的横摆力矩抵消了前轮产生的部分横摆力矩,从而抑制了车辆的过度转向趋势。
仿真中可以清晰复现上述特性。4WS的核心价值在于可以根据车速非线性地调整后轮转角方向和大小,使车辆在低速时更灵活、高速时更稳定。这也是为什么4WS控制算法的核心就是一个随车速变化的后轮转角映射关系。
4.3 仿真参数设置说明
仿真参数设置上,建议求解器选ode45或ode4(四阶龙格库塔法),仿真步长固定为0.001秒。这个模型本身刚度不大,变步长求解器跑起来很快,但如果后续在这个模型基础上挂了快速控制律或非线性环节,固定步长会更容易排查问题。仿真时长根据测试工况来定,角阶跃工况通常给5到10秒,正弦扫频工况需要足够长的时长覆盖多个频率周期,建议给30秒以上。
模型初始化时,所有积分器的初始状态都设为0。如果模型从非零状态开始仿真,初始段响应会出现明显的瞬态超调,影响对稳态响应的分析。
5. 常见问题与排查技巧实录
5.1 仿真发散或结果异常的现象与处理
这个模型结构简单,但实际搭建中出错的情况一点都不少。我把这些年见过的高频问题整理成了一张排查表:
| 现象 | 可能原因 | 处理办法 |
|---|---|---|
| 仿真刚开始就发散,输出瞬间达到10的几十次方 | 矩阵A中某个增益符号写反,比如 ( 2 \cdot a \cdot C_f ) 和 ( 2 \cdot b \cdot C_r ) 的系数符号错误 | 逐项核对状态方程系数,特别关注前轴与后轴贡献的符号差异 |
| 横摆角速度稳态值比经验值大几十倍 | 侧偏刚度单位用了N/deg而不是N/rad | 重查所有参数的物理单位,N/deg转N/rad需要乘以57.3 |
| 输出波形整体正常,但有高频毛刺 | 求解器步长过大,或者代数环导致数值振荡 | 把仿真步长减小一个数量级,或检查是否存在代数环 |
| 前轮转角给正,横摆角速度却为负 | 坐标系定义混乱,y轴方向取反了 | 统一坐标系定义,确保所有旋转方向遵循右手定则 |
| 4WS模型中后轮转角对响应没有影响 | 后轮输入通道没有正确接入状态方程 | 检查B矩阵第二行是否包含 ( \delta_r ) 项,确认后轮输入增益不为零 |
5.2 代数环问题与解决办法
在Simulink模型中,如果输出信号直接反馈到同一时刻的输入端口,就会形成代数环,导致求解困难。二自由度模型中一个典型的情况是:如果直接用 ( \dot{v} ) 输出计算横向加速度 ( a_y ),然后又把 ( a_y ) 作为控制算法的反馈输入回模型,这时输入到 ( v ) 积分的路径上没有任何延迟模块,Simulink就会提示检测到代数环。
解决办法很简单,在反馈回路中插入一个Memory模块或Unit Delay模块。这个延迟只有一步仿真步长,对低频车辆动力学特性影响可以忽略不计。实测下来,加上这个延迟后,模型的仿真速度和稳定性都明显改善。
5.3 与Carsim联合仿真时的模型匹配问题
很多读者做4WS项目最终都要走上Carsim和Simulink联合仿真的路线,到这一步就会遇到模型匹配问题。有了二自由度模型的基础,联合仿真时注意下面几个关键点就能平滑过渡。
Carsim输出的车辆状态是完整的高自由度结果,而二自由度Simulink模型运行在简化假设下,两者直接对比时必然存在差异。正确的做法是让二自由度模型作为控制器设计和前期验证的基准,Carsim作为最终验证平台。在联合仿真时,把控制器的输入信号从Carsim读取,控制器的输出送给Carsim的车辆模型,而二自由度模型此时只用来做观测器设计或者备份通道,不在回路中频繁切换,这样整体稳定性会好很多。
Carsim中的车速信号单位与Simulink模型中使用的单位必须严格对齐。Carsim的默认单位体系是国际单位制(m/s、rad/s),但它的有些版本里有单位显示配置,如果界面显示的是km/h,底层实际传递的仍然是m/s,需要确认清楚后再接管。
我开始做联合仿真时最常踩的坑是后轮转角接口的正负号约定不一致。Carsim的后轮转角接口采用ISO标准定义,而自己搭的Simulink模型中后轮转角正方向可能按SAE标准定义,两者接上后,车辆响应完全相反,排查了很久才发现是正负号问题。因此做联合仿真前,第一件事是核对两个平台之间的转角正负号定义是否一致。
5.4 从模型到C代码生成的注意事项
模型调通之后,如果把控制算法部署到快速控制原型设备或者ECU上,就要考虑Simulink模型的C代码生成。这里有一个实际开发中容易轻视的问题:二自由度车辆模型内部如果用了积分器,生成的C代码会包含动态内存分配和时间状态管理,这在定点数上运行的嵌入式环境里可能会有问题。
推荐的做法是在代码生成之前,把车辆模型部分从控制器部分中剥离出来,控制器部分单独生成代码。二自由度车辆模型本身是模拟量基准,不需要部署到实车控制器上,部署的只有基于它设计出来的控制算法。如果真的需要把整个模型部署到硬件在环环境,建议用离散积分器模块替代连续积分器,并手动指定固定步长,这样生成代码的实时性和可预测性都更好。
6. 最后再分享几个实战心得
写到这里,整个4WS二自由度线性模型的推导、搭建、测试和排查流程都梳理完了。最后补几个个人觉得特别值得分享的实战心得。
第一,模型搭建完成后,一定不要把默认的仿真结果直接当成正确答案。先用最简单的工况验证,比如让后轮转角恒为0、前轮给一个恒定转角,把模型退化成2WS模型,用经验公式估算稳态横摆角速度增益,对比模型输出是否接近。如果这一步对不上,后面所有的分析都不可信。稳态横摆角速度增益的估算公式为:横摆角速度增益等于纵向速度除以轴距再乘以一个与稳定性因数相关的修正项,这个值通常在0.2到0.4 s⁻¹范围内。这个验证步骤花不了两分钟,但能省下后面几天的排查时间。
第二,不要在模型里乱塞各种“临时”增益模块。很多调试现场习惯性地拿一个Gain模块临时修正信号方向,调试完成后又不清理,导致后期模型根本没法维护。我个人的习惯是所有的单位换算、方向修正都集中放在模型输入输出接口处做,并且用标签注释写明换算关系,这样模型内部永远是干净的物理量计算,排查问题效率翻倍。
第三,四轮转向控制算法真正考验人的不是模型本身,而是“在不同车速下后轮转角怎么映射才合理”。二自由度模型可以帮你快速验证各种控制策略,但它不会告诉你哪种映射最优。最优的映射需要结合实车试验或者高精度模型仿真来确定,这部分的经验积累没有捷径可走。先把二自由度模型玩透,再去碰更复杂的控制策略,这条路会走得顺很多。