построение оптимизированной матрицы только из калибровочной / эталонной матрицы? возможно / разрешима? - PullRequest
1 голос
/ 09 апреля 2011

Представьте себе датчик силы тяжести / вращения 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, и результирующий вектор будет совершенно нечетным.

Возможно ли решение?

1 Ответ

0 голосов
/ 10 апреля 2011

На данный момент я вижу единственное оптимизированное решение, так как кажется, что требуемую матрицу R0 невозможно вычислить.

Оптимизированное решение состоит в том, чтобы разбить на 2 части следующую формулу:

Vx = Vz * Xt --> Vx = Vz * C0 * Ct * Xt --> Vx = Vz * C0 * Mt

Шаг 1: предварительно умножьте отрицательный вектор оси Z (Vz) на эталонную калибровочную матрицу (C0) во время взятия или установки эталона:

Vp = Vz * C0

Шаг 2: используйтеоптимизированное умножение вектора на транспонированную матрицу (когда матрица действительно не транспонируется) в каждом кадре (при изменении ориентации):

Vx = optimized_vector_by_transpose_of_matrix_mutiplication( Vp, M0 )

Хотя это не то, что я действительно хочу - это работает - тамнет необходимости вычислять составную матрицу для каждого кадра, и фактическое количество операций точно такое же, как для умножения матрицы на один вектор.

Если кто-нибудь найдет лучшее / более хорошее решение - добро пожаловать :-)

...