1. 线控转向仿真的整体架构与方案选型线控转向Steer-by-WireSBW这几年在底盘电控圈子里热度一直往上走原因很直接取消方向盘与转向轮之间的机械连接之后转向手感、传动比、主动回正这些特性全部变成可以自由标定的软件参数。但真要把这套东西落地实车试验的成本和风险都太高所以用Carsim做整车动力学、用Simulink做控制算法、两者联合跑仿真是目前最主流的验证路径。我这次要复现的是一套完整的线控转向仿真链路Carsim负责提供高精度的整车模型和轮胎、悬架、路面交互Simulink负责跑转向电机控制、方向盘力矩反馈、传动比可变策略这些算法两边通过联合仿真接口实时交换数据。整套东西跑通之后你可以拿它验证PID转角跟踪、路感模拟、主动回正、甚至后面接自动驾驶的横向控制。适合谁来参考如果你已经会一点Simulink基础操作知道PID是什么但对Carsim的接口配置、联合仿真的数据流、线控转向的模型结构还比较模糊那这篇内容基本就是照着抄作业的节奏。如果你是完全零基础建议先把Simulink的求解器和Carsim的界面摸一遍再回来不然中间有些配置项会看得云里雾里。方案选型上我做了几个关键取舍先摆出来整车模型用Carsim而不是自己搭自己用Simscape或者数学方程搭整车轮胎模型这一关就够喝一壶的。Carsim内置的轮胎模型比如PAC2002、FTire经过大量试验标定侧偏、纵滑、回正力矩这些特性可信度高省下来的时间可以全部投到控制算法上。控制算法用Simulink而不是Carsim内置Carsim自带的控制模块功能有限做变传动比、路感电机力矩规划这种需要频繁改逻辑的东西Simulink的灵活度完全不是一个量级。联合仿真用Carsim的S-Function接口这是最成熟的方案Carsim生成一个S-Function模块丢进Simulink两边各自用自己的求解器通过接口按步长交换变量。比FMU导出更直接调试也方便。注意Carsim和Simulink的版本兼容性是个大坑。Carsim 2019之后的版本对MATLAB的支持有明确的版本对应表装之前一定去Carsim安装目录下的文档里查一下版本对不上会出现S-Function编译失败或者仿真直接崩掉的情况。2. Carsim侧模型搭建与接口配置细节2.1 整车参数与转向系统设定打开Carsim之后第一步是选车型。线控转向仿真一般用C级或者D级轿车模型就够了Carsim的数据库里有现成的。选完之后重点改三个地方第一是转向系统。因为线控转向取消了机械连接Carsim里要把转向系统的机械传动部分处理掉。具体操作是在转向系统配置页面把转向柱刚度、阻尼这些参数设成极大或者直接旁路让前轮转角完全由外部输入控制。这一步的逻辑是线控转向里前轮转角是转向电机驱动的不由方向盘角度直接决定所以Carsim的转向系统要变成“接受外部转角指令”的模式。第二是整车质量与质心位置。这两个参数直接影响转向响应。我一般会记录下Carsim默认的簧载质量、质心高度、轴距后面在Simulink里算转向力矩的时候要用到。比如质心到前轴的距离a、到后轴的距离b算横摆角速度增益的时候离不开。第三是轮胎模型。线控转向仿真对轮胎侧偏特性的敏感度很高建议用PAC2002或者PAC89这两个模型参数全、收敛性好。如果用FTire仿真步长要压得很小不然容易发散。2.2 输入输出变量的定义联合仿真的核心就是变量映射。Carsim这边需要定义清楚哪些变量是Simulink传给Carsim的输入哪些是Carsim算完传给Simulink的输出。输入变量我定义了这几个IMP_STEER_L1、IMP_STEER_R1左前、右前轮的转角指令单位是度。线控转向里这就是转向电机执行的结果。IMP_FX_L1、IMP_FX_R1前轮纵向力如果要做驱制动联动的话需要。IMP_MY_L1、IMP_MY_R1前轮回正力矩这个在路感模拟里会用到。输出变量我关注这些Vx、Vy纵向、侧向车速AVz横摆角速度Beta质心侧偏角Steer_L1、Steer_R1实际前轮转角Fy_L1、Fy_R1前轮侧向力Mz整车横摆力矩这些变量在Carsim的I/O Channels里逐个勾选然后导出的时候会自动生成对应的S-Function接口。2.3 联合仿真接口的生成配置完变量之后在Carsim的Models菜单里选“Send to Simulink”Carsim会自动生成一个包含S-Function的Simulink模型模板。这个模板里已经配好了求解器设置和接口模块你直接在这个基础上改就行。这里有个细节Carsim生成的S-Function模块双击进去可以看到输入输出端口和你在Carsim里定义的变量是一一对应的。如果后面要加变量必须回到Carsim重新导出不能在Simulink里手动改端口。实操心得Carsim导出S-Function的时候建议把“Simulink Model”选项里的“Generate S-Function”和“Generate MEX-File”都勾上。MEX-File编译一次之后仿真速度会快很多尤其是做参数扫描的时候差别很明显。3. Simulink侧控制算法集成与PID调参3.1 线控转向控制器的整体结构Simulink这边的模型我分成了四个模块第一个是转角指令生成模块。这部分负责把方向盘角度或者自动驾驶下发的期望转角转换成前轮转角指令。线控转向的核心优势就在这里——传动比可以变。我实现了一个车速相关的变传动比策略低速时传动比小方向盘转一点前轮转很多方便泊车高速时传动比大转向更沉稳。具体实现用一个查表模块1-D Lookup Table输入是车速输出是传动比。我标定的曲线大概是0 km/h时传动比1240 km/h时1480 km/h时16120 km/h时18。这个曲线不是拍脑袋来的是根据“低速轻便、高速稳定”的原则结合Carsim里整车横摆角速度增益随车速的变化趋势反推出来的。第二个是PID转角跟踪控制器。输入是期望前轮转角和实际前轮转角的偏差输出是转向电机的力矩指令。这里用的是位置式PID因为转角控制本质上是位置控制。第三个是转向电机模型。线控转向的电机一般是永磁同步电机或者直流无刷电机在仿真层面我用一个一阶惯性环节加限幅来近似电机力矩指令经过一个时间常数约10ms的一阶惯性环节再经过一个最大力矩限幅比如±10Nm输出实际电机力矩。第四个是路感模拟模块。这部分根据前轮侧向力、回正力矩、车速这些信号反算出方向盘应该给驾驶员多大的反馈力矩。我用的公式是T_feedback K1 * Fy_L1 K2 * Mz K3 * Vx其中K1、K2、K3是标定系数需要根据实车手感反复调。仿真阶段可以先给一组经验值后面有实车数据再修正。3.2 PID参数整定的实操过程PID三个参数我一般按这个顺序来先调P。把I和D设成0P从一个小值开始加比如0.5然后跑一个阶跃转向工况方向盘从0度阶跃到90度看前轮转角的响应。P太小响应慢P太大超调甚至振荡。我最后P定在2.8左右阶跃响应上升时间约0.15s超调量控制在5%以内。再加I。I的作用是消除稳态误差。线控转向里稳态误差主要来自电机摩擦和轮胎回正力矩的干扰。I从0.1开始加加到0.5的时候稳态误差基本消掉了再大就会出现低频振荡。最后加D。D用来抑制超调和振荡。D从0.01开始加加到0.05的时候超调从5%降到2%左右再大就会放大噪声。因为Carsim输出的信号本身有数值噪声D太大会让电机力矩指令抖得厉害。调完之后我跑了一个正弦转向工况方向盘按0.5Hz正弦摆动跟踪误差在±0.3度以内这个精度对于仿真验证来说足够了。注意PID调参的时候一定要把Carsim的仿真步长和Simulink的求解器步长匹配好。Carsim默认步长是0.001sSimulink如果用变步长求解器两边数据交换的时间点会对不齐导致仿真结果出现毛刺。我一般把Simulink也设成固定步长0.001s求解器用ode4龙格库塔四阶。3.3 变传动比策略的实现细节变传动比是线控转向区别于传统转向的核心功能实现起来其实不复杂但有几个坑第一个坑是传动比切换时的突变。如果查表输出的传动比在某个车速点跳变前轮转角指令会跟着跳驾驶员会感觉方向盘“咯噔”一下。解决办法是对查表输出做一阶滤波时间常数设0.1s左右让传动比平滑过渡。第二个坑是低速大转角时的电机饱和。低速传动比小方向盘打满的时候前轮转角指令可能超过40度这时候电机力矩需求很大容易饱和。我在电机模型后面加了一个抗积分饱和anti-windup逻辑当电机力矩达到限幅值时PID的积分项停止累加。第三个坑是高速时的稳定性。高速传动比大前轮转角对方向盘输入不敏感但反过来前轮受到的侧向力扰动会通过路感模块传回方向盘。如果路感模块的增益太大高速时方向盘会抖。我的做法是路感增益也做成车速相关的高速时降低反馈力矩。4. 整车联动调试与仿真发散排查4.1 联合仿真的启动流程一切配置好之后启动顺序很重要先确认Carsim的S-Function已经正确编译在MATLAB命令行里能看到mex编译成功的提示。在Simulink里打开Carsim生成的模型模板确认S-Function模块的端口和Carsim里定义的变量一致。设置Simulink求解器为固定步长、ode4、步长0.001s。设置仿真时间一般先跑5秒看看。点击运行观察Carsim的动画窗口和Simulink的示波器。如果一切正常Carsim的动画窗口会显示车辆在动Simulink的示波器能看到前轮转角跟踪上期望值。4.2 仿真发散的常见原因与排查仿真发散是联合仿真里最常见的问题我踩过的坑大概有这么几类第一类步长不匹配。Carsim和Simulink的步长如果不一致或者Simulink用了变步长两边数据交换的时间点错位积分就会累积误差导致发散。解决办法就是两边都设固定步长而且步长要一样。第二类代数环。如果Simulink模型里存在直接馈通路径比如PID的输出直接影响到输入而求解器又没法解这个代数环仿真就会报错或者发散。解决办法是在反馈路径上加一个单位延迟模块Unit Delay打破代数环。第三类Carsim模型参数不合理。比如轮胎侧偏刚度设得太大、悬架刚度太小车辆在仿真里会自己振荡起来。这种发散和步长无关是模型本身的问题。排查方法是把Carsim单独跑不用Simulink看车辆能不能稳定直行。如果Carsim单独跑都发散那就是模型参数的问题。第四类PID参数太激进。P太大或者D太大控制量剧烈振荡通过联合仿真接口传回Carsim导致车辆动力学也振荡起来。排查方法是把PID的P和D都调小看仿真能不能稳住然后逐步加回去。下面这张表是我整理的排查速查表发散现象可能原因排查方法解决措施仿真一开始就报错版本不兼容或S-Function未编译检查MATLAB命令行有无编译错误重新编译或换兼容版本仿真跑几秒后数值爆炸步长不匹配或代数环检查两边步长设置检查反馈路径统一固定步长加Unit Delay车辆自己振荡Carsim模型参数不合理Carsim单独跑直行工况调整悬架、轮胎参数控制量高频抖动PID的D太大或信号噪声大观察PID输出波形减小D加低通滤波转角跟踪不上PID的P太小或电机限幅太低观察跟踪误差和电机力矩增大P提高限幅值4.3 仿真结果的验证方法仿真跑通之后怎么判断结果对不对我一般做三个验证第一个是稳态验证。给一个固定方向盘转角等仿真稳定后看横摆角速度是不是接近理论值。理论值可以用二自由度车辆模型的公式算ωz (Vx / (ab)) * (δ / (1 K*Vx^2))其中K是稳定性因数a、b是质心到前后轴的距离δ是前轮转角。如果仿真值和理论值差太多说明模型有问题。第二个是瞬态验证。给一个方向盘角阶跃输入看横摆角速度的响应时间、超调量、稳态值。这些指标和实车数据对比能判断模型的瞬态特性准不准。第三个是频域验证。给一个正弦扫频的方向盘输入看横摆角速度的幅频特性和相频特性。这个主要用于验证模型在高频段的保真度。实操心得Carsim的仿真结果可以导出成.mat文件在MATLAB里和理论值画在一起对比。我一般会把横摆角速度、侧向加速度、前轮转角这三个信号都画出来一眼就能看出哪里不对。5. 进阶扩展与工程化建议5.1 接入自动驾驶横向控制线控转向仿真跑通之后最自然的扩展就是接自动驾驶的横向控制。把转角指令生成模块的输入从方向盘角度换成路径跟踪算法输出的期望转角整个链路就变成了自动驾驶横向控制仿真。路径跟踪我推荐用纯跟踪Pure Pursuit或者模型预测控制MPC。纯跟踪实现简单适合快速验证MPC精度高但计算量大需要Simulink的MPC Toolbox支持。接入的时候注意一点自动驾驶下发的期望转角是前轮转角不需要再经过变传动比模块。变传动比只在人工驾驶模式下起作用。5.2 硬件在环HIL的过渡仿真验证完之后下一步一般是上HIL台架。Carsim支持实时仿真可以编译成实时目标运行在dSPACE或者Speedgoat上。Simulink这边的控制算法也可以自动生成C代码刷到真实的转向ECU里。从纯仿真到HIL最大的变化是实时性约束。仿真的时候步长可以很小HIL里步长受限于硬件性能一般1ms左右。所以控制算法的计算量要提前评估太复杂的算法比如高阶MPC可能需要简化。5.3 模型整理与版本管理Simulink模型跑久了容易乱我一般做这几件事子系统封装把转角指令生成、PID、电机模型、路感模拟各自封装成子系统接口用Bus信号统一。信号命名规范所有信号都起有意义的名字不要用默认的Signal1、Signal2。参数集中管理所有标定参数PID增益、传动比曲线、电机限幅放到一个MATLAB脚本里仿真前先跑脚本加载参数。版本管理用Git管理Simulink模型但要注意Simulink的.slx文件是二进制格式Git diff看不出内容变化。我一般同时导出.m脚本版本的模型方便对比。注意Carsim的模型文件.sim和Simulink模型.slx要放在同一个版本库里因为两者的接口是强耦合的。单独改一个忘了改另一个仿真就会报错。5.4 常见问题速查最后整理几个我被问得最多的问题QCarsim和Simulink联合仿真Carsim的动画窗口不显示车辆怎么办A检查Carsim的“Animation”设置里车辆模型有没有被隐藏。另外确认仿真确实在跑有时候Simulink报错了但Carsim窗口还开着看起来像没动。QPID调好了但换一个工况就不行了为什么APID是线性控制器车辆动力学是非线性的。低速和高速、小转角和大地转角车辆响应差别很大。解决办法是用增益调度Gain Scheduling不同工况用不同的PID参数。Q仿真速度太慢怎么加速A第一把Carsim的S-Function编译成MEX文件第二Simulink用固定步长避免变步长求解器的额外计算第三关掉Carsim的动画显示第四如果做参数扫描用MATLAB的parfor并行跑。Q线控转向的失效模式怎么仿真A在Simulink里加一个故障注入模块模拟电机失效、传感器失效、通信延迟这些场景。Carsim这边不需要改故障逻辑全部在Simulink里实现。这套仿真链路我从头搭到尾大概花了三周其中一半时间花在排查仿真发散和调PID上。现在回头看最关键的其实就是三点步长匹配、变量映射、PID别太激进。把这三点守住剩下的就是耐心调参数的事了。