第二章:需求分析与系统定义

大家好,我是你们的老朋友。今天我们来聊聊自动驾驶系统里最容易被忽视、却又最致命的一步——需求分析与系统定义。

说实话,我见过太多团队,一上来就急着写代码、调算法。结果呢?做到一半发现需求没对齐,系统边界模糊不清,最后推倒重来。嗯,我自己也踩过这个坑。

2.1 功能需求与非功能需求

先说说功能需求。说白了,就是“系统要做什么”。比如:

  • 车辆能在高速上自动变道
  • 遇到红灯能自动刹停
  • 能识别行人并减速

这些都很直观。但真正让工程师头疼的,是非功能需求。

非功能需求,是“系统做得怎么样”。举个例子:

  • 感知延迟不能超过100ms
  • 系统可用性要达到99.99%
  • 功耗不能超过50W

我在项目中遇到过一件事。有一次,我们做L4级泊车系统,功能需求都写得很清楚。但客户验收时,发现系统在雨天识别率下降严重。为什么?因为非功能需求里没写“全天候环境适应性”。

所以我的建议是:功能需求和非功能需求,必须同时写、同时审、同时验。缺一个,后面都是雷。

重要提醒:非功能需求往往比功能需求更难量化。比如“系统要安全”,这太模糊了。你得写成“在单点故障下,系统能在200ms内切换到安全状态”。

2.2 系统边界定义

系统边界,就是你的系统管到哪、不管到哪。这听起来简单,但实际操作中经常打架。

举个例子:自动驾驶系统要不要管轮胎打滑?

  • 如果你管,那你就得集成ESP(车身稳定系统)的接口
  • 如果你不管,那你就得假设底层已经处理好了

我个人习惯,在项目启动时画一张系统上下文图。把外部实体(传感器、执行器、云端、驾驶员)都列出来,然后用箭头标出数据流向。

为什么要这么做?因为边界不清,会导致责任不清。我曾经见过一个项目,感知团队和规划团队互相推诿——感知说“我只要输出障碍物列表”,规划说“我需要感知告诉我障碍物的运动轨迹”。你看,这就是边界没定义好。

小技巧:用“输入-处理-输出”模型来定义每个模块的边界。输入是什么?输出是什么?处理逻辑归谁?写清楚,签个字,后面少吵架。

2.3 用例建模(UML)

用例建模,是UML里最实用的工具之一。它不画代码,不画类图,只画系统之间发生了什么。

比如一个“自动泊车”用例:

  • 参与者:驾驶员、车辆、停车场管理系统
  • 用例:搜索车位、规划路径、执行泊入、异常处理

你想想看,这个图一画出来,整个系统的功能边界就一目了然了。哪个功能是给谁用的?哪个功能依赖哪个外部系统?全清楚了。

我记得有一次评审,我们拿着用例图给客户看。客户说:“哦,原来你们这个‘紧急接管’用例,是驾驶员主动触发的,不是系统自动触发的。” 你看,一个图就避免了一场误解。

用例建模的步骤,我一般这么走:

  1. 找出所有参与者(人、系统、设备)
  2. 列出每个参与者的目标
  3. 把目标转化为用例
  4. 画出用例图,标注关系(包含、扩展、泛化)

注意:用例图不是流程图。别把每一步操作都画进去。用例是“用户视角的目标”,不是“系统内部的步骤”。比如“用户启动车辆”是一个用例,但“用户插入钥匙、踩刹车、按启动按钮”是操作步骤,别混了。

2.4 需求管理的最佳实践

最后,分享几个我在实际项目中总结出来的经验:

实践 说明
需求编号 每条需求都要有唯一ID,方便追溯和变更管理
需求优先级 用MoSCoW方法(Must/Should/Could/Won't)分级
需求验证 每条需求都要有对应的测试用例或验收标准
需求变更 建立变更控制流程,别让需求“悄悄变”

我曾经吃过一次大亏。项目做到中期,客户说“加一个功能吧,很简单”。我没走变更流程,直接让开发做了。结果那个功能影响了原有的时序约束,导致整个系统延迟超标。嗯,从那以后,我再也不敢跳过变更控制了。

好了,这一章的内容就到这里。需求分析看起来是“纸上谈兵”,但它是整个系统工程的基石。你想想看,如果地基没打好,后面盖再高的楼也是危楼。

下一章,我们会聊聊系统架构设计。到时候见。

核心总结:

  • 功能需求回答“做什么”,非功能需求回答“做得怎么样”
  • 系统边界定义要清晰,用上下文图辅助
  • 用例建模是沟通利器,别跳过
  • 需求管理要有流程、有编号、有验证

公众号:蓝海资料掘金营,微信deep3321