Armadilloフォーラム

Armaidllo-440 タッチパネルのキャリブレーションについて

sankyo_takada

2015年2月16日 17時44分

お世話になります。
高田と申します。

Armadillo-440でタッチパネルの補正を行う方法について質問があります。
以下の手順を参考にts_calibrateを有効にしてビルドを行いました。
https://users.atmark-techno.com/blog/750/885

Qtで作成したユーザーアプリからキャリブレーションを実行しようと思い
以下のコードを実行したのですが、キャリブレーションアプリが動作しません。
画面はそのままでタッチパネルが利かなくなります。
system("TSLIB_TSDEVICE=/dev/input/event1 ts_calibrate")

上記実行後、psコマンドでプロセスを確認したのですが、ts_cariblateは起動しているようです。
ユーザーアプリからts_calibrateを実行することは可能なのでしょうか?
なお、キャリブレーション終了後は再びユーザーアプリに戻って処理を続けたいと思っています。
コンソールからts_calibrateが動作することは確認しています。

【環境】
Armadillo-440
Linux2.6.26-at22
Qt4.8.6

Linux、Qt初心者です。
初歩的な質問かもしれませんが、ご教授いただけると助かります。
よろしくお願いいたします。

コメント

at_kojiro.yamada

2015年2月18日 14時05分

> ユーザーアプリからts_calibrateを実行することは可能なのでしょうか?
可能です。

Qtを利用する場合、QApplication のインスタンスが生成される前であれば、
ts_calibrateを実行できます。

int main(int argc, char *argv[])
{
    system("TSLIB_TSDEVICE=/dev/input/event1 ts_calibrate");
 
    QApplication app(argc, argv);
      : (省略)
}

また、Qtもキャリブレーションの機能を持っていますので、
そちらを利用する方法もあります。

Mouse Calibration Example
http://qt-project.org/doc/qt-4.8/qws-mousecalibration.html

上記Exampleのソースコードと実行ファイルをまとめたアーカイブを添付します。
試してみてはいかがでしょうか?

開発環境やビルド方法については、以下のHowtoが参考になります。
Howto : Armadillo-440でQt! 第2回
http://armadillo.atmark-techno.com/howto/armadillo-440-qt-2

ファイル ファイルの説明
mouse_calibration_example.tar.gz Mouse Calibration Example のソースコードと実行ファイル

お世話になります。高田です。

ご回答ありがとうございます。
Qtのキャリブレーション機能が動作することを確認しました。
今回はQtのユーザーアプリ上からキャリブレーションを実行して、
補正終了後はユーザーアプリに戻りたいため、
こちらの方法で実装したいと思います。

今後ともよろしくお願いいたします。

> > ユーザーアプリからts_calibrateを実行することは可能なのでしょうか?
> 可能です。
>
> Qtを利用する場合、QApplication のインスタンスが生成される前であれば、
> ts_calibrateを実行できます。
>
>

> int main(int argc, char *argv[])
> {
>     system("TSLIB_TSDEVICE=/dev/input/event1 ts_calibrate");
> 
>     QApplication app(argc, argv);
>       : (省略)
> }
> 

>
> また、Qtもキャリブレーションの機能を持っていますので、
> そちらを利用する方法もあります。
>
> Mouse Calibration Example
> http://qt-project.org/doc/qt-4.8/qws-mousecalibration.html
>
> 上記Exampleのソースコードと実行ファイルをまとめたアーカイブを添付します。
> 試してみてはいかがでしょうか?
>
> 開発環境やビルド方法については、以下のHowtoが参考になります。
> Howto : Armadillo-440でQt! 第2回
> http://armadillo.atmark-techno.com/howto/armadillo-440-qt-2
>

お世話になります。
高田です。

しばらく前のトピックですが、再度質問させてください。
ご教示いただいたサンプルをベースにキャリブレーション機能を実装したのですが、
よくよく確認してみると、以下の動作となっていました。
キャリブレーション実行時、2番目と5番目の「+」マークを押下する際、
タッチパネル上のどこを押下しても補正結果に影響しないようです。
BottomLeftとCenterでしょうか。

キャリブレーションはQtで行っていますが、上記現象について
修正方法等の情報がありましたらご提供いただけると助かります。

よろしくお願いいたします。

at_takashi.sasayama

2015年7月28日 11時50分

笹山です。

> ご教示いただいたサンプルをベースにキャリブレーション機能を実装したのですが、
> よくよく確認してみると、以下の動作となっていました。
> キャリブレーション実行時、2番目と5番目の「+」マークを押下する際、
> タッチパネル上のどこを押下しても補正結果に影響しないようです。
> BottomLeftとCenterでしょうか。

補正結果に影響しないというのは、
キャリブレーション実行後に更新される /etc/pointercal の値が、
2番目(BottomLeft),5番目(Center)の押下個所に影響されない
と解釈したのですが、認識は合っていますでしょうか?

下記のコードは mouse_calibration_example.tar.gz に含まれているものです。

押下した際の座標は、以下のコードで取得していますが、
2番目と、5番目の座標だけ無視するような実装にはなっていないようです。

calibration.cpp

108  void Calibration::mouseReleaseEvent(QMouseEvent *event)            
109  {                                                                  
110      // Map from device coordinates in case the screen is transforme
111      QSize screenSize(qt_screen->width(), qt_screen->height());     
112      QPoint p = qt_screen->mapToDevice(event->pos(), screenSize); // + マークを押下した座標を取得
113                                                                     
114      data.devPoints[pressCount] = p; // 座標をキャリブレーション用のデータとして格納
115 
116      if (++pressCount < 5) //TopLeft -> BottomLeft -> BottomRight -> TopRight -> Center の順に5回処理を行う
117          repaint();
118      else
119          accept();
120  }

試しに、2番目と5番目以外の座標を固定値にしてみたのですが、
2番目と、5番目の座標の変化は /etc/pointercal に反映されていました。

■参考情報

Mouse Calibration Example
http://doc.qt.io/qt-4.8/qt-qws-mousecalibration-example.html

at_takashi.sasayama

2015年8月7日 10時28分

笹山です。

> キャリブレーション実行時、2番目と5番目の「+」マークを押下する際、
> タッチパネル上のどこを押下しても補正結果に影響しないようです。
> BottomLeftとCenterでしょうか。

申し訳ございません。
改めて調査してみたところ、BottomLeft と Center が補正結果に影響しない現象を
こちらでも確認ができました。

> キャリブレーションはQtで行っていますが、上記現象について
> 修正方法等の情報がありましたらご提供いただけると助かります。

この現象ですが Qt-4.8.6 にて採用しているタッチパネルキャリブレーションのアルゴリズムが原因です。

キャリブレーションの処理は、以下のソースに記述されているのですが、
BottomLeft と Center は無視される実装となっていました。

qt-everywhere-opensource-src-4.8.6/src/gui/embedded/qmouse_qws.cpp

494 void QWSCalibratedMouseHandler::calibrate(const QWSPointerCalibrationData *data)
495 {
496     // Algorithm derived from
497     // "How To Calibrate Touch Screens" by Carlos E. Vidales,
498     // printed in Embedded Systems Programming, Vol. 15 no 6, June 2002
499     // URL: http://www.embedded.com/showArticle.jhtml?articleID=9900629         

このような実装になっている理由ですが、
ソース内のコメントにて、以下のアルゴリズムを元にしていると記載がありました。

How to calibrate touch screens
http://www.embedded.com/design/system-integration/4023968/How-To-Calibr…
※コメント内のURLはリンク切れとなっていましたので、移転先のURLを記載しています。

アルゴリズムの内容を完全には理解できていないのですが、
3点の座標取得のみで十分なキャリブレーション精度が確保できるそうです。

キャリブレーション結果が適切かは、当人の感覚にも依存する為、
あまり参考にはならないと思うのですが、Armadillo-440 液晶開発モデルにおいては
十分な精度でキャリブレーションがされているように感じています。

高田様の環境ではキャリブレーションがうまく行われない状況でしょうか?

お世話になります。
高田です。

ご回答ありがとうございます。
Qtのキャリブレーションアルゴリズムによるものなんですね。
承知しました。
なお、5点補正にするためにはアルゴリズムの変更が必要という認識でよろしいでしょうか?
(軽微な変更では済まない)

> キャリブレーション結果が適切かは、当人の感覚にも依存する為、
> あまり参考にはならないと思うのですが、Armadillo-440 液晶開発モデルにおいては
> 十分な精度でキャリブレーションがされているように感じています。
>
> 高田様の環境ではキャリブレーションがうまく行われない状況でしょうか?

運用上は問題のないレベルだと判断しています。
キャリブレーションを実行するとX座標が5dotほどマイナスの値になってしまい、
これは距離にして約1mmになります。
今回は液晶開発モデルのLCDとは別のものを採用しており、7インチワイドとサイズが大きいために
誤差が大きく出ていると考えています。
なお、キャリブレーションでは爪楊枝などの先端の尖ったものでポイントをタッチしています。

よろしくお願いいたします。

at_takashi.sasayama

2015年8月10日 9時53分

笹山です。

> なお、5点補正にするためにはアルゴリズムの変更が必要という認識でよろしいでしょうか?
> (軽微な変更では済まない)

その通りになります。

過去に5点補正のアルゴリズムを採用していた時期が無いかを調査してみたのですが、
以下で確認できる範囲では、一貫して3点補正でした。
5点補正に変更する場合は、独自実装する以外は無さそうです。

Qt Project Git Repository Browser qt/qt.git Qt 4.x
http://code.qt.io/cgit/qt/qt.git/log/src/gui/embedded/qmouse_qws.cpp

お世話になります。
高田です。

ご回答ありがとうございます。

> 5点補正に変更する場合は、独自実装する以外は無さそうです。

承知いたしました。
いただいた情報をもとに対応を検討させていただきます。
ご協力ありがとうございました。