Представьте себе датчик силы тяжести / вращения iPhone, который для каждого положения устройства обеспечивает вектор силы тяжести (Vg) и текущую матрицу вращения 3x3 (M0).Например:
Vg * M0 = Vz
Vz * Mt = Vg
where:
Vg - current gravity vector
M0 - current rotation matrix
Mt - inverse (or actually transpose) matrix of M0
Vz - negative Z-axis vector = { 0, 0, -1 }
Необходимо иметь возможность калибровать акселерометр и гироскоп по всей оси, что означает, что мы хотели бы сохранить эталонную матрицу (C0) для вектора эталонной гравитации (Vc)в какой-то момент времени.Итак:
Vc * C0 = Vz
Vz * Ct = Vc
where:
Vc - reference gravity vector
C0 - reference rotation matrix
Ct - inverse (or actually transpose) matrix of C0
Vz - negative Z-axis vector = { 0, 0, -1 }
Теперь, если мы будем использовать эталонную матрицу в качестве нулевой эталонной, то калиброванную гравитацию (Vx) или гравитацию по отношению к эталонной (Vc) можно вычислить с помощьюсоставная матрица вращения (X0).Итак:
Vg * X0 = Vc
Vc * Xt = Vg
-->
M0 = X0 * C0 --> X0 = X0 * C0 * Ct --> X0 = M0 * Ct
Mt = Ct * Xt --> Xt = C0 * Ct * Xt --> Xt = C0 * Mt
-->
Vx * X0 = Vz
Vz * Xt = Vx
where:
Vx - computed (calibrated) gravity vector
X0 - composite rotation matrix
Xt - inverse (or actually transpose) matrix of X0
Vg - current gravity vector
M0 - current rotation matrix
Mt - inverse (or actually transpose) matrix of M0
Vc - reference gravity vector
C0 - reference rotation matrix
Ct - inverse (or actually transpose) matrix of C0
Vz - negative Z-axis vector = { 0, 0, -1 }
Все вышеперечисленное работает отлично.
Но есть проблема - при использовании всех приведенных выше формул для получения калиброванной силы тяжести нам сначала нужно будет выполнить вычисление составной матрицы длякаждое из следующих положений или поворотов устройства с использованием текущей матрицы вращения - это дорогостоящая операция.
Цель состоит в том, чтобы вычислить тип универсальной матрицы повторной калибровки (R0), которую можно использовать для вычислениякалиброванная сила тяжести (Vx) непосредственно из текущей силы тяжести (Vg) только с одним умножением и не зависит от текущей матрицы вращения (M0), поскольку эта текущая матрица уже включена в текущую силу тяжести (Vg), например:
Vg * R0 = Vx
Vx * Rt = Vg
Простое применение эталонной матрицы (C0) к вектору гравитации (Vg) не работает, поэтому:
Vg * C0 != Vx
Vx * Ct != Vg
Это происходит потому, что Vg = Vz * Mt переводится в Vg = Vz *Ct * Xt, таким образом, умножение его на C0 не даст нам Xt, и результирующий вектор будет совершенно нечетным.
Возможно ли решение?