从旋转矩阵中移除任意旋转轴

时间:2012-03-29 13:22:03

标签: android math rotation linear-algebra

我目前正在研究Android手机上的倾斜补偿线性加速度计。我基本上想要达到的是加速度,它位于地球框架中,而不是传感器框架。我也想让我的矢量引力自由。加速度计的X轴将与陆地车辆的x轴分开对准。因此,不需要偏航补偿(手机的x轴和磁北极之间的角度)。

为此我们有2个传感器读数:

1)3x3旋转矩阵 R (从地球框架到传感器框架的旋转)

2)来自传感器框架的3x1加速度矢量 a =(x,y,z)^ T

要从 a_transposed 手动移除重力,我们只需在地球框架中定义重力矢量:

g =(0,0,9.81)^ T

我现在可以将重力乘以旋转矩阵R并从 a 向量中减去它。因此, a 是无重力加速度矢量。

a'= a - (R * g) (在此步骤a'与API中的软件传感器LINEAR_ACCELERATION具有相同的值)

直到这里一切正常。

现在我想在地球框架中旋转线性加速度矢量 a 而不将Z轴旋转到帐户。首先,我计算旋转矩阵R的倒数,它等于它的转置:

R ^( - 1)= R ^ T

然后我将 a R ^( - 1) 相乘并将其旋转回地球框架

a'= R ^( - 1)* a'

在这一步,我有一个倾斜补偿的线性加速度数据,如果我的手机面向磁北,因为我也围绕z轴旋转,这是不需要的。我必须围绕z轴重新旋转它以获得最终的正确结果。为此,我已经计算了旋转矩阵(即偏航)的欧拉角(绕z轴旋转)。并使用偏航角在相反方向上旋转一次矢量。这应该是最后的修正步骤,但使用欧拉角是有成本的。

如果直接向上握住手机,此方法不起作用,因为如果滚动角度等于90度并且导致万向节锁定。我计算的偏航角是未知,我的后旋转失败。

我的问题是如何修改/更改旋转矩阵,以便我只能通过忽略z轴绕x和y轴旋转,而不使用欧拉角?

我已经检查但它没有帮助我: How do I remove axis from a rotation matrix?

2 个答案:

答案 0 :(得分:0)

a_geo = R^-1*( a_phone - R*g ) = R^-1*a_phone - g

所以你到目前为止所做的就是在局部地理框架(N,E,D或其他东西)中展示你的无偏加速度。如果您想要的是水平面上的投影,您只需消灭第三个坐标,假设您的指数基于1,如matlab或fortran:

a_horiz=a_geo; a_horiz[3]=0;

或用矩阵表示,

a_horiz = [1,0,0;
           0,1,0;
           0,0,0] * a_geo;

您可以将其投影回手机轴,

R*a_horiz;

但目前尚不清楚它是否真的是你想要的...我想你只想应用一个航向旋转并具有某种水平前向加速度和水平横向(右舷)加速度。我不知道任何简单的伎俩...只需提取标题(正如您所指出的那样,只有当您的手机x轴不垂直时才有可能)

psi = atan2( R(1,2) , R(1,1) );

然后旋转水平加速度

a_horiz_car = [ cos(psi) ,  sin(psi) , 0;
               -sin(psi) ,  cos(psi) , 0;
                0        ,        0  , 1] * a_horiz;

只有前两个坐标很有趣,所以你可以使用2x2矩阵。

答案 1 :(得分:0)

您的设备是否有陀螺仪,是否运行2.3(API 9)或更高版本?

如果是这样,也许可以使用TYPE_GRAVITY和/或TYPE_LINEAR_ACCELERATION虚拟传感器来直接获得你想要的东西。