2016-07-20 90 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,从而解决了我的问题。