android 传感器.TYPE_ACCELEROMETER和传感器.TYPE_MAGNED_FIELD的读数在真实的器械上错误,但在模拟器上没有错误?

xmq68pz9  于 2023-03-06  发布在  Android
关注(0)|答案(1)|浏览(112)

我正在尝试从我的设备中读取方位角值。这是通过以下代码完成的:

val accelerometerReading = FloatArray(3)
val magnetometerReading = FloatArray(3)
val rotationMatrix = FloatArray(9)
val orientationAngles = FloatArray(3)
val sensorEventListener = object : SensorEventListener {
    override fun onSensorChanged(event: SensorEvent?) {
        if (event?.sensor?.type == Sensor.TYPE_ACCELEROMETER) {
            System.arraycopy(event.values, 0, accelerometerReading, 0, accelerometerReading.size)
        } else if (event?.sensor?.type == Sensor.TYPE_MAGNETIC_FIELD) {
            System.arraycopy(event.values, 0, magnetometerReading, 0, magnetometerReading.size)
        }

        // Update rotation matrix, which is needed to update orientation angles.
        SensorManager.getRotationMatrix(
            rotationMatrix,
            null,
            accelerometerReading,
            magnetometerReading
        )

        // "rotationMatrix" now has up-to-date information.
        SensorManager.getOrientation(rotationMatrix, orientationAngles)
        val azimuth = orientationAngles[0]
        val azimuth180Degrees = Math.toDegrees(azimuth.toDouble())
        val azimuth360Degrees = (azimuth180Degrees + 360) % 360
        Timber.d("azimuth $azimuth --- azimuth180Degrees $azimuth180Degrees --- azimuth360Degrees $azimuth360Degrees")
    }
}

为了检查方位角阅读是否正确,我做了一个测试,我把设备平放在table上。我开始慢慢地转动它,直到我做了一个完整的360度转弯。
测试并没有像预期的那样进行。我的方位角范围在1. 1到2. 2左右。我期望看到的值范围在-PI到PI之间。
经过两天的谷歌搜索,我还没有能够找到我的代码中的错误,所以我决定在模拟器上测试它。我做了一个新的测试,我旋转模拟器到y = 180,x = -90,我开始滑动z轴。这个测试返回的范围从-PI到PI。
为了进一步测试我的真实的设备,我打开了谷歌Map,下载了一些指南针应用程序,它们都显示了我当前的方向,所以我的设备中的硬件一定是按预期工作的。
我在一个点,我真的不知道如何让我的方位角工作的预期(全范围的-PI到PI),我有一个错误,在我的代码?我错过了什么?

0yg35tkg

0yg35tkg1#

你的代码对我来说很好用,但是我确实需要像这样挥动手机来校准传感器

否则,北方偏离了相当多,它认为南方是90度!我在谷歌Map上也得到了同样的东西(他们曾经显示这个图表,让你校准指南针)和手机上的指南针应用程序也。
这些传感器可能不可靠(这也取决于设备),而且应用程序通常会使用一些技术来保持显示的一致性,例如,导航应用程序可以通过GPS上你的移动来确定你所面对的方向,或者通过你所处道路的方向来确定你所面对的方向。忽略小的变化来保持平稳。实际上,原始的传感器数据是非常嘈杂和不一致的!当然,除非是在模拟器上,在那里它可以是不现实的完美。(顺便说一句,你的方向应该都在零,以模拟一个平面设备,平行于地面,顶部朝北)
我不知道您的设备是否存在特殊问题(或者这是否解释了问题的原因),但我会检查您是否发现了这些校准问题,并与其他应用程序进行比较,注意不要抬起设备,避免太靠近有磁场的设备等

相关问题