Я пытаюсь повернуть значок (маркер) на карте, как компас.Я использую датчик акселерометра, чтобы установить угол наклона телефона, но результат будет неточным даже после нормализации значений оси XYZ и преобразования из радиуса в угол.Как мне сделать это вращение?
В ionic 3 я использую плагин «cordova-plugin-device-motion»: «^ 2.0.1», чтобы получить значения осей и затем сгенерировать векторную нормализацию.После нормализации вектора я могу получить угол наклона устройства от оси Z, но не могу получить вращение оси XY.
- Угол наклона оси Z
let inclination: number = Math.round(this.toDegrees(Math.acos(this.sensor.acc.z)));
Угол поворота вокруг осей XY
let rotation: number = Math.round(this.toDegrees(Math.atan2(this.sensor.acc.y, this.sensor.acc.x)));
import { firebaseConfig } from './../../app/app.module';
import { TaxiDriverServiceProvider } from '../../providers/taxi-driver-service/taxi-driver-service';
import { Injectable, NgZone } from '@angular/core';
import { Subscription, Observable, Subject } from 'rxjs';
import 'rxjs/add/operator/filter';
import { Device } from '@ionic-native/device';
import { Gyroscope, GyroscopeOptions, GyroscopeOrientation } from '@ionic-native/gyroscope';
import { DeviceMotion, DeviceMotionAccelerationData } from '@ionic-native/device-motion';
import { Geolocation, Geoposition, GeolocationOptions } from '@ionic-native/geolocation';
import * as firebase from 'firebase';
import { Platform, Events } from 'ionic-angular';
const KEY_DEVICE_UUID = 'key_device_ref';
const PATH_REFERENCE = 'db_realtime/';
interface Sensor {
orient: { x: number, y: number, z: number; timestamp?: number; },
acc: { x: number, y: number, z: number; timestamp?: number; },
angle: number
}
@Injectable()
export class LocationTrackingProvider {
ref: any;
geolocationSb: Subscription;
accelerometerSb: Subscription;
watch: Observable<Geoposition>;
lat: number = 0;
lng: number = 0;
sensor: Sensor = {} as Sensor;
// Foreground Trackin
geolocationOptions: GeolocationOptions = {
// frequency: 3000,
enableHighAccuracy: true
};
gyroscopeListener: Subject<any> = new Subject();
constructor(
private events: Events,
public deviceMotion: DeviceMotion,
public zone: NgZone,
public geolocation: Geolocation,
public platform: Platform,
public device: Device) {
firebase.initializeApp(firebaseConfig);
this.ref = firebase.database().ref(PATH_REFERENCE);
}
accelerometerStart() {
this.deviceMotion.getCurrentAcceleration().then(
(acceleration: DeviceMotionAccelerationData) => console.log(JSON.stringify(acceleration))
);
this.accelerometerSb = this.deviceMotion.watchAcceleration()
.subscribe((acceleration: DeviceMotionAccelerationData) => {
let normOfg: number = Math.sqrt(
acceleration.x * acceleration.x +
acceleration.y * acceleration.y +
acceleration.z * acceleration.z
);
// Normalize the accelerometer vector
this.sensor.acc = {
x: acceleration.x / normOfg,
y: acceleration.y / normOfg,
z: acceleration.z / normOfg
};
let inclination: number = Math.round(this.toDegrees(Math.acos(this.sensor.acc.z)));
let rotation: number = Math.round(this.toDegrees(Math.atan2(this.sensor.acc.y, this.sensor.acc.x)));
console.log(`normalize: ${normOfg} rot1:${rotation} inc:${inclination}`);
this.events.publish("maps:compass", { angle: rotation });
if (inclination < 25 || inclination > 155) {
}
});
}
toDegrees(radians): number {
return radians * (180 / Math.PI);
}
}
Независимо от угла наклона оси Z мне нужно вращение устройства в этом XYплоскость, следующее изображение:
https://i.stack.imgur.com/gbzQG.png