实时数据绘制滞后于whi

2024-04-27 15:22:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在为一个实验室的工作站自动化写一个程序。我交流的一种仪器叫做光束轮廓仪,它基本上是从两个或两个方向(x,y)读取光的输入。一旦输入被读取,我需要将其转换为2D图像,为此我使用numpy meshgrid并能够获得所需的输出。 为了获得更好的清晰度,请参见下图。x轴和y轴上的两条高斯线是我的原始输入,彩色图形经过meshgrid处理。 enter image description here

为此,我把我的软件分成两部分。首先,我创建另一个QT线程来初始化我的设备并在循环中运行,获取数据并进行处理。然后这个线程向主线程发送一个包含值的信号。在

在主线程中,我获取值、绘制图形并更新gui屏幕。在

它已经开始工作了,问题是当我启动光束轮廓仪读数时,随着时间的推移,软件开始变慢。一开始我以为这是因为数据处理,但它没有意义,因为它在第二个线程中运行,当我启动设备时没有延迟。 这看起来就像是在内存中“保存”数据并变得更慢,这很奇怪,因为我使用set_data和{}方法来绘制。在

注意:如果我关闭我的软件内的设备读数滞后停止,如果我再次启动它,它开始良好,但随着时间的推移会滞后。在

我们非常感谢您的帮助!在

数据采集线程代码:

class ThreadGraph(QtCore.QThread):
    _signalValues = QtCore.pyqtSignal(float, float, float, float, float, float, float, float)
    _signalGraph = QtCore.pyqtSignal(np.ndarray, np.ndarray, np.ndarray, np.ndarray, np.ndarray)
    _signalError = QtCore.pyqtSignal(str)
    BEAMstatus = QtCore.pyqtSignal(str)

    def __init__(self, parent=None):
        super(ThreadGraph, self).__init__(parent)
        self.slit = 0
        self.state = False

    #Thread starts
    def run(self):
        self.init() #Device initialization (Not relevant, therefore omitted)
        time.sleep(0.1)
        while self.state == True: #Thread loop (data acquisition)
            self.emitValues() #Fun to get the data and emit
            time.sleep(0.016)
            self.emitGraph() #Process data into 2D and emit
        try: #When while is over, terminate the thread
            self.beam.close(self.session)
        except RuntimeError as err:
            print err 
        self.quit()

    def emitGraph(self): #Use the data acquired to to generate 2D image and emit
        xx, yy = np.meshgrid(self.slit_data_int[self.slit][0::10], self.slit_data_int[self.slit+1][0::10])
        zz = xx * yy

        self._signalGraph.emit(
            self.slit_data_pos[self.slit][0::10],
            self.slit_data_int[self.slit][0::10],
            self.slit_data_pos[self.slit + 1][0::10],
            self.slit_data_int[self.slit + 1][0::10],
            zz
            )


    def emitValues(self):
        try: #Try to get data from device (data is stored in calculation_result)
            self.slit_data_pos, self.slit_data_int, self.calculation_result, self.power, self.power_saturation, self.power_intensities = self.beam.get_slit_scan_data(self.session)
        except RuntimeError as err:
            self._signalError.emit(str(err))
            return
        else: #emit data to gui main thread
            self._signalValues.emit(
                self.calculation_result[self.slit].peakPosition, 
                self.calculation_result[self.slit + 1].peakPosition,
                self.calculation_result[self.slit].peakIntensity, 
                self.calculation_result[self.slit + 1].peakIntensity,
                self.calculation_result[self.slit].centroidPosition, 
                self.calculation_result[self.slit + 1].centroidPosition,
                self.calculation_result[self.slit].gaussianFitDiameter, 
                self.calculation_result[self.slit + 1].gaussianFitDiameter
                )

主Gui代码:

^{pr2}$

编辑:我还有一个摄像头连接到我的系统,我也用opencv在gui中显示它。我注意到,如果我启动凸轮,光束轮廓仪的fps几乎减少到一半。那么,也许QT绘制优化是一种可行的方法?在


Tags: toselfdatadefnpresultfloat线程
1条回答
网友
1楼 · 发布于 2024-04-27 15:22:52

调用canvas.draw()代价高昂。获取数据的速度可能比命令更快。这将导致绘制事件排队,并且您的绘图将显示为延迟。这个blog post详细说明了一个避免调用canvas.draw()并可用于加速matplotlib实时打印的方法。在

如果这仍然不够快,您可能必须降低采集速率,实施某种形式的帧跳转机制,或使用一个更好地优化速度的不同打印库。在

相关问题 更多 >