4、技术安全概念(TSC):系统架构设计、冗余与多样性、故障检测与响应

好,咱们进入正题。技术安全概念,简称 TSC。说白了,就是把功能安全需求落实到具体的系统架构和电路设计里。这一步非常关键,它决定了你的感知系统到底安不安全。

我个人习惯把 TSC 分成三大块来思考:架构怎么搭冗余怎么做故障怎么管。这三块缺一不可。你想想看,架构是骨架,冗余是肌肉,故障检测与响应是神经系统。没有骨架,系统立不起来;没有肌肉,扛不住冲击;没有神经系统,出了事你都不知道。

4.1 系统架构设计:打好安全的基础

架构设计,我建议从顶层开始往下拆。感知系统通常包含传感器、信号处理、决策输出这几个环节。每个环节都可能出问题。

举个例子,我在项目中遇到过摄像头被泥水遮挡的情况。如果架构里没有考虑遮挡检测,系统就会把错误的图像数据当成有效输入,后果很严重。

所以,架构设计要遵循几个原则:

  • 模块化:每个功能模块职责清晰,边界明确。这样出了问题好定位,也好隔离。
  • 分层设计:感知层、融合层、决策层要分开。层与层之间定义好接口,避免耦合过深。
  • 安全机制内嵌:不要把安全当成事后补丁。架构阶段就要把监控、诊断、降级这些机制考虑进去。

核心观点:架构设计不是画几张框图就完事了。你得问自己:如果这个模块挂了,系统会怎样?如果那个信号错了,后果是什么?这些问题想清楚了,架构才算合格。

4.2 冗余与多样性:别把所有鸡蛋放一个篮子里

冗余,大家都不陌生。但我要强调一点:冗余不是简单的复制粘贴。

我曾经见过一个设计,用了两颗完全相同的摄像头做冗余。结果呢?一场大雨,两颗摄像头同时起雾,双双失效。这就是典型的「共因失效」——同样的设计、同样的工艺、同样的环境,一个挂了,另一个也跑不掉。

所以,我建议引入多样性。多样性可以从几个维度考虑:

维度 说明 举例
硬件多样性 使用不同原理的传感器 摄像头 + 激光雷达 + 毫米波雷达
软件多样性 不同算法实现同一功能 基于CNN的目标检测 + 基于传统视觉的目标检测
时序多样性 不同时间触发或采样 主路径50Hz,冗余路径20Hz
供电多样性 独立电源域 主系统用12V,安全系统用独立电池

冗余的粒度也要注意。我习惯把冗余分为三个层级:

  1. 传感器级冗余:比如两个摄像头同时看前方。
  2. 处理通道级冗余:比如两路独立的处理单元,各自计算,然后交叉验证。
  3. 决策级冗余:比如两个独立的决策逻辑,输出结果做仲裁。

我的经验:冗余不是越多越好。每增加一路冗余,成本、功耗、重量都会增加。关键是找到那个「够用」的点。对于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 阶段多花点心思,后面验证阶段就能少掉很多头发。

好,这一章就到这里。下一章我们聊聊「安全机制的具体实现」,到时候我会拿一个实际的激光雷达案例来拆解。