gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:06:29 24 4
gpt4 key购买 nike

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

我的意思是,假设加速度计给我的感觉是 (Ax,Ay,Az) - in device's coordinates -,我应该应用什么转换将值转换为 (Ax',Ay',Az') - in real world's coordinates -,这样我就可以使用现实世界坐标中的加速度矢量来计算设备是否在向北、向东、向西南等方向加速?

过去几天我一直在解决这个问题。一开始觉得应该不难,但是翻了几十页也没找到什么实用的东西。

顺便说一句,这是我目前已经实现的一些代码:

    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??
}
}
};

我有:

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];

我也尝试过将 accelerometervalues 与倾角矩阵 I 相乘。还与 R 和 I (trueaccel=accel*R*I) 相乘,但这也不起作用。也不会调用 remapcoordinates() 然后以任何先前的形式相乘。

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

最佳答案

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])));

关于android - 将加速度计数据从设备坐标转换为真实世界坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5464847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com