2016-07-20 88 views
0

我使用Opentrack來跟蹤頭部移動,座標通過UDP發送到我的Python程序。該程序的工作原理是正確接收座標,但是我注意到信息到達之前存在很大的延遲。在Python中實時接收UDP數據包時的延遲

在觀察行爲後,我認爲跟蹤軟件會將座標發送給我的程序從中獲取數據的某個緩衝區,但我的程序獲取數據的速度比緩衝區填滿的速度要慢。這意味着如果我移動頭部,那麼這些新座標全部被檢測到,但程序必須逐漸通過導致延遲的緩衝區。這是一個問題,因爲我將它用作實時應用程序,需要將當前座標始終立即發送到我的程序。

我不知道如果這個問題是在Opentrack軟件,如果我頭部到社區尋求幫助,或者如果我能在Python解決它......

基本上,我只是希望有不是一個緩衝區,而是它只是發送當前座標(如果在我的應用程序中某些測量座標丟失,這並不重要)。

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

網絡分析器(例如[Wireshark](https://www.wireshark.org/))應該可以幫助您識別誰負責緩衝,發送者或接收者。 – jedwards

回答

0

所以我加入行

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

在我的代碼解決了這個問題。這將緩衝區設置爲1,從而解決了我的問題。