2016-07-20 12 views
0

Ich verwende Opentrack, um Kopfbewegungen zu verfolgen, und die Koordinaten werden über UDP an mein Python-Programm gesendet. Das Programm funktioniert in dem Sinne, dass es die Koordinaten korrekt empfängt, aber ich habe bemerkt, dass es eine große Verzögerung gibt, bevor die Informationen eintreffen.Verzögerung beim Empfang von UDP-Paketen in Python in Echtzeit

Nach der Beobachtung des Verhaltens scheint mir, dass die Tracking-Software die Koordinaten zu einem Puffer sendet, dass mein Programm die Daten abruft, aber mein Programm ist langsamer, um die Daten als die Geschwindigkeit zu holen, die der Puffer füllt. Dies bedeutet, dass wenn ich meinen Kopf bewege, alle diese neuen Koordinaten erkannt wurden, aber das Programm schrittweise durch den Puffer gehen muss, was die Verzögerung verursacht. Dies ist ein Problem, da ich dies als eine Echtzeitanwendung verwende, die die aktuellen Koordinaten sofort an mein Programm senden muss.

Ich bin nicht sicher, ob das Problem in der Opentrack-Software ist und wenn ich zu dieser Gemeinschaft um Hilfe über Kopf sollte, oder wenn ich es in Python beheben ...

Grundsätzlich mag ich nur da war kein Puffer, sondern nur die aktuellen Koordinaten (es spielt keine Rolle, ob einige gemessene Koordinaten in meiner Anwendung verloren gegangen sind).

def connect(self, PORT): 
    HOST = '' # Symbolic name meaning all available interfaces 
    #PORT = 8888 # Arbitrary non-privileged port 

    # Datagram (udp) socket 
    try : 
     self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
     print 'Socket created' 
    except socket.error, msg : 
     print 'Failed to create socket. Error Code : ' + str(msg[0]) + ' Message ' + msg[1] 
     sys.exit() 


    # Bind socket to local host and port 
    try: 
     self.s.bind((HOST, PORT)) 
    except socket.error , msg: 
     print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1] 
     sys.exit() 

    print 'Socket bind complete' 

#now keep talking with the client 
def fetch(self): 
    # receive data from client (data, addr) 
    d = self.s.recvfrom(1024) 
    data = d[0] 
    addr = d[1] 

    if data: 

     reply = 'OK...' + data 

     self.s.sendto(reply , addr) 

     unpacked_data = struct.unpack('dddddd', data) 
     x = unpacked_data[0] 
     y = unpacked_data[1] 
     z = unpacked_data[2] 
     return (x, y, z) 
+0

Ein Netzwerkanalysator (z. B. [Wireshark] (https://www.wireshark.org/)) sollte Ihnen bei der Identifizierung helfen, wer für die Pufferung, den Sender oder den Empfänger verantwortlich ist. – jedwards

Antwort

0

So löste ich es durch die Zeile hinzufügen

self.s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1) 

in meinem Code. Dies setzt den Puffer auf Größe 1, was mein Problem gelöst hat.