加速从设备的坐标系转换到绝对坐标系(Acceleration from device's c

2019-06-17 11:50发布

从我的Android装置可以阅读的线性加速度值的阵列(该装置的坐标系统中)和绝对方位值的阵列(在地球的坐标系)。 我需要的是在后者的坐标,以获得线性加速度值。 系统。

我该如何转换呢?

阿里在评论回复后编辑

好吧,如果我理解正确的,当我测量线性加速度,手机的位置完全没有关系,因为读数在地球的坐标系统给出。 对?

不过,我只是做了一个测试,我把手机在不同位置和不同的轴得到了加速。 有3对图片 - 首当其冲展示如何把设备(对不起,我画图“技能大师”)和第二者表示从由直线加提供的数据读数。 传感器:

  1. 设备放在左侧

  1. 设备仰卧

  1. 设备站立

而现在 - 为什么在第三种情况下的加速度沿Z轴(未Y),因为发生设备的位置并不重要?

Answer 1:

我终于设法解决这个问题! 因此,要获得加速度矢量地球坐标系 ,你需要:

  1. 获得旋转矩阵( float[16]因此它可以通过以后可以使用android.opengl.Matrix类)从SensorManager.getRotationMatrix()使用SENSOR.TYPE_GRAVITYSENSOR.TYPE_MAGNETIC_FIELD传感器值作为参数),
  2. 使用android.opengl.Matrix.invertM()的旋转矩阵反转它(不转!)
  3. 使用Sensor.TYPE_LINEAR_ACCELERATION传感器来获得线性加速度矢量(在设备的坐标。SYS。),
  4. 使用android.opengl.Matrix.multiplyMV()由线性加速度矢量乘以旋转矩阵。

有你有它! 我希望我会救别人一些宝贵的时间。

感谢爱德华·福尔克和阿里的提示!



Answer 2:

根据@亚历克斯的答案,这里是代码片段:

private float[] gravityValues = null;
private float[] magneticValues = null;

 @Override
    public void onSensorChanged(SensorEvent event) {
        if ((gravityValues != null) && (magneticValues != null) 
            && (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)) {

            float[] deviceRelativeAcceleration = new float[4];
            deviceRelativeAcceleration[0] = event.values[0];
            deviceRelativeAcceleration[1] = event.values[1];
            deviceRelativeAcceleration[2] = event.values[2];
            deviceRelativeAcceleration[3] = 0;

            // Change the device relative acceleration values to earth relative values
            // X axis -> East
            // Y axis -> North Pole
            // Z axis -> Sky

            float[] R = new float[16], I = new float[16], earthAcc = new float[16];

            SensorManager.getRotationMatrix(R, I, gravityValues, magneticValues);

            float[] inv = new float[16];

            android.opengl.Matrix.invertM(inv, 0, R, 0);
            android.opengl.Matrix.multiplyMV(earthAcc, 0, inv, 0, deviceRelativeAcceleration, 0);
           Log.d("Acceleration", "Values: (" + earthAcc[0] + ", " + earthAcc[1] + ", " + earthAcc[2] + ")");                

        } else if (event.sensor.getType() == Sensor.TYPE_GRAVITY) {
            gravityValues = event.values;
        } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
            magneticValues = event.values;
        } 
   }


Answer 3:

根据文档你手机的坐标系中的线性加速度。

您可以从手机的坐标系与旋转矩阵相乘,转换到地球坐标系统的任何载体 。 你可以从旋转矩阵getRotationMatrix() 。

(也许已经有一个功能,这样做乘法你,但我不这样做的Android编程和我不熟悉它的API。)

在旋转矩阵一个很好的教程是方向余弦矩阵IMU:理论手稿。 祝好运!



Answer 4:

OK,首先,如果你试图做Android上的实际惯性导航,你有你的工作等着你。 在智能手机中使用的廉价的小传感器只是不够精确。 虽然出现了在短距离,如大楼内进行intertial导航做了一些有趣的工作。 有可能是你可以挖的主题论文。 谷歌“运动接口开发者大会”,你可能会发现一些有用的东西 - 这是一个招待会上说,Invensense公司几个月前把一对夫妇。

其次,不,线性加速度是在设备坐标,而不是世界坐标。 你必须自己进行转换,这意味着了解设备的3-d方向。

你想要做的是使用一个版本的Android支持虚拟传感器TYPE_GRAVITY和TYPE_LINEAR_ACCELERATION。 您需要使用陀螺仪设备来获得合理准确和精确的读数。

在内部,该系统结合陀螺仪,加速计,磁力计和以拿出该设备定位真正的价值。 这有效地拆分加速度计装置插入其重力和加速度分量。

所以,你想要做的是设置为TYPE_GRAVITY,TYPE_LINEAR_ACCELERATION和TYPE_MAGNETOMETER传感器听众。 使用重力和磁力数据作为输入的SensorManager。 getRotationMatrix(),以获得旋转矩阵,将改变世界坐标为设备坐标,反之亦然。 在这种情况下,你会希望“亦然”的一部分。 也就是说,转换由方向矩阵的转置乘以他们的加速度输入到世界坐标线。



文章来源: Acceleration from device's coordinate system into absolute coordinate system