Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android获取地球坐标系上的加速度计_Android_Matrix_Coordinates_Processing_Accelerometer - Fatal编程技术网

Android获取地球坐标系上的加速度计

Android获取地球坐标系上的加速度计,android,matrix,coordinates,processing,accelerometer,Android,Matrix,Coordinates,Processing,Accelerometer,我想在Android上安装加速计,并将它们放在地球坐标系上,就像这个主题或这里一样,但这些解决方案不适合我。我正在处理。该项目只是简单地跟踪手机在太空中的加速度,不管它是如何(站着,侧身…)。我也是Android新手。 谢谢你的帮助! 多谢各位 编辑:我不需要手机的精确位置,只需要加速度。加速度计是根据设备坐标系给出的。要根据地球坐标系表示加速度计,您需要找到从设备坐标系到地球坐标系的基础矩阵的变化。这就是getRotationMatrix方法中的旋转矩阵。 因此,您必须注册TYPE\u磁场并过

我想在Android上安装加速计,并将它们放在地球坐标系上,就像这个主题或这里一样,但这些解决方案不适合我。我正在处理。该项目只是简单地跟踪手机在太空中的加速度,不管它是如何(站着,侧身…)。我也是Android新手。 谢谢你的帮助! 多谢各位


编辑:我不需要手机的精确位置,只需要加速度。

加速度计是根据设备坐标系给出的。要根据地球坐标系表示加速度计,您需要找到从设备坐标系到地球坐标系的基础矩阵的变化。这就是
getRotationMatrix
方法中的
旋转矩阵。
因此,您必须注册
TYPE\u磁场
并过滤
TYPE\u加速计
值,或使用
TYPE\u重力
以获得
旋转矩阵
。一旦获得
旋转矩阵M
,就可以简单地将设备坐标系中的
加速计矢量
转换为地球坐标系

A_E = M * A_D
就是

A_E[0] = M[0] * A_D[0] + M[1] * A_D[1] + M[2] * A_D[2];
A_E[1] = M[3] * A_D[0] + M[4] * A_D[1] + M[5] * A_D[2];
A_E[0] = M[6] * A_D[0] + M[7] * A_D[1] + M[8] * A_D[2];

其中
A\u D
是传感器更改中返回的加速度计
我终于算出了!我结合了之前的两个答案,下面是代码:

  monSensorManager.getRotationMatrix(Rotate, I, gravity_values, mag_values); 
  float[] relativacc = new float[4];
  float[] inv = new float[16];
  relativacc[0]=lin_values[0];
  relativacc[1]=lin_values[1];
  relativacc[2]=lin_values[2];
  relativacc[3]=0;
  android.opengl.Matrix.invertM(inv, 0, Rotate, 0);
  android.opengl.Matrix.multiplyMV(earthAcc, 0, inv, 0, relativacc, 0);
1) 获取地球坐标中的电话单位矢量 2) 反转矩阵以获得电话坐标中的地球单位矢量 3) 将手机加速度乘以单位矢量,将手机坐标转换为地球坐标。
谢谢大家的帮助

“这些解决方案对我不起作用。”请解释:为什么?你会得到错误的结果吗?“该项目只是跟踪手机在太空中的位置”,这已经出现了无数次。你不能对加速度进行二次积分。你要么需要一个外部参考源(例如GPS),要么需要一些特定领域的假设(例如,脚在地上时不会移动)。嗨,这根本不起作用(结果可能完全是随机的),评论也是这样说的:“我测试了你的代码片段,得到的只是一个相当嘈杂的随机信号作为回报。”该项目并不是真的能够跟踪太空中的位置,而是至少能够获得地球参考中的加速度值。我很清楚,我不能通过双重积分值来获得位置。我想得到加速度值,不管手机的位置如何。恐怕我不明白。我没有发布任何代码片段,也没有任何评论在我的回答下说“我已经测试了你的代码片段,我得到的只是一个非常嘈杂的随机信号。”。传感器有什么问题。输入线性加速度?据我所知,你的问题正是你要找的。@Ali
传感器。输入线性加速度给我加速度,没有重力,但仍在手机坐标中。我需要有地球坐标系中的加速度值。这些图完美地解释了这一点:如果手机站着并向北移动,它给出的值与它在侧面时的值不一样,仍然向北移动。好的,我明白了。被接受的答案有什么问题?请不要说“它不起作用”,但要解释一下您(用代码)尝试了什么以及结果是什么。首先,感谢您的帮助。我不知道如何将这些矩阵相乘,因为我只能将4*4矩阵与
multiplyMM
相乘(我试图为加速度计值制作一个3*3矩阵),所以我有:
android.opengl.matrix.multiplyMM(earthAcc,0,accMatrix,0,Rotate,0)我也尝试了
multiplyMV(earthAcc,0,Rotate,0,acc_值,0)致命的异常:动画线程java.lang.IllegalArgumentException:length-offset
。矩阵都是3*3(accMatrix只是
x,0,0,0,y,0,0,0,z
。旋转矩阵被定义为一个数组,所以你只需要使用正则乘法。然后我得到
运算符*不能应用于float[],float[]
如果我写
earthAcc=acc\u值*旋转;
我仍然会得到非常随机的值。这是我写的:
monSensorManager.getRotationMatrix(旋转,I,重力值,磁值);earthAcc[0]=旋转[0]*acc\u值[0]+旋转[1]*acc\u值[1]+旋转[2]*acc\u值[2];earthAcc[1]=旋转[3]*acc\u值[0]+Rotate[4]*acc_值[1]+Rotate[5]*acc_值[2];earthAcc[2]=Rotate[6]*acc_值[0]+Rotate[7]*acc_值[1]+Rotate[8]*acc_值[2]
我每次都尝试不更新
getRotationMatrix
,但仍然是随机的。谢谢你的帮助,我真的需要它!加速度计会波动,我不知道你说的随机是什么意思。每次调用onSensorChanged时,你都必须计算旋转矩阵。即使你将设备仍放在ta上ble您仍然会看到波动,但值不应该有很大的不同,除非您有强烈的磁干扰。