Mein Algorithmus zur Berechnung der Position des Smartphone - GPS und Sensoren
Ich bin die Entwicklung einer android-Applikation zur Berechnung der position basiert auf Sensor-Daten
- Beschleunigungsmesser --> Berechnen Lineare Beschleunigung
- Magnetometer + Accelerometer --> Richtung der Bewegung
Die erste position wird mit GPS (Latitude + Longitude).
Basiert nun auf der Sensor die Messwerte, die ich brauche, um die Berechnung der neuen position des Smartphones:
Mein Algorithmus ist folgende - (Aber nicht die Berechnung der Genauen Position): Bitte helft mir es zu verbessern.
Hinweis: Mein Algorithmus Code ist in C# (ich bin senden von Sensor-Daten zum Server, Wo die Daten in der Datenbank gespeichert ist. Ich bin die Berechnung der position auf dem Server)
Alle DateTime-Objekte wurden berechnet unter Verwendung der Zeitstempel - Vom 01-01-1970
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 = Double.Parse(currentDirection);
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
//distanceTravelled = initialVelocity * timeTravelling + 0.5 * currentAcceleration * timeTravelling * timeTravelling;
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;
direction = Math.PI * direction / 180.0;
//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;
Dies ist das Ergebnis bekomme ich --> Handy wurde nicht bewegt. Wie Sie sehen können Geschwindigkeit ist 27.3263111114502 So, es ist etwas falsch in der Berechnung der Geschwindigkeit, aber ich weiß nicht, was
ANTWORT:
Fand ich eine Lösung zur Berechnung der position basiert auf Sensor: ich habe geschrieben, eine Antwort weiter unten.
Wenn Sie Hilfe benötigen, bitte einen Kommentar hinterlassen
dies ist Das Ergebnis im Vergleich zu GPS (Hinweis: GPS in Rot)
Beschleunigung ändert.
Identitäten wie s = ut + (1/2)^2 (von Punkt A zu Punkt B) kann nur angewendet werden, wenn die Beschleunigung konstant bleibt, bei 'ein' die ganze Zeit zwischen A und B.
Also, was ist zu tun, wenn sich die Beschleunigung verändert?
Wie wirkt sich die Beschleunigung ändern? Muss man diese Identität für kurze Intervalle der Zeit, Wann die Beschleunigung bleibt konstant auf einer bestimmten Ebene. Wenn die Beschleunigung ist stufenlos vergrößern/verkleinern mit einer rate, dann sind Sie bei der Eingabe der domain der Infinitesimalrechnung.
InformationsquelleAutor Dawood Awan | 2013-11-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie einige von Euch erwähnt, du hast die Gleichungen falsch, aber das ist nur ein Teil der Fehler.
Newton - D ' Alembert Physik für nicht-relativistische Geschwindigkeiten bestimmt dieses:
kann der sensor zu drehen, so Richtung angewendet werden müssen:
gx,gy,gz
ist die Globale Schwerkraft-Vektor (~9.81 m/s^2
auf der Erde)Y
- Achse nach oben zeigt, damit diegy=-9.81
und der rest sind0.0
Messen timings sind entscheidend,
Beschleunigungssensor überprüft werden müssen, so oft wie möglich (die zweite ist eine sehr lange Zeit). Ich empfehle nicht, verwenden Sie timer-Periode größer als 10 ms zu erhalten die Genauigkeit auch Zeit zu Zeit sollten Sie überschreiben berechnete position mit dem GPS-Wert. Kompass Richtung kann überprüft werden, weniger oft, aber mit der richtigen filtration
Kompass ist nicht richtig, die ganze Zeit
Kompass Werte gefiltert werden sollen für einige Spitzenwerte. Manchmal Las er schlechte Werte und kann auch ausgeschaltet werden durch Elektro-magnetischen Verschmutzung oder Metall-Umgebung. In diesem Fall wird die Richtung kontrolliert werden kann, die von GPS während der Bewegung und einige Korrekturen gemacht werden können. Zum Beispiel chech GPS jede minute und vergleichen die GPS-Richtung mit Kompass und, wenn es ständig von einigen Winkel dann hinzufügen oder subtrahieren.
warum einfache Berechnungen auf dem server ???
Hate on-line Verschwendung von traffic. Ja, Sie können log-Daten auf dem server (aber trotzdem finde ich die Datei auf dem Gerät besser sein wird) aber warum zum Teufel limit position-Funktionalität, die von internet-Verbindung ??? nicht zu schweigen von den Verzögerungen ...
[Edit 1] zusätzliche Hinweise
Bearbeitet den code oben ein wenig. Die Ausrichtung muss so präzise sein, wie es sein kann, zu minimieren kumulativen Fehler.
Gyros hätte besser sein als der Kompass (oder noch besser beide). Beschleunigung gefiltert werden sollen. Einige low-pass-Filterung sollte in Ordnung sein. Nach der Schwerkraft die Entfernung würde ich begrenzen ax,ay,az zu brauchbaren Werten und wegwerfen zu kleine Werte. Wenn in der Nähe der niedrigen Geschwindigkeit auch voll stoppen (wenn es nicht ein Zug oder Bewegung im Vakuum). Das sollte geringer die drift, sondern erhöhen auch andere Fehler, so dass ein Kompromiss gefunden werden zwischen Ihnen.
Add-Kalibrierung on-the-fly. Wenn gefiltert
acceleration = 9.81
oder sehr nah an ihm, dann ist das Gerät wahrscheinlich immer noch stehen (es sei denn, seine fliegende Maschine). Orientierung/Richtung kann korrigiert werden, indem die tatsächliche Schwerkraft-Richtung.ja und dt ist die Zeit zwischen 2 Iterationen = aktuelle Zeit - Letzte tatsächliche Zeit. egal, ob Ihre Messungen vor oder nach der iteration (keine äste vorhanden, aber ich lieber ihn zu Messen am Anfang der iteration)
Vielen Dank für die Hilfe. Wollt nur mal Fragen, warum muss ich hinzufügen der vorherigen Geschwindigkeit auf die neue Geschwindigkeit? vx+=ax*dt;
denn Sie Messen die Beschleunigung ist nur ... also die Geschwindigkeit ist integriert (über, hinaus) ... es ist nur Rechteck-Regel Vorder-integral-Berechnung
ja du hast Recht ... die Schwerkraft sollte herausgenommen werden, bevor die integration ohne gyros, es kann getan werden, aber seine schrecklich filtern und wirklich langsam
InformationsquelleAutor Spektre
Beschleunigungssensoren und gyros sind nicht geeignet für positions-Berechnung.
Nach einigen Sekunden der Fehler werden unglaublich hoch. (Ich mich kaum erinnern, dass die doppelte integration ist das problem).
Blick auf diese Google tech talk video über sensor fusioning,
er erklärt sehr ausführlich, warum dies nicht möglich ist.
InformationsquelleAutor AlexWien
Nach der Lösung die position, die ich berechnet über Sensoren, die würde ich gerne poste meinen code hier ein, falls jemand braucht in Zukunft:
Anmerkung: Dies wurde nur geprüft auf Samsung Galaxy S2 Handy und nur, wenn die person war zu Fuß mit dem Handy, es wurde nicht geprüft, wenn bewegliche, im Auto oder auf dem Fahrrad
Dies ist das Ergebnis bekam ich, als im Vergleich bei einem Vergleich mit GPS (Rote Linie GPS, Blau ist, ist die Position berechnet, mit Sensor)
Der code ist nicht sehr effizient, aber ich hoffe, dass mein Austausch in diesem code jemand helfen und zeigen Sie in die richtige Richtung.
Hatte ich zwei getrennte Klassen:
CustomSensorService
public class CalculatePosition {
public class CustomSensorService extends Service implements SensorEventListener{
}
EDIT:
Nicht in der Lage zu bekommen dasselbe Ergebnis. Hinzufügen Sie können Standort-listener-code auch?
InformationsquelleAutor Dawood Awan
Als pro unsere Diskussion, da Ihre Beschleunigung ist ständig ändern, die Gleichungen der Bewegung, die Sie angewendet haben, wird nicht geben Ihnen eine genaue Antwort.
Müssen Sie möglicherweise halten Sie die Aktualisierung Ihrer position und Geschwindigkeiten und wenn man eine neue Lektüre für die Beschleunigung.
Da wäre dies sehr ineffizient ist, wäre mein Vorschlag, rufen Sie die update-Funktion alle paar Sekunden, und verwenden Sie den Mittelwert der Beschleunigung während dieser Zeit, um die neue Geschwindigkeit und position.
InformationsquelleAutor Abhishek Bansal
Ich bin nicht ganz sicher, aber meine beste Vermutung wäre, um dieses Teil:
wenn sagen wir um die prevLocation die Geschwindigkeit wurde: 27.326... und t==0 und currentAcceleration ==0 (als Sie sagten, Sie waren im Leerlauf) die finalvelocity kommen würde, auf
Wenn die finalvelocity wird die Geschwindigkeit der currentlocation, so dass previouslocation = currentlocation. Dies würde bedeuten, dass Ihre finalvelocity kann nicht nach unten gehen. Aber dann wieder, es ist schon ein bisschen von Annahmen hier.
hast du es zur Arbeit?
Ich habe einige Sensor-Filter auf Android Ende. Post wird die Antwort, wenn ich es finde. Habe ich nehmen Sie Ihren Punkt zu beachten, über die Anfangsgeschwindigkeit
InformationsquelleAutor CuccoChaser
Scheint, wie Sie machen es schwer an sich selbst. Sie sollten in der Lage sein verwenden Sie einfach die Google-Play-Service-Location API und leicht zugänglichen Standort, Richtung, Geschwindigkeit, etc. genau.
Ich würde in mit, anstatt das zu tun Arbeit der server-Seite.
InformationsquelleAutor David