我的意思是,假设加速度计给出了类似于(Ax,Ay,Az)-在设备坐标中-的值,那么我应该应用哪些变换来将这些值转换为(Ax',Ay',Az')-在真实世界坐标系中-,以便我可以使用真实世界坐标系中的加速度向量来计算设备是否正在向北、东、南、西等方向加速?
我已经在过去几天里一直在处理这个问题。起初我认为这不应该很难,但在搜索了数十页后,我没有找到任何有用的东西。
顺便说一下,这是一些我迄今为止已经实现的代码:
private SensorEventListener mSensorEventListener = new SensorEventListener() {
public void onAccuracyChanged(Sensor sensor, int accuracy){
}
public void onSensorChanged(SensorEvent event) {
switch(event.sensor.getType()){
case Sensor.TYPE_ACCELEROMETER:
accelerometervalues = event.values.clone();
AX.setText(accelerometervalues[0]+"");
AY.setText(accelerometervalues[1]+"");
AZ.setText(accelerometervalues[2]+"");
break;
case Sensor.TYPE_ORIENTATION:
orientationvalues = event.values.clone();
azimuth.setText(orientationvalues[0]+"");
pitch.setText(orientationvalues[1]+"");
roll.setText(orientationvalues[2]+"");
break;
case Sensor.TYPE_MAGNETIC_FIELD:
geomagneticmatrix =event.values.clone();
TAX.setText(geomagneticmatrix[0]+"");
TAY.setText(geomagneticmatrix[1]+"");
TAZ.setText(geomagneticmatrix[2]+"");
break;
}
if (geomagneticmatrix != null && accelerometervalues != null) {
float[] R = new float[16];
float[] I = new float[16];
SensorManager.getRotationMatrix(R, I, accelerometervalues, geomagneticmatrix);
//What should I do here to transform the components of accelerometervalues into real world acceleration components??
}
}
};
我有:
accelerometervalues
中本地坐标下的加速度矢量。
geomagneticmatrix
中的磁场值向量。
orientationvalues
中的方位角、俯仰角和滚动角。
旋转矩阵R
。倾斜矩阵I
。
我认为所有必要的信息都在那里,方位角、俯仰角和滚动角应该描述设备坐标系相对于真实世界坐标系的位移。此外,我相信R
甚至可用作设备坐标系内的真北矢量。
在我看来,获得在真实世界中的加速度值只需要从这些数据进行数学转换即可。我只是想不出来。
提前感谢。
编辑:
我已尝试直接将accelerometervalues
的分量与旋转矩阵R
相乘(trueaccel = accel * R),但未成功。
trueacceleration[0]= accelerometervalues[0]*R[0]+accelerometervalues[1]*R[1]+accelerometervalues[2]*R[2];
trueacceleration[1]= accelerometervalues[0]*R[1]+accelerometervalues[1]*R[4]+accelerometervalues[2]*R[7];
trueacceleration[2]= accelerometervalues[0]*R[2]+accelerometervalues[1]*R[5]+accelerometervalues[2]*R[8];
我也尝试过将
accelerometervalues
与倾斜矩阵I相乘。同时与R和I都相乘(trueaccel=accel*R*I),但这两种方法都没有奏效。调用remapcoordinates()
并以任何一种方式进行乘法运算也不起作用。有人知道我做错了什么吗?