compass_updater.dart 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import 'dart:math';
  2. import 'package:simple_kalman/simple_kalman.dart';
  3. class CompassUpdater {
  4. double? _lastAngle;
  5. var _angle = 0.0;
  6. final _kalman = SimpleKalman(errorMeasure: 256, errorEstimate: 150, q: 0.9);
  7. double angleDis(double lastAngle, double nowAngle){
  8. var tmp = lastAngle;
  9. var lastDis = nowAngle - tmp;
  10. while(true){
  11. tmp += 360;
  12. var dis = nowAngle - tmp;
  13. if(lastDis.abs() < dis.abs()){
  14. break;
  15. }
  16. lastDis = dis;
  17. lastAngle=tmp;
  18. }
  19. tmp = lastAngle;
  20. lastDis = nowAngle - tmp;
  21. while(true){
  22. tmp -= 360;
  23. var dis = nowAngle - tmp;
  24. if(lastDis.abs() < dis.abs()){
  25. break;
  26. }
  27. lastDis = dis;
  28. lastAngle=tmp;
  29. }
  30. return nowAngle - lastAngle;
  31. }
  32. double? updateRadians(double direction){
  33. var nowAngle = direction * 180 / pi;
  34. var lastAngle = _lastAngle;
  35. if (lastAngle != null) {
  36. _lastAngle = nowAngle;
  37. var da = angleDis(lastAngle, nowAngle);
  38. _angle += da;
  39. return _kalman.filtered(_angle) * pi / 180.0;
  40. } else {
  41. _angle = nowAngle;
  42. _lastAngle = nowAngle;
  43. for(var i =0; i< 50; i++){
  44. _kalman.filtered(_angle);
  45. }
  46. return null;
  47. }
  48. }
  49. }