获取手机的 z 轴和磁北极(而不是 y 轴)之间的角度

Posted

技术标签:

【中文标题】获取手机的 z 轴和磁北极(而不是 y 轴)之间的角度【英文标题】:Get angle between phone's z axis and the magnetic north pole (instead of y axis) 【发布时间】:2021-12-06 03:34:34 【问题描述】:

我知道如何使用 getOrientation 方法获取手机 y 轴和磁北之间的方向角(如此处所述https://developer.android.com/guide/topics/sensors/sensors_position)。 但是,我需要手机的 z 轴和磁北之间的方向,以便获得手机摄像头的方向。我已经尝试编写自己的代码来从 y 轴和磁北之间的角度计算这个角度,但它给了我不可靠的数据,即使使用重力传感器数据进行了校正(例如当手机被翻转时)。

有没有办法直接得到z轴与磁北的夹角?

【问题讨论】:

【参考方案1】:

以this question 为基础,我建议这样做:

    private val rotationMatrix = FloatArray(9)

    override fun onSensorChanged(event: SensorEvent) 
        if (event.sensor.type != Sensor.TYPE_ROTATION_VECTOR) return
        SensorManager.getRotationMatrixFromVector(rotationMatrix, event.values)
        val azimuth = atan2(-rotationMatrix[2], -rotationMatrix[5])
        ... use azimuth ...
    

推理:

(rotationMatrix[2], rotationMatrix[5]) 描述了手机的 z 向量在地球水平面上的投影,以(东、北)坐标表示。你需要与北轴的角度,所以北方向是你的x,东方向是yatan2 采用(y, x) 顺序中的参数,这就是为什么我将索引2 放在第一位,然后是5。z 向量指向手机的正面,但我假设你想要手机背面的方向,主摄像头在哪里。这就是我放减号的原因。

【讨论】:

太棒了,非常感谢。像梦一样工作!

以上是关于获取手机的 z 轴和磁北极(而不是 y 轴)之间的角度的主要内容,如果未能解决你的问题,请参考以下文章

如何获取echarts点击点的X轴和Y轴值

如何获取echarts点击点的X轴和Y轴值

如何获取echarts点击点的X轴和Y轴值

在 PyOpenGL 中切换 Y 轴和 Z 轴

如何设置 highcharts X轴和Y轴值

Transform 详细讲解