使用 pyqtgraph 和 LiDAR 快速、实时地绘制点
Fast, Real-time plotting of points using pyqtgraph and a LiDAR
我想创建一个实时的点绘图 GUI。我正在使用 Scanse Sweep LiDAR,在每次扫描此 LiDAR(工作频率在 1 - 10Hz 之间)时,我都会收到大约 1000 个点 (x, y) 来描述周围的 LiDAR。这是一个二维激光雷达。
我到处查看并尝试了无数的 pyqtgraph 代码片段,但它要么崩溃,要么非常慢,要么根本不起作用。
是否有创建绘图仪的直接方法 window 并在每次新 scan/data 交付时,将那些 点 推送到绘图仪 window?
感谢任何形式的帮助
我不清楚你到底想做什么,所以我假设你想制作一个每秒刷新 10 次的 1000 个点的散点图。下次请包含您的代码,以便我们可以重现您的问题并查看您想要实现的目标。
根据我的经验,PyQtGraph 是 Python 中最快的选项。它可以轻松地以 10 Hz 的频率绘制 1000 个点。请参阅下面的示例。
#!/usr/bin/env python
from PyQt5 import QtCore, QtWidgets
import pyqtgraph as pg
import numpy as np
class MyWidget(pg.GraphicsWindow):
def __init__(self, parent=None):
super().__init__(parent=parent)
self.mainLayout = QtWidgets.QVBoxLayout()
self.setLayout(self.mainLayout)
self.timer = QtCore.QTimer(self)
self.timer.setInterval(100) # in milliseconds
self.timer.start()
self.timer.timeout.connect(self.onNewData)
self.plotItem = self.addPlot(title="Lidar points")
self.plotDataItem = self.plotItem.plot([], pen=None,
symbolBrush=(255,0,0), symbolSize=5, symbolPen=None)
def setData(self, x, y):
self.plotDataItem.setData(x, y)
def onNewData(self):
numPoints = 1000
x = np.random.normal(size=numPoints)
y = np.random.normal(size=numPoints)
self.setData(x, y)
def main():
app = QtWidgets.QApplication([])
pg.setConfigOptions(antialias=False) # True seems to work as well
win = MyWidget()
win.show()
win.resize(800,600)
win.raise_()
app.exec_()
if __name__ == "__main__":
main()
其工作方式如下。通过绘制一个空列表,创建了一个 PlotDataItem。这表示点的集合。当新数据点到达时,使用 setData
方法将它们设置为 PlotDataItem 的数据,从而删除旧数据点。
我想创建一个实时的点绘图 GUI。我正在使用 Scanse Sweep LiDAR,在每次扫描此 LiDAR(工作频率在 1 - 10Hz 之间)时,我都会收到大约 1000 个点 (x, y) 来描述周围的 LiDAR。这是一个二维激光雷达。
我到处查看并尝试了无数的 pyqtgraph 代码片段,但它要么崩溃,要么非常慢,要么根本不起作用。
是否有创建绘图仪的直接方法 window 并在每次新 scan/data 交付时,将那些 点 推送到绘图仪 window?
感谢任何形式的帮助
我不清楚你到底想做什么,所以我假设你想制作一个每秒刷新 10 次的 1000 个点的散点图。下次请包含您的代码,以便我们可以重现您的问题并查看您想要实现的目标。
根据我的经验,PyQtGraph 是 Python 中最快的选项。它可以轻松地以 10 Hz 的频率绘制 1000 个点。请参阅下面的示例。
#!/usr/bin/env python
from PyQt5 import QtCore, QtWidgets
import pyqtgraph as pg
import numpy as np
class MyWidget(pg.GraphicsWindow):
def __init__(self, parent=None):
super().__init__(parent=parent)
self.mainLayout = QtWidgets.QVBoxLayout()
self.setLayout(self.mainLayout)
self.timer = QtCore.QTimer(self)
self.timer.setInterval(100) # in milliseconds
self.timer.start()
self.timer.timeout.connect(self.onNewData)
self.plotItem = self.addPlot(title="Lidar points")
self.plotDataItem = self.plotItem.plot([], pen=None,
symbolBrush=(255,0,0), symbolSize=5, symbolPen=None)
def setData(self, x, y):
self.plotDataItem.setData(x, y)
def onNewData(self):
numPoints = 1000
x = np.random.normal(size=numPoints)
y = np.random.normal(size=numPoints)
self.setData(x, y)
def main():
app = QtWidgets.QApplication([])
pg.setConfigOptions(antialias=False) # True seems to work as well
win = MyWidget()
win.show()
win.resize(800,600)
win.raise_()
app.exec_()
if __name__ == "__main__":
main()
其工作方式如下。通过绘制一个空列表,创建了一个 PlotDataItem。这表示点的集合。当新数据点到达时,使用 setData
方法将它们设置为 PlotDataItem 的数据,从而删除旧数据点。