从我的Android装置可以阅读的线性加速度值的阵列(该装置的坐标系统中)和绝对方位值的阵列(在地球的坐标系)。 我需要的是在后者的坐标,以获得线性加速度值。 系统。
我该如何转换呢?
阿里在评论回复后编辑 :
好吧,如果我理解正确的,当我测量线性加速度,手机的位置完全没有关系,因为读数在地球的坐标系统给出。 对?
不过,我只是做了一个测试,我把手机在不同位置和不同的轴得到了加速。 有3对图片 - 首当其冲展示如何把设备(对不起,我画图“技能大师”)和第二者表示从由直线加提供的数据读数。 传感器:
- 设备放在左侧
- 设备仰卧
- 设备站立
而现在 - 为什么在第三种情况下的加速度沿Z轴(未Y),因为发生设备的位置并不重要?
我终于设法解决这个问题! 因此,要获得加速度矢量在地球坐标系 ,你需要:
- 获得旋转矩阵(
float[16]
因此它可以通过以后可以使用android.opengl.Matrix
类)从SensorManager.getRotationMatrix()
使用SENSOR.TYPE_GRAVITY
和SENSOR.TYPE_MAGNETIC_FIELD
传感器值作为参数), - 使用
android.opengl.Matrix.invertM()
的旋转矩阵反转它(不转!) - 使用
Sensor.TYPE_LINEAR_ACCELERATION
传感器来获得线性加速度矢量(在设备的坐标。SYS。), - 使用
android.opengl.Matrix.multiplyMV()
由线性加速度矢量乘以旋转矩阵。
有你有它! 我希望我会救别人一些宝贵的时间。
感谢爱德华·福尔克和阿里的提示!
根据@亚历克斯的答案,这里是代码片段:
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;
}
}
根据文档你手机的坐标系中的线性加速度。
您可以从手机的坐标系与旋转矩阵相乘,转换到地球坐标系统的任何载体 。 你可以从旋转矩阵getRotationMatrix() 。
(也许已经有一个功能,这样做乘法你,但我不这样做的Android编程和我不熟悉它的API。)
在旋转矩阵一个很好的教程是方向余弦矩阵IMU:理论手稿。 祝好运!
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