android - getOrientation 函数返回的音高错误
问题描述
旧Sensor.TYPE_ORIENTATION
传感器返回 -180° 和 180° 之间的俯仰角。这是一个不错的 API,它包含过滤功能并且效果很好。遗憾Sensor.TYPE_ORIENTATION
的是已被弃用,并且在现代手机上不可用。
有福的替代品Sensor.TYPE_ORIENTATION
是Context.SENSOR_SERVICE
andTYPE_MAGNETIC_FIELD
和 the SensorManager.getRotationMatrix()
andSensorManager.getOrientation()
功能的复杂组合。在过滤方面,您只能靠自己。(顺便说一句,我使用了iirj - 我在 Stackoverflow 上找到的琐碎的低通滤波器效果不如任何东西Sensor.TYPE_ORIENTATION
)
getOrientation的文档声称它返回 -π 到 π 之间的间距。这不可能是真的,因为实现是values[1] = (float) Math.asin(-R[7]);
(asin
返回 -π/2 和 π/2 之间的值)
有没有办法从旋转矩阵中获得完整的 360° 俯仰和滚动?
解决方案
这是Google 不会解决的已知问题。getOrientation
我根据Gregory G. Slabaugh 的论文创建了自己的函数
// Based on pseudo code from http://www.close-range.com/docs/Computing_Euler_angles_from_a_rotation_matrix.pdf
object EulerAngleHelper {
private const val R11 = 0
private const val R12 = 1
private const val R13 = 2
private const val R21 = 3
private const val R22 = 4
private const val R23 = 5
private const val R31 = 6
private const val R32 = 7
private const val R33 = 8
private const val AZIMUTH = 0
private const val PITCH = 1
private const val ROLL = 2
private const val PHI_Z = AZIMUTH
private const val PSI_X = PITCH
private const val THETA_Y = ROLL
fun getOrientation(r: DoubleArray, values: DoubleArray): DoubleArray {
when {
r[R31] < -0.98 -> {
values[PHI_Z] = 0.0 // Anything; can set to 0
values[THETA_Y] = Math.PI / 2
values[PSI_X] = values[PHI_Z] + atan2(r[R12], r[R13])
}
r[R31] > 0.98 -> {
values[PHI_Z] = 0.0 // Anything; can set to 0
values[THETA_Y] = -Math.PI / 2
values[PSI_X] = values[PHI_Z] + atan2(-r[R12], -r[R13])
}
else -> {
values[THETA_Y] = -asin(r[R31])
val cosTheta = cos(values[THETA_Y])
values[PSI_X] = atan2(r[R32] / cosTheta, r[R33] / cosTheta)
values[PHI_Z] = atan2(r[R21] / cosTheta, r[R11] / cosTheta)
}
}
return values
}
}
我只测试了俯仰和滚动。
推荐阅读
- powershell - 无法将哈希表作为函数参数传递
- python - 在 Mac OS Big Sur 上使用 pyenv 安装 python 3.6 时出现问题
- automation - 如何使用赛普拉斯在网站中查找损坏的链接?
- ruby-on-rails - Rails 脚手架黑色背景
- html - 如何使用此标题栏垂直对齐 CSS 中的文本
- html - 如何使用 flex 创建不同数量的列布局?
- .net - 签署由 jwt 和 tls 保护的分离 xml
- api - 如何获取包含过去日期的交通流量信息的路线信息?
- amazon-web-services - 使用 docker compose 在 Amazon ECS 上部署应用程序
- java - 是否可以在java中创建多个数据类型的数组如果可能,如何?