综合项目 / 老人跌倒监护 / EXP-01
EXP-01 · 第 1 章 · 验证性 · 4 学时

需求分析:从居家场景到 R1–R12

写代码之前先把"合同"签好。本实验从老人居家跌倒监护的真实场景出发,把系统职责拆成 R1–R12 十二条可验收需求,按输入 / 检测 / 判定 / 交互 / 告警 / 证据 / 调试七个维度分组,画出跌倒检测、语音询问、告警存档三条核心时序,并明确"先问后救"设计背后的六大时序防护 —— 后面八个实验的每一段代码都能回溯到这里。

难度 ⭐ · 4 学时 需求工程R1-R12 三条核心时序六时序防护

01问题引入:居家跌倒为什么必须"先问后救"

我国独居与空巢老人数量庞大,跌倒是老年人伤害致死的首因之一。跌倒后能否在黄金时间被发现,决定了预后好坏 —— 但如果系统"一惊一乍",误报几次之后就会被家属直接拔电。一个真实的监护系统要同时满足:

1看得见:持续接入摄像头视频流,检测并跟踪画面中的老人(R1–R3)
2判得准:用躯干角、宽高比等几何特征判定跌倒,而不是单帧"看着像"(R4)
3先问后救:跌倒确认后先温和询问,老人应答"没事"则取消,沉默或呼救才升级告警(R5、R6)
4报得出、查得到:告警可靠送达下位机,且全过程留证可回溯(R7、R8、R11)
💡 为什么"先问后救"是需求而不是实现细节卧床翻身、弯腰捡东西、坐下躺下都"形似跌倒"。先询问、给老人一个亲口取消的机会,是对老人自主权的尊重,也是把误报率压到可接受水平的唯一路径 —— 所以它必须写进需求(R5),而不是留给算法碰运气。

02原理通俗讲解:R1–R12 像一份"养老服务合同"

把需求想象成家政服务合同的条款:每一条都能验收 —— 做到了就是做到了,没做到就是没做到,不能含糊。十二条规定七个维度:

维度需求编号通俗理解(合同条款)
输入R1"眼睛":持续接收摄像头视频流
检测R2、R3"认出人":框出画面里的老人并持续跟踪,多人不跟丢
判定R4"下判断":躯干角 > 50°、宽高比 < 0.5 等几何特征判定跌倒姿态
交互R5、R6、R9、R10"搭句话":跌倒后先语音询问(R5);未跌倒但听到呼救直接告警(R6);播报与聆听的窗口管理(R9、R10)
告警R7、R8"叫人来":向串口/下位机发告警,触发灯光、蜂鸣等现场提醒
证据R11"留凭据":告警前后视频、图片与事件日志落盘,事后可查
调试R12"可彩排":--text 文本通道驱动同一台状态机,无摄像头/无麦克风也能回归测试
🔔 R5 vs R6:两条独立的告警路径R5 是"跌倒 → 确认 → 询问 → 升级/取消"的完整确认流;R6 是"没跌倒但喊'救命'"的直通流 —— 人还清醒、能呼救,本身就意味着情况危急,不该再等 12 秒确认。两条路径互不依赖,混为一谈是需求分析最常见的错。

03关联知识点:需求条目 ⇄ 系统模块映射

本课程的分层架构(EXP-02)不是凭空画的,每一层都"认领"了若干需求:

感知层
承接 R1–R4

视频流接入、YOLOv8 人体检测、BlazePose/RTMPose 姿态估计、躯干角与宽高比几何计算 —— 判定的全部原料在这里产出。

决策层
承接 R4–R6、R9、R10

六状态机 IDLE→FALLING→LYING→ASK→ALERT/CANCELLED 把几何特征翻译成"要不要问、要不要报"的时序决策。

交互层
承接 R5、R6、R9、R10

TTS 播报"您还好吗"、ASR 聆听确认词(救命/帮/疼/起不来)与取消词(没事/不用),12s 超时升级。

输出层
承接 R7、R8、R11

0xAA55 + CRC8 串口告警帧驱动 LED/蜂鸣器/OLED,证据链落盘三件套与 events.jsonl。

调试通道
承接 R12

--text 文本输入直接喂进 voice_loop —— "小飞小飞"相当于唤醒、"救命"相当于呼救、"没事"相当于取消,与音频通道同一台状态机。

明确不做
非目标(docs/01)

不做 ROS 业务节点、不做多人会话仲裁 —— 需求文档同样规定"什么不做什么",防止范围蔓延。

04实验目标

  • 能复述并按七个维度默写 R1–R12 十二条需求,说清每条的验收标准
  • 能准确区分 R5(跌倒后询问) 与 R6(呼救直告警) 两条独立路径
  • 能画出跌倒检测、语音询问、告警存档三条核心时序的关键节点(含 1.5s / 3.0s / 12s 时间参数)
  • 能说出六大时序防护各自的"防的是什么"(播报竞态、迟到回复、重复询问……)
  • 完成 docs/01 需求文档的覆盖核对:每条 R 编号都能指到对应模块与代码位置

05实验环境与准备

1硬件到位:深度摄像头 + XFM 六麦阵列 + 工控主机(详见课程总览;本实验以文档精读为主,硬件仅需在场)
2进入工程目录:~/ros2_ws/src/xflz_eai_car1/app/elderly_companion,确认 docs/01 需求文档存在
3备好纸笔或绘图工具:三条核心时序要求手绘一遍,画过才算数
4预习 config/fall_config.yaml 的 state 段默认值:angle_thr 50.0 / aspect_thr 0.5 / falling_window 1.5 / lying_time 3.0 / ask_timeout 12.0 / cooldown 60.0(EXP-03 细讲)
💡 伦理准备本项目处理的是老人的视频与语音:讨论需求时就要确立"数据只留告警证据、不作他用、验证用素材不带真实身份"的隐私意识。

06动画讲解:需求全景与三条核心时序

上半幅是 R1–R12 的七维全景(高亮块循环点亮各维度),下半幅是"跌倒检测 → 语音询问 → 告警存档"三段时序的推进动画:

R1–R12 · 七维需求全景 输入 R1视频流 检测 R2·R3框人·跟踪 判定 R4躯干角·宽高比 交互 R5·6·9·10询问·聆听·播报 告警 R7·R8串口·现场提醒 证据 R11三件套·日志 调试 R12--text 回归 感知 → 决策 → 交互 → 告警 → 留证 · 每层认领对应需求 三条核心时序 · 报文推进 帧流入 1.5s 跌倒窗口 3.0s 躺姿确认 ① 跌倒检测时序 TTS 您还好吗 ASR 聆听 12s 救命→ALERT / 没事→取消 ② 语音询问时序 0xAA55+CRC8 告警帧 三件套 jpg/avi + jsonl cooldown 60s ③ 告警存档时序
动画 1-1|上:七个维度依次点亮,十二条规定各归其位;下:三条核心时序的关键节拍(1.5s → 3.0s → 12s → 60s)循环推进

07互动讲解:R5 与 R6 分流自查台

选一个场景,看系统按哪条需求、走哪条路径决策:

需求分流自查台 · R5 / R6 Router
// 选择一个场景,观察 R5 / R6 两条路径的决策差异 R5 路径:跌倒 → 确认(1.5s+3.0s) → 询问 → 答复判定 → 升级/取消 R6 路径:呼救关键词命中 → 不经确认直接告警
🙋 人文视角询问窗口给了老人"我没事,别麻烦别人"的机会 —— 对健康老人而言,被反复误报的骚扰本身就是一种伤害。需求里保留 R5,本质是保留老人说"不"的权利。

08实操步骤:精读 docs/01 并做覆盖核对

1进入工程目录,确认需求文档与配置文件就位
2通读 docs/01:逐条摘出 R1–R12,按七维分组做成核对表(本页第 02 节表格可作底稿)
3画三条核心时序:务必标出 1.5s 跌倒窗口、3.0s 躺姿确认、12s 询问超时三个时间参数
4对照"明确不做"清单(不做 ROS 业务节点、不做多人会话仲裁),给需求表加上边界列
5预读 config/fall_config.yaml 的 state 段,把需求中的时间参数与配置键一一对应
# ① 进入工程目录
cd ~/ros2_ws/src/xflz_eai_car1/app/elderly_companion

# ② 确认需求文档与配置存在(后续实验反复用到)
ls docs/ config/fall_config.yaml

# ③ state 段关键默认值 —— 三条核心时序的时间参数来源(config L57-L62 附近)
#   angle_thresh: 50.0      躯干角阈值(度)   → 判定需求 R4
#   aspect_thresh: 0.5      宽高比阈值        → 判定需求 R4
#   falling_window: 1.5     跌倒窗口(秒)     → 检测确认时序
#   lying_time: 3.0         躺姿持续(秒)     → 确认后才询问
#   ask_timeout: 12.0       询问超时(秒)     → 超时升级告警 R5
#   cooldown: 60.0          告警冷却(秒)     → 防重复轰炸
🔍 覆盖核对法核对表画两列:左列 R 编号、右列代码/配置位置。右列填不出来的 R,就是后面实验要重点盯的"悬空需求";左列有剩余代码找不到归属,就是范围蔓延。

09重点与易错点

  • R5 与 R6 是两条独立路径:R5 需要"跌倒确认"前置,R6 只要呼救关键词即告警
  • 三条时序必须包含1.5s / 3.0s / 12s 三个时间参数,缺了就不是本系统的时序
  • 六时序防护逐条能说出"防什么":播报竞态、ASR 无 partial 兜底、2s 快答强制提交、打断 epoch 丢弃迟到回复、单次应答去重、8s 静默重播归位
  • 需求有"边界":不做 ROS 业务节点、不做多人会话仲裁同样是需求的一部分
⚠️ 常见坑现象 → 解法
R5 / R6 混淆把"呼救直告警"也画进询问确认链 → R6 不经 ASK 确认流,单独成支
时序漏时间参数流程图画了"确认后询问"但没写 1.5s / 3.0s → 验收无法判定"确认"是否达标
把实现细节当需求需求里出现"用某个模型" → 需求写"检测画面中的人",模型选型属于设计(EXP-02/05)
忽略非目标自由发挥出多人仲裁功能 → 先查"明确不做"清单,防止范围蔓延
需求无验收标准"系统要稳定"没法测 → 每条 R 必须能指出可观察的验收动作

10总结与思考

✅ 完成成果
R1–R12 七维核对表

十二条规定、七维分组、三条核心时序手绘图与非目标边界清单。

🧠 原理收获
先问后救 + 六时序防护

理解为什么"确认升级"是伦理需求而非算法妥协,以及六道时序防线各防什么。

🛠 技能收获
覆盖核对方法

"左列需求、右列代码"的双向核对法,后续每个实验都复用。

❓ 排障思路
从行为反查需求

现场发现怪行为,先问"违反了哪条 R",再决定改需求还是改实现。

📝 思考题 1R6 规定"没跌倒但呼救 → 直接告警"。如果老人在说梦话或电视里有人喊"救命",会造成误告警 —— 在不改 R6 语义的前提下,你会在后续哪个实验(EXP-04 语音?EXP-06 状态机?EXP-08 LLM 语义判断?)加防线?说明理由。
📝 思考题 2cooldown 60s 意味着:一次告警后的 60 秒内,询问升级被抑制但新跌倒不被阻挡。请设计一个场景(老人摔倒 → 被扶起 → 再次摔倒),说明六状态机在这 60 秒内应如何表现才算满足 R5?把你的答案带到 EXP-06 验证。
CASE-03 · 老人跌倒监护 · EXP-01 需求分析(R1–R12) 4 学时 · 验证性 · 基于 elderly_companion 实验讲义改编