Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Kompass mit Android (https://www.delphipraxis.net/178048-kompass-mit-android.html)

Ralphi 13. Dez 2013 17:51

Kompass mit Android
 
Hallo,

ich versuche bisher vergeblich herauszufinden wie eine Kompassfunktion realisiert werden kann.

Bei den Demo-Apps gibt es für Compass3D nur HeadingX, -Y, -Z Bei Bewegung sieht es von Änderung und Wertebereich nicht so aus als gäbe es einen Bezug zur Himmelsrichtung.
Habe auch keine Erklärung zu den Unterschieden zwischen Heading- und Tilt-Werten der Sensoren gefunden.

Eigentlich müsste die Himmelsrichtung ja in TrueHeading des GPS-Sensors stehen, aber da kommt nur NAN obwohl Latitude und Longitude korrekt da sind.

Das Handy mit dem ich es versuche ist ein Samsung S3, Kompass-Apps funktionieren.

Weiss jemand wie man an die Himmelsrichtung kommt?
Gegoogelt habe ich schon erfolglos. In den Demo-Apps gibt es auch leider keinen Hinweis auf Kompassfunktionen mit Himmelsrichtung.

Wäre dankbar wenn jemand da entsprechende Hinweise hätte.

Gruss
Ralphi

hathor 13. Dez 2013 18:33

AW: Kompass mit Android
 
Leider willst Du etwas für ANDROID...
Etwas anderes als ein Beschleunigungschip ist da aber auch nicht drin.

Softwaremäßig kann ich Dir da nicht helfen, obwohl ich mit einem entsprechenden Chip (MEMS Sensor) in Delphi schon mal eine Joystick-Funktion für eine PC-Steuerung programmiert habe.
Siehe:
http://www.codemercs.com/index.php?id=405&L=0
http://www.codemercs.com/index.php?id=42&L=0

Physik:
http://de.wikipedia.org/wiki/Roll-Nick-Gier-Winkel

Software (auch von unserem Robert Marquardt!->29.12.2007<-)
http://www.codemercs.com/index.php?id=170&L=0

himitsu 13. Dez 2013 18:49

AW: Kompass mit Android
 
Zitat:

Etwas anderes als ein Beschleunigungschip ist da aber auch nicht drin.
Das stimmt so nicht.

Aber es kommt auch auf das Modell/Hersteller an, was der nun genau eingebaut hat.

Bei mir ist praktisch fast alles drin, nur Luftdruck/Höhe, Luftfeuchtigkeit und scheinbar auch Temperatur wurde weggelassen (beim S4 Mini DUOS, gegenüber dem normalen S4 Mini).




Im Prinzip gibt es sozusagen 2-3 Varianten dieses Sensors, bzw. Einiges kommt vom selben Sensor und ist nur anders aufbereitet.

- Schwergraft/Gravity inkl. Beschleunigung/Accelerometer, welcher quasi nach unten zeigt (bei stillstand, ansonsten ist da auch noch die Beschleunigung mit drin)
> wenn flach, dann X und Y nahezu 0 und Z ist 9,8 (Erdanziehung)

- lineare Beschleunigung / Linear Acceleration = reine Beschleunigungskräfte
> im Stillstand und bei gleichmäßiger Bewegun ist alles nahezu 0 und ansonsten zeigt es die Beschleinigungskräfte an

- zirkuläre Beschleinigung / Gyroscope
> das sind die Beschleunigugskräfte beim Drehen (vom Zentrum des Sensors aus gesehen)

- Magnetismus (hoffentlich den der Erde) / Magnetic Field und Orientation
> Himmelsrichtung, allerdings in 3 Achsen
> hier kannst du es noch mit der Schwergraft verrechnen, um die Lage des Handys mit einzubeziehen

Und dann natürlich noch die Location/GPS (eventuell noch mit Hilfe der WLANs)




Jetzt mußt du nur noch aufpassen, daß du den gewünschten Sensor erwischst.


Du kannst dir ja mal AndroSensors besorgen, der liestet alle gefundenen Sensoren auf und zeigt die Rohwerte.
MyDroid System Info listet "bekannte" Sensoren auf, ordnet sie gleich Gruppen zu und vergibt "ordentliche" Namen/Beschreibungen und stellt die Werte "ordentlich" formatiert da.
Da kannst'e ja mal nachsehen was vorhanden ist. Und AndroSensors sagt dir wohl Namen des gewünschten Sensors.

arnof 13. Dez 2013 20:38

AW: Kompass mit Android
 
Unter den mobilen Beispielen findet Du die App Sensorinfo, die zeigt Dir alle Sensoren deines Gerätes an und auch die aller Eigenschaften mit allen Werten.

Das Gerät mit den meisten Sensoren war ich hier bereits getestet habe ist das Galaxy Note 3 das schlechteste Gerät ist das Acer B1, das hat überhaupt keinen Sensor drin.

Peter666 14. Dez 2013 12:56

AW: Kompass mit Android
 
Wie bekomme ich aus den Headingwerten die Himmelsrichtung bestimmt?

himitsu 14. Dez 2013 13:08

AW: Kompass mit Android
 
Die Achse mit dem größten Wert zeigt am meisten in Richtung des Nordpols eines Magnetes.

Wenn du es dir einfach machen willst, dann nimmst du nur X und Y (also wenn das Handy flach da liegt, wobei Z nach unten zeigt)
und schon kannst du das wie eine Kreisfunktion ansehen, also via Cosinus und Sinus die Werte der Achsen in den Winkel umrechnen.


PS: Wie du vielleicht weißt,ist der "echte" Nordpol nicht genau da, wo der magnetische Nordpol ist.
Aber das kannst du erstmal ignorieren, und zeigst einfach nur zum magnetischen Nordpol.
Denn um den Fehler rausrechnen zu können, müsstest du wissen, wo sich das Handy grade befindet.

Medium 14. Dez 2013 14:49

AW: Kompass mit Android
 
Zitat:

Zitat von himitsu (Beitrag 1239742)
der "echte" geografische Nordpol nicht genau da, wo der magnetische Nordpol ist.

Beide sind echt, und es ist gleichermaßen legitim nach beiden zu suchen. Bei einem Kompass würde ich aber stets die Anzeige des magnetischen erwarten.

himitsu 14. Dez 2013 17:46

AW: Kompass mit Android
 
Dann würdest du dich in 5000 Jahren eventuell verlaufen, dern de magnetische wandert und angeblich sind wir grade mitten in einer Polumkehr, wo du danach vielleicht am Südpol landen könntest.

Peter666 14. Dez 2013 17:47

AW: Kompass mit Android
 
Also irgendwie bekomme ich aus den Werten wohl nicht die korrekten Daten hergeleitet. Zur Berechnung nutze ich das hier:

Delphi-Quellcode:
function Heading: single;
  begin
    if (FHeadingY > 0) then
      result := 90.0 - arcTan(FHeadingX / FHeadingY) * 180 / PI
    else if (FHeadingY < 0) then
      result := 270.0 - arcTan(FHeadingX / FHeadingY) * 180 / PI
    else if (FHeadingY = 0) and (FHeadingX < 0) then
      result := 180
    else if (FHeadingY = 0) and (FHeadingX > 0) then
      result := 0;
  end;
Ich sollte eventuell erwähnen, dass ich das von hier her habe: http://www51.honeywell.com/aero/comm...netometers.pdf.

Medium 14. Dez 2013 18:26

AW: Kompass mit Android
 
Zitat:

Zitat von himitsu (Beitrag 1239780)
Dann würdest du dich in 5000 Jahren eventuell verlaufen, dern de magnetische wandert und angeblich sind wir grade mitten in einer Polumkehr, wo du danach vielleicht am Südpol landen könntest.

Das schien die Segler in hunderten von Jahren nicht wirklich davon abzuhalten Dinge zu entdecken. Kompass ==> Magnetisch. Da beisst die Maus kein Faden ab. Und das ist, was ich von einem Kompass eben erwarte. Zumindest wenn einfach nur von "Kompass" die Rede ist. Wenn dieser mir etwas anderes als den magnetischen Nordpol zeigt, erwarte ich die Erwähnung im Namen (oder muss ihn als kaputt ansehen). Zum Beispiel "Geografischer Kompass". Aber nur Kompass, da wäre es schlicht und ergreifend falsch den geografischen anzuzeigen. Zumindest, wenn dies nicht explizit als Option AUCH wählbar ist, sondern die Hauptfunktion oder Voreinstellung.

Ralphi 15. Dez 2013 11:36

AW: Kompass mit Android
 
Danke für die vielen Hinweise.

Besonderen Dank an Peter666, das war die Lösung!

Der Wertebereich von 0-360 stimmte schon mit der Funktion, die Richtung war nur um 90 Grad verschoben.
Eventuell waren die Konstanten für andere Magnetfeld-Sensoren.
Ich habe nur die Konstanten um 90 geändert und die Himmelsrichtung war ok.
Die Deklination kann man falls gewünscht glaube ich mit den Tilt-Werten des Sensors berechnen und berücksichtigen.
Das werde ich mal probieren und das Ergebnis hier posten.

Hier die entsprechend geänderte Funktion von Peter666, die ursptünglichen Zeilen habe ich belassen und auskommentiert:
Code:
function Heading: single;
  begin
    if (OrientationSensor1.Sensor.HeadingY > 0) then
      //result := 90.0 - arcTan(OrientationSensor1.Sensor.HeadingX / OrientationSensor1.Sensor.HeadingY) * 180 / PI
      result := arcTan(OrientationSensor1.Sensor.HeadingX / OrientationSensor1.Sensor.HeadingY) * 180 / PI
    else if (OrientationSensor1.Sensor.HeadingY < 0) then
      //result := 270 - arcTan(OrientationSensor1.Sensor.HeadingX / OrientationSensor1.Sensor.HeadingY) * 180 / PI
      result := 180 - arcTan(OrientationSensor1.Sensor.HeadingX / OrientationSensor1.Sensor.HeadingY) * 180 / PI
    else if (OrientationSensor1.Sensor.HeadingY = 0) and (OrientationSensor1.Sensor.HeadingX < 0) then
      result := 180
    else if (OrientationSensor1.Sensor.HeadingY = 0) and (OrientationSensor1.Sensor.HeadingX > 0) then
      result := 0;
  end;

Peter666 15. Dez 2013 13:46

AW: Kompass mit Android
 
Sicher? Also ich kriege da nur "Mist" raus und es scheint ja auch Abhängig, wie das Telefon gehalten wird, oder?

Was mir auch aufgefallen ist, ist das ich die MagHeading und TrueHeading Daten überhaupt nicht geliefert bekomme. Ich habe das eine Androidbeispiel (mit dem Gyrothread) mal in abgewandelter Form umgesetzt und da kriege ich nur Heading und Tiltwerte.

himitsu 15. Dez 2013 13:57

AW: Kompass mit Android
 
Zitat:

Zitat von Peter666 (Beitrag 1239844)
es scheint ja auch Abhängig, wie das Telefon gehalten wird, oder?

Es ist ein 3-Achsen-Sensor, von dem nur X und Y verwendet wird.
Man hat ja auch nur einen 2-Achsen-Komas in der Anzeige.
Wenn das Handy flach gehalten wird, dann sollten X+Y der Draufsicht entsprechen und Z nach unten.

Also senkrecht sollte man da das Handy nicht halten.
Es sei denn man wertet sie Lage des Handys aus und nimmt bei Senkrecht entsprechend X und Z als Achsen.
Bei Senkrecht muß man die Ansicht dann ja um 90° kippen, aber wer würde denn einen "normalen" Kompas senkrecht halten? :roll: (drum hab ich das Nächste wohl noch nie gesehn)

Oder du machst das in 3D, stellst den Kompas als Kugel dar und zeichnest den Pfeil dann in 3 Achsen da rein.

Ralphi 15. Dez 2013 15:23

AW: Kompass mit Android
 
Bei mir passt es. Ich habe zum testen die Beispiel-App Orientation-Sensor aus den Samples verwendet und die Funktion bei der Ausgabe eingebaut.
Wenn es nicht passt ist der Kompass eventuell nicht kalibriert oder der Sesnor nicht aktiviert.
Lade einfach eine Kompass App (Ich habe Kompass3D von gamijo geladen) und vergleiche damit. Die App hat in den Einstellungen die Kalibrier-Funktion, bei der man das Handy in 8er Form bewegen muss. Danach ist es genauer, ich habe ein paar Grad Unterschied zum iPhone-Kompass, das kann evtl. die Deklination sein.

Gehalten werden muss das Handy flach (wie man einen Kompass normalerweise hält wenn man draufguckt), Norden ist "Handy-oben".

Peter666 15. Dez 2013 17:00

AW: Kompass mit Android
 
@himitsu: Das machst du, wenn du zum Beispiel eine Augmented Reality Anwendung erstellen willst. In meinem Fall wollte ich Azimut, Elevation von Sternen im Ausschnitt darstellen und für die Richtung den Kompass nutzen. Es hapert gefühlt nur an 2 Kleinigkeiten, zum einen weiß ich nicht wie ich den FOV von dem Gerät bestimme, also die Anzahl des sichtbaren Azimut-Winkels, je nachdem ob das Telefon im Portraitmodus gehalten wird und natürlich der Kompass. Irgendwie verzweifel ich ein bisschen daran.

Peter666 19. Dez 2013 10:50

AW: Kompass mit Android
 
Ich werde noch blöde :)

Auf dem Androiden bekomme ich bei dem Accelerometer3D Motion-Sensor völlig andere Werte als beim IPhone. Die Baseclass is TAndroidNativeAccelerometrSensor und bei iOS TiOSMotionSensor.
Bei Ios Sind das Werte zwischen 0.003 und -1.003 bei Acceleration X-Z und bei den Androiden meist so um die 0.4,0.3,9.81.

Ich könnte das jetzt normalisieren, aber ich hab dennoch das Gefühl das das nicht passt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz