Files
orisys-sdk/docs/field-gain-model.zh.md
T
ykcheungab 0a042c7fbf 新增 HHD 场加权标定模型与加权空载基线
field_gain/1 用坐标增益图对无旋向量场做 L1 场加权,以连续 30 帧加权中位数替代旧 raw 零点,实时入口暂不支持。目标测试 102 项与 lint_gate 通过;契约见 orisys-sdk/docs/field-gain-model.zh.md。
2026-10-19 19:49:25 +08:00

6.7 KiB
Raw Blame History

场加权力标定模型契约

用途:reference。范围:SDK schema 3 field_gain/1 的输入、映射、空载基线、诊断与兼容边界。 统一力标定模型契约负责文件选择、身份与逐帧生命周期; 本文只补充场加权模型特有语义。状态:2026-10-19 已实现并有回归测试,离线录像对照见 实施计划。

定位与边界

从现有多点增益生成空间图,对 HHD 无旋向量场做加权求和,作为 FN 的实验估计。 不依赖深度、接触中心、最大光流点或单接触判定;实时入口尚未接入,必须显式拒绝。 现有增益对应各加载位置的整场响应,不是已验证的局部系数。交付证明软件契约与可复现估计, 不宣称局部压力、多接触力可加性或精度改善。负的基线差保留;显示阈值只由显示层决定。

文件字段

model.type 为 field_gain/1,input_profile 为 hhd_normal_l1_field/1,outputs 仅 ["fn"]。 pipeline 沿用 schema 3 的测量身份,并增加闭合的 pipeline.field(由 SDK FIELD_IDENTITY 生成):grid、shape、mask_shape、vector、reduction、dtype、 unit、mask、lifecycle、area_compensation。它们进入特征签名;改变任一值即需升级 profile。 params 必需键:

键 规则
points_uv、gains_N_per_raw、triangles 沿用空间增益的完整凸包三角网校验;点数由数组决定
valid_force_range_N 必填 [low, high];超范围保留数值并标 out_of_range
mapping 固定 {"inside": "barycentric", "outside": "boundary_projection", "tie_break": "boundary_edge_order"}
baseline 固定 {"frames": 30, "statistic": "median"},仅实现这一策略

artifacts 必须有且仅有一个 role="coordinate_map" 附件;map_sha256 必须等于附件字节摘要。 附件提供输出分辨率 uv_by_output_px 与 valid_mask,SDK 打开模型时校验形状与有限性。

增益图与加权求和

先把支撑点增益映射到 HHD 向量场的计算网格,再逐帧归约;缓存身份包含模型指纹、坐标附件、 HHD 网格形状与物理有效掩膜,任一变化都重建。映射规则:

  • 三角网内按重心插值取增益;查询落在共享边时按文件中的三角顺序取第一个命中的三角形。
  • 凸包外投影到最近边界线段,再按投影参数插值两端增益;距离相同时取边界边排序中靠前者。
  • 输出网格内只在物理有效像素上统计;有效掩膜内缺坐标或增益是模型映射错误,报 coordinate_unmapped,不当作零或域外增益。
  • 按块面积降采样到 HHD 网格:增益取覆盖有效像素的均值;coverage 是覆盖面积比, inside 是凸包内面积比;混合覆盖格点保留比例,不平均无效坐标。

逐帧对同一帧的 HHD 无旋向量场 d 计算 P = A * sum_{HHD 激活格点}(gain * (|d_x| + |d_y|))。HHD raw 汇总正是 A * sum_{激活格点}(|d_x|+|d_y|),所以常增益必须精确等于 gain * raw;coverage 只用于 外推比例与诊断,不得再乘进 P,否则掩膜边缘的部分覆盖格点会被重复折扣。

HHD 激活但 coverage=0(没有任何有效像素映射到该格点)是模型映射错误,报 coordinate_unmapped,不得静默记零。A 取自 hhd/api.py 现有的 参考网格面积补偿(参考网格像素数/当前网格像素数),调用方不得再乘一次或重复归一化。 不得改变 FN raw、HHD 分解或剪切分量。空场时 P=0 且外推比例为 0; 负的 FN = P - B0 保留为有效数值(可能超量程)。

空载基线与生命周期

用户先声明无载窗口,SDK 才对后续帧累计加权 P:

  • Sensor.declare_unloaded_reference(reference_id=...)(FingerRuntime 同名转发)开始窗口; reference_id 必填并记录。窗口要求连续 30 个有效帧;任一无效输入或映射错误会中断连续计数, 向前 30 帧零点未就绪。
  • B0 为这 30 个 P 的中位数;就绪前的帧状态为 zero_unavailable,不输出牛顿值。 就绪后 FN = P - B0。
  • 空载确认不以接触定位为门槛,但要求输入有限;换模型、重置、倒播或新会话使基线失效。
  • 场模型拒绝旧标量零点:Sensor.set_calibration_reference() 对 hhd_normal_l1_field/1 抛 CalibrationError,调用方必须使用加权窗口接口,不能把旧 FN raw 零点当作 B0。

结果诊断

CalibrationResult.diagnostics 逐帧携带版本化诊断;旧结果或缺字段时按未知处理,不得补零:

键 含义
model_fingerprint 模型文档与附件的内容指纹
mapping 生效的边界策略
baseline_N、reference_id 已就绪基线及其声明标识;未就绪为 None
pending_reference_frames 当前连续窗口已累计的有效帧数
extrapolated_fraction、coverage_fraction 按 q 加权的凸包外比例与覆盖比例
area_scale、frame_id 本帧面积补偿与帧标识

extrapolated_fraction 是估计质量,不是有效性:它不改变 status,也不得让上层丢弃牛顿值。 零点缺失、输入错误仍无效;超量程沿用现有显式状态。

兼容与实现位置

旧 spatial_gain/1、global_gain/1 与旧文件语义不变;schema 3 按声明轴校验,旧 SDK 遇 field_gain/1 必须拒绝。hhd_downsample 仍按既有兼容例外处理:只允许该键数值不同, 其余处理参数、几何、展开域、SN 与传感器类型仍须匹配,不能借此跳过签名校验。

位置 责任
src/orisys/field_calibration.py profile/策略常量、增益图构建、加权归约
src/orisys/calibration_models.py 类型注册、参数校验、基线状态与诊断
src/orisys/hhd/api.py 同帧 get_field():d 拷贝、物理掩膜、面积补偿
src/orisys/sensor.py、src/orisys/finger/runtime.py 同帧场推断、加权零点声明、上下文绑定
工作区 scripts/finger_multical/export_field.py 现有空间模型只读导出为实验文件,不重训、不改排除点

回归证据:tests/test_field_calibration.py 覆盖常增益等价、两区域贡献、重叠向量先合成再 L1、 边界投影、掩膜/NaN/空场、映射错误与 30 帧基线生命周期;tests/test_model_runtime.py 覆盖 HHD 同帧场接线、加权零点声明与无接触推断。命令与 run_id 记录在实施计划的执行结果中。 实验导出文件不覆盖原件,provenance 声明来源哈希、边界/基线策略和实验假设。