3. 应用层架构设计:功能需求分析、应用层模块划分、转向控制策略、路感模拟策略、故障诊断策略
好,我们进入第三章。这一章讲的是应用层,说白了就是SBW系统里最「有灵魂」的那部分。底层把信号收上来了,中间层把数据传上来了,那应用层要干什么?做决策、给手感、保安全。
我个人习惯把应用层比作「驾驶员和底盘之间的翻译官」。你转方向盘,它得懂你的意图;路面有反馈,它得模拟出真实手感;万一出故障,它还得知道怎么保命。嗯,责任不小。
3.1 功能需求分析:先搞清楚要做什么
做架构设计,第一步不是画框图,而是列需求。我见过不少团队上来就写代码,结果写到一半发现需求漏了,回头再补架构,那叫一个痛苦。
SBW应用层的功能需求,我一般分成三类:
- 核心控制需求:转向响应要快、要准、要稳。比如从中间位置到满舵,响应时间不能超过150ms。这是硬指标。
- 人机交互需求:路感要真实,不能像玩具车。低速轻、高速稳,这是基本。还要能模拟不同路面的反馈。
- 安全冗余需求:单点故障不能导致功能丧失。诊断要覆盖传感器、执行器、通信链路。故障后要能降级运行。
我曾经在一个项目里,客户说「路感要像宝马3系」。你想想看,这需求怎么量化?后来我们花了两个月,采集了上百组数据,才把「宝马3系手感」翻译成算法参数。所以,需求分析阶段多花时间,后面少流眼泪。
3.2 应用层模块划分:怎么拆才合理
需求清楚了,接下来就是拆模块。我的原则是:高内聚、低耦合、可测试。每个模块只干一件事,但要把这件事干到极致。
SBW应用层我通常拆成四个核心模块:
| 模块名称 | 核心职责 | 输入 | 输出 |
|---|---|---|---|
| 转向控制模块 | 计算目标转角,驱动执行器 | 方向盘转角、车速 | 目标前轮转角 |
| 路感模拟模块 | 生成方向盘反馈力矩 | 车速、前轮受力、路面状态 | 目标回正力矩 |
| 故障诊断模块 | 监控系统健康状态 | 所有传感器/执行器状态 | 故障码、降级指令 |
| 模式管理模块 | 切换驾驶模式、降级策略 | 驾驶员指令、故障状态 | 模式切换信号 |
这里要注意,模块之间的接口要尽量简单。我见过一个项目,路感模块和转向控制模块之间传了20多个信号,调试的时候根本分不清是谁的问题。后来我强制要求:模块间接口不超过5个信号。逼着大家去思考,哪些是真正必要的。
3.3 转向控制策略:怎么让车听话
转向控制的核心,说白了就是让前轮老老实实跟着方向盘转。但SBW没有机械连接,全靠算法,所以控制器的设计就特别关键。
我常用的架构是前馈+反馈的双环控制:
- 前馈环:根据方向盘转角、车速,查表得到一个基础的目标转角。这个表是标定出来的,不同车速下转向比不一样。
- 反馈环:用实际前轮转角做PID闭环,消除误差。我习惯加一个前馈项,把系统的非线性补偿掉,这样PID的压力就小很多。
给你看一段伪代码,这是我当年在项目里用的简化版:
// 转向控制主循环,周期 5ms
void SteeringControl_5ms(void)
{
// 1. 读取方向盘转角,单位:度
float steeringWheelAngle = GetSteeringWheelAngle();
// 2. 根据车速查转向比表
float ratio = LookupSteeringRatio(vehicleSpeed);
// 3. 计算目标前轮转角(前馈)
float targetWheelAngle = steeringWheelAngle / ratio;
// 4. 读取实际前轮转角
float actualWheelAngle = GetActualWheelAngle();
// 5. PID闭环控制
float error = targetWheelAngle - actualWheelAngle;
pidOutput = PID_Calculate(error);
// 6. 输出控制量到执行器
SetMotorTorque(pidOutput);
}
嗯,这里要注意一点:PID参数不能一套打天下。低速和高速的响应特性完全不同。我建议至少做三套参数:低速(0-30km/h)、中速(30-80km/h)、高速(80km/h以上),中间做平滑过渡。
避坑指南:我曾经在一个项目中,PID参数在低速时调得特别好,结果上了高速,车子开始轻微摆动。查了两天才发现,是高速时系统增益变了,PID积分项饱和了。后来加了抗饱和处理,问题解决。
3.4 路感模拟策略:让驾驶员「感觉」到路
路感模拟,是SBW系统里最「玄学」的部分。没有机械连接,你怎么让驾驶员觉得「这车有路感」?
我的做法是:把路感拆解成三个分量。
- 回正力矩:这是最主要的。车速越高,回正力矩越大。低速时回正力矩小,方向盘轻。这个可以用一个车速相关的函数来模拟。
- 阻尼力矩:防止方向盘来回摆动。阻尼系数和车速、转向速度都有关。我习惯加一个死区,避免微小抖动被放大。
- 路面激励:这是高阶功能。通过前轮上的加速度传感器,感知路面不平,然后叠加一个高频小幅度力矩到方向盘上。做得好的话,驾驶员能「感觉」到压到了石子。
你想想看,这三个分量叠加起来,就是一个比较真实的路感了。当然,具体参数要靠大量标定。我记得有一次,为了模拟「柏油路和水泥路的区别」,我们在试验场跑了整整一周,采集了上千组数据。
个人经验:路感模拟不要追求「绝对真实」,而是追求「一致性」。驾驶员习惯了某种手感后,只要每次开都一样,他就会觉得「这车手感好」。反倒是那种忽轻忽重的,最让人崩溃。
3.5 故障诊断策略:安全是底线
SBW是安全关键系统,故障诊断不是「锦上添花」,而是生存底线。我常说一句话:你可以没有路感,但不能没有诊断。
故障诊断策略,我分成三个层级:
- 传感器级诊断:每个传感器都要做合理性检查。比如两个转角传感器读数偏差超过5度,立刻报故障。还有信号范围检查、变化率检查。
- 执行器级诊断:电机有没有堵转?电流有没有超限?温度有没有过高?这些都要实时监控。我习惯在电机控制器里做主动短路测试,上电时自检一次。
- 系统级诊断:通信链路有没有丢帧?主从控制器的心跳是否正常?两个控制器之间的计算结果是否一致?
诊断到故障后,怎么处理?我建议用降级策略,而不是直接停机。比如:
| 故障等级 | 故障示例 | 降级策略 |
|---|---|---|
| L1(轻微) | 单个传感器噪声大 | 切换到冗余传感器,仪表盘报警 |
| L2(中等) | 主控制器故障 | 切换到从控制器,限制最大转向速度 |
| L3(严重) | 双控制器同时故障 | 启用机械备份(如果有),或安全停车 |
警告:千万不要把所有故障都设计成「停车」。你想想看,如果在高速上120km/h行驶,突然因为一个传感器故障就停车,那后果是什么?降级运行,安全回家,这才是诊断策略的核心思想。
3.6 本章知识体系总览
说了这么多,我画了一张图,把应用层的核心逻辑串起来。你一看就明白了。
这张图把四个模块的关系画得很清楚。转向控制和路感模拟是「两条腿走路」,一个管前轮,一个管方向盘。故障诊断和模式管理是「大脑」,监控全局,决定降级策略。
好了,应用层架构设计就讲到这里。内容不少,但都是干货。下一章我们会深入到底层驱动层,看看那些和硬件打交道的代码是怎么写的。
公众号:蓝海资料掘金营,微信deep3321