Commit Graph

1 Commits

Author SHA1 Message Date
arm_dev dfc945b7e0 P6 通止规装配:主流程节点(S00–S11 跑通)+ 入口脚本 + 真机/仿真验证
新增
----
- arm_application/gauge_assembly_node.py:主流程。每个阶段一个 _step_*,
  返回值就是状态机的事件;纯逻辑(状态机/配置/限位/夹爪后端/自检)全部
  在 gauge_*.py 里,节点只做"发指令 + 读反馈 + 报错"。
  * S00 自检报告带"缺了会怎样",必检拦住、选检告警;
  * S01 回 home → 切工具系 → 逆时针预绕,**事后用 TF 实测绕工具 Z 转了多少度**
    (转轴偏差 >5° 直接中止:以"度"为单位的动作全建立在这条假设上);
  * S03 手外粗定位:没有 eye-to-hand 标定文件时明确报"缺哪个文件、怎么生成",
    回 S04 兜底(不做假装成功的反投影);
  * S05 稳定判据用"到均值的最远距离",不用相邻帧之差;
  * S07 悬停处测基线 → 步进下压 → 两路切向任一突变即停,法向超安全上限抬起中止;
  * S08 棘轮四步(慢转→松爪→快回转→夹紧),停止判据「切向 >阈值 且 法向突增」,
    掉件走 E1 重放;S09 反向拧出(比拧入多一轮);
  * E1 重放等 /gauge/reload_ok 人工确认(超时按中止),E2 任何中止都先退安全高度。
- launch/gauge_assembly.launch.py:只做一件事 —— 发布手眼静态 TF(S05 的前提),
  其余判据全交给 S00(判断标准只有一处)。
- scripts/run_gauge_assembly.sh:--arm/--sim/--dry-run/--holes/--backend。
- gauge_assembly 入口(setup.py)+ 站点参数 reload_timeout_s。
- test/test_gauge_step_events.py:**读节点源码 AST**,把每个 _step_* 可能返回的
  事件逐个问状态机"合法吗" —— 节点与转移表是两份数据,漏登记要在 pytest 里炸,
  而不是在真机上跑到那一步才炸。

顺手修掉的两个真问题
--------------------
1. 四份 launch 里的四元数换算**已经互相抄歪了**(退化分支的公式各不相同)。
   统一收口到 handeye_lib.read_transform_yaml,并加回环测试(真实标定文件 +
   180°/270° 等分支切换角度);实测 4 个 launch 输出与库完全一致。
2. pipeline_node.AssemblyPipeline 支持 node_name 复用(本流程继承它的一阶段
   跟踪/二阶段定位链,但在图上必须是另一个节点名)。

验证(都在本机真跑过)
----------------------
  pytest(仿真环境)              → 349 passed, 14 skipped(缺 onnx 的用例跳过)
  干跑全流程                      → S00→S01→…→S11→DONE,exit 0
  仿真里不干跑(缺 /home 等)      → S00 拦住,exit 1,未发任何运动指令
另:仿真环境没有 onnx(只有真机 conda 有),相关用例改为 skip —— 让测试结果
"红就是真红"。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-24 10:12:03 +08:00