带有 Python 的粒子过滤器 GUI

Posted

技术标签:

【中文标题】带有 Python 的粒子过滤器 GUI【英文标题】:Gui for Particlefilter with Python 【发布时间】:2015-12-22 14:00:23 【问题描述】:

我正在尝试实现一个粒子过滤器,我为此选择了 python,因为我有点喜欢 python。到目前为止,我已经使用 tkinter 和 python 3.4 编写了我的 gui。

我使用 tkinter.canvas 对象显示地图(使用 PIL 加载的 png 图像),然后为每个粒子创建点,例如:

dot = canvas.create_oval(x, y, x + 1, y + 1)

当机器人移动时,我用机器人的控制命令、粒子位置和粒子对齐来计算每个粒子的新位置。 移动粒子 tkinter.canvas 有两种方法:

canvas.move()canvas.coords()

但是这两种方法似乎都会立即更新 gui,当大约有 100 个粒子时这是可以的,但如果有 200 - 5000 个粒子(我实际上应该在一开始就进行全局本地化)时就不行了。所以我的问题是gui的性能。

所以我的实际问题是:tkinter 中有没有办法阻止画布更新 gui,然后更改 gui,然后再次更新 gui?或者你能推荐一个比 tkinter 更好的模块吗?

【问题讨论】:

你可能想看看 pygame - 如果你想一下,用例听起来很像一个游戏,而且 pygame 允许比 tk 更好的视频处理机制 我过去已经测试过 pygame,但当时它似乎有点复杂。我现在会尝试用 tkinter 来做(主要是因为我的整个 gui 已经用 tkinter 编写了,我对重写它并不那么兴奋),因为性能问题似乎来自计算而不是来自 gui。但是谢谢你的想法:) 【参考方案1】:

您的观察不正确。画布不会立即更新。在事件循环能够处理事件之前,不会重绘椭圆形。在重新绘制画布之前,很有可能更新数千个对象。不过,画布并不是一种高性能工具,因此以高帧速率移动数千个对象会很困难。

如果您看到对象立即更新,可能是因为您在代码中的某处调用了updateupdate_idletasks,或者您以其他方式允许事件循环运行。

那么,您的问题的具体答案是确保您不调用updateupdate_idletasks,或者让事件循环处理事件,直到您更改所有粒子的坐标.

以下是一个简短的示例。当它运行时,请注意所有粒子都以一秒的间隔同时移动。这是因为所有的计算都是在允许事件循环重绘画布上的项目之前完成的。

import Tkinter as tk
import random

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.canvas = tk.Canvas(self, width=500, height=500, background="black")
        self.canvas.pack(fill="both", expand=True)

        self.particles = []
        for i in range(1000):
            x = random.randint(1, 499)
            y = random.randint(1, 499)
            particle = self.canvas.create_oval(x,y,x+4,y+4,
                                               outline="white", fill="white")
            self.particles.append(particle)

        self.animate()


    def animate(self):
        for i, particle in enumerate(self.particles):
            deltay = (2,4,8)[i%3]
            deltax = random.randint(-2,2)
            self.canvas.move(particle, deltax, deltay)

        self.after(30, self.animate)

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()

【讨论】:

我现在发现我的想法走错了方向。我做了一些时间测试,发现耗时的部分是粒子的计算和粒子的重新采样。现在我需要弄清楚如何改进它(但这是另一个问题)。非常感谢:)

以上是关于带有 Python 的粒子过滤器 GUI的主要内容,如果未能解决你的问题,请参考以下文章

Python Qt GUI设计:5种事件处理机制(提升篇—3)

Python Qt GUI设计:5种事件处理机制(提升篇—3)

Python Qt GUI设计:5种事件处理机制(提升篇—3)

在视频稳定中使用卡尔曼滤波器或粒子滤波器平滑运动

python 带有行过滤器的happybase连接池演示

ROS1云课→26机器人Gmapping等环境地图构建