AN-1021: タッチ・スクリーン・アプリケーションに対するMMSE に基づくマルチポイント・キャリブレーション・アルゴリズム
概要
一般に現代の機器では、ユーザ・インターフェースとしてタッチ・スクリーン技術を使ったLCDを採用しています。抵抗型タッチ・スクリーンの構造はシンプルで動作が良く知られているため、低価格デザインでは最も広く採用されていますが、抵抗型タッチ・スクリーンの機械的なミスアライメントとスケール・ファクタにより、タッチ・スクリーンから発生されるX座標とY座標が影響を受けます。このため、タッチ・スクリーンの座標を背後のディスプレイ (LCDなど)に完全に位置合わせすることは困難です。タッチ・スクリーンを内蔵する最終製品を出荷する際には、キャリブレーション・アルゴリズムを実行することが必要です。
タッチ・スクリーンに対する従来型キャリブレーション・アルゴリズムは、3つのリファレンス・ポイントを使う3ポイント・キャリブレーション・アルゴリズムでした。従来型の3ポイント・キャリブレーション・アルゴリズムは能率的かつ効果的ですが、タッチ・スクリーンが比較的大きい場合に性能が低下します。このアプリケーション・ノートでは、最小平均2乗誤差(MMSE)に基づくマルチポイント・キャリブレーション・アルゴリズムを提案します。このアルゴリズムでは、抵抗型タッチ・スクリーンに対して3ポイントより多いリファレンス・ポイントを使います。数学的予測と実験では、このアルゴリズムの方が従来型 3ポイント・キャリブレーション・アルゴリズムより正確であることが示されています。
数学的基礎
図1 に、赤で示す円の理論中心はO (原点)で理論半径はRです。この赤の円はタッチ・スクリーンの下のLCDにより表示されるイメージを表しているものと見なします。青の楕円は、ユーザがLCDにより表示される赤の円を追跡するときに、タッチ・スクリーンにより発生される、誇張されたポイントのセットを表します。抵抗型タッチ・スクリーンには機械的ミスアライメントとスケール・ファクタの不一致があるため、再生されたイメージは各軸で異なるファクタを使って回転、移動、スケールされて現れます。キャリブレーション・アルゴリズムでの困難は、タッチ・スクリーンから出力される座標を、表示されたイメージを正確に表す座標へ変換する点にあります。
理論座標が P(x, y)であるポイントが存在し、かつタッチ・スクリーンで発生される座標が P’(x’, y’)であるとします(ポイント Pは赤い円上にあり、ポイント P’ は青い楕円上にある対応するポイントです)。P’(x’, y’)はθだけ回転され、各軸でKXとKYによりスケールされ、各軸でTXとTYにより移動された後に理論座標P(x, y)へ戻すことができるものとします。キャリブレーション・アルゴリズムの目的は、係数 θ、KX、KY、TX、TYを計算することです。その後、これらの係数を使ってタッチ・スクリーンから直接発生された座標をキャリブレーションすることができます。
解析を容易かつ分かり安くするため、P’(x’, y’)をタッチ・スクリーンから直接出力される座標とし、その等価な極座標表現をP’(Rcos θ0、Rsin θ0)とします。さらに、P’(x’, y’) の対応する理論座標を P(x, y)とします。P’(x’, y’)とP(x, y)との間の関係を使うと、次のように表すことができます。
P(x, y) = P(KXRcos(θ0 + θ) + TX, KYRsin(θ0 + θ) + TY)
三角関数の公式から、
cos(θ0 + θ) = cosθ0 cosθ − sinθ0 sinθ
かつ
sin(θ0 + θ) = sinθ0 cosθ + cosθ0 sinθ
これらから、次式が得られます。
さらに、
ここで、 θ、KX、KY、TX、TY はすべて定数。
次のように表すと、
cosθKX = KX1
−sinθKX = KX2
TX = KX3
sinθKY = KY1
cosθKY = KY2
TY = KY3
前式は次のように表されます。
これらの式は、P’(x’, y’)を P(x, y)へ戻すときのキャリブレーションに使うことができます。X 軸またはY 軸の各式で、未知係数が3 個あります。
従来型 3 ポイント・キャリブレーション・アルゴリズム
前の解析では、X 軸またはY 軸のキャリブレーション式を求めました。各式には、 X 軸またはY 軸に対して3 個の未知係数があります。したがって、独立な 3 個のリファレンス・ポイントについて、連立方程式を立てて、未知係数を求めることができます。
3 つのリファレンス・ポイントの理論座標を (x0, y0)、(x1, y1)、(x2,y2)とし、サンプルされた対応する座標を (x’0, y’0)、(x’1, y’1)、(x’2,y’2)とすると、X 軸とY 軸に対する式は、次のようになります。
かつ
これらの式を行列で表すと、
かつ
この式を解くと、キャリブレーション係数KX1、KX2、KX3、KY1、KY2、KY3 を求めることができます。
消去法による計算結果は次のようになります。
k = (x'0 − x'2)(y'1 − y'2) − (x'1 − x'2)(y'0 − y'2)とすると、
MMSEに基づくマルチポイント・キャリブレーション・アルゴリズム
従来型 3 ポイント・キャリブレーション・アルゴリズムで計算した係数を使うと、3 個のリファレンス・ポイントを正確な理論位置にキャリブレーションすることができますが、リファレンス・ポイントに近くない他のポイントに対して、特にタッチ・スクリーンのサイズが比較的大きい場合に、キャリブレーション性能は不十分です。例 のセクションの実験結果も、この問題を示しています。このため、3 個より多いリファレンス・ポイントを使って最適なキャリブレーション係数を求めます。
リファレンス・ポイント (N + 1 > 3)をN + 1 個とし、その理論座標を (x0, y0)、(x1, y1)、…、(xN, yN)して、サンプルされた対応する座標を (x’0, y’0)、(x’1, y’1)、…、(x’N, y’N)とすると、式は次のようになります。
かつ
連立方程式の式数 (N + 1)は、未知係数の数 (3)より大きいことに注意してください。
目的は、(N + 1) 個の全リファレンス・ポイントに合う最適なキャリブレーション係数を計算することです。最適係数を得る方法は、MMSE の規則に従うことです。これは、このアルゴリズムがMMSE に基づくマルチポイント・キャリブレーション・アルゴリズムと呼ばれる理由です。
X 軸を例にして、目的関数を次のように定義します。
ここで、FX はリファレンス・ポイントの2 乗誤差の和です。
KX1、KX2、KX3 の最適係数とは、目的関数FX を最小にできる係数のことです。したがって、次の式を使うことができます。
すなわち、
これらの式は次のように簡素化できます。
次のように表すと、
各式は行列で R• KX = BX と表すことができ、最適係数KX = R−1• BX は前の連立方程式を解くことにより求めることができます。
X 軸と同様に次のように表すと、
Y 軸に対する最適係数KY = R−1 • BY は、連立方程式R • KY =BY を解くことにより求めることができます。
消去法による計算結果は次のようになります。
次のように表すと、
連立方程式 R• KX = BX とR•KY = BY は、次のように表すことができます。
かつ
この連立方程式は、従来型 3 ポイント・アルゴリズムに対する前の連立方程式と同じ形式であることが容易に分かります。
したがって、同じ式を使って係数の結果を計算することができます。
次のように表すと、
k = (a0 − a2)(b1 − b2) − (a1 − a2)(b0 − b2)
次式が得られます。
MMSEに基づくマルチポイント・キャリブレーション・アルゴリズムの解析
a0、a1、a2; b0、b1、b2; c0、c1、c2; d0、d1、d2 の計算から、a0、a1、a2 を3つの方法でx’i の重み付け平均として扱うことができ、b0、b1、b2を3 つの方法でy’i の重み付け平均として扱うことがてきることが明らかです。同様に、c0、c1、c2を 3 つの方法で xi の重み付け平均として、d0、d1、d2 を3 つの方法でyi の重み付け平均として、それぞれ扱うことができます。
最後の連立方程式は、従来型 3 ポイント・アルゴリズムに対する前の連立方程式と同じ形式であるため、MMSE 規則に基づくアルゴリズムは、もう1 つの3 ポイント・アルゴリズムと見なすことができます。ただし、MMSE に基づくアルゴリズムでの違いは、使用しているリファレンス・ポイントからの直接の情報ではなく、リファレンス・ポイントの重み付け平均情報を使用していることです。すなわち、最初に、N + 1 個の直接サンプルされるポイント (x’0, y’0)、(x’1, y’1)、…、(x’N、y’N)から3 個の重み付け平均ポイント (a0, b0)、(a1, b1)、(a2, b2)を計算します。3 個の重み付け平均ポイントの対応する理論座標は、 (c0, d0)、(c1, d1)、(c2,d2)と見なされます。したがって、MMSE に基づくアルゴリズムは、これらの3 個の重み付け平均ポイントに対する従来型 3 ポイント・アルゴリズムと等価になることが分かります。
MMSEに基づくマルチポイント・キャリブレーション・アルゴリズムの手順
MMSE に基づくマルチポイント・キャリブレーション・アルゴリズムについては、次のステップを実行します。
- N +1 (N + 1 > 3) 個のリファレンス・ポイント (x0, y0)、(x1,y1)、… 、(xN、yN)を選択します。
- タッチ・スクリーンで発生されるリファレンス・ポイントのサンプルされた座標(x’0, y’0)、(x’1, y’1)、…、(x’N、y’N)を取得します。
- このアプリケーション・ノートで示した式を使って、キャリブレーション係数KX とKY を計算します。これらは次のようになります。
- 通常動作では、キャリブレーション係数 (KX、KY)と次の式を使って、ポイント P’(x’, y’)に対するキャリブレーションを計算します。
例
図 2 に示すように、タッチ・スクリーン上で9 個のポイントを選択します。これらの理論座標は、(3931, 3849)、(2047, 3849)、(164, 3849)、(3931, 2047)、(2047, 2047)、(164, 2047)、(3931, 246)、(2047, 246)、(164, 246)です。タッチ・スクリーンから出力されるサンプルされた対応する座標は、 (3927, 3920)、(2054, 3936)、(193, 3943)、(3911, 2119)、(2054, 2127)、(195, 2164)、(3915, 331)、(2050, 354)、(189, 371)です。明らかに、理論座標と対応するサンプルされた座標との間には非常に大きな誤差があります。
従来型 3 ポイント・アルゴリズム、MMSE に基づく5 ポイント・アルゴリズム、MMSE に基づく9 ポイント・アルゴリズムを使った3 つの実験を次に示します。
- 従来型 3 ポイント・アルゴリズムでは、3 個のリファレンスを選択しました。図2 のポイント 1、ポイント 6、ポイント8 です。キャリブレーション係数は、
KX1 = +1.011238、KX2 = −0.003952、KX3 = −24.638760
KY1 = +0.009894、KY2 = +1.005168、KY3 = −130.112700
この係数を使ったキャリブレーション後の結果を 表1 に示します。 - MMSEに基づく5 ポイント・アルゴリズムでは5 個のリファレンスを選択しました。図2 のポイント 1、ポイント 3、ポイント 5、ポイント 7、ポイント 9 です。キャリブレーション係数は、
KX1 = +1.009899、KX2 = −0.002260、KX3 = −23.715720
KY1 = +0.008494、KY2 = +1.006247、KY3 = −121.821000
この係数を使ったキャリブレーション後の結果を 表2 に示します。 - MMSEに基づく 9 ポイント・アルゴリズムでは9 個のリファレンスを選択しました。図2 のポイント 1、ポイント 2、ポイント 3、ポイント 4、ポイント 5、ポイント 6、ポイント 7、ポイント 8、ポイント 9 です。キャリブレーション係数は、
KX1 = +1.011161, KX2 = −0.001887、KX3 = −25.777180
KY1 = +0.009718、KY2 = +1.006107、KY3 = −126.258100
この係数を使ったキャリブレーション後の結果を 表3 に示します。
Point (X, Y) | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Ideal Coordinates | (3931, 3849) | (2047, 3849) | (164, 3849) | (3931, 2047) | (2047, 2047) | (164, 2047) | (3931, 246) | (2047, 246) | (164, 246) |
Sampled Coordinates | (3927, 3920) | (2054, 3936) | (193, 3943) | (3911, 2119) | (2054, 2127) | (195, 2164) | (3915, 331) | (2050, 354) | (189, 371) |
Calibrated Coordinates | (3931, 3849) | (2037, 3846) | (155, 3835) | (3922, 2039) | (2044, 2028) | (164, 2047) | (3933, 242) | (2047, 246) | (165, 244) |
Error | (0, 0) | (−10, −3) | (−9, −14 ) | (−9, −8 ) | (−3, −19 ) | (0, 0) | (+2, −4 ) | (0, 0) | (+1, −2) |
Sum of Square Error | (276, 650) |
Point (X, Y) | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Ideal Coordinates | (3931, 3849) | (2047, 3849) | (164, 3849) | (3931, 2047) | (2047, 2047) | (164, 2047) | (3931, 246) | (2047, 246) | (164, 246) |
Sampled Coordinates | (3927, 3920) | (2054, 3936) | (193, 3943) | (3911, 2119) | (2054, 2127) | (195, 2164) | (3915, 331) | (2050, 354) | (189, 371) |
Calibrated Coordinates | (3933, 3856) | (2042, 3856) | (162, 3847) | (3921, 2044) | (2046, 2036) | (168, 2057) | (3929, 245) | (2046, 252) | (166, 253) |
Error | (2, 7) | (−5, +7) | (−2, −2 ) | (−10, −13 ) | (−1, −11 ) | (4, 10) | (-2, −1 ) | (-1, +6) | (+2, +7) |
Sum of Square Error | (159, 418) |
Point (X, Y) | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Ideal Coordinates | (3931, 3849) | (2047, 3849) | (164, 3849) | (3931, 2047) | (2047, 2047) | (164, 2047) | (3931, 246) | (2047, 246) | (164, 246) |
Sampled Coordinates | (3927, 3920) | (2054, 3936) | (193, 3943) | (3911, 2119) | (2054, 2127) | (195, 2164) | (3915, 331) | (2050, 354) | (189, 371) |
Calibrated Coordinates | (3938, 3856) | (2044, 3854) | (162, 3842) | (3925, 2044) | (2047, 2034) | (167, 2053) | (3932, 245) | (2046, 250) | (165, 249) |
Error | (7, 7) | (−3, +5) | (−2, −7) | (−6, −3 ) | (0, −13 ) | (3, 6) | (+1, −1 ) | (-1, +4) | (+1, +3) |
Sum of Square Error | (110, 363) |
結論
実験結果に示すように、いずれのキャリブレーション・アルゴリズムを使っても、キャリブレーションした座標は、直接 サンプルした座標より優れています。さらに、これら3 つの実験を比較すると、次の結論が得られます。
- 従来型 3 ポイント・キャリブレーション・アルゴリズムは、3 個のリファレンス・ポイントを理論位置へキャリブレーションするのに役立ちます。さらに、3 個のリファレンス・ポイントに近いポイントに対しては性能が非常に優れています。ただし、3 個のリファレンス・ポイントに近くないポイントに対して、従来型 3 ポイント・キャリブレーションの性能は不十分です。このアルゴリズム の2 乗誤差の和は、テストした3 つのアルゴリズムで最大でした。したがって、従来型 3 ポイント・キャリブレーション・アルゴリズムは、タッチ・スクリーン・サイズが比較的大きいアプリケーションには適していません。
- あるポイント (リファレンス・ポイントに近いポイント)に対して、MMSE に基づくマルチポイント・キャリブレーション・アルゴリズムの性能は、従来型 3 ポイント・キャリブレーション・アルゴリズムより劣ります。ただし、タッチ・スクリーン全体を見たとき、MMSE に基づくマルチポイント・キャリブレーション・アルゴリズムの2 乗誤差の和は、従来型 3 ポイント・アルゴリズムより小さくなります。これは、3 個より多いリファレンス・ポイントの情報を使っているためです。このため、性能は、全体的な面で従来型 3ポイント・アルゴリズムより優れています。
- MMSE に基づくマルチポイント・キャリブレーション・アルゴリズムの場合、使用するリファレンス・ポイント が多いほど、性能が向上します。
これらの実験結果は、数学的にも敵っています。
コードの実装
C言語によるキャリブレーション・アルゴリズムのコードをコーディング のセクションに示します。3 個のリファレンス・ポイントの場合、このコードでは従来型 3 ポイント・キャリブレーション・アルゴリズムを採用しています。.リファレンス・ポイントが3 個より多い場合は、このコードではMMSEに基づくマルチポイント・キャリブレーション・アルゴリズムを採用しています。このコードは、ADuC7026 を使ってテストされました (ADuC7026 はアナログ・デバイセズのMCU製品)。 3 つの実験例の結果は、このコードを使って計算しました。
コーディング
#define N 9 // number of reference points for calibration algorithm signed short int ReferencePoint[N][2]; // ideal position of reference points signed short int SamplePoint[N][2]; // sampling position of reference points double KX1, KX2, KX3, KY1, KY2, KY3; // coefficients for calibration algorithm void Do_Calibration(signed short int *Px, signed short int *Py) // do calibration for point (Px, Py) using the calculated coefficients { *Px=(signed short int)(KX1*(*Px)+KX2*(*Py)+KX3+0.5); *Py=(signed short int)(KY1*(*Px)+KY2*(*Py)+KY3+0.5); } int Get_Calibration_Coefficient() // calculate the coefficients for calibration algorithm: KX1, KX2, KX3, KY1, KY2, KY3 { int i; int Points=N; double a[3],b[3],c[3],d[3],k; if(Points<3) { return 0; } else { if(Points==3) { for(i=0; i< Points; i++) { a[i]=(double)(SamplePoint[i][0]); b[i]=(double)(SamplePoint[i][1]); c[i]=(double)(ReferencePoint[i][0]); d[i]=(double)(ReferencePoint[i][1]); } } else if(Points>3) { for(i=0; i<3; i++) { a[i]=0; b[i]=0; c[i]=0; d[i]=0; } for(i=0; i< Points; i++) AN-1021 Application Note Rev. 0 | Page 10 of 12 { a[2]=a[2]+(double)(SamplePoint[i][0]); b[2]=b[2]+(double)(SamplePoint[i][1]); c[2]=c[2]+(double)(ReferencePoint[i][0]); d[2]=d[2]+(double)(ReferencePoint[i][1]); a[0]=a[0]+(double)(SamplePoint[i][0])*(double)(SamplePoint[i][0]); a[1]=a[1]+(double)(SamplePoint[i][0])*(double)(SamplePoint[i][1]); b[0]=a[1]; b[1]=b[1]+(double)(SamplePoint[i][1])*(double)(SamplePoint[i][1]); c[0]=c[0]+(double)(SamplePoint[i][0])*(double)(ReferencePoint[i][0]); c[1]=c[1]+(double)(SamplePoint[i][1])*(double)(ReferencePoint[i][0]); d[0]=d[0]+(double)(SamplePoint[i][0])*(double)(ReferencePoint[i][1]); d[1]=d[1]+(double)(SamplePoint[i][1])*(double)(ReferencePoint[i][1]); } a[0]=a[0]/a[2]; a[1]=a[1]/b[2]; b[0]=b[0]/a[2]; b[1]=b[1]/b[2]; c[0]=c[0]/a[2]; c[1]=c[1]/b[2]; d[0]=d[0]/a[2]; d[1]=d[1]/b[2]; a[2]=a[2]/Points; b[2]=b[2]/Points; c[2]=c[2]/Points; d[2]=d[2]/Points; } k=(a[0]-a[2])*(b[1]-b[2])-(a[1]-a[2])*(b[0]-b[2]); KX1=((c[0]-c[2])*(b[1]-b[2])-(c[1]-c[2])*(b[0]-b[2]))/k; KX2=((c[1]-c[2])*(a[0]-a[2])-(c[0]-c[2])*(a[1]-a[2]))/k; KX3=(b[0]*(a[2]*c[1]-a[1]*c[2])+b[1]*(a[0]*c[2]-a[2]*c[0])+b[2]*(a[1]*c[0]- a[0]*c[1]))/k; KY1=((d[0]-d[2])*(b[1]-b[2])-(d[1]-d[2])*(b[0]-b[2]))/k; KY2=((d[1]-d[2])*(a[0]-a[2])-(d[0]-d[2])*(a[1]-a[2]))/k; KY3=(b[0]*(a[2]*d[1]-a[1]*d[2])+b[1]*(a[0]*d[2]-a[2]*d[0])+b[2]*(a[1]*d[0]- a[0]*d[1]))/k; return Points; } }