【问题标题】:Should i use Accelerometer or Gyroscope to measure angle of the z-axis我应该使用加速度计还是陀螺仪来测量 z 轴的角度
【发布时间】:2013-06-11 18:27:51
【问题描述】:

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

【问题讨论】:

  • 不熟悉,陀螺仪是2轴还是3轴?
  • 你想要后置摄像头相对于磁北的角度还是相对于地球表面的角度?
  • 比如说你在海上,我需要能够测量地平线和正上方星星之间的角度。例如使用六分仪测量高度 i> 一颗星星

标签: java android accelerometer sensors gyroscope


【解决方案1】:

您应该使用加速度计。

这个想法如下,在静态相机中,作用在相机上的唯一力(由加速度计看到)是重力。这应该能够告诉你哪个方向是“向下”。然后你需要做的是计算相机所面对的方向(这是一个常数,取决于你的加速度计的方向)和重力方向之间的角度。

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

因为根据定义,(真)水平线是向下 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]) 
    

    【讨论】:

      【解决方案3】:

      如果已知相机是静态的,则可以使用重力这必须通过应用程序实现,因为有水平仪应用程序可以做到这一点。 上面的Cedric Garcias answerHoan Nguyens answer 对此进行了更详细的解释。

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

      【讨论】:

      • 是的,如果是这样,我怎么知道相机是否与地面平行?
      • 这样做意味着我必须经常跟踪角度的变化,我认为这对性能不利,我想知道是否有任何传感器始终知道它的位置而不是根据最后一个位置计算它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多