updateValues method
void
updateValues()
This method should be called repeatedly with a high frequency to get accurate values.
Implementation
void updateValues() {
if (_lastUpdateTime == 0) {
_lastUpdateTime = DateTime.now().millisecondsSinceEpoch;
}
// Accelerometer
var accelerations = readScaledAccelerometerValues();
_accelAccelerationX = accelerations[0];
_accelAccelerationY = accelerations[1];
_accelAccelerationZ = accelerations[2];
_accelAngleX = _getAccelXAngle(
_accelAccelerationX, _accelAccelerationY, _accelAccelerationZ);
_accelAngleY = _getAccelYAngle(
_accelAccelerationX, _accelAccelerationY, _accelAccelerationZ);
_accelAngleZ = _getAccelZAngle();
// Gyroscope
var angularSpeeds = readScaledGyroscopeValues();
_gyroAngularSpeedX = angularSpeeds[0] - _gyroAngularSpeedOffsetX;
_gyroAngularSpeedY = angularSpeeds[1] - _gyroAngularSpeedOffsetY;
_gyroAngularSpeedZ = angularSpeeds[2] - _gyroAngularSpeedOffsetZ;
// angular speed * time = angle
var dt = (DateTime.now().millisecondsSinceEpoch - _lastUpdateTime).abs() /
1000.0; // s
var deltaGyroAngleX = _gyroAngularSpeedX * dt;
var deltaGyroAngleY = _gyroAngularSpeedY * dt;
var deltaGyroAngleZ = _gyroAngularSpeedZ * dt;
_lastUpdateTime = DateTime.now().millisecondsSinceEpoch;
_gyroAngleX += deltaGyroAngleX;
_gyroAngleY += deltaGyroAngleY;
_gyroAngleZ += deltaGyroAngleZ;
// Complementary Filter
var alpha = 0.96;
_filteredAngleX = alpha * (_filteredAngleX + deltaGyroAngleX) +
(1.0 - alpha) * _accelAngleX;
_filteredAngleY = alpha * (_filteredAngleY + deltaGyroAngleY) +
(1.0 - alpha) * _accelAngleY;
_filteredAngleZ = _filteredAngleZ + deltaGyroAngleZ;
}