安卓,用指南针从加速度计中移除重力



首先,我假设设备在第一次测量时处于静止状态,所以我拥有的加速度是重力,其次我不会使用低通滤波器。

Android给了我线性加速度和罗盘值。我的猜测是,我可以用指南针旋转加速度到地球参考,从而消除重力。我的猜测是,如果我计算两个指南针测量的差,我有一个数量是手机旋转的指数,所以,如果我把它加到初始重力矢量上,我也可以旋转它。

那么在第I次测量中,我的猜测是:

#a[i] contains the 3-acceleration at time i
#b[i] cointains the 3-compass values at time i
b[i]=numpy.sin(b[i]/(180./math.pi)) # I normalize the compass values from 0 to 1
#since b is a unit vector I need to "de-normalize" it
b[i]=b[i]*sqrt(g**2.)
deltab=b[i]-b[i-1]
# At the very beginning of the code I had something like g=a[0]
g=g-deltab #well I've tried also with the plus sign

它不工作,但我看不出问题,你知道吗?

编辑:我也在尝试这种方法,我也不知道为什么它不起作用:我在这里找到了计算旋转矩阵的方法给出了向量和旋转角度。下面是如何构建这个矩阵:http://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle我选择的角度是新旧罗经方向的标量积。它们旋转的向量是旧向量和新向量的叉乘(我猜…这可能是错的)如果我得到指南针的旋转,然后我建立旋转矩阵,然后我把它应用到我的初始重力向量上,它是正确的旋转重力向量吗?

#a[i] contains the 3-acceleration at time i
#b[i] cointains the 3-compass values at time i
omega=cross(b[i],b[i-1])
theta=dot(b[i],b[i-1])/sqrt(dot(b[i],b[i])*dot(b[i-1],b[i-1]))
M=rotationMatrix(omega,theta)
aWithoutGravity[i]=dot(M,a[i])

正如你所描述的,这个问题无法解决。如果你有两个坐标系,你可以用另一个来描述一个,但是你只有两个向量(在手机的坐标系中描述),单个向量会引入歧义,因为你实际上只知道它们之间的角度。

例如,考虑对重力和磁场矢量进行初始测量,现在旋转和旋转您的手机。你可以再次测量磁场矢量,但是假设你不知道重力矢量,它会在哪里?你所知道的就是它相对于磁场矢量的角度(你也可以假设你知道它的大小),基本上在磁场矢量周围形成一个锥体(或者如果你假设大小)。但是由于你不知道它的确切信息,你不能用它来完全确定线性加速度。也就是说,给定一个测量的加速度(物理上,重力+线性加速度),在可能的重力矢量锥中的每个矢量都意味着不同的线性加速度。

它确实帮你解决了一部分问题,因为你现在有一个复杂的几何问题,只有一定范围的线性加速度向量与"重力锥"一致,但这个问题变得比简单的减法复杂得多,而且没有先验的理由相信这个较小的可能的线性加速度向量子集告诉你任何有用的东西。

例如,罗经的原始读数为(1,0,0),加速度读数为(6, 6, 0)。如果手机只是围绕(1,0,0)旋转,其他加速读数是可能的,如(6, -6, 0), (6, 0, 6), (6, 0, -6),以及许多介于两者之间。因此,由于这种模糊性,人们无法仅根据罗盘读数来判断(6, 6, 0)是由于加速还是因为手机旋转而变成了(6, -6, 0)

罗盘值(即来自android传感器Sensor.TYPE_MAGNETIC_FIELD的值)在重力方向和磁北方向上都有分量。所以你可以用它,和重力向量一起,算出东的方向,因为这是由两个向量的叉乘给出的。事实上,取决于你在世界上的位置,重力方向的Sensor.TYPE_MAGNETIC_FIELD分量可能相当大。

还需要注意的是,Android有两个传感器Sensor.TYPE_GRAVITYSensor.TYPE_LINEAR_ACCELERATION,它们是从Sensor.TYPE_ACCELEROMETER衍生而来的。这些读数总是满足

Sensor.TYPE_ACCELEROMETER =  Sensor.TYPE_GRAVITY + Sensor.TYPE_LINEAR_ACCELERATION

最新更新