В настоящее время я работаю над линейным акселерометром с компенсацией наклона на телефоне Android. То, что я в основном хочу достигнуть, является ускорением, которое находится в структуре земли, а не в корпусе датчика. Я также хочу сделать мою векторную гравитацию свободной. Ось X акселерометра будет совмещена отдельно с осью Х наземного транспортного средства. Поэтому компенсация рыскания (угол между осью x телефона и магнитным севером) не нужна.
Для этого у нас есть 2 показания датчика:
1) Матрица вращения 3x3 R (вращение от заземляющей рамы до рамы датчика)
2) Вектор ускорения 3x1 a = (x, y, z) ^ T от рамы датчика
Чтобы вручную удалить гравитацию из a_transposed , мы можем просто определить вектор гравитации в кадре Земли:
г = (0,0,9,81) ^ Т
Теперь я могу умножить гравитацию на матрицу вращения R и вычесть ее из вектора a . В результате a ' - это вектор ускорения свободного падения.
a '= a - (R * g)
(на этом шаге a 'имеет те же значения, что и программный датчик LINEAR_ACCELERATION в API)
Пока здесь все работает нормально.
Теперь я хочу повернуть мой вектор линейного ускорения a ' в системе заземления без учета вращения оси Z для учета . Для этого сначала вычисляю инверсию матрицы вращения R, которая равна ее транспонированию:
R ^ (- 1) = R ^ T
Затем я умножаю a ' на R ^ (- 1) и поворачиваю его обратно к заземлению.
a '= R ^ (- 1) * a'
На этом шаге у меня есть данные линейного ускорения с компенсацией наклона, если мой телефон направлен на магнитный север, потому что я также вращался вокруг оси z, что не нужно. Я должен повернуть его вокруг оси Z, чтобы получить окончательный правильный результат. Для этой цели я вычислил угол Эйлера (вращение вокруг оси z) из матрицы вращения, которая является отклонением. И повернул мой вектор один раз в противоположном направлении, используя угол рыскания. Это должен быть последний шаг коррекции, но с использованием углов Эйлера есть затраты.
Этот метод не работает, если я держу телефон прямо вверх, потому что если угол крена равен 90 градусам, и это вызывает блокировку карданного подвеса. Тогда мой расчетный угол поворота составляет неизвестно , и мое вращение назад не удается.
Мой вопрос заключается в том, как изменить / изменить матрицу вращения, чтобы я мог вращаться только вокруг оси x и y, игнорируя ось z без использования углов Эйлера?
Я уже проверил, но это не помогло мне:
Как удалить ось из матрицы вращения?