# Coarse Compensation Fit

> 读取粗定位点云点与世界点对照数据，分析误差模式，并拟合适用于当前粗定位链路的补偿参数。用于：根据更多标定点更新粗定位补偿；比较单一刚体矩阵、位置相关旋转+平移、线性仿射等方案；输出可直接写入配置的参数；解释每个参数的物理含义和现场调试方式。当用户说”重新计算粗定位补偿””用更多点更新补偿””拟合龙门补偿””分析点云点和世界点误差””更新当前矩阵/参数”时使用。

- Skill: `grasscaograss/coarse-compensation-fit` (Agent Skill)
- Install (CLI): `npx skillmds@latest add grasscaograss/coarse-compensation-fit`
- Raw SKILL.md: https://api.skillmd.com/api/skills/grasscaograss/coarse-compensation-fit/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: Apache-2.0
- Author: grasscaograss (https://skillmd.com/u/grasscaograss)
- Updated: 2026-09-21
- Page: https://skillmd.com/skills/grasscaograss/coarse-compensation-fit

---


# 粗定位补偿拟合

## 目标

根据点云点与世界点对照数据，拟合适合当前项目的粗定位补偿参数，并给出：
- 推荐补偿模型
- 配置参数
- 参数含义
- 误差统计
- 外推稳定性分析

## 当前项目补偿链路

当前粗定位链路：
1. 相机原始结果
2. `VisionPositionCompensation`：相机坐标系 → 世界坐标系
3. `GantryQuadraticCorrection`：龙门补偿（当前代码里实际是位置相关旋转+平移的 9 参数模型）

当前代码模型位于：
- `src/Weldone.Application/Coarse/GeneralCoarsePositioningAppService.cs`
- `src/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)

补偿公式：
```text
theta(x,y) = a0 + a1*x + a2*y
tx(x)      = b0 + b1*x
ty(x,y)    = c0 + c1*x + c2*y
z'         = z + dz
```

补偿矩阵：
```text
Rz(theta) + [tx, ty, dz]
```

## 输入数据格式

优先读取用户提供的桌面文本文件，常见格式：

```text
实际位置：
P1:  x, y, z
...

点云中的点：
P1:  x, y, z
...
```

或：

```text
点云变换点1： x,y,z
世界点1： x,y,z
```

需要保证点号一一对应。

## 工作流程

### 第一步：读取数据

读取用户提供的文件，提取：
- 点云点 `P[i]`
- 世界点 `W[i]`

### 第二步：基础诊断

必须先做以下分析：
1. 逐点误差：`d = W - P`
2. 误差分布：按 X 区域看 dX/dY/dZ
3. 距离一致性检查：任意点对的 cloud_dist / world_dist 比值范围

判断原则：
- 如果距离比例严重异常（如 0.2、0.5 这类极端值），先提醒用户数据可能混了不同坐标系或异常点
- 如果距离比例稳定（如 0.9~1.02），可以进入拟合

### 第三步：至少比较以下三种模型

#### A. 单一刚体矩阵

误差模型：
```text
dx = -theta*y + tx
dy =  theta*x + ty
dz = 常量
```

输出：
- theta (deg)
- tx, ty, dz
- 等效 4x4 矩阵
- mean / max error

#### B. 位置相关旋转+平移（当前推荐模型）

误差模型：
```text
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。

### 第四步：做外推稳定性测试

必须用一个“超出训练范围”的测试点做外推检查，例如用户当前关心的点，或者自己选一个边界外点。

检查内容：
- 输出位置偏移是否离谱
- 矩阵元素是否仍接近合理范围（对仿射模型）
- 是否存在明显发散

原则：
- 精度略高但外推会爆炸的模型，不推荐
- 精度略低但稳定的模型，更适合现场使用

### 第五步：给结论

结论必须包含：
1. 推荐哪个模型
2. 为什么推荐
3. 参数列表
4. 参数含义（尤其要说明工人主要调哪些参数）
5. 如果需要，给出建议写入 `CoarseVisionSetting.json` 的数组

## 输出模板

### 推荐模型
- 模型名：
- 原因：

### 误差对比
- A：mean / max
- B：mean / max
- C：mean / max

### 推荐参数
```text
[a0, a1, a2, b0, b1, c0, c1, c2, dz]
```

### 参数含义
- a0：整体旋转偏移，现场优先调
- b0：整体 X 偏移，现场优先调
- c0：整体 Y 偏移，现场优先调
- dz：整体 Z 偏移，现场优先调
- a1/a2/b1/c1/c2：位置相关修正，通常标定后固定

## 注意事项

- 优先复用当前项目的补偿思路，不要默认切回二次多项式
- 如果用户要求“方便工人调”，优先推荐少参数、物理含义清晰的模型
- 如果用户要求“精度最高”，也要同时报告外推风险
- 不要直接修改代码，除非用户明确要求
- 如果用户要把结果写进 config，再去更新桌面上的 `CoarseVisionSetting.json`

