3. 校准矩阵原理:三点校准与多点校准的数学推导

触摸偏移的校准,说白了就是找一个数学变换,把触摸屏上报的坐标映射到屏幕显示坐标上。这个映射关系怎么定?靠的就是校准矩阵。我做了这么多年触摸驱动,见过不少团队在校准这一步偷懒,结果就是「点不准、飘得厉害」。今天咱们把三点校准和多点校准的数学底牌翻出来看看。

3.1 为什么需要校准矩阵?

触摸屏和显示屏天生就是两套坐标系。触摸屏有自己的 ADC 采样坐标,显示屏有自己的像素坐标。两者之间通常存在旋转、缩放、平移,甚至梯形畸变。你想想看,如果直接拿触摸坐标当显示坐标,那点按位置肯定偏到姥姥家去了。

校准矩阵的作用,就是用一个数学模型把这两套坐标系对齐。最常见的模型是仿射变换,它包含 6 个自由度:

  • X 方向缩放
  • Y 方向缩放
  • X 方向旋转
  • Y 方向旋转
  • X 方向平移
  • Y 方向平移

核心公式:

X_display = a * X_touch + b * Y_touch + c
Y_display = d * X_touch + e * Y_touch + f

其中 a、b、c、d、e、f 就是我们要解出的 6 个校准参数。

3.2 三点校准:最少点数的线性解法

6 个未知数,理论上需要 3 个点(每个点提供 X 和 Y 两个方程,共 6 个方程)就能解。这就是三点校准的数学基础。

我记得第一次在嵌入式设备上实现三点校准时,踩过一个坑:三个点不能选在一条直线上。否则矩阵会奇异,解出来的参数全是 NaN。后来我养成了一个习惯——选点的时候一定让它们构成一个尽可能大的三角形,覆盖屏幕的三个角落。

3.2.1 求解过程

假设我们在屏幕上选了三个校准点:

校准点 触摸坐标 (X, Y) 显示坐标 (X, Y)
点 1 (x1, y1) (X1, Y1)
点 2 (x2, y2) (X2, Y2)
点 3 (x3, y3) (X3, Y3)

把 6 个方程写成矩阵形式:

| x1  y1  1   0   0   0 |   | a |   | X1 |
| 0   0   0  x1  y1  1 |   | b |   | Y1 |
| x2  y2  1   0   0   0 |   | c |   | X2 |
| 0   0   0  x2  y2  1 | * | d | = | Y2 |
| x3  y3  1   0   0   0 |   | e |   | X3 |
| 0   0   0  x3  y3  1 |   | f |   | Y3 |

解这个 6×6 线性方程组,就能得到 a~f 六个参数。实际工程中我一般用高斯消元法或者 LU 分解,在 MCU 上跑起来很快。

工程小技巧:三点校准的精度受限于触摸屏的线性度。如果触摸屏本身非线性严重,三点校准只能保证这三个点准,中间区域可能还是偏的。我曾经在一个廉价电阻屏项目上吃过这个亏,后来被迫换成了五点校准。

3.3 多点校准:最小二乘法的降维打击

当触摸屏存在非线性畸变时,三点校准就不够用了。多点校准的思路是:采集 N 个点(N > 3),然后用最小二乘法拟合出最优的 6 个参数。这样每个点都不一定完全准,但整体误差最小。

说白了,就是用「统计平均」来对抗「局部噪声」。

3.3.1 超定方程组

对于 N 个点,我们得到 2N 个方程,但只有 6 个未知数。这就是超定方程组:

| x1  y1  1   0   0   0 |   | a |   | X1 |
| 0   0   0  x1  y1  1 |   | b |   | Y1 |
| x2  y2  1   0   0   0 |   | c |   | X2 |
| 0   0   0  x2  y2  1 |   | d |   | Y2 |
| ...                     | * | e | = | ... |
| xN  yN  1   0   0   0 |   | f |   | XN |
| 0   0   0  xN  yN  1 |       |   | YN |

记作:A * p = b

其中 A 是 2N×6 的矩阵,p 是 6×1 的参数向量,b 是 2N×1 的目标向量。

3.3.2 最小二乘解

标准解法是求正规方程:

A^T * A * p = A^T * b
p = (A^T * A)^(-1) * A^T * b

这个公式看起来吓人,但实际计算时我一般用 QR 分解,数值稳定性比直接求逆好得多。在 Cortex-M4 级别的 MCU 上,9 点校准的计算时间大概在 2~3 毫秒,完全可接受。

注意:正规方程的条件数是原矩阵条件数的平方。如果触摸点分布不好(比如所有点挤在一个角落),A 矩阵的条件数会很大,导致解出来的参数对噪声极其敏感。我曾经在一个项目上遇到过这种情况,校准完当时准,过两天温度一变就飘了。后来我把校准点均匀分布在屏幕的 9 个区域,问题就解决了。

3.4 三点校准 vs 多点校准:怎么选?

我个人的经验是:

  • 三点校准:适合线性度好的触摸屏(比如高质量电容屏),计算量小,校准速度快。但容错性差,一个点采集偏差就会导致整体偏移。
  • 五点/九点校准:适合非线性明显的触摸屏(比如大尺寸电阻屏、红外屏),或者对精度要求高的场景。计算量稍大,但鲁棒性好。
对比项 三点校准 多点校准
最少点数 3 4+(推荐 5 或 9)
数学模型 线性方程组精确解 最小二乘法拟合
抗噪声能力 弱 强
计算量 小 中
适用场景 小尺寸、高线性度屏 大尺寸、非线性屏

3.5 校准矩阵的数学结构图

下面这张图展示了从触摸坐标到显示坐标的完整变换链路,以及三点校准与多点校准在数学上的区别:

校准矩阵数学结构图 校准矩阵数学结构图 触摸坐标 (x, y) 显示坐标 (X, Y) 仿射变换 X = a*x + b*y + c Y = d*x + e*y + f 三点校准 3 个点 → 6 个方程 精确解(线性方程组) 计算快,抗噪弱 多点校准 N 个点 → 2N 个方程 最小二乘拟合 计算稍慢,抗噪强 选点原则 三点不共线 | 多点均匀分布 | 覆盖屏幕边缘和中心

3.6 工程实现中的避坑指南

最后分享几个我在实际项目中踩过的坑:

  • 点序问题:校准点的点击顺序会影响用户体验。我习惯从左上角开始,顺时针依次点击,这样用户不容易搞混。
  • 去抖动:采集触摸坐标时一定要做均值滤波。我曾经遇到过触摸屏 ADC 噪声达到 ±10 个像素,不做滤波的话校准参数根本稳不住。
  • 参数持久化:校准参数算出来后要存到非易失存储里。我一般存成浮点数,用 CRC 校验,防止数据损坏导致触摸失灵。
  • 回退机制:如果校准失败(比如矩阵奇异、残差过大),要能回退到上一次有效的校准参数。嗯,这个机制救过我一次——有一次产线上的触摸屏批次有问题,九点校准全失败,幸好有回退机制,设备还能用旧参数正常工作。

一句话总结:三点校准是数学上的精确解,但工程上多点校准更实用。选点要均匀,计算要稳健,参数要持久化——这三点做到了,触摸偏移的问题就解决了一大半。