粗定位补偿拟合
目标
根据点云点与世界点对照数据,拟合适合当前项目的粗定位补偿参数,并给出:
- 推荐补偿模型
- 配置参数
- 参数含义
- 误差统计
- 外推稳定性分析
当前项目补偿链路
当前粗定位链路:
- 相机原始结果
VisionPositionCompensation:相机坐标系 → 世界坐标系GantryQuadraticCorrection:龙门补偿(当前代码里实际是位置相关旋转+平移的 9 参数模型)
当前代码模型位于:
src/Weldone.Application/Coarse/GeneralCoarsePositioningAppService.cssrc/Weldone.Domain/Settings/CoarseVisionSetting.cs
当前 GantryQuadraticCorrection 的 9 参数含义:
[0] a0: 旋转角基准值(rad)[1] a1: 旋转角随X变化的斜率(rad/mm)[2] a2: 旋转角随Y变化的斜率(rad/mm)[3] b0: X平移基准值(mm)[4] b1: X平移随X变化的斜率[5] c0: Y平移基准值(mm)[6] c1: Y平移随X变化的斜率[7] c2: Y平移随Y变化的斜率[8] dz: Z平移常量(mm)
补偿公式:
theta(x,y) = a0 + a1*x + a2*y
tx(x) = b0 + b1*x
ty(x,y) = c0 + c1*x + c2*y
z' = z + dz
补偿矩阵:
Rz(theta) + [tx, ty, dz]
输入数据格式
优先读取用户提供的桌面文本文件,常见格式:
实际位置:
P1: x, y, z
...
点云中的点:
P1: x, y, z
...
或:
点云变换点1: x,y,z
世界点1: x,y,z
需要保证点号一一对应。
工作流程
第一步:读取数据
读取用户提供的文件,提取:
- 点云点
P[i] - 世界点
W[i]
第二步:基础诊断
必须先做以下分析:
- 逐点误差:
d = W - P - 误差分布:按 X 区域看 dX/dY/dZ
- 距离一致性检查:任意点对的 cloud_dist / world_dist 比值范围
判断原则:
- 如果距离比例严重异常(如 0.2、0.5 这类极端值),先提醒用户数据可能混了不同坐标系或异常点
- 如果距离比例稳定(如 0.9~1.02),可以进入拟合
第三步:至少比较以下三种模型
A. 单一刚体矩阵
误差模型:
dx = -theta*y + tx
dy = theta*x + ty
dz = 常量
输出:
- theta (deg)
- tx, ty, dz
- 等效 4x4 矩阵
- mean / max error
B. 位置相关旋转+平移(当前推荐模型)
误差模型:
theta(x,y) = a0 + a1*x + a2*y
tx(x) = b0 + b1*x
ty(x,y) = c0 + c1*x + c2*y
输出:
- 9 个参数
- 每个参数物理含义
- mean / max error
- 外推合理性(是否发散)
C. 线性仿射矩阵
矩阵元素随位置线性变化,用于和 B 对比。 如果 B 明显更好,优先推荐 B。
第四步:做外推稳定性测试
必须用一个“超出训练范围”的测试点做外推检查,例如用户当前关心的点,或者自己选一个边界外点。
检查内容:
- 输出位置偏移是否离谱
- 矩阵元素是否仍接近合理范围(对仿射模型)
- 是否存在明显发散
原则:
- 精度略高但外推会爆炸的模型,不推荐
- 精度略低但稳定的模型,更适合现场使用
第五步:给结论
结论必须包含:
- 推荐哪个模型
- 为什么推荐
- 参数列表
- 参数含义(尤其要说明工人主要调哪些参数)
- 如果需要,给出建议写入
CoarseVisionSetting.json的数组
输出模板
推荐模型
- 模型名:
- 原因:
误差对比
- A:mean / max
- B:mean / max
- C:mean / max
推荐参数
[a0, a1, a2, b0, b1, c0, c1, c2, dz]
参数含义
- a0:整体旋转偏移,现场优先调
- b0:整体 X 偏移,现场优先调
- c0:整体 Y 偏移,现场优先调
- dz:整体 Z 偏移,现场优先调
- a1/a2/b1/c1/c2:位置相关修正,通常标定后固定
注意事项
- 优先复用当前项目的补偿思路,不要默认切回二次多项式
- 如果用户要求“方便工人调”,优先推荐少参数、物理含义清晰的模型
- 如果用户要求“精度最高”,也要同时报告外推风险
- 不要直接修改代码,除非用户明确要求
- 如果用户要把结果写进 config,再去更新桌面上的
CoarseVisionSetting.json