将加速度计的数据从设备坐标转换为真实世界坐标

Tom*_*mmy 12 android device accelerometer coordinates

如果这是一个非常基本的问题,我真的很抱歉,但我没有选择,只能问:如何将加速度计数据从设备坐标转换为真实世界坐标?

我的意思是,假设加速度计让我像(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??
        }
   }
};
Run Code Online (Sandbox Code Playgroud)

我有:

原生坐标中的加速度矢量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];
Run Code Online (Sandbox Code Playgroud)

我也尝试accelerometervalues用倾斜矩阵I进行乘法运算.同时乘以R和I(trueaccel = accel*R*I)并且也不起作用.也没有呼叫remapcoordinates()然后在任何先前的形式中相乘.

有没有人知道我做错了什么?

Tom*_*mmy 6

Oki,我已经用数学方法解决了这个问题,所以请耐心等待.

如果要将加速度矢量accelerationvalues转换为trueacceleration以实际世界坐标表示的加速度矢量,一旦将方位角,俯仰和滚动存储在orientationvalues矢量中,只需执行以下操作:

                trueacceleration[0] =(float) (accelerometervalues[0]*(Math.cos(orientationvalues[2])*Math.cos(orientationvalues[0])+Math.sin(orientationvalues[2])*Math.sin(orientationvalues[1])*Math.sin(orientationvalues[0])) + accelerometervalues[1]*(Math.cos(orientationvalues[1])*Math.sin(orientationvalues[0])) + accelerometervalues[2]*(-Math.sin(orientationvalues[2])*Math.cos(orientationvalues[0])+Math.cos(orientationvalues[2])*Math.sin(orientationvalues[1])*Math.sin(orientationvalues[0])));
            trueacceleration[1] = (float) (accelerometervalues[0]*(-Math.cos(orientationvalues[2])*Math.sin(orientationvalues[0])+Math.sin(orientationvalues[2])*Math.sin(orientationvalues[1])*Math.cos(orientationvalues[0])) + accelerometervalues[1]*(Math.cos(orientationvalues[1])*Math.cos(orientationvalues[0])) + accelerometervalues[2]*(Math.sin(orientationvalues[2])*Math.sin(orientationvalues[0])+ Math.cos(orientationvalues[2])*Math.sin(orientationvalues[1])*Math.cos(orientationvalues[0])));
            trueacceleration[2] = (float) (accelerometervalues[0]*(Math.sin(orientationvalues[2])*Math.cos(orientationvalues[1])) + accelerometervalues[1]*(-Math.sin(orientationvalues[1])) + accelerometervalues[2]*(Math.cos(orientationvalues[2])*Math.cos(orientationvalues[1])));
Run Code Online (Sandbox Code Playgroud)