Удалить произвольную ось вращения из матрицы вращения - PullRequest
2 голосов
/ 29 марта 2012

В настоящее время я работаю над линейным акселерометром с компенсацией наклона на телефоне 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 без использования углов Эйлера?

Я уже проверил, но это не помогло мне: Как удалить ось из матрицы вращения?

Ответы [ 2 ]

0 голосов
/ 30 июня 2012

Есть ли в вашем устройстве гироскопы, и работает ли оно на 2.3 (API 9) или выше?

Если это так, возможно, вы сможете использовать виртуальные датчики TYPE_GRAVITY и / или TYPE_LINEAR_ACCELERATION, чтобы получить то, что вам нужно.

0 голосов
/ 30 июня 2012
a_geo = R^-1*( a_phone - R*g ) = R^-1*a_phone - g

так что все, что вы до сих пор делали, это проецируете свое непредвзятое ускорение в локальной географической структуре (N, E, D или что-то в этом роде).Если вам нужна проекция на горизонтальную плоскость, вы просто аннулируете 3-ю координату, скажем, ваши индексы основаны на 1, например, matlab или fortran:

a_horiz=a_geo; a_horiz[3]=0;

или выражены с помощью матрицы,

a_horiz = [1,0,0;
           0,1,0;
           0,0,0] * a_geo;

Вы можете проецировать это обратно на ось своего телефона,

R*a_horiz;

Но не ясно, действительно ли это то, что вы хотите ... Я думаю, вы хотите просто применить поворот заголовка и иметь некоторыевид горизонтального прямого ускорения и горизонтального бокового (правого) ускорения.Я не знаю простого трюка ... Просто извлеките заголовок (как вы отметили, возможно, только если ось вашего телефона не вертикальная)

psi = atan2( R(1,2) , R(1,1) );

Затем поверните горизонтальное ускорение

a_horiz_car = [ cos(psi) ,  sin(psi) , 0;
               -sin(psi) ,  cos(psi) , 0;
                0        ,        0  , 1] * a_horiz;

Интересны только первые две координаты, поэтому вы можете использовать матрицу 2x2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...