Android 如何获取设备相对于世界的orientation 实现类似Google Maps的罗盘功能
实现世界坐标系设备朝向获取的方案
仅靠加速度传感器无法获取到相对于世界坐标系的方位角,这类传感器只能输出设备自身的俯仰、滚转参数,要得到类似Google Maps的朝向数据,你需要使用Android系统的复合传感器或者同时结合加速度、地磁传感器做计算,具体实现方式如下:
方案一:使用旋转矢量传感器(推荐,Google Maps采用该方案)
旋转矢量传感器是系统自带的融合传感器,会自动结合加速度计、地磁计、陀螺仪的输出做滤波校准,精度更高、漂移更小,不需要自己实现复杂的传感器融合算法。
具体实现步骤:
- 获取系统传感器管理器实例
val sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager - 获取旋转矢量传感器实例
val rotationSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR) - 注册传感器事件监听器,在
onSensorChanged回调中处理数据:- 先将传感器返回的旋转矢量转换为旋转矩阵
val rotationMatrix = FloatArray(9) SensorManager.getRotationMatrixFromVector(rotationMatrix, event.values)- 将旋转矩阵转换为朝向参数数组
val orientationArr = FloatArray(3) SensorManager.getOrientation(rotationMatrix, orientationArr) - 最终你需要的朝向值为
orientationArr[0],该值单位为弧度,转角度可调用Math.toDegrees(orientationArr[0]),范围是-180°~180°:0°代表指向地磁北,90°指向东,-90°指向西,±180°指向南。
方案二:自行组合加速度计+地磁计计算
如果你需要自定义传感器融合逻辑,可以采用该方案:
- 分别注册加速度传感器、地磁传感器的监听,实时保存两类传感器的输出数据
gravityValues、magneticValues - 调用系统接口生成旋转矩阵:
SensorManager.getRotationMatrix(rotationMatrix, null, gravityValues, magneticValues) - 后续和方案一相同,调用
getOrientation接口即可得到朝向参数
注意事项
- Android 6.0及以上版本需要申请
ACCESS_FINE_LOCATION权限才能正常获取地磁朝向数据,否则返回的角度值无效 - 地磁传感器容易受周边电子设备干扰,可在应用中提示用户按8字轨迹晃动设备校准传感器,减少角度漂移
- 如果需要指向真北而非地磁北,可结合当前定位的地磁偏角参数对得到的方位角做修正

内容的提问来源于stack exchange,提问作者Ziv Sion
相关产品推荐
相关产品推荐

