Mahony

com.roumai.myodecoder.core.Mahony

Overview

Mahony 是一个算法实现类,用于将 IMU 传感器的原始数据转换为姿态角。

用户需要将传感器获取到的 IMU 数据实时传入 Mahonyupdate 方法(比如在 IO 线程中更新数据), 然后通过调用如 angleInEarth velocityInEarth positionInEarth 方法在适当的地方(比如 Main 线程)获取当前姿态角度。

Functions

#update/4

将 IMU 数据更新至算法输入,辅助计算最终的姿态角度。

参数类型描述
gyroPoint陀螺仪数据
accelPoint加速度计数据
magPoint磁力计数据
deltaTimeDouble更新时间间隔(秒)
返回值类型描述
Quaternion旋转四元数
val mahony = Mahony()
val gyro = Point(0.0, 0.0, 0.0)
val accel = Point(0.0, 0.0, 0.0)
val mag = Point(0.0, 0.0, 0.0)
val deltaTime = 0.0
val quaternion = mahony.update(gyro, accel, mag, deltaTime)
// quaternion 可以不做处理,如果有需要可以自行设计算法时使用

#angleInEarth/0

获取当前姿态角度(对大地坐标系)。

返回值类型描述
Point姿态角度(Pitch, Roll, Yaw)
val angle = mahony.angleInEarth()
Log.i(TAG, "Pitch: ${angle.x}, Roll: ${angle.y}, Yaw: ${angle.z}")

#velocityInEarth/0

获取当前姿态速度(对大地坐标系,笛卡尔坐标)。

返回值类型描述
Point姿态速度(X, Y, Z)
val velocity = mahony.velocityInEarth()
Log.i(TAG, "Velocity: ${velocity.x}, ${velocity.y}, ${velocity.z}")

#positionInEarth/0

获取当前姿态位置(对大地坐标系,笛卡尔坐标)。

返回值类型描述
Point姿态位置(X, Y, Z)
val position = mahony.positionInEarth()
Log.i(TAG, "Position: ${position.x}, ${position.y}, ${position.z}")

FAQ

Q: 如何根据磁力计数据获取指南针方向?

A: Mahony 类里面并未实现该函数,因为通过磁力计换算成罗盘模式其实有比较简单的实现方法,可以参考以下代码:

val mag = Point(...) // 磁力计读取到的数值
val angle = atan2(mag.x, mag.y) * 180 / Math.PI
Log.i(TAG, "Compass: ${angle}˚")