|
|
|
@ -37,11 +37,17 @@ void MotionInput::SetGyroscope(const Common::Vec3f& gyroscope) { |
|
|
|
gyro.y = std::clamp(gyro.y, -GyroMaxValue, GyroMaxValue); |
|
|
|
gyro.z = std::clamp(gyro.z, -GyroMaxValue, GyroMaxValue); |
|
|
|
|
|
|
|
// Auto adjust drift to minimize drift
|
|
|
|
// Auto adjust gyro_bias to minimize drift
|
|
|
|
if (!IsMoving(IsAtRestRelaxed)) { |
|
|
|
gyro_bias = (gyro_bias * 0.9999f) + (gyroscope * 0.0001f); |
|
|
|
} |
|
|
|
|
|
|
|
// Adjust drift when calibration mode is enabled
|
|
|
|
if (calibration_mode) { |
|
|
|
gyro_bias = (gyro_bias * 0.99f) + (gyroscope * 0.01f); |
|
|
|
StopCalibration(); |
|
|
|
} |
|
|
|
|
|
|
|
if (gyro.Length() < gyro_threshold * user_gyro_threshold) { |
|
|
|
gyro = {}; |
|
|
|
} else { |
|
|
|
@ -107,6 +113,19 @@ void MotionInput::UpdateRotation(u64 elapsed_time) { |
|
|
|
rotations += gyro * sample_period; |
|
|
|
} |
|
|
|
|
|
|
|
void MotionInput::Calibrate() { |
|
|
|
calibration_mode = true; |
|
|
|
calibration_counter = 0; |
|
|
|
} |
|
|
|
|
|
|
|
void MotionInput::StopCalibration() { |
|
|
|
if (calibration_counter++ > CalibrationSamples) { |
|
|
|
calibration_mode = false; |
|
|
|
ResetQuaternion(); |
|
|
|
ResetRotations(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Based on Madgwick's implementation of Mayhony's AHRS algorithm.
|
|
|
|
// https://github.com/xioTechnologies/Open-Source-AHRS-With-x-IMU/blob/master/x-IMU%20IMU%20and%20AHRS%20Algorithms/x-IMU%20IMU%20and%20AHRS%20Algorithms/AHRS/MahonyAHRS.cs
|
|
|
|
void MotionInput::UpdateOrientation(u64 elapsed_time) { |
|
|
|
|