我应该使用加速度计还是陀螺仪来测量Z轴角度?

3

我正在开发一款安卓应用程序,需要知道后置摄像头相对于地平线的角度,而不是相对于上一次位置的角度。所有我所阅读的指南针和加速度计的定义都没有提到我是否能够做到这一点。是否有可能实现这个功能?


我不熟悉,陀螺仪有2轴还是3轴? - noMAD
你想要后置摄像头相对于磁北极的角度还是相对于地球表面的角度? - Hoan Nguyen
举个例子,假设你在海上,我需要能够直接测量地平线和正上方的星星之间的角度。例如使用六分仪来测量星星的高度。 - FutureSci
3个回答

3

你应该使用加速度计。

思路如下,在静态相机中,唯一作用于相机的力(被加速度计看到)是重力。这应该能够给出哪个方向是“向下”的。然后您需要做的是计算相机面对的方向(这是一个常数,取决于您的加速度计定位的方向)和重力方向之间的角度。

两个向量的点积(http://en.wikipedia.org/wiki/Dot_product)应该给出向量的余弦值(如果两个向量是单位向量),然后使用反余弦函数,您应该能够得到以弧度表示的角度。

由于根据定义,(真正的)地平线距离向下90º(弧度为pi/2),因此您应该从点积的结果中减去pi/2,结果应该在-pi/2和+pi/2之间。

结果为-x意味着相机面朝“向下”并与地平线成x度角。结果为+x意味着相机面朝“向上”并与地平线成x度角。


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

0

如果相机被认为是静态的,那么可以使用重力 并且这应该可以通过应用程序实现,因为有精神水平应用程序可以做到这一点。Cedric Garcia的回答(链接1)和Hoan Nguyen的回答(链接2)更详细地解释了这一点。

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


是的,如果是这样,我怎么知道相机是否面向地面平行? - FutureSci
这样做意味着我不断地跟踪角度的变化,我预计这对性能来说是不利的。我想知道是否有任何传感器始终知道它的位置,而不是基于上一个位置进行计算。 - FutureSci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接