1. 车道保持系统概述:什么是LKA/LDW、功能安全等级ASIL、系统输入输出定义
各位同学,欢迎来到这门实战课。我是你们的老朋友,一个在嵌入式汽车电子领域摸爬滚打了十几年的工程师。今天咱们正式开始聊车道保持系统。
说实话,我第一次接触这个功能是在2015年,那时候给一家Tier1做域控制器。客户要求实现LKA,我当时觉得不就是让车沿着线走嘛,能有多难?结果被现实狠狠教育了一顿。嗯,咱们慢慢聊。
1.1 什么是LDW和LKA?
这两个缩写,你肯定见过。但很多人搞混它们。
- LDW(Lane Departure Warning):车道偏离预警。说白了,就是车要压线了,它提醒你。只报警,不控制。
- LKA(Lane Keeping Assist):车道保持辅助。这个更进了一步,它会主动帮你打方向盘,把车拉回车道中间。
我见过不少项目,客户一开始只要求LDW,后来发现光报警没用,驾驶员该睡还是睡。于是升级到LKA。但LKA也不是万能的,后面我会讲它的局限性。
核心区别一句话:LDW是“动嘴”,LKA是“动手”。
1.2 功能安全等级ASIL
做汽车嵌入式,你绕不开功能安全。尤其是LKA这种涉及横向控制的功能。
ISO 26262把安全等级分成了A、B、C、D四个级别。D是最严格的,A是最宽松的。LKA一般要求ASIL B或ASIL C,具体看OEM的要求。
| 等级 | 严重度 | 暴露概率 | 可控性 | 典型应用 |
|---|---|---|---|---|
| ASIL A | 轻度伤害 | 低 | 容易控制 | 车窗升降 |
| ASIL B | 中度伤害 | 中 | 一般可控 | LKA、ACC |
| ASIL C | 严重伤害 | 高 | 难以控制 | EPS、制动 |
| ASIL D | 致命伤害 | 极高 | 几乎不可控 | 安全气囊 |
注意:我曾经在一个项目里,因为低估了ASIL等级,导致后期重新做安全分析,整个软件架构推倒重来。那叫一个酸爽。所以,项目一开始就要和功能安全工程师确认好等级。
1.3 系统输入输出定义
搞嵌入式,你得先搞清楚系统要什么、给什么。LKA系统的输入输出,我习惯分成三类:感知、决策、执行。
1.3.1 输入信号
- 摄像头数据:车道线信息(左线、右线、曲率、置信度)。这是核心输入。
- 车辆状态:车速、横摆角速度、方向盘转角、转向灯状态。
- 驾驶员意图:是否手握方向盘、是否踩刹车、是否打转向灯。
- 系统状态:ACC是否激活、ESP是否介入。
你想想看,如果驾驶员打了转向灯,LKA还强行把车拉回来,那得多吓人?所以转向灯信号必须优先处理。
1.3.2 输出信号
- 转向请求:给EPS(电动助力转向)的扭矩或角度请求。
- 报警信号:给仪表盘的视觉/听觉报警。
- 状态反馈:系统是否激活、是否故障、是否被Override。
个人经验:输出信号一定要做合理性检查。比如你请求的扭矩不能超过EPS的物理极限。我曾经见过一个bug,因为扭矩请求溢出,导致方向盘突然打到底。还好是在测试场,不然后果不堪设想。
1.4 一个简单的系统框图
咱们用伪代码描述一下LKA的主循环逻辑。别急,后面章节会展开讲每个模块。
// LKA主循环(伪代码)
void LKA_MainLoop(void)
{
// 1. 读取输入
LaneInfo_t lane = Camera_GetLaneInfo();
VehicleState_t veh = Vehicle_GetState();
// 2. 安全检查
if (veh.turnSignal == ACTIVE) {
LKA_Disable(); // 转向灯优先
return;
}
// 3. 计算控制量
float steerAngle = LKA_ComputeSteerAngle(lane, veh);
// 4. 输出到EPS
EPS_SetSteerRequest(steerAngle);
// 5. 状态上报
LKA_ReportStatus();
}
这段代码看着简单,但实际工程里,每一步都有大量的边界条件和安全机制。比如第3步,如果车道线置信度低于阈值,你该怎么办?是保持上次的控制量,还是平滑退出?这些我都会在后面的章节里一一拆解。
1.5 本章小结
咱们这一章,说白了就是给LKA系统画了个轮廓。你知道了:
- LDW只报警,LKA会控制。
- 功能安全等级不是闹着玩的,LKA至少ASIL B。
- 输入输出要清晰,尤其是转向灯优先级。
下一章,咱们会深入聊摄像头数据怎么处理,车道线怎么拟合。那才是真正考验嵌入式C语言功底的地方。准备好了吗?
课后思考:如果摄像头被泥巴糊住了,LKA应该怎么处理?是直接退出,还是降级到LDW?想想看,没有标准答案。
公众号:蓝海资料掘金营,微信deep3321