0

私は Python 初心者であり、ソケット プログラミングに関する問題に遭遇したため、事前にコード化されたスクリプトを使用しています。

私は 2 台のコンピューターを使用しています。1 台は Matlab/Simulink リアルタイム アプリケーションを実行しており、UDP 経由で Wi​​ndows ラップトップにデータを送信しています。データには、カーソルの XY 座標とターゲット、ターゲットの半径、色 (合計 6 つの信号) が含まれています。ラップトップで、理想的には udp 信号を読み取り、指定された座標でリアルタイム (またはリアルタイムに近い) で二次画面に楕円を描画する python スクリプトを実行しています。残念ながら、実行速度が 1000Hz で送信される UDP 信号に追いつくほど速くない可能性があります。これにより、送信された信号が変化してから画面に表示されるまでに約 40 秒の大幅な遅延が発生します。

私が正しければ、問題は recvfrom コマンドにあります。受信したデータは、1000Hz でリアルタイムにすべてを表示するのではなく、何らかのバッファに格納され、FIFO スタイルで表示されます。問題は、これを修正する方法がわからないことです。ソケットプログラミングに関するほとんどの説明は、私の頭を悩ませています。1000Hz で表示する必要はありません。50Hz でも問題ありませんが、できるだけ早く変更を表示するのは非常に良いことです。FIFOではなく、最後に受信したデータだけを読みたい。

誰でも私を助けることができますか?前もって感謝します。

import socket
import struct
from PySide import QtGui
from PySide import QtCore
import random
import ctypes
import sys
import time
import math

UDP_IP = "192.168.1.25" #server
UDP_PORT = 25000 #server

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT)) #


class MyGui(QtGui.QWidget):

    def __init__(self):

        super(MyGui,self).__init__()

        #self.screen()
        user32 = ctypes.windll.user32
        self._W = user32.GetSystemMetrics(0)
        self._H = user32.GetSystemMetrics(1)
        self._rW = random.random()
        self._rH = random.random()
        self._rR = random.random()
        self._rC = 500

        self._CursorX = 0
        self._CursorY = 0
        self._CursorXt = 0
        self._CursorYt = 0
        self._CursorRt = 0
        self._Color = 0    

        print(self.geometry())
        self._W = self.width()
        self.setStyleSheet("background-color: black")
        self.setGeometry(QtCore.QRect(2000,50,500,300))
        self.showFullScreen()


    def paintEvent(self, e):
        qp = QtGui.QPainter()
        qp.begin(self)
        self._drawTarget(qp)
        self._drawCursor(qp)
        qp.end()

    def _drawTarget(self, qpT):

        # color1 = QtGui.QColor()
        # color1.setNamedColor('#d4d4d4')

        color1=QtGui.QColor(self._Color)

        qpT.setPen(color1)

        qpT.setBrush(QtGui.QColor(self._Color))
        qpT.drawEllipse(QtCore.QPointF(self._CursorXt, self._CursorYt), self._CursorRt, self._CursorRt)

    def _drawCursor(self, qpC):

        color2 = QtGui.QColor(0, 0, 0)
        color2.setNamedColor('#FFFF00')
        qpC.setPen(color2)

        qpC.setBrush(QtGui.QColor('#FFFF00'))
        qpC.drawEllipse(QtCore.QPointF(self._CursorX, self._CursorY), 20, 20)

    def mousePressEvent(self, QMouseEvent):
        print ("mouse position")
        print (QMouseEvent.pos())

    def setCursorPosition(self,x,y,xt,yt,Rt,color):
        self._CursorX = x
        self._CursorY = y
        self._CursorXt = xt
        self._CursorYt = yt
        self._CursorRt = Rt
        self._Color = color 
        self.update()



class MyProcess:
    def __init__(self, whichGui):
        self._x = 0
        self._y = 0 
        self._xt = 0
        self._yt = 0
        self._Rt = 0
        self._color = 0
        self._whichGui = whichGui
        self._T = QtCore.QTimer()
        self._T.timeout.connect(self._update)
        self._T.start(30)

    def _update(self):

        data, addr = sock.recvfrom(8*6)
        #print ("received message:", data)
        value = struct.unpack('dddddd', data)
        #print (value)
        self._xt = value[0]
        self._yt = value[1]
        self._Rt = value[2]
        self._x = value[3]
        self._y = value[4]
        self._color = value[5]
        self._whichGui.setCursorPosition(self._x, self._y, self._xt, self._yt, self._Rt, self._color)


# Run the Graph
G = MyGui()
G.show()


P = MyProcess(G)
4

0 に答える 0