第3章:需求分析与建模

安全关键系统的需求规范

做飞控这么多年,我最大的体会是:需求规范写不好,后面全是坑。你想想看,一个飞控系统在天上飞,代码里一个逻辑错误可能就是机毁人亡。所以需求规范这件事,真不是走个过场。

安全关键系统的需求规范,说白了就是要把「人要做什么」翻译成「机器要做什么」。我个人习惯用三层结构来组织:

  • 系统级需求:描述整个飞控系统对外表现的行为。比如「飞机在失去GPS信号后,应能保持稳定飞行至少30秒」。
  • 软件级需求:描述软件模块要完成的功能。比如「导航模块应在GPS失效后,自动切换至惯性导航模式」。
  • 硬件级需求:描述硬件接口和性能约束。比如「IMU采样频率不低于200Hz,数据延迟不超过5ms」。

关键点:每一层需求都必须可验证、可追溯、无歧义。我在项目中遇到过,有人写「系统应快速响应」,结果测试时大家吵了半天——到底多快算「快速」?后来我们统一要求:所有时间指标必须带具体数值。

需求到模型的追溯方法

需求写完了,怎么保证模型真的实现了需求?这就涉及到追溯性。我个人最常用的方法是需求ID + 模型标签

具体做法是这样的:

  1. 每条需求分配一个唯一ID,比如 REQ-NAV-001
  2. 在Simulink模型中,给对应的模块打上标签,比如 req:REQ-NAV-001
  3. 用工具自动生成追溯矩阵,检查有没有需求没被实现,或者模型里有多余的功能

嗯,这里要注意:不要等到模型做完了再补追溯。我曾经有个项目,团队先画模型再补需求标签,结果发现30%的模型功能根本不在需求文档里——那些都是工程师「顺手加的功能」。这在安全关键系统里是绝对不允许的。

我的小技巧:在Simulink里用Requirements Toolbox,可以直接把需求文档链接到模型模块。鼠标点一下模块,就能看到对应的需求原文。这样审查的时候特别方便。

使用Simulink进行高层级建模

高层级建模,说白了就是先画骨架,再填血肉。我习惯把模型分成三个层次:

层次 内容 抽象程度
架构层 系统模块划分、数据流、控制流 最高
行为层 状态机、逻辑判断、模式切换 中等
算法层 具体控制律、滤波器、数学运算 最低

做高层级建模时,我建议先画架构层。比如一个飞控系统,我会先画出:

  • 传感器输入模块(IMU、GPS、气压计)
  • 状态估计模块(融合传感器数据)
  • 控制律模块(计算舵面指令)
  • 执行器输出模块(发送PWM信号)

这些模块之间用信号线连接,数据流向一目了然。等架构层确认没问题了,再往下细化每个模块的内部行为。

避坑指南:我曾经在架构层偷懒,把传感器融合和导航逻辑画在同一个模块里。结果后来要改导航算法,发现传感器融合也被牵连了。从那以后,我坚持每个模块只做一件事,接口定义清楚。

知识体系结构图

下面这张图,是我自己总结的需求分析与建模的核心逻辑。你可以把它当作本章的「地图」:

需求分析与建模核心逻辑 需求规范 系统级需求 → 软件级需求 → 硬件级需求 可验证、无歧义、带具体指标 需求到模型的追溯 需求ID分配 → 模型标签绑定 → 追溯矩阵生成 工具:Requirements Toolbox Simulink高层级建模 架构层 → 行为层 → 算法层 先画骨架,再填血肉 可追溯、可验证的安全关键模型

一个实际例子

拿「高度保持模式」来说。需求原文可能是:

REQ-ALT-001:当飞机进入高度保持模式时,高度误差应控制在±5米以内。

在Simulink里,我会先建一个架构层模块叫 AltitudeHoldController,输入是当前高度和目标高度,输出是升降舵指令。然后在行为层,用Stateflow画状态机:

  • 状态1:爬升/下降(误差大时)
  • 状态2:微调(误差小时)
  • 状态3:保持(误差在范围内)

最后在算法层,填入具体的PID参数。每个模块都打上需求标签 req:REQ-ALT-001。这样审查时,鼠标一点就知道这个模块对应哪条需求。

总结一下:需求规范是地基,追溯方法是钢筋,高层级建模是框架。三者缺一不可。我见过太多项目,模型画得漂亮,但一问「这个模块对应哪条需求」,没人答得上来——这种模型,我不敢让它飞上天。

专注资料整理