Положение устройства от вектора вращения с кватернионами
Я в растерянности.
Я пытаюсь оценить датчик вектора вращения, чтобы выяснить, куда направлено мое устройство. По сути, мне нужны данные для искусственного горизонта (направление в смысле восток, север... было бы неплохо, но не обязательно).
Я не понимаю ничего из этого. Ни одна из формул, которые я пробовал, не работает или, кажется, не подходит
Я должен быть в состоянии определить, направлен ли мой дисплей вверх или вниз, и под каким углом он это делает, верно? (Уровень телефона, на уровне 30 градусов, ангел и т. Д.)
На данном этапе я даже не уверен, что мои вопросы имеют смысл.
Было бы неплохо быстрое и простое решение, но если бы было что-то, что помогло бы мне понять, что я пытаюсь сделать, я бы тоже это оценил.
1 ответ
Из того, что вы говорите, я делаю вывод, что у вас есть 3-осевой MEMS IMU (инерциальная единица измерения) и, возможно, цифровой магнитометр.
Если это не так, и у вас есть только 3-осевой цифровой гироскоп, тогда невозможно узнать "абсолютную" ориентацию (относительно севера, востока, вниз - NED) устройства, только ориентацию относительно ориентация, в которой программа начала работать. Чтобы иметь возможность получить ориентацию NED, требуются дополнительные датчики, такие как акселерометр, магнитометр или GPS (среди прочих). Я продолжу с предположением, что у вас есть акселерометр и магнитометр.
Поскольку вы говорите, что вам нужен только "искусственный горизонт", я думаю, вам не нужно отслеживать или фильтровать ориентацию, вы можете выполнить измерения IMU и оценить горизонт. Если в этом случае вам требуется отслеживание ориентации или фильтрация, то этот подход даст вам некоторые из возможных моделей измерения для использования в фильтре Калмана или дополнительном DCM-фильтре (см. Отчет и статью по адресу http://www.x-io.co.uk/open-source-imu-and-ahrs-algorithms).
Ниже приведены две модели измерения, реализованные в MATLAB, с помощью обеих из которых вы можете получить зашумленное измерение крена, шага и рыскания относительно кадра NED (север, восток, вниз). Обратите внимание, что вторая функция будет работать только тогда, когда IMU в основном плоский, вы можете улучшить это с помощью одной из систем отслеживания ориентации, которые я упоминал выше.
function rpy = tiltFromAccel(a)
%% Gets the roll and pitch wrt. gravity using the accelerometer
rpy = zeros(3,1);
rpy(1) = atan2(a(2), sqrt(a(1).^2 + a(3).^2));
rpy(2) = atan2(-a(1), sqrt(a(2).^2 + a(3).^2));
rpy(3) = 0; % Yaw is unobservable from accelerometer alone
end
function yaw = northFromMag(m)
%% Gets the yaw of North using the magnetometer
% This will be really noisy. Effects that are not modelled: hard iron,
% soft iron, non-orthogonality of the sensors, scaling and bias.
% This function assumes that the magnetometer is flat.
yaw = atan2(m(1),m(2));
end
Если у вас есть углы крена и тангажа, легко выполнить некоторую простую логику, как вы уже описали, если повороты выполняются по одному; если вращения вокруг нескольких осей одновременно, то это более сложно. Это недостаток использования углов Эйлера в качестве представления ориентации, для получения дополнительной информации см. https://en.wikipedia.org/wiki/Euler_angles.
Надеюсь, это то, что вы ищете.