Maison >développement back-end >C++ >Comment cet algorithme calcule-t-il avec précision la position du smartphone à l'aide des données des capteurs et du GPS ?

Comment cet algorithme calcule-t-il avec précision la position du smartphone à l'aide des données des capteurs et du GPS ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-03 14:16:40260parcourir

How Does This Algorithm Accurately Calculate Smartphone Position Using Sensor Data and GPS?

Mon algorithme pour calculer la position du smartphone - Algorithme intégré basé sur les données des capteurs et le GPS

Résoudre le problème de l'algorithme :

L'algorithme fourni ne calcule pas correctement la vitesse finale (vitesse) de l'appareil. Pour corriger cette erreur, la formule suivante doit être utilisée :

finalvelocity = initialVelocity + Double.Parse(currentAcceleration) * (t);

Algorithme révisé :

L'algorithme révisé intègre le calcul de vitesse corrigé et des améliorations supplémentaires pour garantir une précision estimation de la position :

var prevLocation = ServerHandler.getLatestPosition(IMEI);
var newLocation = new ReceivedDataDTO()
{
    LocationDataDto = new LocationDataDTO(),
    UsersDto = new UsersDTO(),
    DeviceDto = new DeviceDTO(),
    SensorDataDto = new SensorDataDTO()
};

//First Reading
if (prevLocation.Latitude == null)
{
    //Save GPS Readings
    newLocation.LocationDataDto.DeviceId = ServerHandler.GetDeviceIdByIMEI(IMEI);
    newLocation.LocationDataDto.Latitude = Latitude;
    newLocation.LocationDataDto.Longitude = Longitude;
    newLocation.LocationDataDto.Acceleration = float.Parse(currentAcceleration);
    newLocation.LocationDataDto.Direction = float.Parse(currentDirection);
    newLocation.LocationDataDto.Speed = (float) 0.0;
    newLocation.LocationDataDto.ReadingDateTime = date;
    newLocation.DeviceDto.IMEI = IMEI;

    // saving to database
    ServerHandler.SaveReceivedData(newLocation);
    return;
}

//If Previous Position not NULL --> Calculate New Position

**//Algorithm Starts HERE**

var oldLatitude = Double.Parse(prevLocation.Latitude);
var oldLongitude = Double.Parse(prevLocation.Longitude);
var direction = Math.PI * Double.Parse(currentDirection) / 180.0;
Double initialVelocity = prevLocation.Speed;

//Get Current Time to calculate time Travelling - In seconds
var secondsTravelling = date - tripStartTime;
var t = secondsTravelling.TotalSeconds;

//Calculate Distance using physice formula, s= Vi * t + 0.5 *  a * t^2
var distanceTravelled = initialVelocity * t + 0.5 * Double.Parse(currentAcceleration) * t * t;

//Calculate the Final Velocity/ Speed of the device.
// this Final Velocity is the Initil Velocity of the next reading
//Physics Formula: Vf = Vi + a * t
var finalvelocity = initialVelocity + Double.Parse(currentAcceleration) * (t);

//Convert from Degree to Radians (For Formula)
oldLatitude = Math.PI * oldLatitude / 180;
oldLongitude = Math.PI * oldLongitude / 180;

//Calculate the New Longitude and Latitude
var newLatitude = Math.Asin(Math.Sin(oldLatitude) * Math.Cos(distanceTravelled / earthRadius) + Math.Cos(oldLatitude) * Math.Sin(distanceTravelled / earthRadius) * Math.Cos(direction));
var newLongitude = oldLongitude + Math.Atan2(Math.Sin(direction) * Math.Sin(distanceTravelled / earthRadius) * Math.Cos(oldLatitude), Math.Cos(distanceTravelled / earthRadius) - Math.Sin(oldLatitude) * Math.Sin(newLatitude));

//Convert From Radian to degree/Decimal
newLatitude = 180 * newLatitude / Math.PI;
newLongitude = 180 * newLongitude / Math.PI;

Incorporation des données du capteur Intégration :

Cet algorithme utilise à la fois les données de l'accéléromètre et du magnétomètre pour calculer la direction du mouvement. Les étapes suivantes décrivent le processus :

  1. Accélération linéaire : Utilisez l'accéléromètre pour calculer l'accélération linéaire sur les axes x, y et z.
  2. Direction du mouvement : Combinez les lectures de l'accéléromètre avec les lectures du magnétomètre pour déterminer la direction du mouvement. mouvement.
  3. Vitesse et distance : Intégrez l'accélération par rapport au temps pour obtenir la vitesse. Calculez la distance en utilisant la vitesse et l'intervalle de temps.
  4. Position finale : Mettez à jour la position actuelle en utilisant la distance et la direction calculées.

Considérations supplémentaires :

  1. Calibrage : Calibrez périodiquement les capteurs pour garantir précision.
  2. Filtrage : Implémentez des filtres de bruit et de dérive pour améliorer la qualité des données.
  3. Synchronisation de l'heure : Assurer une synchronisation temporelle précise entre les capteurs et le l'horloge de l'appareil.
  4. Mises à jour régulières du GPS : Corrigez périodiquement l'estimation de la position à l'aide du GPS mises à jour.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn