Armadilloフォーラム

コンテナのweston環境上でタッチパネルキャリブレーションした設定の永続化について

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
コメント

at_shota.shimoyama

2025年9月1日 12時28分

アットマークテクノの下山です。

情報を詳細にお書きいただきありがとうございます

まず、キャリブレーションを行うためには、weston.iniに最低限以下を追加する必要があります

[libinput]
touchscreen_calibrator=true
calibration_helper=/bin/save-calibration.sh

ここで、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

#!/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{LIBINPUT_CALIBRATION_MATRIX}="'$VALS'"'
 
echo "$RULE" > /vol_data/touchscreen.rules
 
exit 0

このスクリプトは、 /vol_data/touchscreen.rulesとしてキャリブレーションの値を設定するudev ruleを配置するスクリプトです。
これを ABOSDEのプロジェクトディレクトリのcontainer/resources_flutter/bin/に配置します
実行権限を与えないと実行されないので、以下のコマンドを忘れずに実行してください

chmod +x container/resources_flutter/bin/save-calibration.sh 

これだけだと、udev ruleが作られるだけで自動的に適用されるわけではないので、
ABOSDEのapp.confに以下を追加します。

add_pre_command touch /var/app/volumes/{{PROJECT}}/touchscreen.rules
add_pre_command cp /var/app/volumes/{{PROJECT}}/touchscreen.rules /etc/udev/rules.d/
add_pre_command udevadm control --reload
add_pre_command udevadm trigger --subsystem-match=input

これは、コンテナを起動する前に、/var/app/volumes/{{PROJECT}}/touchscreen.rules/etc/udev/rules.dに移動させ、そのudev ruleを適用させるための設定です。
(1行目は2行目のエラーを防ぐためにあります。/var/app/volumes/{{PROJECT}}/touchscreen.rulesが存在しないと2行目でエラーが発生してコンテナが起動できないため、そのファイルが存在しない場合には空のファイルを作るようにさせています)

以上でキャリブレーションの設定を永続化できるかと思います

よろしくお願いします

下山様

お世話になっております。

このたびは、キャリブレーションの永続化に関するご質問に対し、丁寧にご対応いただき、誠にありがとうございました。
ご教示いただいた内容をもとに、無事に実装を完了することができました。

今後とも変わらぬご支援のほど、何卒よろしくお願い申し上げます。