2016-07-07 20 views
0

Ich renne WebSocket-Client auf einem Raspberry Pi, um ein Servo mit Daten von einem Sprung Motion WebSocket Server gesendet zu steuern. Die Menge an Daten, die durch die Sprungbewegung über die Websocket-Verbindung gesendet werden, ist so hoch, dass es eine lange Verzögerung gibt, bis der Pi die letzte Nachricht einholt, die umso schlechter wird, je länger sie läuft.Python WebSocket-Client, nur die neueste Nachricht in der Warteschlange

Wie kann ich alle alten Nachrichten in einer Warteschlange verwerfen und nur die neuesten Nachrichten verwenden? Derzeit wird diese ich tue:

ws = create_connection("ws://192.168.1.5:6437") 
    while True: 
     result = ws.recv() 
     resultj = json.loads(result) 
     if "hands" in resultj and len(resultj["hands"]) > 0: 
       # print resultj["hands"][0]["palmNormal"] 
       rotation = math.atan2(resultj["hands"][0]["palmNormal"][0], -resultj["hands"][0]["palmNormal"][1]) 
       dc = translate(rotation, -1, 1, 5, 20) 
       pwm.ChangeDutyCycle(float(dc)) 
+0

Sie benötigen einen Faden in eine lokale Warteschlange und einen Thread erhalten die neueste Nachricht aus der Warteschlange zu verarbeiten (alle anderen abwerfen), sobald der vorherige Zug beendet ist. – barny

+0

Wird der andere Thread nicht unter dem gleichen Problem leiden und nicht in der Nähe der Warteschlange der Websocket-Nachrichten stehen? – Tom

+0

Wenn Sie den recv tun, bevor Sie es tun, können Sie testen, ob es eine andere Nachricht gibt, lesen Sie alle und Aktion die letzte Nachricht? – barny

Antwort

1

Da der Sprung Servicedaten bei rund 110 Bildern pro Sekunde sendet, müssen Sie über 9ms jede Verarbeitung zu tun. Wenn Sie das überschreiten, werden Sie zurückkommen. Die einfachste Lösung ist wahrscheinlich, eine künstliche App-Bildrate zu erstellen. Wenn Sie für jede Schleife die Zeit für das nächste Update nicht erreicht haben, erhalten Sie nur die nächste Nachricht und verwerfen sie.

ws = create_connection("ws://192.168.1.5:6437") 
allowedProcessingTime = .1 #seconds 
timeStep = 0 
while True: 
    result = ws.recv() 
    if time.clock() - timeStep > allowedProcessingTime: 
     timeStep = time.clock() 
     resultj = json.loads(result) 
     if "hands" in resultj and len(resultj["hands"]) > 0: 
       # print resultj["hands"][0]["palmNormal"] 
       rotation = math.atan2(resultj["hands"][0]["palmNormal"][0], -resultj["hands"][0]["palmNormal"][1]) 
       dc = translate(rotation, -1, 1, 5, 20) 
       pwm.ChangeDutyCycle(float(dc)) 
     print "processing time = " + str(time.clock() - timeStep) #informational 

(ich habe nicht diese Änderung an Ihrem Code ausführen, so dass die üblichen Warnungen gelten)