自从我开始使用此功能并且尚未成功获得有效结果以来已过去几天.
我想要的基本上是将加速度矢量从设备坐标系转换为真实世界坐标.我知道这是可能的,因为我有相对坐标的加速度,我知道设备在现实世界系统中的方向.
Reading Android developers似乎使用getRotationMatrix()得到R =旋转矩阵.
因此,如果我想要A(世界系统中的加速度矢量)来自A'(电话系统中的加速度矢量),我必须做到:
A=R*A'
但是我不明白为什么矢量A总是第一个和第二个分量为零(例如:0,00; -0,00; 6,43)
我目前的代码与此类似:
public void onSensorChanged(SensorEvent event) {
synchronized (this) {
switch(event.sensor.getType()){
case Sensor.TYPE_ACCELEROMETER:
accelerometervalues = event.values.clone();
break;
case Sensor.TYPE_MAGNETIC_FIELD:
geomagneticmatrix =event.values.clone();
break;
}
if (geomagneticmatrix != null && accelerometervalues != null) {
float[] Rs = new float[16];
float[] I = new float[16];
SensorManager.getRotationMatrix(Rs, I, accelerometervalues, geomagneticmatrix);
float resultVec[] = new float[4];
float relativacc[]=new float [4];
relativacc[0]=accelerationvalues[0];
relativacc[1]=accelerationvalues[1];
relativacc[2]=accelerationvalues[2];
relativacc[3]=0;
Matrix.multiplyMV(resultVec, 0, Rs, 0, relativacc, 0);
//resultVec[] is the vector acceleration relative to world coordinates system..but doesn't WORK!!!!!
}
}
}
这个问题非常类似于这个Transforming accelerometer’s data from device’s coordinates to real world coordinates,但在那里我找不到解决方案……我曾尝试过所有的方法..
请帮帮我,我需要帮助!
更新:
现在我的代码在下面,我试图解释矩阵产品,但没有任何改变:
float[] Rs = new float[9];
float[] I = new float[9];
SensorManager.getRotationMatrix(Rs, I, accelerationvalues, geomagneticmatrix);
float resultVec[] = new float[4];
resultVec[0]=Rs[0]*accelerationvalues[0]+Rs[1]*accelerationvalues[1]+Rs[2]*accelerationvalues[2];
resultVec[1]=Rs[3]*accelerationvalues[0]+Rs[4]*accelerationvalues[1]+Rs[5]*accelerationvalues[2];
resultVec[2]=Rs[6]*accelerationvalues[0]+Rs[7]*accelerationvalues[1]+Rs[8]*accelerationvalues[2];
这里有一些数据读取和结果示例:
Rs separated by " " Rs[0] Rs[1]....Rs[8]
Av separated by " " accelerationvalues[0] ...accelerationvalues[2]
rV separated by " " resultVec[0] ...resultVec[2]
正如你可以注意到的那样,现实世界中x和y轴上的分量都是零(大约),即使你移动手机也是如此.相反,相对加速度矢量正确检测每个运动!
解
编号中的错误与浮点数相乘有关,与双重多重不同.
这总结为如果手机即使具有相同方向的情况正在加速,旋转矩阵也不是恒定的.
所以不可能将加速度矢量转换为运动期间的绝对坐标…
这很难,但这是现实.
解决方法:
Finnaly我找到了答案:
数字中的错误与float vars乘法有关,与double doubleyplication不同. Here there is the solution.
这总结为如果手机即使具有相同方向的情况正在加速,旋转矩阵也不是恒定的.因此,在运动过程中将加速度矢量转换为绝对坐标是不可能的……这很难但却是现实.
FYI定向矢量由磁性数据和重力矢量构成.这导致一个ciclic问题:转换相对acc需要oirentation需要磁场和重力,但我们知道重力只有当手机停止相对acc ..所以我们回到开始.
这在Android Developers where is explained中得到证实,只有当手机没有加速时(例如,他们谈论*落体,实际上不应该有重力测量)或者当它不在非正常磁场时,旋转矩阵才能给出真实的结果.
The matrices returned by this function are meaningful only when the
device is not free-falling and it is not close to the magnetic north.
If the device is accelerating, or placed into a strong magnetic field,
the returned matrices may be inaccurate.
在其他世界,完全无用……
你可以相信这个东西用Android Senor或类似的东西在桌面上进行简单的实验.