import 'dart:async'; import 'dart:math'; import 'package:get/get.dart'; import 'package:sensor/sensor.dart'; import '../logger.dart'; import 'package:simple_kalman/simple_kalman.dart'; class Compass extends GetxController with GetSingleTickerProviderStateMixin { @override void onClose() { super.onClose(); compassListener?.cancel(); } final _tmp = []; double? _lastAngle; var _angle = 0.0; final kalman = SimpleKalman(errorMeasure: 256, errorEstimate: 150, q: 0.9); Compass() { compassListener = Sensor.orientationStream.listen((event) { final direction = event.z; var nowAngle = -direction * 180 / pi; var lastAngle = _lastAngle; if(lastAngle != null){ _lastAngle = nowAngle; if(nowAngle - lastAngle >180){ lastAngle += 360; } if(nowAngle - lastAngle < -180){ lastAngle -=360; } var da = nowAngle - lastAngle; _angle += da; _tmp.add(_angle); if(_tmp.length>50){ _tmp.removeAt(0); } angle.value = kalman.filtered(_angle) ; }else{ for(var i = 0; i< 9; i++){ kalman.filtered(nowAngle); } _angle = kalman.filtered(nowAngle); _lastAngle = _angle; } }); info('指南针初始化成功'); } final angle = 0.0.obs; StreamSubscription? compassListener; }