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

Lor*_*ork 3 math android matrix sensor coordinates

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

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

阅读Android开发人员似乎使用getRotationMatrix()我得到R =旋转矩阵.

因此,如果我想要A(世界系统中的加速度矢量)来自A'(电话系统中的加速度矢量),我必须做到:

  A=R*A'
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么矢量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!!!!!

        }
      }
   }
Run Code Online (Sandbox Code Playgroud)

这个问题非常类似于这个转换加速度计的数据从设备的坐标到现实世界的坐标,但在那里我找不到解决方案......我已经尝试了所有方法..

请帮帮我,我需要帮助!

更新:

现在我的代码在下面,我试图解释矩阵产品,但没有任何改变:

            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];
Run Code Online (Sandbox Code Playgroud)

这里有一些数据读取和结果示例:

Rs separated by " " Rs[0] Rs[1]....Rs[8]
Av separated by " " accelerationvalues[0] ...accelerationvalues[2]
rV separated by " " resultVec[0] ...resultVec[2]
Run Code Online (Sandbox Code Playgroud)

来自CAT经理的数据

正如你可以注意到的那样,现实世界中x和y轴上的组件都是零(大约),即使你移动手机也是如此.相反,相对加速度矢量正确检测每个运动!

解决方案编号中 的错误与浮点数乘法相关,与双重多重不同.这总结为如果手机即使具有相同方向的情况正在加速,旋转矩阵也不是恒定的. 所以不可能将加速度矢量转换为运动期间的绝对坐标......这很难但它却是现实.

Lor*_*ork 5

Finnaly我找到了答案:

数字中的错误与float vars乘法有关,与double doubleyplication不同.这里有解决方案. 这总结为如果手机即使具有相同方向的情况正在加速,旋转矩阵也不是恒定的.所以不可能将加速度矢量转换为运动期间的绝对坐标......这很难但它却是现实.

FYI定向矢量由磁性数据和重力矢量构成.这导致一个ciclic问题:转换相对acc需要oirentation需要磁场和重力,但我们知道重力只有当手机停止相对acc ..所以我们回到开始.

这在Android开发者中得到了证实,其中解释了旋转矩阵仅在手机未加速时才会给出真实结果(例如,他们谈论自由落体,实际上不应该是重力测量)或者当它不是非常规时磁场.

此功能返回的矩阵仅在器件不自由下落且不靠近磁北时才有意义. 如果设备正在加速或置于强磁场中,则返回的矩阵可能不准确.

在其他世界中,完全无用......你可以相信这个东西在Android Senor或类似的东西上进行简单的实验.