Как преобразовать значение Yaw, Pitch, Roll и Acceleration в декартову систему? - PullRequest
3 голосов
/ 29 февраля 2012

У меня показания Yaw, Pitch, Roll, Rotation matrix, Quaternion и Acceleration. Эти показания принимаются с частотой 20 (в секунду). Они собираются с мобильного устройства, которое перемещается в трехмерном пространстве из одной позиции в другую.

Я устанавливаю базовую плоскость путем умножения обратной матрицы на начальное положение. Остальные чтения взяты, рассматривая первое как справочное. Теперь я хочу преобразовать эти показания в трехмерную декартову систему.

Как конвертировать? Может кто-нибудь, пожалуйста, помогите?

1 Ответ

1 голос
/ 06 октября 2013

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

Если у вас есть матрицы вращения R_i для каждого момента i в вашем интервале l=20secs.Чем эти повороты являются относительными к тому, который применяется при R_(i-1), вы можете рассчитать их повороты относительно первой позиции.Итак, A_i = R_1*...*R_i, но в конце концов вы также можете просто сохранить новое направление движения (расчеты сейфов).

При условии, что сначала направление движения будет d_0 = (1,0,0).Вы можете вычислить следующее по d_i = R_i*d_(i-1) (всегда норма d_(i-1), потому что оно может уменьшиться или увеличиться из-за ошибки).Первая позиция p, ваша начальная скорость v_0 = (0,0,0) и, наконец, ускорение a_i.Вам нужно рассчитать векторную скорость v_i для каждого момента:

v_i = v_(i-1) + l*a_i*A_i*d_0 = v_(i-1) + l*a_i*d_i

Теперь вы в основном знаете, куда вы движетесь и какую скорость используете, поэтому ваша позиция p_i на данный момент i определяется как:

`p_i = p_0 + l * ( v_1 + v_2 + ... + v_i)`

Для единиц:

a_i = [m/s^2]^3
v_i = [m/s]^3
p_i = [m]^3  

Точность

Теперь несколько моментов с точностью вашей позициирасчет (просто если вы хотите знать, насколько хорошо это будет работать).Предположим, у вас есть ошибка e>= ||R_i*v-w|| (где w - правильный вектор).в данных вы рассчитываете матрицы вращения с.Ваша ошибка умножается сама собой, поэтому ваша ошибка в i моменте составляет e_i <= e^i.
Тогда, поскольку вы применяете к ней l и a_i, она становится:

f_i <= l*a_i*e^i

Но вытакже добавляется ошибка при добавлении скорости, так что теперь ее g_i <= f_1+...+f_i.И да, вы также складываете для позиции (обе суммы превышают i):

h_i <= g_1+...+g_i = ΣΣ (l*a_i*e^i) = l* ΣΣ (a_i*e^i)

Так что это в основном максимальная разница от вашей позиции p_i до правильной позиции w (||p_i - w|| <= h_i).
Это все еще не принимает во внимание, что вы не получаете правильное ускорение от вашего устройства (я не знаю, как они обычно делают это), потому что правильным будет:

a_i = ||∫a_i(t) dt||  (where a_i(t) is vectorial now)

И вам нужно будет рассчитать разницу в направлении (матрицу вращения) следующим образом:

 Δd_i = (∫a_i(t) dt)/a_i   (again a_i(t) is vectorial)

Таким образом, кроме ошибок, которые вы получаете из-за ошибки ваших вращений с вашего устройства (и из арифметики с плавающей запятой)), у вас есть ошибка в вашем ускорении, я не буду вычислять это сейчас, но вы замените a_i = a_i + b_i.

Так что я почти уверен, что это будет далеко от реальной позиции.Вы даже должны принять во внимание, что ваша скорость может отличаться от нуля, когда она должна быть!

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

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