Android传感器:getRotationMatrix()返回错误的值,为什么?

自从我开始使用此功能并且尚未成功获得有效结果以来已过去几天.

我想要的基本上是将加速度矢量从设备坐标系转换为真实世界坐标.我知道这是可能的,因为我有相对坐标的加速度,我知道设备在现实世界系统中的方向.

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或类似的东西在桌面上进行简单的实验.

上一篇:基于ECS快速搭建Docker环境


下一篇:为什么缺少某些传感器的枚举值?使用它们是否安全?