compass.dart 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import 'dart:async';
  2. import 'dart:math';
  3. import 'package:get/get.dart';
  4. import 'package:sensor/sensor.dart';
  5. import '../logger.dart';
  6. import 'package:simple_kalman/simple_kalman.dart';
  7. class Compass extends GetxController with GetSingleTickerProviderStateMixin {
  8. @override
  9. void onClose() {
  10. super.onClose();
  11. compassListener?.cancel();
  12. }
  13. final _tmp = <double>[];
  14. double? _lastAngle;
  15. var _angle = 0.0;
  16. final kalman = SimpleKalman(errorMeasure: 256, errorEstimate: 150, q: 0.9);
  17. Compass() {
  18. compassListener = Sensor.orientationStream.listen((event) {
  19. final direction = event.z;
  20. var nowAngle = -direction * 180 / pi;
  21. var lastAngle = _lastAngle;
  22. if(lastAngle != null){
  23. _lastAngle = nowAngle;
  24. if(nowAngle - lastAngle >180){
  25. lastAngle += 360;
  26. }
  27. if(nowAngle - lastAngle < -180){
  28. lastAngle -=360;
  29. }
  30. var da = nowAngle - lastAngle;
  31. _angle += da;
  32. _tmp.add(_angle);
  33. if(_tmp.length>50){
  34. _tmp.removeAt(0);
  35. }
  36. angle.value = kalman.filtered(_angle) ;
  37. }else{
  38. for(var i = 0; i< 9; i++){
  39. kalman.filtered(nowAngle);
  40. }
  41. _angle = kalman.filtered(nowAngle);
  42. _lastAngle = _angle;
  43. }
  44. });
  45. info('指南针初始化成功');
  46. }
  47. final angle = 0.0.obs;
  48. StreamSubscription<Orientation>? compassListener;
  49. }