GPS übers Netzwerk

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo Leute,

    ich bin neu auf dem Gebiet der Programmierung und wurde mit meinem Projekt ein wenig ins kalte Wasser geworfen. Und zwar wird in einem Forschungsflugzeug eine Infrarotkamera betrieben die in recht schnellen Abständen Fotos macht. Jedesmal wenn nun die Blende ausgelöst wird, soll die dazu exakte Zeit in einem txt-File gespeichert werden. Die Elektronik und die entsprechenden Programme müssen dafür entworfen werden. Die Hardware ist nahezu fertig. Mein Problem ist vorerst das GPS-Signal.
    Die im Flugzeug eingebauten GPS-Empfänger schicken die Daten mit 100 Hz in einem speziellen Protokoll durch das lokale Netzwerk im Flugzeug. Die Daten möchte ich nun mit meinem RasPi empfangen und auswerten.
    Wie ich das Ganze über einen per USB oder an den GPIO-Pins angebrachtes GPS hinbekomme, weiß ich. Aber nicht wie ich die GPS-Zeit aus einem Paket im Netzwerk erhalte.
    Die IP-Adresse und der verwendete Port des Gerätes, dass die GPS-Daten sendet, sind bekannt. Das Ganze wird als UDP durch die Gegend geschickt. Jedes Paket enthält 72-byte, wovon ich nur die ersten zwei bytes (byte 1 und 2) benötige. Diese enthalten die GPS-Zeit.
    Ich habe mir bereits gpsd angeschaut, bin mir aber nicht sicher, ob dieses auch aus einem solchen Paket im lokalen Netzwerk die GPS-Zeit extrahieren und mir ausgeben kann.
    Ich komme dahingehend im Moment nicht weiter und wäre für jede Hilfe dankbar.

    Viele Grüße,
    BallerNacken

    Einmal editiert, zuletzt von BallerNacken (20. Dezember 2013 um 03:30)

  • [font="Tahoma, Verdana, Arial, sans-serif"]> Die IP-Adresse und der verwendete Port des Gerätes, dass die GPS-Daten sendet, sind bekannt.[/font]
    [font="Tahoma, Verdana, Arial, sans-serif"]Die Frage ist eher, wohin die Daten geschickt werden. Ist es ein Broadcast oder koennt Ihr das konfigurieren ?[/font]

    [font="Tahoma, Verdana, Arial, sans-serif"]> Das Ganze wird als UDP durch die Gegend geschickt. Jedes Paket enthält 72-byte, wovon ich nur die ersten[/font]
    [font="Tahoma, Verdana, Arial, sans-serif"]> zwei bytes (byte 1 und 2) benötige. Diese enthalten die GPS-Zeit.[/font]
    [font="Tahoma, Verdana, Arial, sans-serif"]Wisst Ihr wie die Zeit codiert ist ?[/font]
    [font="Tahoma, Verdana, Arial, sans-serif"] [/font]
    [font="Tahoma, Verdana, Arial, sans-serif"]> Ich komme dahingehend im Moment nicht weiter und wäre für jede Hilfe dankbar.[/font]
    [font="Tahoma, Verdana, Arial, sans-serif"]Keine Sorge, UDP-Pakete empfangen und zwei Bytes decodieren ist recht einfach :D[/font]

  • Ein Weihnachtsgeschenk fuer Euch :D

    Speichern in ReceiveTime.cpp, Compilieren mit g++ -o ReceiveTime, Ausfuehren mit ./ReceiveTime:
    (Die Zeitdecodierung fehlt noch)

  • Erstmal Danke für die Antworten! Tell danke für das nette Geschenk, werde ich nächste Woche mal ausprobieren, wenn ich dazu komme (ist leider nicht so einfach zu testen). Für alle anderen, es wird ein Broadcast gesendet und ich meine mich zu erinnern, das die Zeit in einem NMEA Satz gespeichert ist.

    Grüße,
    BallerNacken

  • [font="Tahoma, Verdana, Arial, sans-serif"]> Tell danke für das nette Geschenk, werde ich nächste Woche mal ausprobieren,[/font]
    [font="Tahoma, Verdana, Arial, sans-serif"]> wenn ich dazu komme (ist leider nicht so einfach zu testen).[/font]
    [font="Tahoma, Verdana, Arial, sans-serif"]ich kenne das Problem, hab auch schon Kameras in einem Vermessungsflugzeug gesteuert ...[/font]

    [font="Tahoma, Verdana, Arial, sans-serif"]> Für alle anderen, es wird ein Broadcast gesendet[/font]
    [font="Tahoma, Verdana, Arial, sans-serif"]Das ist gut, das muesste dann auch der PI bekommen[/font]

    [font="Tahoma, Verdana, Arial, sans-serif"]Recht weit oben um Code gibt's ein #define fuer das PORT. Dort den korrekten Wert einstellen[/font]

    [font="Tahoma, Verdana, Arial, sans-serif"]> und ich meine mich zu erinnern, das die Zeit in einem NMEA Satz gespeichert ist.[/font]
    [font="Tahoma, Verdana, Arial, sans-serif"]Wenn's ein NMEA ist, gibt das Programm nichts vernuenftiges aus.[/font]

    [font="Tahoma, Verdana, Arial, sans-serif"]NMEA ist ein ASCII-Protokoll und die Uhrzeit ist in 6 Bytes codiert ![/font]

  • Also, ich konnte den Code endlich testen. Leider bekomme ich keine Zeit ausgegeben. Ein Fehler erscheint auch nicht, weshalb ich annehme der Socket wurde richtig erstellt.

    Hast du eine Ahnung, was es sein könnte?

    Edit: Okay habe es hinbekommen, lag an der Konfiguration des GPS im Fugzeug. Nun empfange ich die UDP Pakete. Für die Zeit bekomme ich folgende Ausgabe:


    Code
    len:72
    Zeit: E7 F4
    len:72
    Zeit: E7 08
    len:72
    Zeit: E7 1C
    .
    .
    .

    Die Länge des NCOM Paketes wird mit 72 Byte schon vollkommen richtig angezeigt. Ich nehme an, ich muss nun noch die Zeit aus diesen etwas "kryptischen" Daten umformen? Oder werden vielleicht die falschen Bytes ausgelesen?

    ps.: das E7 bleibt, nur der hintere Wert ändert sich immer.

    Edit2: Das Manual der GPS-IMU-Unit sagt für Byte 0: Sync, Always7h. Ich denke mal das ist der Indetifier. Wenn ich in der Zeile 83 die 0 zu einer 1 und die 1 zu einer 2 mache, müsste es dann besser sein? Time ist byte 1 und 2.

    Grüße,
    BallerNacken

    Einmal editiert, zuletzt von BallerNacken (7. Januar 2014 um 05:11)

  • [font="Tahoma, Verdana, Arial, sans-serif"]> Das Manual der GPS-IMU-Unit sagt für Byte 0: Sync, Always7h.[/font]
    [font="Tahoma, Verdana, Arial, sans-serif"]7h ist aber nicht E7h[/font]

    [font="Tahoma, Verdana, Arial, sans-serif"]> Wenn ich in der Zeile 83 die 0 zu einer 1 und die 1 zu einer 2 mache, müsste es dann besser sein? Time ist byte 1 und 2.[/font]
    [font="Tahoma, Verdana, Arial, sans-serif"]Ist auf jeden Fall einen Versuch wert. Und die Resultate schoen protokollieren ![/font]

    [font="Tahoma, Verdana, Arial, sans-serif"]Sagt das Manual auch, in welchem Format die Zeit ist ??[/font]

    [font="Tahoma, Verdana, Arial, sans-serif"]Die Werte in Byte 1 haben einen Abstand von 20 (Dezimal). Wie schnell hintereinander kommen die Meldungen ?[/font]

  • Zitat


    [font="Tahoma,Verdana,Arial,sans-serif"]> Das Manual der GPS-IMU-Unit sagt für Byte 0: Sync, Always7h.[/font]
     [font="Tahoma,Verdana,Arial,sans-serif"]7h ist aber nicht E7h[/font]


    Das sollte "Always E7h" heißen. Würde also ungefähr passen...

    Zitat


    [font="Tahoma,Verdana,Arial,sans-serif"]> Wenn ich in der Zeile 83 die 0 zu einer 1 und die 1 zu einer 2 mache, müsste es dann besser sein? Time ist byte 1 und 2.[/font]
     [font="Tahoma,Verdana,Arial,sans-serif"]Ist auf jeden Fall einen Versuch wert. Und die Resultate schoen protokollieren ![/font]


    Ich werde morgen oder übermorgen testen können, ob sich mit der Änderung was verändert. War heute nicht mehr möglich.

    Zitat


    [font="Tahoma,Verdana,Arial,sans-serif"]Sagt das Manual auch, in welchem Format die Zeit ist ??[/font]


    Im Manual steht wortwörtlich:

    Zitat


    Byte Quantity Notes
    0 Sync Always E7h
    1 Time Time is transmitted as milliseconds into the minute in GPS time.Range is 0 to
    2 Time 59,999 ms.

    Das sagt mir, dass die Zeit nicht irgendwie verpackt sein sollte, sondern so wie dort beschrieben in ms übertragen wird.

    Zitat


    [font="Tahoma,Verdana,Arial,sans-serif"]Die Werte in Byte 1 haben einen Abstand von 20 (Dezimal). Wie schnell hintereinander kommen die Meldungen ?[/font]


    Schnell. Manual sagt das GPS haut mit 2-20 Hz raus. Bei meinem Test würde ich eher auf 20 Hz tippen :)

    Mal schauen wie es morgen aussieht. Ich werde mal ein wenig rumtesten. Kommt ja noch einiges mehr für mich, was verstanden und programmiert werden muss. :)

    Grüße,
    BallerNacken

    Einmal editiert, zuletzt von BallerNacken (7. Januar 2014 um 12:57)

  • Eigentlich gibt es nur zwei vernuenftige Varianten wie die Zeit codiert sein koennte.

    Ich hab hier beide drin, wenn eine passt, dann einfach die anderen beiden loeschen:

  • Okay, das funktioniert schonmal.

    Bekomme nun folgende Ausgabe:

    LSB enthält also die Millisekunden in der Minute. Es zählt bis 60000 ms hoch und fängt dann wieder vorne an. Was MSB allerdings enthält, blicke ich überhaupt nicht. Ich weiß das LSB für Least significant bit und MSB für Most significant bit steht, aber das war es dann auch schon.
    Außerdem ist mir erst jetzt :wallbash: aufgefallen, dass ich ja auch noch die Minuten benötige. Diese stehen in einem anderen Feld. Ich habe allerdings null Plan, wie ich da ran kommen soll...Das hier ist die Anleitung zu der GPS-IMU-Einheit. Vielleicht wird einer von euch daraus ja schlauer. (Seite 82-89)
    Das Feld enthält die Minuten seit dem 06.01.1980. Da muss ich dann noch die Sekunden und Millisekunden irgendwie oben drauf rechnen. Erst dann habe ich die komplette Zeit...ist doch deutlich komplizierter als ich erwartet hatte :(

  • > Was MSB allerdings enthält, blicke ich überhaupt nicht.
    Diese Zeile einfach loeschen. Die war drin um zu sehen wie die beiden Bytes zusammengefuegt werden muessen.

    > Außerdem ist mir erst jetzt aufgefallen, dass ich ja auch noch die Minuten benötige.
    Oehoemm !! In der Beschreibung stand doch drin, dass es die Millisekunden nach dem letzten Sekundenpuls sind ...

    > Diese stehen in einem anderen Feld
    In welchem ?

    > Das Feld enthält die Minuten seit dem 06.01.1980. Da muss ich dann noch die Sekunden und
    > Millisekunden irgendwie oben drauf rechnen.
    Unix-Timestamp fuer den 6.1.1980 bestimmen (WELCHE UHRZEIT ???) + minuten * 60 + sekunden -> Unix Timestamp
    Von localtime() umrechnen lassen

    Mit der Frequenz stimmt auch etwas nicht. 20ms sind keine 20Hz


  • > Außerdem ist mir erst jetzt aufgefallen, dass ich ja auch noch die Minuten benötige.
    Oehoemm !! In der Beschreibung stand doch drin, dass es die Millisekunden nach dem letzten Sekundenpuls sind ...

    > Diese stehen in einem anderen Feld
    In welchem ?

    Genau das verstehe ich nicht. Ist ein bisschen schwer zu erklären, magst du in der Anleitung mal nachsehen? Es ist wohl in Byte 62, in einem Channel und da wieder in 3 Bytes versteckt. Aber wie ich da hinkomme...puh!

    Zitat


    Mit der Frequenz stimmt auch etwas nicht. 20ms sind keine 20Hz

    Ja stimmt, sind 50 Hz...hm! Ich habe morgen oder am Freitag eine Unterhaltung mit jemandem, der schonmal sowas ähnliches für diese GPS-IMU-Einheit gemacht hat. Bis dahin bleibt mir wohl nichts anderes übrig, als rum zu probieren. Durch deine Hilfe, habe ich das auslesen der UDP-Pakete immerhin schonmal recht gut verstanden!

  • Für dich mag das eine genaue Beschreibung sein. Ich hingegen kann mit den Tabellen wenig anfangen. Genau aus diesem Grund habe ich höflich nachgefragt, ob du mal drüber schauen kannst. Und was die Software angeht, ja die gibt es. Diese kann aber nur zum Post-Processing verwendet werden und ist somit für meinen Zweck hinfällig.
    Verarschen wollte ich dich also mit Sicherheit nicht! Aber okay, dann lassen wir das hier.
    Trotzdem Danke für deine Hilfe!

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!