4、技术安全概念(TSC):系统架构设计、冗余与多样性、故障检测与响应
好,咱们进入正题。技术安全概念,简称 TSC。说白了,就是把功能安全需求落实到具体的系统架构和电路设计里。这一步非常关键,它决定了你的感知系统到底安不安全。
我个人习惯把 TSC 分成三大块来思考:架构怎么搭、冗余怎么做、故障怎么管。这三块缺一不可。你想想看,架构是骨架,冗余是肌肉,故障检测与响应是神经系统。没有骨架,系统立不起来;没有肌肉,扛不住冲击;没有神经系统,出了事你都不知道。
4.1 系统架构设计:打好安全的基础
架构设计,我建议从顶层开始往下拆。感知系统通常包含传感器、信号处理、决策输出这几个环节。每个环节都可能出问题。
举个例子,我在项目中遇到过摄像头被泥水遮挡的情况。如果架构里没有考虑遮挡检测,系统就会把错误的图像数据当成有效输入,后果很严重。
所以,架构设计要遵循几个原则:
- 模块化:每个功能模块职责清晰,边界明确。这样出了问题好定位,也好隔离。
- 分层设计:感知层、融合层、决策层要分开。层与层之间定义好接口,避免耦合过深。
- 安全机制内嵌:不要把安全当成事后补丁。架构阶段就要把监控、诊断、降级这些机制考虑进去。
核心观点:架构设计不是画几张框图就完事了。你得问自己:如果这个模块挂了,系统会怎样?如果那个信号错了,后果是什么?这些问题想清楚了,架构才算合格。
4.2 冗余与多样性:别把所有鸡蛋放一个篮子里
冗余,大家都不陌生。但我要强调一点:冗余不是简单的复制粘贴。
我曾经见过一个设计,用了两颗完全相同的摄像头做冗余。结果呢?一场大雨,两颗摄像头同时起雾,双双失效。这就是典型的「共因失效」——同样的设计、同样的工艺、同样的环境,一个挂了,另一个也跑不掉。
所以,我建议引入多样性。多样性可以从几个维度考虑:
| 维度 | 说明 | 举例 |
|---|---|---|
| 硬件多样性 | 使用不同原理的传感器 | 摄像头 + 激光雷达 + 毫米波雷达 |
| 软件多样性 | 不同算法实现同一功能 | 基于CNN的目标检测 + 基于传统视觉的目标检测 |
| 时序多样性 | 不同时间触发或采样 | 主路径50Hz,冗余路径20Hz |
| 供电多样性 | 独立电源域 | 主系统用12V,安全系统用独立电池 |
冗余的粒度也要注意。我习惯把冗余分为三个层级:
- 传感器级冗余:比如两个摄像头同时看前方。
- 处理通道级冗余:比如两路独立的处理单元,各自计算,然后交叉验证。
- 决策级冗余:比如两个独立的决策逻辑,输出结果做仲裁。
我的经验:冗余不是越多越好。每增加一路冗余,成本、功耗、重量都会增加。关键是找到那个「够用」的点。对于ASIL D的系统,我通常建议至少做到处理通道级冗余。
4.3 故障检测与响应:发现问题,更要解决问题
故障检测,说白了就是「怎么知道出事了」。响应,就是「出事了怎么办」。
故障检测的手段有很多,我挑几个常用的说说:
- 合理性检查:比如车速信号突然从60km/h跳到200km/h,明显不合理,直接标记为故障。
- 超时监控:某个模块应该在10ms内给出结果,结果等了50ms还没动静,那就是出问题了。
- CRC校验:数据传输过程中有没有被篡改?CRC一算就知道。
- 看门狗:程序跑飞了?看门狗会把它拉回来。
- 交叉比较:两个冗余通道的结果不一致?触发安全响应。
嗯,这里要注意。检测到故障之后,响应策略要提前定义好。不能等到故障发生了再想怎么办。
我常用的响应策略有这几种:
| 响应等级 | 描述 | 适用场景 |
|---|---|---|
| 降级运行 | 关闭故障功能,保留核心安全功能 | 摄像头故障,但雷达还能用 |
| 安全停车 | 执行受控的停车操作 | 关键传感器全部失效 |
| 故障容错 | 利用冗余通道继续运行 | 主通道故障,切换到冗余通道 |
| 紧急报警 | 通知驾驶员或远程监控中心 | 任何检测到的安全相关故障 |
避坑指南:我曾经犯过一个错误——故障检测的阈值设得太严。结果系统频繁触发降级,用户体验极差。后来我学乖了,阈值要留一点余量,同时加入「去抖」机制,避免瞬态干扰导致误报。
4.4 一个简单的故障检测代码示例
光说不练假把式。我写个简单的故障检测逻辑,大家感受一下。
// 故障检测示例:合理性检查 + 超时监控
typedef struct {
uint32_t timestamp;
float speed;
uint8_t crc;
} SensorData_t;
bool CheckSensorPlausibility(SensorData_t *data) {
// 合理性检查:速度不能超过物理极限
if (data->speed > 250.0f || data->speed < 0.0f) {
return false; // 故障
}
// 超时监控:数据时间戳不能太旧
uint32_t now = GetSystemTick();
if ((now - data->timestamp) > 100) { // 超过100ms
return false; // 故障
}
// CRC校验
uint8_t calc_crc = CalculateCRC8((uint8_t*)data, sizeof(SensorData_t)-1);
if (calc_crc != data->crc) {
return false; // 故障
}
return true; // 数据正常
}
这段代码很简单,但涵盖了三个基本的故障检测手段。实际项目中,你还要考虑故障的累积、故障的确认次数、故障恢复条件等等。
4.5 小结
技术安全概念,说到底就是三件事:架构要稳、冗余要巧、检测要准。这三件事做好了,你的感知系统就有了安全底线。
我做了这么多年功能安全,最大的体会就是:安全不是测试出来的,是设计出来的。TSC 阶段多花点心思,后面验证阶段就能少掉很多头发。
好,这一章就到这里。下一章我们聊聊「安全机制的具体实现」,到时候我会拿一个实际的激光雷达案例来拆解。