2、校准算法数学基础:线性校准与非线性校准的数学原理,最小二乘法在触摸校准中的应用
做触摸校准,说白了就是解决一个问题:你点下去的位置,和芯片读到的坐标,到底差了多少? 这个差值怎么算、怎么补,就是校准算法的核心。
我个人习惯把校准算法分成两类:线性校准和非线性校准。别被名字吓到,其实没那么玄乎。咱们一个一个说。
2.1 线性校准:最常用的“三板斧”
线性校准假设触摸屏的物理坐标和ADC采样值之间是一次函数关系。你想想看,如果屏幕是完美的、贴合工艺也没问题,那这个假设基本成立。
数学上,我们用一个仿射变换来描述:
X_device = a * X_adc + b * Y_adc + c
Y_device = d * X_adc + e * Y_adc + f
这里 X_device、Y_device 是你要的物理坐标(比如像素),X_adc、Y_adc 是触摸芯片读回来的原始值。a、b、c、d、e、f 就是我们要算的6个校准参数。
为什么是6个参数?
因为除了缩放(a、d)和平移(c、f),还有旋转和剪切(b、e)。屏幕贴歪了、ADC参考电压有偏差,这些都能被这6个参数吃掉。
我在项目中遇到过一种情况:某款7寸屏,贴膜工艺不稳定,导致屏幕左上角和右下角的线性度差异很大。用6参数模型,校准后误差能控制在1个像素以内。换成3参数(只算缩放和平移),误差直接飙到5个像素。嗯,这里要注意:能用6参数就别用3参数,多算三个数,省掉一堆硬件调校的麻烦。
2.2 非线性校准:当线性不够用时
线性校准不是万能的。有些触摸屏,尤其是大尺寸电容屏或者曲面屏,ADC值和物理坐标之间不是直线关系。你点一个十字,读回来可能是个弯的。
这时候就需要非线性校准。常见的做法是分段线性或者多项式拟合。
分段线性:把屏幕分成多个小格子,每个格子单独算一套线性参数。格子越小,精度越高,但校准点也越多。
多项式拟合:用更高次的函数去逼近。比如二次多项式:
X_device = a0 + a1*X + a2*Y + a3*X² + a4*X*Y + a5*Y²
我曾经调试过一款21.5寸的工业触摸屏,屏幕边缘的畸变非常严重。用6参数线性校准,边缘误差有8个像素。换成二次多项式,误差直接降到1.5个像素。代价是什么?计算量大了,而且校准点从3个变成了至少6个。
| 校准类型 | 参数数量 | 校准点数 | 适用场景 | 精度 |
|---|---|---|---|---|
| 3参数线性 | 3 | 2~3 | 小尺寸、工艺好 | 一般 |
| 6参数线性 | 6 | 3 | 大多数消费/工业屏 | 良好 |
| 分段线性 | 可变 | 9~25 | 大尺寸、边缘畸变 | 优秀 |
| 二次多项式 | 6~12 | 6~9 | 曲面屏、高精度要求 | 优秀 |
避坑指南
我曾经为了省事,在大尺寸屏上只用3点线性校准。结果用户反馈屏幕边缘点不准,尤其是画图软件里,画出来的线总是歪的。后来老老实实改成9点分段线性,问题才解决。所以,别在精度上省钱,校准点多几个,用户体验好一大截。
2.3 最小二乘法:校准的“万能钥匙”
好了,参数模型有了,接下来怎么算这些参数?
你肯定不能直接解方程——因为测量值有噪声,3个点解6个参数,方程数不够。就算点够了,噪声也会让结果飘得离谱。
这时候就要请出最小二乘法。它的核心思想很简单:让所有校准点的理论值和实际测量值之间的误差平方和最小。
数学上,我们构造一个误差函数:
E = Σ (Y_device_i - (a*X_adc_i + b*Y_adc_i + c))²
然后对 a、b、c 分别求偏导,令导数为0,解这个线性方程组。这就是线性最小二乘。
具体步骤我习惯这样记:
- 收集数据:在屏幕上显示N个校准点,记录每个点的物理坐标和ADC值。
- 构造矩阵:把ADC值写成矩阵A,物理坐标写成向量b。
- 求解正规方程:
(AᵀA) x = Aᵀb,解出参数向量x。 - 验证:用求出的参数回代,算一下残差。如果某个点残差特别大,可能是测量异常,需要剔除。
我的小技巧
在实际工程中,我一般会多采几次数据取平均,然后再做最小二乘。比如每个校准点按5次,去掉最大最小值,剩下3次取平均。这样能有效抑制随机噪声,校准结果更稳定。
对于非线性校准,比如二次多项式,原理一样。只不过矩阵A的列数更多了,包含了X²、XY、Y²这些项。求解方法不变,还是最小二乘。
2.4 校准流程总览
说了这么多,咱们用一张图把整个流程串起来。这张图是我做项目时常用的思路,你可以直接拿去用。
这张图把整个流程分成了7个关键步骤。从采集数据开始,到选择模型、构造矩阵、最小二乘求解,最后验证输出。我个人习惯在验证环节多花点时间——残差分析做得好,上线之后少烦恼。
2.5 工程中的几个坑
最后,分享几个我在实际项目中踩过的坑,希望能帮你少走弯路。
- 校准点分布要均匀:别把点都挤在屏幕中间,边缘和角落也要覆盖。否则边缘的误差会被最小二乘“平均”掉,导致边缘不准。
- ADC值要稳定:如果触摸芯片的ADC噪声很大,先做滤波再校准。我一般用滑动平均,窗口大小取5~10。
- 小心奇异矩阵:如果校准点都在一条直线上,矩阵AᵀA会奇异,解不出来。所以校准点一定要不共线。
- 浮点转定点:在MCU上做最小二乘,浮点运算很慢。我习惯在PC上算好参数,然后转成定点数(比如Q16格式)烧进去。这样运行时只需要做乘加,效率高很多。
一句话总结
线性校准够用就用线性,不够用就上非线性。最小二乘法是算参数的标准工具,理解它的原理,你就能应对90%的触摸校准场景。