我目前正在安卓手机上开发倾斜补偿线性加速度计。我基本上想达到的是加速度,它在地球框架内,而不是传感器框架内。我还想让我的矢量重力自由。加速度计的X轴将与陆地车辆的X轴分开对齐。因此,不需要偏航补偿(手机x轴和磁北之间的角度)。
为此,我们有两个传感器读数:
1) 3x3旋转矩阵R(从地球框架到传感器框架的旋转)
2) 传感器帧的3x1加速度矢量a=(x,y,z)^T
要手动从a_transposed中移除重力,我们可以简单地定义地球框架中的重力矢量:
g=(0,0,9.81)^T
我现在可以将重力与旋转矩阵R相乘,并将其从向量中减去。因此a'是无重力加速度矢量。
a'=a-(R*g)(在本步骤中,a’的值与API中的软件传感器LINEAR_CCELERATION的值相同)
在这里之前一切都很好。
现在我想在地球框架中旋转我的线性加速度向量a',而不考虑Z轴旋转。为了做到这一点,我首先计算旋转矩阵R的倒数,它等于它的平移:
R^(-1)=R^T
然后我将a'与R^(-1)相乘,并将其旋转回地球框架。
a'=R^(-1)*a'
在这一步,如果我的手机面向磁北,我有一个倾斜补偿的线性加速度数据,因为我也绕着z轴旋转,这是不需要的。我必须绕z轴重新旋转它才能得到最终正确的结果。为此,我根据旋转矩阵计算了欧拉角(绕z轴旋转),即偏航。并使用偏航角将矢量向相反方向旋转一次。这应该是最后的校正步骤,但使用欧拉角是有成本的。
如果我直接向上拿手机,这种方法就不起作用,因为如果滚动角度等于90度,就会导致万向节锁定。然后,我计算的偏航角未知,我的背部旋转失败。
我的问题是如何修改/更改旋转矩阵,使我只能通过忽略z轴绕x和y轴旋转,而不使用欧拉角?
我已经检查过了,但对我没有帮助:如何从旋转矩阵中删除轴?
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矩阵。
您的设备是否有陀螺仪,是否运行2.3(API 9)或更高版本?
如果是这样,可以使用TYPE_GRAVITY和/或TYPE_LINEAR_CCELERATION虚拟传感器直接获得您想要的东西。