我应该使用加速度计或陀螺仪来测量z轴的角度

时间:2013-06-11 18:27:51

标签: java android accelerometer sensor gyroscope

我正在Android中编写一个应用程序,需要知道后置摄像头相对于地平线指向的角度,而不是相对于它的最后位置。我已经为罗盘和加速度计读取的所有定义都没有说我能做到这一点。是否可以这样做?

3 个答案:

答案 0 :(得分:3)

您应该使用Accelerometer。

这个想法如下,在静态相机中,作用在相机上的唯一力(加速度计可见)是重力。这应该可以给你哪个方向“向下”。你需要做的是计算摄像机所朝向的方向(这是一个常数,取决于你的加速度计的方向)和重力方向之间的角度。

两个向量的点积(http://en.wikipedia.org/wiki/Dot_product)应该给出向量的余弦(如果两个向量是单位向量),那么使用arccos你应该能够以弧度为单位获得角度。 / p>

根据定义,(true)视界从下降到90º(pi / 2弧度),你应该从点积的结果中减去pi / 2,结果应该在-pi / 2和+ pi /之间2。

-x的结果表示相机正面向“向下”并与地平线成x角。 + x表示摄像机朝向“向上”并与地平线成x角。

答案 1 :(得分:2)

您想要计算的是屏幕表面与地球表面之间的角度(局部平坦)。这可以使用TYPE_GRAVITY或TYPE_ACCELEROMETER(不太准确)来计算。角度只是地球表面法线与屏幕法线之间的角度(z值)

angle = (float) Math.acos(normalize z value);

其中

normalize z value = event.values[2] / Math.sqrt(event.values[0] * event.values[0] + event.values[1] * event.values[1] + event.values[2] * event.values[2]) 

答案 2 :(得分:0)

如果已知摄像机是静态的,则可以使用重力,这必须可以通过应用程序实现,因为有精神级应用程序执行此操作。 上面Cedric Garcias answerHoan Nguyens answer更详细地解释了这一点。

如果另一方面相机可能正在移动,那么我认为你必须跟踪所有的动作(使用陀螺仪)并将它们从相机固定的时间点整合到当前时间。这可能非常具有挑战性。