综合项目 / 智慧工厂装货分拣码垛 / EXP-01
EXP-01 · 第 1 章 · 验证性 · 4 学时

需求分析:把用户的话变成 R1-R10 工程条款

"让机器人在工厂里装货、分拣、码垛,还要听得懂话、保得了命"——这样一句话怎么做成交付系统?本实验从需求的模糊性出发,逐条吃透 R1-R10 需求体系,画出三大任务的物流链,厘清 R8 语音打断与 R9 雷达急停的优先级分层,并完成一份结构化需求阅读笔记。

难度 ⭐ · 4 学时 R1-R10三大任务流程 R8/R9 打断分层纯文档阅读

01问题引入:一句话需求为什么做不成系统

项目启动会上,需求往往只有一句话:"做一个会装货、分拣、码垛的智能工厂机器人,能语音控制,要注意安全。"把它直接交给程序员会发生什么?

1"语音控制"——喊哪几句?喊破喉咙没反应算谁的 bug?(唤醒词集合未定义)
2"装货"——从哪抓、放到哪、抓几次?每次都要重新教一遍吗?(任务流程未定义)
3"注意安全"——离多近算危险?碰到就停还是持续 0.5 秒才停?(安全阈值未量化)
4于是项目组把口径固化为 R1-R10 十条需求:每条都可量化、可验收、可指派到具体节点
💡 一句话认知需求文档只回答两个问题:系统要做什么(功能边界)与边界在哪里(约束与阈值)。凡是"差不多、看着办"的表述,都要么变成量化参数(60°/20cm/0.5s),要么显式标注【待定】留待后续确认——绝不允许含糊地进入编码。

02原理通俗讲解:开餐厅,先定菜单再排厨房工位

需求工程听起来抽象,其实和开一家餐厅一模一样——没有人先买锅碗瓢盆再想卖什么菜:

🍳 菜单 = R1-R10 条款
先定"卖什么菜"

菜单没定就采购,食材全浪费。菜单就是需求边界:装货、分拣、码垛三道"菜品"(R4-R6),点菜方式是"语音"(R1-R3)。

🧑‍🍳 厨房工位 = 五节点架构
再排"谁干什么活"

切配、掌勺、传菜各司其职(EXP-02 的五节点)。工位安排错了,再好的菜单也出不了菜——这就是"先需求后架构"的顺序。

📋 传菜条 = 接口设计
工位之间怎么说话

传菜条上写什么(口味、桌号)就是接口的消息字段(EXP-03)。写模糊了,传错菜是常态。

🔔 传菜叫号 = 固定播报
对顾客只说标准话术

R3/R7 约束:大模型只负责把"顾客的话"翻译成点菜动作,"您的菜好了"永远是固定话术——后厨不即兴发挥,上错的风险就小。

🛑 后厨急停阀 = 安全联锁
出事先断力,再讲道理

R9:有人靠近灶台 20cm 内停留 0.5 秒,整锅立刻停火——来不及请示,量化阈值才是保命的。

🧪 试营业 = 全功能验证
验收表就是试吃单

EXP-09 按 TS 测试用例逐条过——菜单、工位、急停全部演练一遍,才敢开门迎客。

🔍 工程化思路主线本课程九个实验就是这条主线的展开:需求(菜单)→ 架构(工位)→ 接口(传菜条)→ 功能实现(出菜)→ 验证(试营业)。顺序不可颠倒:菜单没定就炒菜,炒出来的没人点;接口没定先写节点,联调时对不上暗号。

03关联知识点:R1-R10 体系与两大打断

知识点 1.1.1 · R1-R10 需求体系(前置:ROS 2 话题/服务/参数基础)。按四个维度分组,逐条标注"可量化约束":

分组条款一句话要点可量化约束
交互R1-R3单轮语音闭环:唤醒→ASR→LLM 意图→执行→播报意图枚举 load/sort/palletize;一律走大模型意图解析、不用关键词匹配;大模型只做功能映射,播报用固定文案
任务R4-R6装货 / 分拣 / 码垛三大任务R4.1:每步操作完成后必须先回 work 姿态才能进行下一步
播报打断R7-R8固定文案播报;语音唤醒打断四步复位中断动作 → 回 work → 流水线停止 → 取消任务
安全R9-R9.1雷达危险检测释放力矩;打断分层前方 60°(0° 为中心 ±30° 跨 0° 环绕)+ 20cm 内 + 持续 0.5s → 释放 6 个总线舵机力矩 + danger=true;雷达打断 > 语音打断
工程R10工程组织与文档结构docs/01 需求总览等文档行号可追溯

知识点 1.1.2 · 三大任务流程——物流链总览(docs/05_流程与安全.md):

# 物流链(每个阶段收尾都有"回 work"这一步安全握手)
装货区  →  分拣区  →  流水线(定点停靠)  →  码垛区
 R4 视觉抓取    R5 抓取放流水线   送料+光电定点停      R6 定点取料码放
        ⟳ 回work        ⟳ 回work        ⟳ 回work        ⟳ 回work  (R4.1)

知识点 1.1.3 · 安全联锁:R9 检测基于激光雷达自身坐标系 laser_link(不依赖车身 TF),触发动作是话题直发释放力矩(最快路径);危险解除后恢复力矩 + 调 /arm_controller/go_work + danger=false,随后需重新唤醒才执行任务。R8 是用户主动打断的四步复位,两者优先级不同。

🧩 记忆锚点R1-R3 管"怎么点菜",R4-R6 管"做什么菜",R7-R8 管"怎么报菜名/换菜",R9-R9.1 管"后厨安全阀",R10 管"开店手续"。

04实验目标

  • 理解 R1-R10 需求体系,能逐条复述每个需求的约束要点(唤醒词集合、任务指令集合、安全阈值等)
  • 掌握装货/分拣/码垛三大任务的物流走向与执行顺序,能独立绘制含"回 work"状态的任务流程图
  • 理解安全联锁机制(雷达危险检测 → 释放机械臂总线舵机力矩),以及 R8 语音打断与 R9 雷达打断的分层关系
  • 理解语音 + 大模型驱动的单轮闭环(唤醒 → ASR → LLM 意图 → 执行 → 播报),并解释"大模型只做功能映射、不生成应答文案"的设计理由
  • 独立完成一份结构化需求阅读笔记,能标注【待定】项与隐含约束
  • 迁移:"需求总览 → 流程梳理 → 安全约束"的分析方法可迁移到其他具身智能/智能制造场景

05实验环境与准备

类别内容
硬件B2 麦克纳姆底盘、C1 五自由度机械臂 + 夹爪(本实验仅阅读文档,无需上电);涉及传感器:激光雷达、RGB-D 深度相机、语音阵列麦克风、光电传感器、AprilTag 标签(tag36h11)
OS / ROSUbuntu 22.04 + ROS 2 Humble
Python3.10(语音/视觉/抓取节点运行时使用 /home/iflytek/ros2_venv 虚拟环境;本实验仅需理解概念)
核心库rclpy、std_msgs、std_srvs、geometry_msgs、sensor_msgs(仅需理解消息类型概念)
阅读对象app/eai_factory/ 包内 docs/01_需求总览.md、docs/05_流程与安全.md、README.md
⚠️ 准备提示本实验不执行任何 ros2 命令、无硬件操作;若在工程机以外阅读,注意 README 中的路径(/home/iflytek/ros2_ws/...)为实机路径,不要照搬。准备好笔记工具(draw.io / PlantUML / mermaid 任选)即可开始。

06动画讲解:物流链与打断分层

上半部分:货物流经四个工区,每一步收尾都先回 work 再进入下一步(R4.1);下半部分:两类打断的分层仲裁——雷达打断(R9)优先级高于语音打断(R8),危险期间语音的"回 work"被抑制。

物流链 · 每步收尾先回 work(R4.1 安全握手) 装货区分拣区 流水线(定点停靠)码垛区 R4 视觉抓取R5 放上传送 光电传感器定点停R6 定点码放 ⟳work⟳work⟳work 任务之间靠"回 work"握手 · 漏画 = 流程图经典错误 打断分层 · 雷达 > 语音(R9.1) R8 语音唤醒打断 R9 雷达危险打断 优先级仲裁 危险期间抑制语音 四步复位:中断动作→回work→停流水线→取消任务 释放 6 舵机力矩 + danger=true 解除→恢复力矩+go_work→需重新唤醒
动画 1-1|上:货物沿物流链流动,绿色 ⟳work 是每步之间强制的安全握手;下:R9 雷达打断优先进入仲裁,危险期间语音的回 work 被抑制

07互动讲解:需求裁剪实验台

假设你是项目经理,想"砍掉"某条需求省成本——点击按钮看看裁掉它会坏什么:

需求裁剪实验台 · Requirement Trim Lab
// 点击裁剪按钮,评估被砍条款的连锁后果 R4.1 ✓ 每步回 work:任务间安全握手存在 R3 ✓ LLM 意图解析:换个说法也能听懂 R9 ✓ 60°/20cm/0.5s 雷达联锁:安全底线在
💡 换个角度想需求裁剪台演示的是需求间的耦合:R4.1 一断,任务流程图的显式状态全塌;R3 一改,N1 语音节点的实现方式与 intent_hints 配置全变;R9 一砍,系统从"允许上人车间"降级为"演示玩具"。每条需求都锚着下游设计,砍需求 = 连锁改版。

08实操步骤:五步吃透需求文档

1在 eai_factory 包目录用 grep 快速定位 R1-R10 与 R8/R9 章节行号(60min)
2绘制装货/分拣/码垛三大任务流程图,每张必须画出"回 work"状态(60min)
3在 docs/05 中标注 R8 四步复位与 R9 触发/解除动作,画打断分层箭头图(60min)
4读 README 架构速览与关键决策,建立"需求编号 → 模块 → 关键决策"三层映射(30min)
5按"交互/任务/安全/工程组织"四节撰写需求阅读笔记,标注【待定】项(30min)
# ① 在 eai_factory 包目录下:快速定位各条款行号
ls docs/
grep -n "R[0-9]" docs/01_需求总览.md      # 定位 R1-R10 各条款
grep -n "R8\|R9" docs/05_流程与安全.md    # 定位打断与安全章节
# L62-L68(R8)  L70-L78(R9)  L80-L88(R9.1) ...

# ② 架构速览与关键决策(只记录,不执行)
head -50 README.md
# 架构速览:N1 语音 / N2 调度器 / N-grasp 双模式 / N3 安全 / N-conveyor 流水线
# 复用清单:car1_bringup / car1_arm_controller / car1_peripherals / apriltag_detector

# ③ 一键启动命令(本实验仅记录语法,7 个开关 EXP-02 展开)
ros2 launch eai_factory eai_factory.launch.py
# 7 开关:start_base / start_viz / start_voice / start_vision
#         / start_grasp / start_conveyor / start_radar
🔍 笔记的及格线每条需求必须提炼出可量化约束(唤醒词集合、60°/20cm/0.5s、6 舵机)与设计含义(对哪个模块、影响什么实现),并附文档行号——只抄条款不做归纳的是无效笔记。

09重点与易错点

⚠️ 三大经典易错R8 语音打断 ≠ R9 雷达急停(触发源不同);流程图漏掉"回 work"(R4.1 是显式需求);把文档里【待定】的坐标当成已实现值(坐标以 EXP-03 的 config/eai_factory.yaml 为准)。
⚠️ 常见坑现象 → 解法
分不清 R8 与 R9两类打断都叫"打断"但触发源不同 → 按触发源 / 动作 / 解除条件三列做对比表:语音唤醒→复位动作;雷达危险→释放力矩
流程图漏掉回 work未注意到 R4.1 是显式需求 → 用 docs/01_需求总览.md L52-L55 的适用清单逐项核对每个任务的收尾
把【待定】坐标当实现值需求文档与配置文档混读 → 以【待定】标记为准,坐标类数值以 config/eai_factory.yaml 为准
误以为危险解除会自动续跑漏读 R9.1 → 危险解除进 work 后需等待重新唤醒再执行任务,不会自动继续
把复用节点记成自家模块README 已给出复用清单 → car1_bringup / car1_arm_controller / car1_peripherals / apriltag_detector / visual_grasp 是"复用不改"
  • 能列出 R1-R10 每条一句话要点,并说出哪几条属于交互 / 任务 / 安全分组
  • 能画出 装货区 → 分拣区 → 流水线(定点停靠) → 码垛区 物流链,并标注每阶段的回 work(R4.1)
  • 能说出雷达危险触发三个量化条件(60° 扇区、20cm、0.5s)与触发动作(释放 6 个总线舵机力矩 + 发 danger)
  • 能说出语音打断(R8)四步复位:中断动作 → 回 work → 流水线停止 → 取消任务
  • 需求笔记含文档行号引用、【待定】标注与需求→模块映射

10实验总结与思考

✅ 完成成果
需求梳理表 + 三图一笔记

R1-R10 梳理表(含量化约束与【待定】)、三大任务流程图(含回 work)、R8/R9 分层时序图、需求阅读笔记(含行号引用)。

🧠 原理收获
四维分组 + 优先级分层

交互/任务/播报打断/安全/工程五组结构;雷达打断 > 语音打断的仲裁逻辑与"危险期间抑制回 work"边界。

🛠 技能收获
结构化需求梳理方法

分组 → 量化约束 → 待定项三步法;流程图显式画安全状态;grep 行号定位文档条款。

📐 评分速览
40 / 30 / 20 / 10

梳理表 40 分、流程图 30 分、打断分层分析 20 分、笔记规范与行号引用 10 分,合计 100。

📝 思考题 1为什么 R3 要求"一律走大模型意图解析,不用关键词匹配",而 R7 却用固定文案播报?请结合"大模型只做功能映射"的设计约束说明其理由。
📝 思考题 2R9 的检测有三个量化参数(60°、20cm、0.5s),分析每个参数的作用;若把 persist_time 从 0.5s 改为 0.1s 会带来什么问题?(提示:与源讲义实测的抖动/误触发有关)