| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- 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>[];
- 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<Orientation>? compassListener;
- }
|