如何将weston-calibrator校准值转换为LIBINPUT_CALIBRATION_MATRIX
解决weston-calibrator校准值转LIBINPUT_CALIBRATION_MATRIX的问题
核心转换逻辑
weston-calibrator输出的6个值是直接映射到屏幕像素坐标的线性变换参数,而libinput的LIBINPUT_CALIBRATION_MATRIX需要的是归一化到[0,1]范围的相对比例参数(1代表整个屏幕的宽或高)。
转换公式很明确:
假设weston输出的6个值为 a b c d e f,你的屏幕分辨率为width(横向像素)和height(纵向像素),那么libinput矩阵的6个参数计算方式为:
- 第1、2、3位(x轴相关):
a/width、b/width、c/width - 第4、5、6位(y轴相关):
d/height、e/height、f/height
你之前疑惑的“用1替代高/宽”,本质就是把像素单位转换成相对比例单位——用1代表整个屏幕的宽度或高度,所以需要把weston的像素级参数分别除以屏幕宽、高,完成单位转换。
针对你的校准数据的具体操作
步骤1:取三次校准值的平均值(提升准确性)
先把三次输出的对应数值取平均,得到更稳定的基础参数:
a_avg ≈ -1.240614 b_avg ≈ -0.023318 c_avg ≈ 2148.772461 d_avg ≈ 0.000995 e_avg ≈ -1.137791 f_avg ≈ 1147.010132
步骤2:确认屏幕分辨率
你需要先获取自己设备的实际屏幕分辨率,比如通过weston-info或fbset命令查看。从你的校准值(c≈2150,f≈1150)推测,屏幕大概率是2160x1152,如果实际分辨率不同,替换成你自己的数值即可。
步骤3:计算libinput校准矩阵
用平均值和屏幕分辨率计算:
# 假设屏幕为2160x1152 a' = -1.240614 / 2160 ≈ -0.000574 b' = -0.023318 / 2160 ≈ -0.000011 c' = 2148.772461 / 2160 ≈ 0.994802 d' = 0.000995 / 1152 ≈ 0.000001 e' = -1.137791 / 1152 ≈ -0.000988 f' = 1147.010132 / 1152 ≈ 0.995669
步骤4:写入udev规则
把计算出的参数替换到你的udev规则中:
ENV{ID_USB_SERIAL}=="DIALOGUE_INC_PenMount_USB", ENV{LIBINPUT_CALIBRATION_MATRIX}="-0.000574 -0.000011 0.994802 0.000001 -0.000988 0.995669"
注意事项
- 屏幕分辨率必须准确,这是转换的核心前提,否则矩阵必然失效。
- 小数位数保留3-6位即可,过多的小数位没有实际意义。
- 校准参数中出现负数是正常的,代表触摸坐标轴与屏幕坐标轴存在反转,无需调整符号。
内容的提问来源于stack exchange,提问作者skaldesh
相关产品推荐
相关产品推荐

