Jump to content

Berechnungen mit GPS-speed


walterberger

Recommended Posts

Hallo

Ich bin neu in der Welt von Tinkerforge und mache gerade die ersten Versuche mit dem GPS-Bricklet. Dazu habe ich das Callback beispiel genommen (python) und für callback_motion angepasst. Das funktioniert soweit das ich mir fortlaufend die Geschwindigkeit anzeigen lassen kann. Die Richtung (course) benötige ich nicht. Wie muss ich aber nun speed definieren, damit ich mit dem Wert berechnungen anstellen kann?

Link zu diesem Kommentar
Share on other sites

Vielen Dank, aber leider hilft mir das nicht weiter.

Die Frage war vielleicht etwas schlecht verständlich.

Unten mal mein Programm, dort wo fast am Ende zahl = 1 steht sollte anstelle von 1 die Geschwindigkeit (speed) stehen. Wenn ich dort einfach speed eingebe erhalte ich folgende Fehlermeldung:

 

Traceback (most recent call last):

  File "C:\Users\wb\AppData\Local\Programs\Python\Python35-32\Servo-Test-1\GPS-7Meter-1.py", line 40, in <module>

    zahl = speed

NameError: name 'speed' is not defined

 

Wie muss ich speed dort definieren?

 

 

#!/usr/bin/env python

# -*- coding: utf-8 -*-

 

HOST = "localhost"

PORT = 4223

UID = "qG8" # Change to your UID

 

from tinkerforge.ip_connection import IPConnection

from tinkerforge.bricklet_gps import BrickletGPS

import time

ende = 6.5

 

# Callback function for coordinates callback

def cb_motion(course, speed):

    #print("Speed: " + str(speed/360))

    #print("Longitude: " + str(longitude/1000000.0) + "° " + ew)

    #print("")

 

 

 

 

    if __name__ == "__main__":

        ipcon = IPConnection() # Create IP connection

        gps = BrickletGPS(UID, ipcon) # Create device object

 

        ipcon.connect(HOST, PORT) # Connect to brickd

        # Don't use device before ipcon is connected

 

        # Register coordinates callback to function cb_coordinates

        gps.register_callback(gps.CALLBACK_MOTION, cb_motion)

 

    # Set period for coordinates callback to 1s (1000ms)

    # Note: The coordinates callback is only called every second

    #      if the coordinates has changed since the last call!

    # gps.set_coordinates_callback_period(1000)

 

        gps.set_motion_callback_period(100)

 

 

zahl = 1

while 1:

    start = 0

    while start <= ende:

        start = start + zahl

   

    print ("Summe", start)

    time.sleep(1)

 

 

           

#  input("Press key to exit\n") # Use input() in Python 3

ipcon.disconnect()

 

Link zu diesem Kommentar
Share on other sites

Das was du das tun willst funktioniert auch mit Callbacks. Aber fang am besten erst mal einfach mit Gettern an:

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-

HOST = "localhost"
PORT = 4223
UID = "qG8" # Change to your UID

from tinkerforge.ip_connection import IPConnection
from tinkerforge.bricklet_gps import BrickletGPS
import time

ende = 6.5

if __name__ == "__main__":
    ipcon = IPConnection() # Create IP connection
    gps = BrickletGPS(UID, ipcon) # Create device object

    ipcon.connect(HOST, PORT) # Connect to brickd
    # Don't use device before ipcon is connected

    while True:
        start = 0

        while start <= ende:
            course, speed = gps.get_motion() # speed in 1/100 km/h
            start = start + speed

            time.sleep(0.1)

        print("Summe", start)
        time.sleep(1)

    ipcon.disconnect()

 

Mit ist nur nicht klar, warum du den speed aufsummieren möchtest bis die Summe 0,065 km/h erreicht hat.

Link zu diesem Kommentar
Share on other sites

Nur eine kleine Ergänzung:

  File "C:\Users\wb\AppData\Local\Programs\Python\Python35-32\Servo-Test-1\GPS-7Meter-1.py", line 40, in <module>

    zahl = speed

NameError: name 'speed' is not defined

Die Variable "speed" war im Haupt(main)code nicht definiert und daher unbekannt.

Diese war nur innerhalb des Callback-Aufrufs bekannt und auch nur dort nutzbar.

Mit z.B.

start = 0

wird die Variable "start" erst definiert und erhält eine Wertzuweisung. Es kommt aber darauf an wo (=scope: https://de.wikipedia.org/wiki/Variable_%28Programmierung%29#G.C3.BCltigkeitsbereich_von_Variablen_.28Scope.29) man diese festlegt.

Link zu diesem Kommentar
Share on other sites

Vielen Dank, das funktioniert.

Ja das Ganze so wie es jetzt da steht macht natürlich keinen Sinn.

Letztendlich soll nicht die Geschwindligkeit sondern der Weg (v*t) aufsummiert werden um alle X Meter eine Aktion auszulösen.

 

Dazu habe ich mir gedacht ein Industrial Quad Relay Bricklet zu verwenden und einen Ausganz kurz ein und wieder auszuschalten.

Und irgendwie muss ich die Endlosschlaufe auch noch ferngesteuert aktivieren und deaktivieren können. Da habe ich mir gedacht das geht am besten mit einem IO-4 Bricklet.

Könnte das so grundsätzlich funktionieren?

 

Der Ursprung des Ganzen ist übrigens das hier:

http://www.tinkerunity.org/forum/index.php/topic,3398.0.html

 

 

Das was du das tun willst funktioniert auch mit Callbacks. Aber fang am besten erst mal einfach mit Gettern an:

 

 

Mit ist nur nicht klar, warum du den speed aufsummieren möchtest bis die Summe 0,065 km/h erreicht hat.

Link zu diesem Kommentar
Share on other sites

  • 2 weeks later...

Mittlerweilen habe ich das Programm soweit zum laufen gebracht das es mit dem PC funktioniert. Die Genauigkeit muss ich noch austesten.

 

Hier mal der Code:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

HOST = "localhost"
PORT = 4223
UID = "qG8" # Change to your UID

from tinkerforge.ip_connection import IPConnection
from tinkerforge.bricklet_gps import BrickletGPS
import time

ende = 7

if __name__ == "__main__":
    ipcon = IPConnection() # Create IP connection
    gps = BrickletGPS(UID, ipcon) # Create device object

    ipcon.connect(HOST, PORT) # Connect to brickd
    # Don't use device before ipcon is connected

    while True:
        start = 0

        while start <= ende:
            course, speed = gps.get_motion() # speed in 1/100 km/h
            start = start + (speed/3600)

            time.sleep(0.1)

        print("Summe", start)

        HOST = "localhost"
        PORT = 4223
        UID = "roq" # Change to your UID

        from tinkerforge.ip_connection import IPConnection
        from tinkerforge.bricklet_industrial_quad_relay import BrickletIndustrialQuadRelay
        import time

        if __name__ == "__main__":
            ipcon = IPConnection() # Create IP connection
            iqr = BrickletIndustrialQuadRelay(UID, ipcon) # Create device object

            ipcon.connect(HOST, PORT) # Connect to brickd
           
            iqr.set_value(1111)
            time.sleep(0.3)
            iqr.set_value(0000)
                      
            ipcon.disconnect()
        
    ipcon.disconnect()

 

Dazu habe ich noch ein paar Fragen:

 

- Ist das so richtig wie ich die verschiedenen Bicklets aufrufe oder macht man das anders?

 

- Wenn die Berechnung den gewünschten Wert erreicht hat erflgt das auslösen. Dort ist eine Pause von 0.3 Sec drinn, muss so sein. Sehe ich das richtig das in der Zeit die Neuberechnung noch nicht läuft? Wenn ja wie muss das seine damit die Neuberechnung unabhänig von der Auslösung weiterläuft?

 

- Nun möchte ich den gesammten Ablauf mit einem externen Schalter via IO-4 Bricklet steuern. Wenn der Schalter offen ist sollte eine art Warteschlaufe laufen und wenn der Schalter geschlossen ist sollte die Berechnung und Auslösung durchlaufen. Wie muss ich das machen, da habe ich leider keine Idee?

 

- Und noch was anderes, schlussendlich soll das alles auf einem RedBrick laufen. Denn habe ich auch schon hier und nach Anleitung die SD-Karte vorbereitet. Nur tut sich leider nicht, der Brick wird nicht erkannt. Gemäss Anleitung sollte die grüne LED blinken, aber bei meinem leuchter diese dauernd. Was könnte das sein?

 

Danke und einen schönen Abend.

Link zu diesem Kommentar
Share on other sites

- Ist das so richtig wie ich die verschiedenen Bicklets aufrufe oder macht man das anders?

 

Das würde man eher so machen. Die Beispiele haben verschiedene Abschnitte und man würde die Beispiele in ihre Abschnitte zerlegen und diese dann zusammenfügen:

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-

HOST = "localhost"
PORT = 4223
UID_GPS = "qG8" # Change to your UID
UID_IQR = "roq" # Change to your UID

from tinkerforge.ip_connection import IPConnection
from tinkerforge.bricklet_gps import BrickletGPS
from tinkerforge.bricklet_industrial_quad_relay import BrickletIndustrialQuadRelay
import time

ende = 7

if __name__ == "__main__":
    ipcon = IPConnection() # Create IP connection
    gps = BrickletGPS(UID_GPS, ipcon) # Create device object
    iqr = BrickletIndustrialQuadRelay(UID_IQR, ipcon) # Create device object

    ipcon.connect(HOST, PORT) # Connect to brickd
    # Don't use device before ipcon is connected

    while True:
        start = 0

        while start <= ende:
            course, speed = gps.get_motion() # speed in 1/100 km/h
            start = start + (speed/3600)

            time.sleep(0.1)

        print("Summe", start)

        iqr.set_value(0b1111)
        time.sleep(0.3)
        iqr.set_value(0b0000)
        
    ipcon.disconnect()

 

- Wenn die Berechnung den gewünschten Wert erreicht hat erflgt das auslösen. Dort ist eine Pause von 0.3 Sec drinn, muss so sein. Sehe ich das richtig das in der Zeit die Neuberechnung noch nicht läuft? Wenn ja wie muss das seine damit die Neuberechnung unabhänig von der Auslösung weiterläuft?

 

Der sleep Aufruf hält das Programm (genauer gesagt den einzigen Thread des Programms) da an. Die Neuberechnung wird also auch angehalten.

 

Damit das gleichzeitig laufen kann, kannst du entweder einen weiteren Thread benutzten, oder  den Motion Callback des GPS Bricklets, der im Hintergrund auch in einem weiteren Thread ausgeführt wird. Du solltest dich wahrscheinlich erstmal zumindest kurz mit Threads und Nebenläufigkeit beschäftigen. Mit Threads kann man in einem Programm mehrere Dinge parallel ausführen.

 

- Nun möchte ich den gesammten Ablauf mit einem externen Schalter via IO-4 Bricklet steuern. Wenn der Schalter offen ist sollte eine art Warteschlaufe laufen und wenn der Schalter geschlossen ist sollte die Berechnung und Auslösung durchlaufen. Wie muss ich das machen, da habe ich leider keine Idee?

 

Du musst dazu in deinem Programm also den Zustand des IO-4 Bricklet Abfragen und dann entweder die Berechnung durchführen, oder weiter das IO-4 Bricklet abfragen.

 

- Und noch was anderes, schlussendlich soll das alles auf einem RedBrick laufen. Denn habe ich auch schon hier und nach Anleitung die SD-Karte vorbereitet. Nur tut sich leider nicht, der Brick wird nicht erkannt. Gemäss Anleitung sollte die grüne LED blinken, aber bei meinem leuchter diese dauernd. Was könnte das sein?

 

Dann ist der Brick im Booten stecken geblieben? Ist das eine SD Karte von uns? Wenn nicht, wie schnell ist beim lesen. Es kann Probleme mit sehr langsamen SD Karten geben. Wenn es dass nicht ist, dann versuch mal das Image neu auf die SD Karte zu schreiben.

Link zu diesem Kommentar
Share on other sites

Vielen Dank für die Antwort.

 

Wie muss die Abfrage des IO-4 genau aussehen? Hast du da vielleicht ein Beispiel.

 

Die Speicherkarte habe ich zusammen mit dem RedBrick bei eienm Reseller gekauft.

Eigentlich bin ich davon ausgegeangen das das Image schon auf der Karte ist, war es aber nicht. Ich habe das Image mit Windows gemäss Anleitung auf die Karte geschrieben. Aber vielleicht ist die Karte nicht gut, ich werde mir mal eine andere besorgen. Auf diese hier habe ich das Image schon 2x versucht zu schreiben.

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...