Оглавление |
---|
Информация | ||
---|---|---|
| ||
|
Основная информация
Общие сведения
В данной статье приведено описание настройки акселерометра устройства, необходимой для корректной работы автоматической ориентации экрана.
Предупреждение |
---|
Если на акселерометр на устройстве работает корректно |
, то его калиброватьне требуется. |
Для настройки акселерометра требуется создать правило udev
, определяющее привязку соответствие данных, получаемых от акселерометра, к осям и осей координат устройства. Эта привязка Это соответствие может быть представлена представлено в виде таблицы ( матрицы ) размером 3х3, содержащей коэффициенты коррекции для данных, получаемых от акселерометра.
За взаимодействие с датчиком поворота отвечает IIO-подсистема ядра Linux, в частности — утилита iio-sensor-proxy
(см. https://gitlab.freedesktop.org/hadess/iio-sensor-proxy/#iio-sensor-proxy).
Матрица, используемая Ниже представлена таблица, содержащая в себе матрицу, используемую для калибровки экрана (Подробнее подробное описание см. https://gitlab.freedesktop.org/hadess/iio-sensor-proxy/#accelerometer-orientation).Голубым , представлена в виде таблицы. Синим отмечены заголовки строк и столбцов, относительно которых в дальнейшем будет производится калибровка. Красным в таблице отмечены участкизначения, которыене нужно редактировать (,так как они не участвуют в калибровке).
x | y | z | |
(1) | x1 | y1 | z1 |
(2) | x2 | y2 | z2 |
(3) | x3 | y3 | z3 |
Блок кода | ||||
---|---|---|---|---|
| ||||
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", ENV{ACCEL_MOUNT_MATRIX}="x1,y1,z1;x2,y2,z2;x3,y3,z3" |
По умолчанию , iio-sensor-proxy
принимает такую ( использует единичную ) матрицу:.
x | y | z | |
(1) | 1 | 0 | 0 |
(2) | 0 | 1 | 0 |
(3) | 0 | 0 | 1 |
Матрица интерпретируется в виде правила udev
следующим образом:
Блок кода | ||||
---|---|---|---|---|
| ||||
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", ENV{ACCEL_MOUNT_MATRIX}="1,0,0;0,1,0;0,0,1" |
Для калибровки экрана, необходимо изменять значения данной таблицы. Алгоритмы, по которым происходит калибровка, описаны в статье.
Настройка акселерометра: проверка наличия целевой матрицы
Калибровка экрана подразумевает изменение значений данной матрицы.
Проверка наличия целевой матрицы
Целевая матрица используется для калибровки датчика поворота. По умолчанию она должна находится в описании устройств из ACPI (Advanced Configuration and Power Interface, см. https://ru.wikipedia.org/wiki/ACPI).
Для проверки наличия целевой матрицы устройства , необходимо получить выгрузку DSL дамп (описание устройств из ACPI), путем вызова следующих команд:выполнив следующие команды:
Command | |
---|---|
Блок кода | |
language | bash | title | Получение DSL дампа устройства
cat /sys/firmware/acpi/tables/DSDT > dsdt.dat
iasl -d dsdt.dat
iasl -tc dsdt.dsl |
iasl
- Intel ACPI компилятор/декомпилятор, используется для работы с ACPI и не только (см. https://linux.die.net/man/1/iasl). Команда
iasl -d dsdt.dat
дизассемблирует dsdt.dat
в dsdt.dsl
(формат ASL). ASL - ACPI Source Language, исходный язык для определения и написания методов ACPI (см. https://wiki.osdev.org/AML).
В полученном файле (dsdt.dsl
) необходимо найти матрицу по умолчанию:
- если известны
-
DEVICE_ID
/
VENDOR_ID
,
- найти по нему запись о данном устройстве;
- в записи об устройстве найти методROTM (Rotation Matrix).
В случае если целевая матрица не была обнаружена, необходимо выполнить калибровку с помощью правила udev
(см. Калибровка при помощи правила udev).
Пример метода ROTM Рассмотрим пример для планшета Lenovo IdeaPad 3IGL5-LTE:
Блок кода | ||||
---|---|---|---|---|
| ||||
Method (ROTM, 0, NotSerialized) { Name (RBUF, Package (0x03) { "0 -1 0", "1 0 0", "0 0 1" }) Return (RBUF) /* \_SB_.PCI0.I2C5.DEV_.ROTM.RBUF */ } |
Отсюда мы видим, что исходная Целевая матрица для данной модели :имеет следующий вид.
x | y | z | |
(1) | 0 | -1 | 0 |
(2) | 1 | 0 | 0 |
(3) | 0 | 0 | 1 |
Блок кода | ||||
---|---|---|---|---|
| ||||
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", ENV{ACCEL_MOUNT_MATRIX}="0,-1,0;1,0,0;0,0,1" |
В случае если полученная матрица некорректно откалибровала устройство, необходимо произвести калибровку по алгоритму, приведенному ниже (п.3).
Настройка акселерометра: калибровка при помощи udev правила
выполнить калибровку с помощью правила udev
(см. Калибровка при помощи правила udev).
Якорь | ||||
---|---|---|---|---|
|
Порядок калибровки
В
Как откалибровать датчик, вслучае если целевая матрица отсутствует
,или
некорректно откалибровала сенсор:Определить желаемоеесли при её применении калибровка сенсора выполняется некорректно, для калибровки датчика необходимо:
- определить нормальное положение устройства (портретная
- или альбомная ориентация). Нормальное положение зависит от нужд пользователя. За нормальное можно принять любое положение
- и отталкиваясь от этого проводить настройку. Можно также в качестве нормальной использовать ориентацию, в которой отображается экран при включении устройства (например, для планшетов iRU
- это альбомный режим);
- задать начальную матрицу в виде правила
udev
(см. Применение единичной матрицы); - если режим отображения экрана не соответствует положению устройства
- — определить, на сколько нужно осуществить поворот
- экрана для приведения его в правильное положение, и выполнить указанные далее изменения элементов матрицы для получения нужного режима отображения экрана (см. Приведение экрана
Якорь | ||||
---|---|---|---|---|
|
единичной матрицы
Первым шагом необходимо Необходимо задать начальную (единичную) матрицу в виде правила udev
правила, помещенного в файл /etc/udev/rules.d/99-astra-orientation.rules
(все дальнейшие действия по калибровке экрана будут сводится к его редактированиюподразумевают редактирование этого файла):
x | y | z | |
(1) | 1 | 0 | 0 |
(2) | 0 | 1 | 0 |
(3) | 0 | 0 | 1 |
Блок кода | ||
---|---|---|
| ||
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", ENV{ACCEL_MOUNT_MATRIX}="1,0,0;0,1,0;0,0,1" |
Для применения правил необходимо перезагрузить устройство (можно упомянуть вариант с тригеррами и прочим, но у меня после этого не всегда нормально работает гироскоп, перезагрузить надежнее).
Настройка акселерометра: определение необходимого нормального положения устройства
После того, как была
примененазадана начальная матрица, необходимо
выяснитьопределить, на
сколько (сколько градусов
?)нужно осуществить поворот
изображения,экрана для приведения его в правильное положение (см. Приведение экрана в правильное положение
. Все дальнейшие изменения по повороту применимы только).
Информация |
---|
Приведенное описание поворота экрана применимо только к начальной (единичной) матрице |
. |
Якорь | ||||
---|---|---|---|---|
|
Поворот изображения на 90° по часовой стрелке
Начальная матрица имеет следующий вид.
x | y | z | |
(1) | 1 | 0 | 0 |
(2) | 0 | 1 | 0 |
(3) | 0 | 0 | 1 |
Блок кода | ||||
---|---|---|---|---|
| ||||
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*",
ENV{ACCEL_MOUNT_MATRIX}="1,0,0;0,1,0;0,0,1" |
Необходимые для поворота вычисления имеют следующий вид.
x | y |
z | |||
(1) | cos (90) | -1 * sin (90) | 0 |
(2) | sin (90) | cos (90) | 0 |
(3) | 0 | 0 | 1 |
Результирующая матрица имеет следующий вид.
x | y | z | |
(1) | 0 | -1 | 0 |
(2) | 1 | 0 | 0 |
(3) | 0 | 0 | 1 |
Блок кода | ||||
---|---|---|---|---|
| ||||
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*",
ENV{ACCEL_MOUNT_MATRIX}="0,-1,0;1,0,0;0,0,1" |
Поворот изображения на 180° по часовой стрелке
Начальная матрица имеет следующий вид.
x | y | z | |
(1) | 1 | 0 | 0 |
(2) | 0 | 1 | 0 |
(3) | 0 | 0 | 1 |
Блок кода | ||||
---|---|---|---|---|
| ||||
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*",
ENV{ACCEL_MOUNT_MATRIX}="1,0,0;0,1,0;0,0,1" |
Необходимые для поворота вычисления имеют следующий вид.
x | y | z | |
(1) | cos (180) | -1 * sin (180) | 0 |
(2) | sin (180) |
cos (180) | 0 | ||
(3) | 0 | 0 | 1 |
Результирующая матрица имеет следующий вид.
x | y | z | |
(1) | -1 | 0 | 0 |
(2) | 0 | -1 | 0 |
(3) | 0 | 0 | 1 |
Блок кода | ||||
---|---|---|---|---|
| ||||
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*",
ENV{ACCEL_MOUNT_MATRIX}="-1,0,0;0,-1,0;0,0,1" |
Поворот изображения на 270° по часовой стрелке
Начальная матрица имеет следующий вид.
x | y | z | |
(1) | 1 | 0 | 0 |
(2) | 0 | 1 | 0 |
(3) | 0 | 0 | 1 |
Блок кода | ||||
---|---|---|---|---|
| ||||
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*",
ENV{ACCEL_MOUNT_MATRIX}="1,0,0;0,1,0;0,0,1" |
Необходимые для поворота вычисления имеют следующий вид.
x | y | z | |
(1) | cos (270) | -1 * sin (270) | 0 |
(2) | sin (270) | cos (270) | 0 |
(3) | 0 | 0 | 1 |
Результирующая матрица
имеет следующий вид.
x | y | z | |
(1) | 0 | 1 | 0 |
(2) | -1 | 0 | 0 |
(3) | 0 | 0 | 1 |
Блок кода | ||||
---|---|---|---|---|
| ||||
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*",
ENV{ACCEL_MOUNT_MATRIX}="0,1,0;-1,0,0;0,0,1" |
Определение необходимости инвертирования
Если после выполнения п. 3.2 получилось инверсия какого определения нормального положения устройства (см. Приведение экрана в правильное положение) получилась инверсия какого-либо из режимов просмотра (инвертированный альбомный/портретный режим), необходимо произвести инверсию относительно Y-координат . (п. 3.3.1см. Инвертирование Y-координат).
В случае , если после применение инверсии желаемый результат применения инверсии относительно Y-координат не был достигнут желаемый результат, необходимо вернуть матрицу , полученную из п. 3.2.хк состоянию, полученному в Приведение экрана в правильное положение, и произвести инверсию относительно X-координат (п. 3.3.2).
Настройка акселерометра: инвертирование Y координаты
Якорь | ||||
---|---|---|---|---|
|
Для инверсии в качестве исходной матрицы необходимо брать матрицу, полученную после поворота (
необходимо каждуюY-координату (из тех, которые участвуют в калибровке)умножить на -1
:
- y1 * -1;
- y2 * -1.
Таким образом, результирующая матрица будет
иметь следующий вид.
x | y | z | |
(1) | x1 | y1 = -1 * y1 | z1 |
(2) | x2 | y2 = -1 * y2 | z2 |
(3) | x3 | y3 | z3 |
Блок кода | ||||
---|---|---|---|---|
| ||||
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", ENV{ACCEL_MOUNT_MATRIX}="x1,-y1,z1;x2,-y2,z2;x3,y3,z3 |
" |
Якорь | ||||
---|---|---|---|---|
|
Для инверсии
в качестве исходной матрицынеобходимо брать матрицу, полученную после поворота (
необходимо
каждую X-координату (из тех, которые участвуют в калибровке) умножить на -1
:
- x1 * -1;
- x2 * -1.
Таким образом, результирующая матрица будет
иметь следующий вид.
x | y | z | |
(1) | x1 = -1 * x1 | y1 | z1 |
(2) | x2 = -1 * x2 | y2 | z2 |
(3) | x3 | y3 | z3 |
Блок кода | ||
---|---|---|
|
Настройка акселерометра: настройка частоты опроса датчика на примере (МИГ т8х)
| ||
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*",
ENV{ACCEL_MOUNT_MATRIX}="-x1,y1,z1;-x2,y2,z2;x3,y3,z3" |
Настройка частоты опроса датчика поворота на устройстве МИГ Т8х
Для снижения чувствительности (частоты опроса) датчика поворота на планшете МИГ Т8х необходимо:
- получить минимально возможное значение из файла
/sys/bus/iio/devices/iio:device0/in_accel_sampling_frequency_available
; - обновить значение на полученное минимальное путем редактирования файла
/sys/bus/iio/devices/iio:device0/in_accel_sampling_frequency
.
Недостаток данного подхода в том, что после перезагрузки датчик не запоминает измененное значение.
Для того чтобы система могла автоматически устанавливать минимальную частоту обновления датчика, необходимо:
- выполнить команды:
Command sudo mkdir /etc/mig sudo touch /etc/mig/mig-t8x-accel-sampling-freq-fix.sh
- в файл
/etc/mig/mig-t8x-accel-sampling-freq-fix.sh
вставить следующий текст:Блок кода language bash title /etc/mig/mig-t8x-accel-sampling-freq-fix.sh SET_FREQ_FILE="/sys/bus/iio/devices/iio:device0/in_accel_sampling_frequency" AV_FREQ_FILE="/sys/bus/iio/devices/iio:device0/in_accel_sampling_frequency_available" minFreq=`cat $AV_FREQ_FILE | cut -d' ' -f1` echo $minFreq > $SET_FREQ_FILE
- создать файл службы, выполнив команды:
Command sudo mkdir /etc/mig
sudo touch /etc/mig/mig-t8x-accel-sampling-freq-fix.sh - в созданный файл вставить следующий текст:
Блок кода language bash title /etc/systemd/system/mig-t8x-accel-sampling-fix.service [Unit] Description=Fix accel sampling frequency for MIG T8x [Service] Type=simple ExecStart=/bin/bash /etc/mig/mig-t8x-accel-sampling-freq-fix.sh [Install] WantedBy=multi-user.target
- после сохранения файла активировать службу командой:
Command sudo systemctl enable mig-t8x-accel-sampling-fix.service
После перезагрузки системы датчик будет автоматически настраиваться на минимальную частоту обновления.
Сценарий, автоматически выполняющий приведенные выше шаги, доступен по ссылке generate_mig-t8x-fix-accel-sampling-frequency.sh.
TODO