shimomura2025
2025年8月29日 15時40分
いつもお世話になっております。下村と申します。
現在、Armadillo-X2上でGUIアプリケーションの開発を進めております。コンテナ環境でwestonを用いてディスプレイサーバを起動し、GUIを表示していますが、タッチ操作にズレが生じているため、キャリブレーションの対応を行っています。
ディスプレイ・タッチパネルの環境について
使用しているディスプレイは「TSC-50 DMC」で、抵抗皮膜のタッチパネルです。
当初、デフォルトのカーネルではタッチパネルが認識されませんでしたが、USB Touchscreen Driverを有効にしてカーネルを再ビルドすることで、タッチが正常に認識されるようになりました。
キャリブレーション方法について
タッチパネルのベンダーにもキャリブレーション方法を確認したところ、「Linux標準のパッケージを利用してキャリブレーションを行うように」と案内されました。そのため、現在はwestonの機能とudevルールを組み合わせてキャリブレーションを行っています。
現状の課題
weston-touch-calibratorコマンドでキャリブレーション自体は成功し、一時的にタッチのズレが解消されますが、コンテナやwestonの再起動を行うと設定が消えてしまい、再びタッチのズレが発生します。westonの起動ログを見ると、入力デバイスと出力の紐付けが遅れることでキャリブレーションがスキップされているようです。
westonの起動ログ
[02:01:07.010] input device event2 has no enabled output associated (none named), skipping calibration for now. ... [02:01:07.072] associating input device event2 with output HDMI-A-1 (none by udev)
起動直後は入力デバイスと出力の紐付けができておらず、キャリブレーションがスキップされています。その後、紐付けが完了しますが、キャリブレーションは適用されないままです。
現状の設定内容
- weston.ini
[libinput]セクションでtouchscreen_calibrator=true、save-calibration.shを設定
[output]セクションでtouch-deviceやcalibration値を指定
- Dockerfile
touchscreen.rulesとsave-calibration.shをコンテナ内に配置
- touchscreen.rules
キャリブレーションマトリクスを記述
- save-calibration.sh
キャリブレーション値をtouchscreen.rulesに書き込み、udevをリロード
(各設定内容は末尾に添付しております)
ご相談事項
- westonの仕様上、起動時に入力デバイスと出力の紐付けが遅れることでキャリブレーションがスキップされているようですが、Armadillo-X2でキャリブレーション設定を永続化する方法や、weston起動時に確実にキャリブレーションを適用する方法がございましたらご教示いただけますと幸いです。
- 他に推奨されるキャリブレーション方法や設定手順がございましたら、併せてご案内いただけますと助かります。
ご多忙のところ恐縮ですが、何卒よろしくお願いいたします。
参考情報
https://wiki.st.com/stm32mpu/wiki/How_to_calibrate_the_touchscreen
https://stackoverflow.com/questions/67162466/where-is-the-calibration-m…
現状の設定内容(抜粋)
weston.ini
[libinput] ~省略~ touchscreen_calibrator=true calibration_helper=/usr/bin/save-calibration.sh [output] name=HDMI-A-1 touch-device=/dev/input/event2 mode=1920x1080 calibration=1.106639 0.000150 -0.048482 -0.005233 1.135088 -0.075048 ~省略~
Dockerfile
COPY udev/touchscreen.rules /etc/udev/rules.d/touchscreen.rules COPY udev/save-calibration.sh /usr/bin/save-calibration.sh RUN chmod 777 /usr/bin/save-calibration.sh
touchscreen.rules
SUBSYSTEM=="input", KERNEL=="event[0-9]*", ENV{ID_INPUT_TOUCHSCREEN}=="1", ENV{LIBINPUT_CALIBRATION_MATRIX}="1.106639 0.000150 -0.048482 -0.005233 1.135088 -0.075048"
save-calibration.sh
#!/bin/bash # $1: device, $2-$7: calibration values if [ $# -ne 7 ]; then echo "Usage: $0 device val1 val2 val3 val4 val5 val6" exit 1 fi DEVICE=$1 VALS="$2 $3 $4 $5 $6 $7" RULE='SUBSYSTEM=="input", KERNEL=="event[0-9]*", ENV{ID_INPUT_TOUCHSCREEN}=="1", ENV{LIBINPUT_CALIBRATION_MATRIX}="'$VALS'"' echo "$RULE" > /etc/udev/rules.d/touchscreen.rules udevadm control --reload udevadm trigger exit 0
コメント
shimomura2025
at_shota.shimoyama
2025年9月1日 12時28分
アットマークテクノの下山です。
情報を詳細にお書きいただきありがとうございます
まず、キャリブレーションを行うためには、weston.iniに最低限以下を追加する必要があります
ここで、calibration_helperで指定するスクリプトは、
weston-touch-calibrator (目的デバイスのsys path)
のキャリブレーション操作後に呼び出されるスクリプトで、主にキャリブレーション値を永続化させるための処理を記載します。(公式の例↓
https://gitlab.freedesktop.org/wayland/weston/-/blob/main/doc/scripts/c…
)
ちなみに、
weston-touch-calibrator (目的デバイスのsys path)
のキャリブレーション操作後に、・calibration_helperのスクリプトが exit 0 を返せば、キャリブレーションの値が即座に反映
・calibration_helperのスクリプトが exit 1 を返せば、キャリブレーションの値を破棄
します。
キャリブレーション値を永続化させる処理というのは、入力デバイスにLIBINPUT_CALIBRATION_MATRIXというudevの環境変数を登録させるudev ruleを作成することです。
このudevの環境変数を参照することで、westonは起動時にキャリブレーションの値を設定しています。
作成した udev rule は ABOS上の
/var/app/volumes/{{PROJECT}}/
(コンテナ内からは/vol_data/
として見えます)に配置してください。ここに置くと電源を落としてもファイルが残るので、再起動時にここを参照して前回のキャリブレーションの値が記載されたudev ruleを適用することができます。以上を踏まえて、calibration_helperで指定するスクリプトとして以下のようなものを作成してください
(書いていただいたスクリプトを参考にしました)
/bin/save-calibration.sh
このスクリプトは、
/vol_data/
にtouchscreen.rules
としてキャリブレーションの値を設定するudev ruleを配置するスクリプトです。これを ABOSDEのプロジェクトディレクトリの
container/resources_flutter/bin/
に配置します実行権限を与えないと実行されないので、以下のコマンドを忘れずに実行してください
これだけだと、udev ruleが作られるだけで自動的に適用されるわけではないので、
ABOSDEのapp.confに以下を追加します。
これは、コンテナを起動する前に、
/var/app/volumes/{{PROJECT}}/touchscreen.rules
を/etc/udev/rules.d
に移動させ、そのudev ruleを適用させるための設定です。(1行目は2行目のエラーを防ぐためにあります。
/var/app/volumes/{{PROJECT}}/touchscreen.rules
が存在しないと2行目でエラーが発生してコンテナが起動できないため、そのファイルが存在しない場合には空のファイルを作るようにさせています)以上でキャリブレーションの設定を永続化できるかと思います
よろしくお願いします