Files
linkerhand_retarget_ros2/src/linkerhand_calibration/TESTING.md
T
2026-09-24 12:23:40 +08:00

783 lines
63 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 标定测试的执行范围
2026-09-24 O30 剩余误差诊断:只读两批封存数据及已冻结参数,旧/新独立验证图像
分别 2681/516 帧;按机位/标签/任务/指令拆分残差,受限试探仅用训练图像选参数、
验证轮报告结果。顶部相机在新拇指 roll 三轮只见固定标签;跨批食指端点偏差及
拇指 roll 高角度重复性残差已定位。JSON/URDF 逐字节差、来源哈希和所有试探结果
记录于 [O30_REMAINING_ISSUES.md](O30_REMAINING_ISSUES.md)。未修改生产拟合、采集、
门限或已生成候选;诊断结果不计作正式精度测试通过,也未驱动硬件。
2026-09-23 自动 URDF 修复:采集/局部/重装组 43 passed(17.06 秒),离线草稿及
换向端点组 43 passed(34.18 秒),更新审计 3 passed(0.33 秒)。完整真实
coordinator 的虚拟时钟 108 方向集成 1 passed(97.21 秒),用于核对完整调度和
训练/验证隔离,未启动硬件。最后补齐快照 mesh 与封存路径检查后,仅复查受影响
4 项,4 passed(2.38 秒);此组与前面重叠,不重复累计。
早期失败包括旧夹具仍使用已纠正的标签/方向配置、近端插值掩盖未观测换向端点;
分别修正历史场景声明、改用有来源的端点连续性约束后通过,没有降低验收门限。
旧外参全手与新外参拇指均按自身配置回放,训练重新收敛,JSON 重建 URDF 字节
一致,FK 最大差 6.66e-16,ROS/MuJoCo 加载通过;独立精度仍未通过,未发布。
证据、物理精度限制及候选路径见 [O30_AUTOMATIC_URDF_FIX.md](O30_AUTOMATIC_URDF_FIX.md)。
2026-09-23 离线逻辑复核:复用连续候选关联替代逐帧 PnP 排序,扫描起点按扫描身份纳入;
补全欠约束 SVD 零空间,范围证据记录实际可见训练样本和轮次,单轮仅允许未认证草稿。
新增 7 项集中回归通过;其余受影响项分组通过。首次 24 passed/4 failed/2 errors(22.21 秒)
中的失败分别为未 source ROS 和新增夹具字段名错误;修正后对应及 CLI 10 passed(2.13 秒)。
范围边界组 5 passed(1.20 秒),中节绑定/历史数据隔离组 2 passed(1.12 秒)。
用户确认 ID12–ID15 随中节运动后,新离线配置将四标签绑定至 `*_middle`;封存数据回放生成
`offline_confirmed_middle_tags_draft`,训练坐标 RMS 1.4867 px,最终 FK 差 5.55e-16。
四指角度子项通过,但拇指 roll/MCP 及全局图像/不确定度未通过;未发布,未控制实机。
详细问题、证据和复现命令见 [O30_OFFLINE_LOGIC_REVIEW.md](O30_OFFLINE_LOGIC_REVIEW.md)。
2026-09-23 四指侧摆竖直基准:新增显式离线选项 `--draft-upright-splay-zero`,
四项作为用户定义基准移出自由零位参数,全部行程与其余零位重新拟合。
新增/CLI 用例 6 passed(13.04 秒),相关范围、缺项、导出及生命周期用例
18 passed(16.88 秒)。`offline_upright_zero_draft` 最终 URDF 的四指正面侧偏均为
0°;JSON/FK 最大差 8.89e-16,标准加载与来源哈希检查通过。
报告区分 11 个拟合零位、4 个用户定义零位、5 个 CAD 末端零位和 20 个拟合范围。
本次独立验证已算出角度误差,但整手精度仍未通过,未更新 latest_passed。
原始数据保持不变,未进行硬件运动;上一版侧摆偏移 −6.6° 至 −9.4° 的草稿已附拒绝说明。
2026-09-23 物理零位复核:旧 `offline_full_hand_draft` 因四指 SDK/URDF 方向反转而
错误估计约 −20° MCP 零位,已附拒绝说明,不能将其文件检查通过理解为零位正确。
独立离线配置纠正方向后,`offline_corrected_zero_draft_v2` 的四指 MCP 为
+0.385°、−0.306°、−0.690°、−1.475°,没有强制置零;JSON/URDF FK 最大差
7.78e-16、标准加载及原始数据哈希检查通过。独立验证求解器仍报 IndexError,
保留 traceback,精度/发布均为 False;没有硬件动作。
本次 `test_raw_draft.py` 27 passed(30.15 秒),新增实采角点方向回归、离线模型
修订边界及验证求解异常不冒充精度通过的检查。原始数据仍为 107/108 单元。
全手草稿候选搜索收敛为最多四个收敛结果,明确记录非穷尽;相关数值不可观测拒绝、
候选预算和训练初值契约 3 passed、21 deselected(0.90 秒)。
实机封存数据 `20260923_142201` 已生成全手草稿于
`calibration_output/splay_recapture_20260923_132346/offline_full_hand_draft/`:
15 个非末端零位、20 个范围,五个末端零位保留 CAD;原始采集仍为 107/108。
复用已计算且收敛的同目标训练候选,重算原始像素误差确认一致,再运行正常草稿验收;
缓存文件、脚本和来源哈希见 `numerical_fit_reuse.json`。JSON/最终 URDF FK 最大差
6.66e-16,标准加载通过。独立验证角度求解失败,四个零位接近 ±20° 模型边界;
精度和发布均未通过,`latest_passed` 未更新。没有硬件动作。
2026-09-23 同批数据全手离线求解支持:最终 `test_raw_draft.py` 23 passed(14.47 秒)。
新增重复观测合并的原始目标、梯度和信息矩阵等价检查,原始图像误差仍逐帧报告;
训练初值拒绝不同数据批次或使用验证选择的结果,相关 CLI 不能进入在线运动。
首次等价测试的近零梯度逐元素断言受浮点消减影响(最大绝对差 4.62e-7、全梯度相对差
3.32e-13),改为完整梯度范数误差小于 1e-11 后通过,未改模型或采集精度门限。
试验过的自适应参数缩放未在合成全手收敛检查中通过,已撤回;最终沿用原参数缩放。
仅未认证草稿的数值停止容差为 1e-5,正式求解默认值及发布检查不变。
2026-09-23 离线草稿支持单轮完整训练:`test_raw_draft.py` 20 passed(8.42 秒)。
覆盖任一训练轮缺四指联动上行时仍保留全手求解范围、初始化选择另一完整训练轮、
两轮互补缺项或完整验证轮不能冒充完整训练轮,以及原有不可观测零位拒绝、JSON
重建和只读离线生命周期契约。未改变正式采集完整性或发布门限;未恢复历史测试。
实机数据的实际离线求解另行记录,不把上述软件测试当作精度验收。
2026-09-23 原始续采的活动标签基准检查:12 passed、30 deselected(1.37 秒)。
覆盖活动标签像素/反馈差异记录后继续导入、缺少基准记录的离线复核标记、固定基准
移动仍拒绝、非有限反馈拒绝、正式发布拒绝未复核安装、草稿仍检查来源完整性,
以及现有标签重装/次数持久化契约。真实 coordinator 检查确认没有因活动标签
基准差异暂停,且将未复核状态写入日志。未启动 SDK 或相机。
两份实机停止记录 `132507` / `132938` 的固定参考与 96 个方向断点只读复核位于
`calibration_output/splay_recapture_20260923_132346/software_review_resume_reference.json`。
不重判旧采样质量、不修改角点;下一任务为四指侧摆第 1 轮正向联动。
这只证明恢复检查和任务位置正确,不代表后续实机运动或 URDF 精度验收通过。
2026-09-22 正式 2+1 局部失败调度收敛:新增 test_taskwise_recovery.py,覆盖
完整依赖任务组延后、训练/验证顺序不变、已完成前缀不变、一次回访预算、真实
coordinator 的带视角错误处理、多视角参考变化不被掩盖、失败后归位且不进入拟合、
无可复用零位时的恢复日志及预算持久化、未解决状态禁止发布。
首组 30 项通过、1 项失败(13.93 秒);失败为既有观察器迁移测试仍断言
rigid_pair_v1,当前配置实际为 rigid_pair_candidates_v2,修正过时断言。
随后调度/恢复/旧 staged 契约/执行组 44 项通过、1 项未选(6.20 秒);passed
断点/分阶段训练/真实图像共享姿态交接组 59 项通过(22.11 秒)。集中任务准入
判断后,受影响恢复组及完整合成 JSON→URDF 验收 18 项通过(14.10 秒)。各组
有重叠,不累计为全量回归。最后一组包含最终文件重建一致性、独立图像验收、
CAD 冻结零位与授权字段保护。
正式 CLI --validate-only 通过,确认 capture_plan_v5、17 任务、训练 0/1、验证 3,
受保护输入一致。git diff --check 通过。本轮无实机运动,未改求解器/精度门限,
不代表全手稳定性验收;旧 v4/v15 断点与新调度隔离。
2026-09-22 用户指定无名指侧摆基准由 85 改为 127:同步 Profile、准备向量、
ROS 配置、产品指纹及当前夹具。Profile/局部任务组首次 14 项通过、1 项旧基准
断言失败(21.25 秒);修正该断言后单项通过(0.55 秒)。正式 CLI 配置校验及
diff 检查通过。全手新会话 194750 在启动前被已有控制/反馈/状态发布者保护拒绝,
未启动本次 SDK、未发送运动,不算实机标定通过;旧基准断点不复用。
2026-09-22 固定 190634 的绝对零位可观测性检查:新增
`test_zero_evidence_coverage.py`,覆盖原零位输入拒绝不变、训练/验证缺失列表
分离、明确缺失掌定位轴线,以及真实 O30 URDF 下的 MCP 零位/未知掌坐标精确
等价变换;已知掌坐标时同一零位变化可检测。三项通过,0.45 秒;既有
`test_spatial_solve_order.py` 真实空间拟合回放一项通过,0.86 秒。
仅增强输入覆盖报错,不改变零位/精度/运动策略。本次无实机运动,未发布产物;
不能把完整小指屈伸数据误当作全手绝对掌坐标参考,详情见稳定性报告最新节。
2026-09-22 DIP 父姿态/安装/角度不确定度:复用 `JointPairImages`,新增独立图像
局部角度协方差,保留共享相关项。原组 8 项通过,0.89 秒;新增“不确定度不可用
不得删除竞争模型”后受影响 3 项通过,0.44 秒。临时密度参数边界 3 项通过,
0.43 秒;密度对照未显示稳定收益,参数及其专属测试随后撤除。补齐重复图像和
角色身份检查,最终该模块 9 项通过,0.95 秒。各组有重复,不累计为全量回归。
真实 190634 前两轮默认预算 16 初值全部收敛,不确定度结果仍为非发布诊断;
72 帧/阶段对照中 2 初值独立图像求解失败,保留负面证据,不放宽优化器/候选
门限、不触发额外运动。第三轮在本轮未用于训练或选择,正式零位和产物仍未验收。
2026-09-22 复用 190634 离线曲线检查:补充原图像模型的纯前向名义像素误差
`image_motion_prediction_errors`,禁止验证时重拟合角度,检查训练/映射来源重叠、
有限角度、模型不变与错误预测可见。受影响组首次 3 项通过,0.47 秒;核对正式
验收语义后撤除对名义总像素误差额外施加 1.5 px 的判决,仅返回误差,再测该项
1 项通过,0.44 秒。正式物理验收规则及测量精度门限不变。
真实 MCP/PIP 冻结指令曲线及 DIP 两个保留候选的第三轮条件角度检查均通过;
DIP 安装候选仍未区分,不等于物理零位或 JSON/URDF 发布通过。细节及一次
缺少旁观标签的读取失败记录在稳定性报告,本轮未运动机械手。
2026-09-22 取消辅助侧摆并回到原交接方法:撤除本轮显式辅助开关,整指实验
拒绝任何辅助计划。采集/实际指令三轮/入口组首次 36 项通过、2 项因未 source
工作区而找不到 ROS package 失败,17.96 秒;补齐环境后仅重跑失败两项,
2 项通过、0.60 秒,没有为测试修改生产路径。
双侧交接回归首组六项因历史夹具与现 Profile 的姿态/标签尺寸不符而初始化失败;
修复测试夹具后首次写错 dataclass 字段,未进入求解;改用 baseline_u8 后六项
通过、1.86 秒,其余受同夹具影响的 23 项通过、4.86 秒。历史 113/16.5 mm
仅用于旧证据回放,生产仍为 85/16 mm。包含交接后模型选择、旧零位不变、
坏图像双侧拒绝、来源哈希和读回防篡改;不代表当前实机发布已通过。
当前 182949 真实数据原 MCP/PIP 及交接回放见稳定性报告:第三轮几何检查通过,
但未完成冻结指令映射、物理零位和最终产物验收。本轮未再次驱动机械手。
2026-09-22 用户指定一次辅助侧摆对照:复用已有 ObserverPreparation,整指实验
只允许 DIP 前一个有界动作,不继承全手或扩幅预算。真实 coordinator 虚拟测试
`test_chain_capture_runtime.py -k 'complete_chain and True'` 1 项通过、15.94 秒,
确认只有一次 52→115→52 辅助段,MCP/PIP/DIP 实际全部指令仍各三次往返,
不生成零位或产物。单动作/全手拒绝/多动作拒绝三个预算边界通过、0.83 秒。
实机 182949 在 MCP/PIP 十二方向完成及一次辅助段完成后,因早期父参考图像差异
暂停,DIP 未开始。离线有无辅助的双标签安装估计均未通过候选验收;未放宽门限,
未发布。具体证据见稳定性报告,不能将软件调度通过写成实机全流程通过。
2026-09-22 小指实际三轮采集:`test_chain_capture.py`、
`test_chain_capture_runtime.py`、`test_diagnostic_presets_cli.py` 共 33 项通过,
17.23 秒。实际 coordinator 虚拟时钟统计全部发送指令,包含准备/收尾,断言三个
关节恰好三次完整往返;保存三份第一轮训练回程参考,禁止验证轮、错误方向/
轮次、缺帧、标签缺失或不稳定反馈替换来源。DIP 标签持续缺失仍按原超时暂停,
原始证据不生成授权零位或角度、不发布。新增旧正式准备不受影响与同一参考只写
一次的两个边界通过,0.57 秒。本轮未驱动硬件,也未声称正式离线产物链已接通。
2026-09-22 正式入口收敛:O30 默认改为 `taskwise_2_plus_1`,不默认声明辅助动作,
产品指纹同步;历史合成夹具显式生成 fixed 数据全集,再由正式夹具选择验收分区。
`test_taskwise_two_round.py`、`test_o30_profile.py`、诊断 CLI 与交错运动受影响组
41 项通过,18.57 秒;含一次正式合成 20 关节 JSON→URDF 及独立图像验收,
新增 CAD 零位不变和仅允许字段变化断言。启动参数/分区/恢复/旧 staged 兼容组
41 项通过、6 项未选,18.30 秒;未运行不相关全型号拟合。旧固定策略测试显式
选 fixed,不通过改变生产策略保留过时默认。以上是软件测试,不是实机正式通过。
新增 2+1 实际 launch 参数传递用例 1 项通过,0.84 秒;CLI `--validate-only`
确认默认 17 任务、训练 0/1、验证 3,受保护指纹一致,未启动硬件。检查脚本首次
把 CLI 的 JSON 和尾部说明当成单个 JSON 解析失败;改为解码首个 JSON 后检查通过,
未改生产输出。`git diff --check` 通过。
只读旧数据的插值对照仍不满足精度,未将 PCHIP 引入正式代码,未新增运动。
2026-09-22 用户指定无名指侧摆基准改为 85:同步 Profile、全部相关零位/准备向量、
ROS 参数、产品指纹及合成夹具;其他通道不变。来源/指纹、侧摆零位路径、采样节点/
速度和局部任务契约共 4 项通过、1.97 秒。额外只读校验参数与 Profile 基准一致,
所有零位的 ring_yaw=85;范围示教文件仅修改本机 baseline.target[4],历史反馈
不改写。未启动实机运动,不改旧会话证据;新基准须重新采集,不复用旧断点。
2026-09-22 整指延后求解采集:显式 `o30_pinky_chain` 实验入口使用原任务路径、
原 SDK/基准保护及交错停点,逐任务轮次 0、1、3;原始父参考回访不授予零位或
角度权限。`test_chain_capture.py` 与旧旁观隔离失败项复查 15 项通过、1.58 秒;
完整真实 coordinator 虚拟时钟 18 单元集成测试通过、19.43 秒;缺失 DIP 标签时
原参考超时仍暂停,1 项通过、2.21 秒。验证轮不得进入旧分段拟合器,1 项通过、
0.72 秒;旧参考权限/虚拟任务契约 2 项通过、0.86 秒。
预设、旁观、冻结验收回归首组 55 项通过、1 项失败、2.08 秒:旧用例把启动日志
固定为单条,未考虑已有 camera_preflight;改为断言调用前后记录完全不变,未删
生产日志。完整虚拟夹具初次因设备心跳未刷新、合成标签投影小于原 30 px 门限
失败,修夹具心跳与焦距后通过,没有放宽生产门限。以上各组不累计为全量回归,
更不代表实机几何或 JSON/URDF 发布通过。
新增显式 CLI 训练策略/禁恢复契约 1 项通过、0.67 秒。实机 `165627` 三任务
18 单元连续采集完成,无暂停、无重扫,安全返回;独立冻结预测仍拒绝,具体精度
与候选差异见稳定性报告。没有因采集完成重跑不相关的全型号产物测试。
2026-09-22 联合模型冻结指令验证:新增 `test_frozen_chain_validation.py`,
16 项通过、0.61 秒;测试夹具改为通过构造接口提供窄支持域后,仅复查受影响项,
1 项通过、0.53 秒。覆盖已知真值的双向映射、验证期禁止重拟合、错误指令与零位
不得被吸收、5 px 阶段平移不得被重新配准、训练/候选选择图像隔离、独立轮次、
稳态目标、保持通道、机位/内参/标签尺寸、非有限或非整数线端指令和范围外拒绝。
复用已有几何合成夹具,无新增实机运动。`FrozenChainCommands` 是非授权的验收
组件,未接入运行时;它不证明物理零位来源、完整采样节点覆盖或候选不确定度。
未将该组软件测试标记为正式 2+1 或 JSON/URDF 验收通过。
2026-09-22 实时诊断内存修复:不再为诊断强制保留全场完整记录或训练几何;
方向结束验收与状态显示共用当前扫描窗口,完整报告在安全返回、关闭采集后从
不可变日志按需读取。`test_diagnostic_coordinator.py`、
`test_diagnostic_reference_flow.py`、`test_capture_runtime_index.py` 首轮 28 项通过、
2 项旧测试因直接解析压缩索引失败,115.33 秒(超过日常目标;后续仅复查受影响项)。
改用正式 `load_jsonl` 后失败两项通过,18.25 秒;新增当前扫描身份/容器绑定断言后
只复查一项完整流程,25.96 秒(与实机并行时耗时)。没有改变生产哈希或准入规则。
只读旧证据保留模型回放及四倍记录量压力数据见
`software_review_20260922_stability/retention_validation_20260922.json`。
实机 `151025` 完成拇指 CMC roll、MCP 四方向,一次通过原始覆盖;最大 GC
0.183 秒、未发生反馈超时,因小指侧摆持续升到 72°C 主动中止。不是全手通过。
用户确认仍可运动后,先只读确认温度下降且无故障,再运行 `151821`:491.96 秒、
48069 条记录,前六任务的十二方向原始覆盖均一次完成,实测 RSS 最高约 341 MiB、
GC 最大 0.239 秒、控制回调最大 0.114 秒,无反馈超时。进入 DIP 时因上游 MCP/PIP
均无可信零位,`parent_reference_current_session_source_missing` 正确阻止父参考复用;
尚未修改此诊断依赖行为。全手其余任务及正式 2+1、JSON/URDF 均未通过验收。
2026-09-22 机械手移动后新会话 `20260922_145145`:全手单轮非发布诊断计划
17 任务、20 关节、36 扫描单元,不恢复旧零位、不增加辅助动作。完成前五任务
共十个方向的原始覆盖;拇指 MCP 正向重扫一次,拇指 IP 与小指 MCP 零位未确认。
小指 PIP 准备阶段发生 1.783 秒 generation-2 GC 停顿,同期反馈时效保护暂停。
未完成全手测试,未发布 JSON/URDF;不能称作正式 2+1 验收。
全手入口/报告/分析受影响组 47 项通过(6.32 秒)。随后修复诊断多通道分段身份
及各指独立 command/feedback 索引,`test_diagnostic_quality.py` 28 项通过
(1.99 秒);四个分段均检查独立通道覆盖、错误分段拒绝、静止中指不得借其他指
运动通过。该修正在本次实机停止后完成,尚未实机验证,且不修复 GC 阻塞。
候选输出角度及共享不确定度诊断:`test_finger_chain_diagnostic.py` 新增轴符号/
2π 等价消除、真实零位差保留、与独立角度重拟合数值导数对照、相关协方差、
训练留出身份隔离及验证相机/尺寸/角色不变边界。首组 2 项通过(8.39 秒);
增加输入一致性边界后仅重跑受影响验证组,6 项通过(6.79 秒),不累计为全量。
旁观机位诊断入口使用 `test_diagnostic_presets_cli.py`、
`test_diagnostic_observation_scope.py`、`test_diagnostic_yaw_hold_plan.py`,39 项
通过(1.56 秒),覆盖扫描单元不变、序列化兼容、设备/参考保护和非发布隔离。
真实 `142553` 小指一次往返原始采集完成,但 DIP 安装候选仍未区分;
`143540` 既有四指侧摆旁观测试因无名指硬件堵转暂停,用户要求重试后的只读
检查报过温,未再运动。细节见稳定性报告,软件通过不代表实机正式标定通过。
2026-09-22 用户最终确认 O30 标签黑框 16×16 mm 后,同步正式 Profile、检测器、
标定覆盖表及产品指纹。`test_o30_profile.py` 的来源指纹、跨配置尺寸一致性、
图像采集受影响组 3 项通过,0.80 秒;CLI `--validate-only` 通过,
`git diff --check` 通过。本次没有实机运动或发布,不代表 DIP 多解已经解决。
下文 16.5 mm 的确认及“正式配置未改”描述保留为此前实验阶段记录。
整指三阶段联合诊断使用 `test_finger_chain_diagnostic.py`:已知几何恢复、
Schur 与完整协方差对照、只拟合留出角度、64 组初值的每一位实际参与初始化、
参考漂移不得被隐藏、URDF 结构去冗余、分阶段参考以及共同标签尺度诊断。
初组 10 项通过,1.17 秒,耗时记录为
`software_review_20260922_stability/finger_chain_tests.json`。开发中仅重跑修改所
影响的诊断组或新边界,没有重跑未受影响的旧模型和整手产物链。随后新增消除
逐图像角度等价 2π 绕回,受影响验证与新边界 4 项通过,0.83 秒;只从六份已保存
结果重算分箱比较,没有重复拟合,主要歧义结论不变。
真实 `121712` 的六组 64 初值回放均保留独立结果;存在三维多解和尺度一致性
问题,详见稳定性报告。此模块不能授权实机角度或发布,不等同于正式 2+1 通过。
用户随后要求固定 16.0/16.5 mm 对照,新增第七份 64 初值结果;比较脚本已核对
两组来源哈希、图像分区、结构约束和参考策略相同。16.0 mm 像素误差较低但
候选仍不唯一,正式配置未改;未因这次仅诊断输入变更重复无关测试。
完整父候选与联合父姿态诊断:`test_joint_pair_diagnostic.py` 检查已知真值恢复、
父姿态/角度 Schur 协方差与完整逆矩阵一致、固定几何验证、重复图像拒绝、
16 个失败初值保留及不能按验证误差选训练候选;不生成发布模型。
首次与配置策略组 13 项通过、1.42 秒;向量化/共用有界求解器后受影响 5 项
通过、0.69 秒;新增拒绝边界 1 项通过、0.42 秒,验证接口变更受影响 2 项
通过、0.65 秒,候选选择边界 1 项通过、0.39 秒。
`test_rigid_pair_observer.py -k 'not independent_parent_branches'` 的历史真实回读、
篡改和新旧父候选调用边界 9 项通过、20.37 秒;迁移/准备契约/已知真值候选组
32 项通过、5.64 秒。没有重跑未受影响的独立补采重拟合或整手产物链。
新版无辅助动作配置只读验证通过;`121712` 经新运行时桥接入口正确拒绝歧义。
联合诊断的真实 16 初值回放有像素改善,但父几何和候选比较仍不通过,详见稳定性
报告;这些软件分组不累计为一次全量测试,也不等同于实机或 JSON/URDF 验收。
共享零位及双端交接反馈契约复用 `staged_revisit_v2`:新 O30/u8 跨次容差 10,
窗内稳定性 2,旧无版本记录仍为 4。`test_shared_tag_pose_bridge.py` 与
`test_shared_pose_handoff.py` 首轮 45 项通过、3 项失败,19.03 秒;失败为两个
JSON 列表/元组直接相等断言,以及一个未完成任务本不应导入的旧测试假设。
改为反序列化后的物理参考相等、区分完成/未完成任务归属,不修改生产恢复规则。
针对复查及新增反馈契约篡改组 5 项通过、4.27 秒;源窗口的 7/10/11 边界、
旧版门限及窗内抖动新增组 3 项通过、1.30 秒。没有无理由重复完整拟合。
真实 `114118` 只读 PIP 回放在新反馈契约下通过独立父姿态检查和准备解算;
不把此软件结果视为 DIP 或整手实机通过。
随后 `121712` 无辅助侧摆实机完成六方向原始采集、无需重扫;MCP/PIP 和
DIP 父参考通过,DIP 几何因约 1.964 px / 4.864° 继续拒绝,未发布。
同批只读约束消融保留拒绝结果,详见稳定性报告;没有将删除约束作为修复方案。
实际启动验证纠正了上轮导出判断:固定 2+1 分区不是执行决策,应从策略派生,
不能填入禁止 YAML 导出的 `task_training_cycles`。修正后新策略/观测策略组
15 项通过、16.87 秒,包含正式合成 JSON→URDF;补充有效 YAML 完整往返后,
只重跑该项,1 项通过、1.04 秒。单次 v3 预算记录由实机暴露,新增
`test_single_trajectory_action_declares_budget_and_cannot_escalate`,与原两次预算恢复
用例共 2 项通过、0.78 秒。实机 `113510` 的旧记录保留拒绝;`114118` 的新记录
284 帧通过辅助证据验收,但因 PIP 父模型缺失停止,不能写成 DIP 精度通过。
2+1 辅助观测接入修正:`test_observer_policy.py` 同时检查 staged 与严格 2+1,
`test_taskwise_two_round.py` 检查实际 v3 依赖/动作编译而非只检查参数接受,且扫描顺序不变。
初次 quick 组 13 项通过、1 项导出断言失败、1 项未选(3.22 秒):运行期分区按现有契约
不可导出为可复用 YAML,修正测试预期后该项通过(1.14 秒)。后续策略与真实双标签回放组
17 项通过、107.59 秒,其中独立父分支真实补采回放耗时 65.68 秒;未再重复整手产物测试。
修正后的实际 CLI `--validate-only` 通过。真实小指的零新增运动反事实对照仍因几何精度
不足拒绝,详见 `O30_STABILITY_REVIEW_20260922.md`,不能称为实机修复完成。
2026-09-22 严格逐任务 2+1 用 `test_taskwise_two_round.py`:quick 部分检查
逐任务顺序、轮间不重复准备、禁止补轮、断点分区及不可观测不跨任务推迟;
integration 部分复用正式 O30 夹具,验证 20 关节拟合、独立留出及 JSON 重建相同 URDF。
与 `test_diagnostic_quality.py` 共 28 项通过,16.08 秒。诊断压缩证据读取用
`test_diagnostic_analysis.py`,19 项通过、2.24 秒。旧准备契约测试直接读取
压缩索引导致一次失败,改用公共 `load_jsonl` 后只复查受影响组,30 项通过、
1 项未选,3.32 秒。各组不累计为全量通过;实机边界见
`O30_STABILITY_REVIEW_20260922.md`。
辅助侧摆端点离开条件使用 `test_witness_endpoint.py`。真实夹具
`o30_witness_terminal_gap.json.gz` 来自 `20260920_183257` 的 226 帧完整侧摆窗口,
末尾连续三帧缺命令,仅余两帧有效尾部。真实记录必须继续拒绝;追加的模拟后续帧
仅验证实时等待门,不能作为实机或发布证据。与 `test_preparation_witness.py`、
`test_preparation_sync.py` 共 53 项通过,14.89 秒,检查在线和离线共用端点窗口、
原超时上限、旧记录兼容、数据篡改和辅助拟合失败仍拒绝。
准备契约升级用 `test_preparation_contract.py`,覆盖新旧断点分离、父子/预算/动作
变化、历史记录保留、原会话边界、节点写入和发布入口禁止旧模型冒充新预算。
时钟自适应刷新用 `test_camera_timing.py`,正负平滑漂移在模拟 30 Hz 的 60 秒内
曝光时间误差保持小于原 1 ms 连续性预算,同时验证真跳变仍拒绝及启动锚点年龄。
辅助精度预算前置用 `test_observer_pose.py` 和 `test_observer_reference.py`。
此次增量验证分组记录在 `software_review_stability_repair`:初始针对组 79 项、8.84 秒;
证据/真实 PIP-DIP 回放/runner/合成完整产物组 91 项、58.99 秒;修正启动锚点刷新
时机后的相机组 15 项、0.47 秒。组间有重复用例,不将累计次数称为一次全量回归。
实际目录的断点选择只读验证约 17 ms,排除了旧准备契约;配置 validate-only 通过。
这些结果不替代新版本的连续实机验收。
相机时钟诊断变更使用 `test_camera_timing.py`:同时覆盖原始计时单位、跳变、陈旧帧、
重同步顺序及拒绝事务可重放。新增 `CLOCK_MONOTONIC_RAW` 仅记录诊断边界,不能
替换 ROS 时间或放宽同步门限。2026-09-20 针对组 12 项通过,0.33 秒,记录于
`calibration_output/O30_RIGHT_001/software_review_stability_architecture/camera_timing_tests.json`。
这不表示实机重复失同步已经修复;整体评估见 `O30_STABILITY_ASSESSMENT_20260920.md`。
日常修改运行受影响用例和必要契约用例,目标为 60 秒内完成。不要因为修改了一行代码就运行
整手拟合或全量 `colcon test`。公共产物契约变更需要覆盖相关型号,发布前再执行全量回归。
测试保留原文件位置,避免破坏现有共享夹具。`test/conftest.py` 集中维护分类;函数上的显式标记优先。
| 标记 | 内容 | 何时执行 |
| --- | --- | --- |
| `quick` | 局部求解、调度、恢复、隔离和拒绝边界 | 日常选择受影响文件 |
| `replay` | 已记录的真实图像、准备失败和姿态歧义 | 修改对应观测或恢复逻辑 |
| `integration` | 完整拟合、产物回读、进程或 ROS 链路 | 修改公共契约或发布前 |
| `legacy` | 历史格式、旧型号算法及兼容入口 | 修改兼容契约或发布前 |
从工作区根目录准备环境:
```bash
source /opt/ros/jazzy/setup.bash
source install/setup.bash
export PYTHONPATH="$PWD/src/linkerhand_calibration:${PYTHONPATH:-}"
export PYTHONDONTWRITEBYTECODE=1
```
采集计划、训练接口日常验证(按改动选择文件,不必每次全部执行):
```bash
python3 -m pytest -q -m quick \
src/linkerhand_calibration/test/test_capture_plan.py \
src/linkerhand_calibration/test/test_adaptive_training.py \
src/linkerhand_calibration/test/test_command_motion.py \
--durations=8 --timings-json=/tmp/calibration-quick.json
```
涉及零位恢复时加 `test_zero_recovery.py`;涉及断点时加 `test_prepared_resume.py`、
`test_passed_resume.py`;涉及发布时加 `test_artifact_publication.py`。真实中指 DIP 歧义回归位于
`test_measured_transfer.py::test_real_middle_dip_fits_but_remains_ambiguous`,其正确结果仍为拒绝不充分证据。
`test_prepared_resume.py::test_resume_tick_uses_prepared_data_and_still_checks_current_reference`
同时覆盖 O30 分阶段恢复:历史证据索引须在启动准备时完成,实时回调不能再次整理整份历史;
参考变化仍拒绝复用。五个型号、参考保持/变化共 10 项约 2 秒。真实 `20260920_141822`
在该索引阶段发生控制回调阻塞,修复后的 `20260920_142046` 已实际复用 4 个扫描单元;
后续因小指零位 ID4 检测断续停止,不代表整手通过。
O30 回访反馈重复性修改,先运行 `test_staged_training.py -k revisit`:真实反馈 48→41、
10 的边界、超限、同批不稳定、图像/安装变化以及 v1/v2 回读共 8 项约 1.2 秒。
涉及复核记录格式时,追加 `test_staged_artifacts.py` 的 JSON→URDF 一致性和阶段拒绝组,
共享一次整手产物,5 项约 31 秒;无需为每个拒绝条件重复完整拟合。
分阶段调度、旁观证据和恢复的快速检查:
```bash
python3 -m pytest -q -m quick \
src/linkerhand_calibration/test/test_staged_training.py \
src/linkerhand_calibration/test/test_staged_runtime.py \
src/linkerhand_calibration/test/test_observer_pose.py \
src/linkerhand_calibration/test/test_observer_reference.py \
--durations=8 --timings-json=/tmp/calibration-staged-quick.json
```
`test_observer_reference.py` 共享一次上下游图像求解,角点、来源、安装和取样篡改直接检验
证据回读边界。`test_staged_runtime.py` 的进程复用用例及整手训练用例标为 `integration`。
只有训练/冻结/发布契约变化时,才运行下面的分阶段整手组;本次初次完整组 19 项约 45 秒,
后增加的回访时序拒绝用例随产物组单独复查,未重复其余已通过的完整拟合:
```bash
python3 -m pytest -q \
src/linkerhand_calibration/test/test_staged_training.py \
src/linkerhand_calibration/test/test_staged_runtime.py \
src/linkerhand_calibration/test/test_staged_artifacts.py \
--durations=8 --timings-json=/tmp/calibration-staged-integration.json
```
该组共享整手输入和产物,包含实际混合轮数统计、冻结后不再训练、一次集中补采、失败终止、
断点及 JSON→URDF 链路。下面的旧策略整手组仅在旧策略相关逻辑也受影响时追加。
共享 Tag 的进入姿态联合准备修改,运行真实 MCP 的专门回放组:
```bash
python3 -m pytest -q \
src/linkerhand_calibration/test/test_preparation_transition.py \
--durations=8 --timings-json=/tmp/calibration-preparation-transition.json
```
该组共享一次真实图像求解,检查正式运行时继续、原始证据回读、缺失辅助数据、留出隔离、
保持通道/参考变化、篡改拒绝及取消清理,通常约 10 秒。只有候选选择公共逻辑受影响时追加
`test_image_model_selection.py` 的相关用例;已有通过的完整拟合不为文档或断言修正重复执行。
本次验证记录位于 `calibration_output/O30_RIGHT_001/software_review_preparation_transition/`,
保留失败与针对性复查关系,不把软件回放写成实机通过。
测量几何候选的精度资格与图像评估分离,回归位于 `test_measured_transfer.py` 的
`test_real_ip_compares_uncertain_alternative_before_authorizing`、
`test_uncertain_alternative_cannot_be_frozen` 和
`test_uncertain_alternative_still_vetoes_when_images_do_not_distinguish`。
三项共享 `20260920_140424` 的 129 帧真实 IP 准备及父几何证据;精度不足的候选仍参与
留出区分,不能冻结;无法区分仍拒绝。相关旧中指 DIP、候选选择及回读边界共 17 项
耗时 5.39 秒,后补否决边界 1 项耗时 2.16 秒。记录位于
`calibration_output/O30_RIGHT_001/software_review_ip_alternative/`,不代表整手实机通过。
完整 O30 产物链路按需单独执行:
```bash
python3 -m pytest -q \
src/linkerhand_calibration/test/test_o30_artifacts.py::test_o30_nonlinear_twenty_channel_finalization \
--durations=8 --timings-json=/tmp/calibration-o30-integration.json
```
该用例从正式采集证据入口进入,检查采样完成、训练决策回放、运动授权、受保护相机文件、
原始角点、JSON→URDF 重建和回读。输入来自独立 FK 合成场景,使用兼容的几何运动授权;
不模拟在线图像模型选择,不替代实机连续采集及精度验收。末节 CAD 零位假设仍须保留原语义。
整手输入由会话级夹具共享,只读使用;需要篡改的用例先复制。反馈缺失、反馈卡住已改为局部
映射契约测试,不再各生成一套整手 JSON/URDF。篡改、取消和失败指针检查优先复用验收边界。
`--timings-json` 记录各用例 setup/call/teardown 耗时、结果、层级和 Python/YAML 源码指纹。
同一版本通过的测试不无理由复跑;修复失败后只重跑失败及受新改动影响的用例。裸 `pytest`
仍会运行全量,标记不会悄悄关闭测试。分层收集可用 `--collect-only -m replay` 等命令检查。
上一版逐任务自适应方案的软件验证记录保存在工作区
`calibration_output/O30_RIGHT_001/software_review_adaptive_training/software_validation.json`,
同目录保留各组耗时记录和历史数据对照。O30 正式产物链路与混合轮数统计约 44 秒,
恢复、断点及真实 DIP 歧义回归约 19 秒,在线训练评估与取消约 6 秒。记录保留开发期间
的失败及修复后复查关系,不将不同代码版本的增量检查称为一次最终全量回归。
本次分阶段方案记录在
`calibration_output/O30_RIGHT_001/software_review_staged_training/software_validation.json`。
同目录保留各次运行的源码指纹、耗时及开发失败,报告标明修复关系。新旧策略、旁观图像、
原真实 DIP 拒绝和文件链路均分别记录;不重复旧的 2.88 GB 日志性能测量,不宣称实机已通过。
遮挡感知准备策略的日常检查使用 `test_preparation_witness.py`:真实无名指停点保留为
`fixtures/o30_ring_mcp_ambiguous.json.gz`,合成独立侧摆源明确标注,模块共享一次原始
拟合和一次新增证据。覆盖逐指避让后单通道往返、整数 SDK 目标、回访不重采、
训练/留出隔离、姿态改变、完整窗口、篡改、强制证据缺失及正式读回。只读策略为
`--preparation-policy occlusion_aware_witness_v1 --validate-only`,不启动硬件。
最终遮挡版:该文件加 Profile 加载、采集计划、原图像采集契约,共 58 项约 14.12 秒。
源码迭代与现场遮挡澄清导致的增量复查分别记录,不把开发过程累计次数称为一次回归。
记录目录为 `calibration_output/O30_RIGHT_001/software_review_preparation_witness/`。
新策略仍需完整实机对照;原 O30 JSON→URDF 及取消发布两项共享整手夹具约 32.12 秒,
没有逐个拒绝条件重新拟合整手,也没有运行全量 pytest/colcon。
准备优化器统一恢复检查位于 `test_image_bundle_optimizer.py`。快速用例检查计算次数、
内存上限、不收敛/异常/非有限值/误差增大时继续拒绝;真实回放标记为 `replay`,共享
一次 `20260920_154722` 拇指 IP 求解。夹具保留真实父参考、上游准备记录及其原始角点,
通过正式准备、来源几何和父参考验收;不能仅用孤立合成输出代替这些入口。
该次真实候选原先耗尽 150 次稀疏求值,使用同一训练证据暖启动直接解法后,再 6 次
收敛,随后被原 1.5 px 门限拒绝,合格候选得以通过。未收敛候选仍否决,不参与绕过
门限的比较;留出数据不决定计算恢复。主回归 24 项约 32.20 秒,覆盖旧 IP 精度不足
候选、真实中指/无名指歧义拒绝、转接/共享姿态回读、小指历史预算、训练/留出隔离和
工作进程取消。新增用例开发失败及针对性复查分别保存于
`calibration_output/O30_RIGHT_001/software_review_solver_recovery/`。
未重跑整手拟合和 JSON→URDF 产物组;本次改变的是准备求解及其证据绑定,产物生成、
最终角度/像素门限没有修改。软件回放通过不代表整手实机已经通过。
准备采样有效性与辅助适用性使用 `test_preparation_sync.py`:夹具来自真实
`20260920_160630` 小指完整准备窗口,保留两帧原始缺指令值。检查完整原始窗口回读、
排除记录绑定、缺值行上的保持关节变化、持续缺样/端点/身份变化拒绝,以及拟合前
辅助不适用时主模型独立验收,拟合后不改路线。与 `test_preparation_witness.py` 的
原歧义和篡改检查合计 41 项、10.58 秒;历史 v1 和拟合失败拒绝另 3 项、3.97 秒。
后补缺候选不可视为转角不足的边界单独执行;没有无理由重跑前述已通过组。
验证记录位于 `calibration_output/O30_RIGHT_001/software_review_preparation_admission/`。
双端共享姿态交接使用 `test_shared_pose_handoff.py`,夹具来自 `20260920_163002`,
包括原 MCP 模型/零位/像素来源、上游回基准原始窗口和 PIP 准备完整证据。
共享一次 PIP 拟合,检查原失败复现、新双端验证、原门限、正式回读、数据篡改、验证轮
隔离、源图像先于全部新准备数据、断点依赖导入/去重、恢复代次和四指模型归属。
DIP 用真实像素模拟后续访问,经 `ObservationCapture`、父参考确认和文件回读,
下游模型外壳明确为合成数据,不能宣称整指实机通过。
本轮父参考、有限恢复、旧断点及旧版共享姿态 62 项通过,20.95 秒;最终针对组
25 项通过,4.11 秒(含 1 项已受修改影响的旧父参考回读)。随后新增时序边界与导入
去重只执行相应用例。现有 O30 正式采集证据入口 JSON→URDF 集成单独运行一次,
31.24 秒。开发中的夹具缺来源、策略字段绑定和 ROS 环境收集失败保留原记录,
不计为通过;没有全量 pytest 或 colcon。完整记录见
`calibration_output/O30_RIGHT_001/software_review_shared_pose/`。
准备观测预算的实机像素回归使用 `test_preparation_density.py`,夹具为
`20260920_171710` 的完整小指 PIP/DIP 准备窗口、上游模型和双端交接图像。新 PIP
模型重新投影原 DIP 像素后,验证更完整的训练/留出分组、源模型精度传递、候选区分
及模型回读;冻结旧父模型仍拒绝,四指多关节求解不扩容。此回放带有明确的离线姿态
准入标记,不声称它是一次可发布的实机采集。正式产物另用已有 staged 产物组检验。
`test_checkpoint_startup.py` 检查断点加载心跳、独立 900 秒上限、恢复后设备/服务
时限、异常清理及无断点不发布加载状态。相关启动/共享姿态/真实密集回放 98 项
14.79 秒;产物回读、阶段隔离和取消发布 8 项 24.11 秒。前一批 85 项通过、1 项
失败是历史测试将最大像素误差写死为 0.75;新增留出图像为 0.752,实际契约为
1.5 px。现已断言正式契约,并复查完整共享姿态回读。环境收集失败、反事实回放
拒绝分类断言修正和后续通过记录均保留,不混算为一次完整实机回归。
扩展到准备采集/辅助证据入口后,发现在线密集预算未传入离线重拟合,已补齐
`image_sampling_policy` 的版本、报告与角色哈希绑定、重放参数及帧数上限校验。
后续来源/辅助/真实回放组 121 项通过、2 项为测试断言失败;原断言分别固定了错误
文本和旧采样子集模型。修正为准确拒绝码及相同预算的离线对照后,仅复查失败用例、
受影响的启动与产物边界,16 项通过,32.54 秒。发布线程清理再检查 7 项通过。
记录完整保存在 `software_review_stability_density`,没有将多版本增量测试宣称为
一次全量回归。实机尝试 `20260920_174317` 在发起标定运动前被现有 ROS 控制节点占用
阻止,未产生可交付 JSON/URDF。
完整已声明归零路径用作辅助观测时,运行 `test_declared_witness_path.py`:
只有完全相同避让姿态下的既有单关节归零路径可超过默认四分之一行程,
任意扩幅、其他关节变化及未经声明的侧摆全行程仍拒绝。
`test_conditioned_witness.py` 使用 `20260920_191613` 的真实中指 PIP/MCP 图像,
覆盖原来只作事后检查时的共享姿态失败、独立源验证后参与共享零位拟合、
正式证据回读以及端点变化/策略降级拒绝。旧 v1/v2 辅助证据继续按原含义读取;
新 v3 的共享姿态条件绑定进准备契约,不能复用旧契约模型。
`test_rigid_pair_observer.py` 使用 `20260920_192330` 的中指 MCP/PIP/DIP 原始
图像,验证双 Tag 联合拟合、原 1°/1 mm 来源门限、DIP 有界父几何传递和正式证据
回读;保持关节变化、源验证角点变化、当前端点变化及删除必需证据均拒绝。
`test_observer_pose.py` 另用已知真值和故意偏置的父姿态初始化验证相对安装恢复,
防止把历史父模型当成精确测量。真实夹具包含上游完整来源和会话头。
受影响的旧观测/共享姿态/几何传递/配置/准备契约组 86 项通过,28.21 秒;
新刚体对与 staged JSON/URDF 产物链组 14 项通过,38.29 秒。
初次缺 ROS 环境的收集失败不计入通过;上述结果属于软件回放,不能代替整手实机验收。
staged `passed` 续采检查 `test_passed_resume.py` 的真实 coordinator 导入边界:
已通过访问必须先完整落盘才能跳过,未完成和未来轮次不被授权;导入中止和反馈失效仍暂停。
相关 staged 调度和断点启动组首次 21 项通过、4 项夹具失败(O6 不支持 staged、
旧合成观测缺会话字段);修正夹具后只重跑受影响的 6 项,1.39 秒全部通过。
统一观测策略使用 `test_observer_policy.py`:覆盖整图依赖选择、断开的角色关系、
历史模式不变、通过关节策略保持、幂等、序列化和执行校验。
`test_checkpoint_observer_upgrade.py` 检查完整审计及拒绝改动既有模型、训练决策、
运动/精度契约和保护哈希。`test_rigid_pair_observer.py` 增加真实食指夹具
`o30_index_rigid_pair.json.gz`,明确验证有歧义的数据不会因开启新策略而误通过;
中指原通过、篡改拒绝和正式证据回读用例继续保留。
本轮策略/迁移/准备契约/真实回放组 30 项通过、19.43 秒,另 1 项因没有 source
ROS 环境导入失败;恢复环境后只重跑该项及受影响的配置/观测兼容组,18 项通过、
2.29 秒。启动参数和准备辅助兼容组 32 项通过、9.99 秒,共 80 项通过。
最初把食指真实数据预设为可通过的实验出现来源歧义,已记录为负例;未降低任何
精度、候选区分或发布门限。这些结果是软件验证,不是整手实机通过。
有界独立观测使用 `test_observer_preparation.py`:检查按共同祖先生成动作、四分之一
行程限制、已通过测量不变、画面内旋转不算视角覆盖、模拟真值恢复、命令/反馈/路径/
完成记录篡改拒绝、原始证据导入、运动预算跨重启保持、固定端点等待上限及真实食指
提前触发。`o30_observer_initial_hold.json.gz` 保存 `20260920_210259` 的初始静止
记录,用于检查稳定窗口与图像时效分离,以及未开始侧摆的计划可以审计后继续。
初次兼容组 40 项通过、1 项测试替身缺少新增控制器,20.78 秒;补齐测试替身后,
新流程及受影响用例 14 项通过、2.80 秒。准备契约、调度、全相机原始像素与既有
staged JSON/URDF 产物链 41 项通过、29.74 秒。采集计划兼容组 12 项通过、4.39 秒。
修正实机暴露的时效契约及未开始动作的恢复边界后,新流程和旧刚体对回放 22 项
通过、19.98 秒。各组有重复用例,不累计为一次全量通过。
观测补采有限序列与父标签跨次反馈契约:`test_observer_preparation.py`、
`test_parent_reference_reuse.py`、`test_parent_reference_provenance.py` 验证真实
`20260920_211220` 的完整小幅补采、247→255 的跨次反馈、原图像精度检查、
历史 v1 语义、两步预算及未开始动作的恢复。父参考组 58 项通过,7.69 秒;
序列/迁移/准备契约组 36 项通过,5.63 秒;序列/调度组 27 项通过,6.33 秒;
状态显示组 8 项通过,1.47 秒。新增预算用例初次因测试夹具命令和反馈共享列表
重复缩放失败,修正夹具后该项通过,0.81 秒;反馈规则篡改拒绝项初次即通过。
记录在 `software_review_active_observer_sequence`,这些分组有重复,不累计成全量回归。
训练中的双 Tag 父姿态分支优化:`test_rigid_pair_observer.py` 与
`test_observer_preparation.py` 共 25 项通过,47.56 秒,包含 213013 实机补采源、
旧中指正式证据回读、源不足拒绝、预算与保留断点。逐帧多初值最大 320 次评估,
全局交替最多三次;旧冻结父姿态路径保留原 80 次评估。独立 DIP 几何仍因精度不足拒绝,
该组通过只表示观测源/兼容机制通过,不能宣称整手或本批 DIP 通过。
## 原 MCP/PIP 训练回程参考适配与无侧摆实测(2026-09-22 19:06)
本轮新适配器使用已有隔离求解工作进程,采集源有界且不读取第三轮;只授权父参考
检查,不授权物理零位、角度样本或产物发布。完整 coordinator 合成运动集成首次
1 项通过,16.43 秒;增加图像身份及模型证据断言后,`test_chain_capture.py` 与
`test_chain_capture_runtime.py` 28 项通过,18.52 秒。新增来源分箱、训练冻结、
清理后旧结果拒绝、未解模型拒绝等边界随后 4 项通过,0.84 秒。
工作进程、旧初始化及 CLI 组 25 项通过,7.44 秒;包括真实 spawn 对新请求/结果
类型的传递。实测后仅更新描述文字,CLI/分析输出受影响组 30 项通过,1.83 秒。
以上存在重叠用例,不相加为一次全量回归,未重复运行所有已通过用例。
实机 `20260922_190634` 完成小指 MCP/PIP/DIP 每任务连续 2+1:18 个方向单元
无暂停、无重扫;原始命令核查各三次往返,无侧摆或准备额外圈。冻结在线模型
后的第三轮几何检查 MCP/PIP 各 60/60 通过,最大 RMS 0.295269/0.448776 px;
DIP 入口父模型复用通过。`frozen_reference_live_audit.json` 留存逐帧结果。
这些是采集与几何检查通过,不等于 DIP 曲线、物理零位或 JSON/URDF 发布验收。
## 整指运动学联合模型离线检查(2026-09-22)
新增 `test_kinematic_chain_diagnostic.py` 和 `test_chain_candidate_audit.py`,
针对性运行 8 项通过,4.03 秒。覆盖共享铰链下的阶段参考姿态、合成真值恢复、
Schur 协方差与完整逆矩阵一致、冻结模型拒绝无法解释的阶段平移、相机坐标系
相关协方差,以及只按训练状态合并数值等价解、保留失败解和不等价候选。
真实 `20260922_142553` 回放完整枚举 64 个双标签初值,全部收敛;训练状态分成
4 个物理解族,原 0.01 / Holm 门限检验后保留 2 族。保留族的条件输出角度包络
为 MCP 0.136425°、PIP 0.197536°、DIP 0.655645°。原始拟合结果不重写,
分族和相机几何审计只读取保存参数,不重新拟合。证据位于
`calibration_output/O30_RIGHT_001/software_review_20260922_stability/` 下的
`kinematic_chain_camera_geometry_audit_142553.json`。
这不是正式标定稳定性通过:轴距采用精确 URDF 约束,验证仍逐帧估角,且反向数据
用于候选检验。尚缺物理零位绑定、冻结双向指令映射、未使用第三轮、完整输出误差
及 JSON/URDF 往返验收。新模块为非授权离线模型,未绕过正式父参考或发布门限。
## O30 raw_joint 正式链路(2026-09-22)
用户指定停滞重试(2026-09-22):仅 O30 的 `mechanical_stall` 增加同一运动
首次尝试加两次重试,每次重发前等待 3 秒,第 3 次失败停止。等待不发送新位置
指令,不作为有效采样;失联、控制权冲突及其他保护仍检查。真实 coordinator
虚拟时钟验证三次失败、两次等待和等待期间保护:3 passed,1.00 秒。
既有安全及反馈组 44 passed;另一条旧启动测试补充显式复用相机参数后通过。
测试夹具曾缺少 SDK 心跳,已补齐模拟心跳,未因此改变生产通信保护。
新默认协议及完整边界见 `O30_RAW_PROTOCOL_IMPLEMENTATION.md`。
针对性验证(不同组有重叠,不相加宣称一次全量回归):
- 原始采集、断点恢复、存储回归:35 passed,44.24 秒。覆盖首单元尚未通过的中断发现、跨恢复补采预算、实际 coordinator 三轮指令、缺失光学观测禁止运动。
- 全手运动效果及显式旧协议路径:3 passed,4.12 秒。原有两个接受关节角夹具改为显式 `TASKWISE_TWO_ROUND`,不修改新协议质量门限。
- 光学核验及候选集合门限:8 passed,5.84 秒。错误内外参、覆盖、序列号、同步拒绝;物理超差拒绝,标签安装不唯一不额外否决。
- 共享 CAD 图像导数、历史失败角点和发布回读:10 passed,51.30 秒;批量独立角度验证修正稀疏索引读取后,发布组 3 passed,10.92 秒。
- 外参工具、原子发布、状态及 O30 launch 公共契约:30 passed,2.32 秒。
- 最终候选门禁、共享整指/运动链及真实失败回归:23 passed,12.25 秒。正式终结入口缺少来源证据时,拒绝求解并保存失败状态:1 passed,4.76 秒。
- 光学核验采集同步上限统一为 50 ms 后,外参工具受影响组:10 passed,0.57 秒。源码编译与 `git diff --check` 通过。
- ID5/9/12 与 ID10 历史回归来自 `o30_raw_failure_observations.json.gz`,仅用于旧角点观察能力回归,不能恢复为新协议数据。
- `o30_training_candidate_parameters.npz` 保存两个合成训练解的参数,供配对损失/保留候选边界测试复用,不含任何实机标定授权。
完整合成真值数值回归:64 个初始化全部收敛,约 192.82 秒;每个候选总求值不超过 200。
训练像素门限排除 32 个,训练分层配对检验排除 16 个,剩余 16 个全部通过候选协方差与第三轮验证。
训练检验使用原 0.03 px 分辨率余量和 0.01 Holm 家族门限;第三轮不参与选择。
保留候选的零位三倍标准差与候选差异联合包络约 0.100°,绝对指令角约 0.192°,轴位置约 0.125 mm,FK 位置约 0.260 mm。
产物通过实际 robot_state_publisher、结构授权、JSON 重建及最终 FK 回读;后半程验收和发布约 10.38 秒。
只写入 `calibration_output/software_review_20260922_raw_joint/known_truth/` 和独立软件测试指针;实机 `latest_passed` 未修改。
未进行本次新协议全手实测或实机姿态对照;不能把以上软件结果当作现场精度证明。
## O30 轻量原始角点采集与立即补采(2026-09-23)
新增集中回归 `test_raw_lightweight.py`,不恢复外部删除的历史测试。覆盖当前方向立即补一次、
中断预算、仅固定标签在线跟踪、死区/平台、堵转/反向/噪声、静止采样冻结计时、
不稳定终点有界退出、采完禁止发送、封存校验、旧协议读取与混合拒绝、旧合成 URDF 重建。
首组 6 passed、5 failed(4.25 秒):五个失败是扫描测试没有先进入任务避让姿态,
修正夹具起始向量后只复查该组,5 passed(0.98 秒)。后续边界组 10 passed、
1 failed(4.18 秒):竞争控制测试缺少 Start 后反馈,补齐后单项 1 passed(0.77 秒)。
完整真实 coordinator 虚拟时钟、单主机位移动标签、108 方向、无补采、归位封存与
训练/验证分区检查 1 passed(85.13 秒),属于必要整手调度集成,不是实机通过。
旧合成产物 v1/v2 JSON→URDF 重建与终态入口 3 passed(0.87 秒)。
删重复图像记录并保留未稳定原始帧后,受影响采集/补采恢复/封存/兼容组
7 passed(6.25 秒)。各组存在重叠,不累计为一次全量测试。
正式 CLI 配置校验通过。实机 `20260923_104837` 去程通过,拇指旋转回程指令 162、
反馈 253,累计实际运动无推进 4.005 秒触发保护;未重复启动,控制栈已退出,
停在当前位置,未执行自动归位。仅 1/108 方向完成,未封存为完整采集、未发布 URDF。
同段移动标签角点最大位移约 0.47 px、固定基准约 0.50 px,未见明显回程运动;
不能据此删除停滞保护,也不能宣称全手稳定采集通过。
补充只读离线入口检查初次失败(3.61 秒):虚拟相机夹具缺少实际入口要求的
`rectified_camera_model` 日志,补齐夹具后在后续组通过,确认缺项拒绝发生于
离线验收、原始文件哈希不变且无新运动。
用户随后明确授权硬件停滞重试一次:复用现有 StallRetry,O30 原始采集限制为
首次尝试加一次重试,等待 3 秒,同方向共享预算;其他硬件保护不进入重试。
首组 6 passed、1 failed(4.19 秒):测试将保护停止发送的最后保持指令也误认为
等待期间推进,修正断言后四种实际 coordinator 场景 4 passed(1.31 秒)。
运动保护代码和计划身份同步更新,旧策略会话不得混入新断点。
补充端点阶段切换与反馈抖动回归:180 ms 图像延迟单项通过(7.87 秒),
扩大到 300 ms 并增加 4 u8 往返抖动后复现 3 个失败、4 个通过(14.95 秒)。
隔离模块验证有限端点等待和推进历史最高值修正,8 passed(7.98 秒),未影响当时运行的实机。
用户随后明确端点只看实际发送 SDK 指令:最终采用有效稳态记录中的已发送指令核验端点,
不额外增加端点等待、不要求反馈到 0/255,也不把稳态图混入运动覆盖。
真实 coordinator 300 ms 延迟、反馈端点仅 10/240、离线误判复核与中断拒绝,
加上方向推进、补采、封存及旧协议边界,17 passed(10.04 秒)。
SDK 身份错误保留原字段、其他硬件保护和单次停滞重试、旧合成 URDF 重建,
9 passed(1.86 秒)。
实机 `20260923_110651` 完成 35 个方向,原记录 29 个通过、6 个端点误判;
在小指 PIP 验证回程因 `o30_sdk_identity_mismatch` 停止,反馈仍约 29.81 Hz。
未触发停滞重试,未归位封存,未更新 `latest_passed`。异常身份字段在旧日志中缺失,
不能将此状态直接等同于物理通信断开。修正后只读复核同一数据,35 个完整方向均通过,
缺 73 个方向,禁止发布,源数据哈希未变化;报告见实现文档。
最终端点与推进规则下,完整 coordinator 单主机位、108 方向、归位封存及
训练/验证分区回归:1 passed(87.51 秒)。该必要整手集成仍仅为软件验证。
源码编译和 `git diff --check` 通过;未恢复外部删除的历史测试。
2026-09-23 用户确认 ID17 在拇指近端指节后修正安装连杆及产品哈希。
正式配置加载、拓扑反馈依赖 0/1/6、仅顶机位、17 任务/108 方向校验通过;
临时校验脚本首次误用 TagSpec.id,改为 tag_id 后通过,生产加载未失败。
既有原始角点、立即补采和旧协议边界回归 3 passed(0.85 秒)。
现有真实数据的局部拟合揭示原绑定错误,但修正后最大训练标签误差仍为 8.047 px,
原精度门限未通过;软件回归通过不代表实机 URDF 可发布。未重新运动或改写源证据。
2026-09-23 低精度离线草稿:新增集中 `test_raw_draft.py`,加已有合成正式 URDF
重建检查,13 passed(1.55 秒)。覆盖真实零位写入与 FK、缺测关节不改、JSON 零位/
曲线/来源篡改拒绝、不可观测零位拒绝、精度超限仍允许草稿、旧 Profile 仅允许标签
连杆修正、同步缺失帧不供给范围证据,以及 CLI 不进入运动或正式发布。
实测旧数据的正式 CLI 草稿路径已运行,生成完整结构 URDF 并通过标准 ROS 加载;
JSON/URDF FK 最大差 4.44e-16,两个拇指零位和四个行程实际改变。
独立精度验收仍失败,输出 `accuracy_passed=false`,没有更新 `latest_passed`。
第一次实数据导出因原始帧含空指令失败,修复共享证据过滤后 v2 成功;未删除失败审计。
2026-09-23 全手 15 零位/20 行程目标及采集后自动导出:受影响范围与真实 runner 生命周期
5 passed(1.75 秒),验证完整目标、部分数据不能冒充全手,以及成功/缺项/求解失败三种
情况下 SDK 栈、监控节点和自建 ROS 上下文均先关闭,离线阶段从不重新启动运动。
补充 Profile 原字节快照后,仅复查三个生命周期场景,3 passed(1.66 秒)。
正式 CLI --validate-only 通过,明确列出 15 个零位和 20 个行程目标。
必要的一次全手数学检查:独立 XML FK 生成 2028 帧训练角点,463 参数图像模型单初值
12 次联合迭代收敛;包括生成数据和秩检查共 31.82 秒,最大零位差 0.001054°。
复用保存参数进行完整 JSON→URDF 导出与标准加载,不重复拟合;15 个零位修正、五个
末端零位保留、20 个行程、最终 FK 最大差 5.55e-16 均通过。非实机验收、不更新正式指针。
2026-09-23 ID10 调整后的草稿断点:新增 `test_raw_remount.py`,验证 78 个连续通过方向
保留、旧 ID10 角点排除、原始像素不改、已用补采次数保留、重复调整声明拒绝、未知/
固定标签拒绝,以及固定基准和已知标签漂移仍拒绝。基准不可见标签只能进入草稿,不能
正式发布。首轮 5 passed,测试夹具共享列表导致 1 failed;修正夹具后,对失败项、CLI、
中断预算及受影响草稿契约运行 19 passed(2.74 秒)。没有恢复已删除的历史测试。
随后按 CAD 拓扑隔离整条受影响手指,验证旧观测不混用、已开始扫描禁止扩大排除范围,
受影响 6 passed(1.14 秒)。
2026-09-23 中指侧摆 0–80 短段:按已声明段长度缩放反馈分箱密度,保留图像/指令覆盖、
实际运动分辨率、4 秒推进及其他硬件保护。相关短段、堵转/反向/噪声、硬件保护、离线
生命周期与范围证据检查 14 passed(3.02 秒)。只读复核 `20260923_125329` 的两个
第二次完整尝试均通过,原始失败记录未改写,结果保存为 `short_segment_reassessment.json`。
## 离线零位方向回归
`test_raw_draft.py` 中的 `parallel_root_motion` 用同一批不变角点核对平行根轴方向,
四指 SDK/URDF 符号反转时必须拒绝,不能通过关节零位吸收错误。
`old_capture_model_correction` 验证离线绑定/方向修订仍保留原始采集身份,并拒绝速度变更。
方向用例来自首轮实采角点节选 `fixtures/o30_recorded_root_directions.json.gz`,
保留来源 SHA256,不含验证轮。其余数值回归仍使用合成数据;不发送硬件指令。
2026-09-23 拇指独立原始采集:局部范围编译保留 `raw_joint_2_plus_1`,清除被保留关节的
零位测量声明;训练策略允许经过范围契约验证的 O30 局部配置。复用原执行器和补采预算,
未修改拟合模型或运动保护。新增范围往返序列化、24 单元原路线/分区一致、立即补一次与归位后
结束测试,连同全手原调度两项回归共 4 passed(1.03 秒)。
实机会话 `thumb_recapture_20260923_175829/O30_RIGHT_001/20260923_180129` 在启动归位阶段
MCP 指令 0/反馈 120,两次无推进后停止;正式扫描 0/24,不能记为实机采集通过。
标定控制链已关闭,原全手数据未修改,等待现场机械接触观察。
2026-09-23 新外参拇指与旧四指离线组合:修复独立验证总判定的 NumPy bool_ JSON
序列化失败;新增冻结旧参考参数的图像拟合更新与显式局部验证范围。参数按语义转移,
不共享新旧相机外参,不改变 CAD 轴,无观测增量冻结,零位存在自由规范时拒绝。
`test_raw_joint_update.py test_raw_draft.py` 共 37 passed(20.74 秒);随后加入零位
可观测性保护,更新工具相关 3 passed(0.19 秒)。全手默认验证仍拒绝缺失关节,
局部报告不得视为全手验收。未恢复删除的历史测试。
实采组合草稿通过 JSON 重建、最终 FK(7.36e-16)、标准加载与 MuJoCo 编译。
曲线模型角度检查通过不等于 URDF 线性驱动通过:纯 URDF yaw 最大误差约 3.52°,
精度未认证,不更新 latest_passed。详见
`calibration_output/thumb_recapture_20260923_175829/offline_combined_new_thumb_draft/README.md`。