具有四元数的旋转矢量的设备位置

时间:2014-11-07 19:16:18

标签: android vector rotation quaternions

我不知所措。

我正在尝试评估旋转矢量传感器,以确定我的设备面向哪个方向。 基本上,我需要的是一个人工地平线的数据(东方,北方,...的方向将是一个很好的额外,但不是严格需要。)

我不明白任何一个。我尝试过的任何公式都没有,或者似乎更接近。

我应该能够判断我的显示器是朝上还是朝下,以及它在哪个角度,对吧? (电话级别,30度天使等)

在这个阶段,我甚至不确定我的问题是否有意义。

快速简便的解决方案会很好,但如果有任何东西可以帮助我理解我想要做的事情,我也会很感激。

1 个答案:

答案 0 :(得分:0)

据你所说,我推断你有一个3轴MEMS IMU(惯性测量单元),也许还有一个数字磁力计。

如果不是这种情况并且您只有一个3轴数字陀螺仪,则无法知道设备的“绝对”方向(相对于北,东,下 - NED),只有相对于程序开始运行的方向的方向。为了能够获得NED方向,需要额外的传感器,例如加速度计,磁力计或GPS(以及其他)。我将继续假设你有一个加速度计和磁力计。

由于您说您只需要“人工视野”,我认为您不需要任何姿态跟踪或过滤,您可以进行IMU测量并估计视野。如果您需要进行姿态跟踪或过滤,则此方法将为您提供一些可用于卡尔曼滤波器或互补DCM滤波器的测量模型(请参阅http://www.x-io.co.uk/open-source-imu-and-ahrs-algorithms处的报告和论文)。 / p>

以下是在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#Proper_Euler_angles

希望这是你正在寻找的。