Здесь я опишу, как получить ориентацию устройства относительно горизонтальной плоскости и магнитного севера. Это всего лишь 1 строка кода для получения магнитного курса от ориентации (матрицы вращения).
Возьмите показания акселерометра и магнитометра a и m как трехмерные векторы. a x m перекрестный продукт указывает на восток или запад независимо от ориентации телефона. То, указывает ли перекрестное произведение на восток или запад, зависит от ваших условных обозначений (вверх положительно или отрицательно) и от руки вашей системы координат (левой или правой).
Возможно, вы захотите применить хотя бы простое скользящее среднее к вашим данным, прежде чем вычислять перекрестное произведение.
В общем, не очень хорошая идея использовать крен, тангаж и рыскание, поэтому, пожалуйста, не делайте этого. Во всяком случае, вам это не нужно.
Показания акселерометра a , перекрестное произведение a x m и перекрестное произведение показаний акселерометра и перекрестного произведения a x ( a x m ) дает 3 попарно перпендикулярных вектора. Сделайте их единичными векторами, умножив их на обратную величину их соответствующей длины. Эти 3 единичных вектора дадут вам матрицу вращения .
Матрица вращения эквивалентна ориентации устройства. В моем приложении магнитный курс был atan2(R[Y][Y], R[Y][X])
, где R - матрица вращения. Возможно, вам придется взять различные элементы матрицы вращения и, возможно, изменить знаки в зависимости от соглашений, которые вы соблюдаете.
Если API устройства предоставляет матрицу вращения, то для получения магнитного курса достаточно просто кода.