通过Python实时操作

时间:2011-08-16 14:31:50

标签: python real-time

所以我是一个没有经验的Python编码器,我收集的内容可能是一个相当复杂的需求。我是一名认知科学家,我需要精确的刺激显示和按钮按压检测。我被告知,最好的方法是使用实​​时操作,但不知道如何去做。理想情况下,每次试验,程序都会实时运行,然后一旦试验结束,操作系统就可以回到不那么细致的状态。将有大约56项试验。可能有办法从我的python脚本编写代码吗?

(然后,我需要知道的是实际显示刺激的时间。实时方法可以确保刺激在我想要的时候显示,自上而下的方法。另一方面。 ,如果知道记录计算机实际有机会显示它的话,我可以采取更自下而上的方法。)

5 个答案:

答案 0 :(得分:4)

根据纯粹主义者的标准,Python不是一种实时语言 - 它有太多的库和函数可以快速实现。如果您已经通过操作系统,而不是嵌入式系统,那么您已经失去了很多真正的实时功能。 (当我听到“实时”时,我认为VHDL代码需要经过FPGA线路的时间。其他人用它来表示“我按下了一个按钮,从人类的慢角度来看,它做了一些事情,瞬间“我会假设你正在使用后者对实时的解释。”

通过刺激显示和按钮按下检测,我认为你的意思是你有一些东西(例如)像试验那样向人们展示一个图像并让他们点击一个按钮来识别图像或确认他们已经看到它 - 也许是为了测试反应速度。除非你担心精确到毫秒(与人类反应的时间相比应该可以忽略不计),否则你可以使用python进行这样的测试。要使用GUI,请查看Tkinter:http://www.pythonware.com/library/tkinter/introduction/。要处理刺激和按钮按下之间的时间,请查看时间文档:http://docs.python.org/library/time.html

祝你好运!

答案 1 :(得分:4)

因为您试图以毫秒精度对时间延迟进行科学测量,所以我不推荐任何在通用计算机上进行时间切片的过程。无论是在C,Java还是Python中实现,如果它以分时模式运行,那么结果如何可以验证?您可能会被要求证明CPU在测量过程中从不中断过程,从而扭曲了结果。

听起来你可能需要为此目的构建一个专用设备,其时钟电路以已知速率滴答,并且可以测量刺激和响应之间发生的离散滴答数。然后可以通过没有这种时序约束的软件来控制该设备。也许您应该将此问题发布到Electrical Engineering交换。

如果没有专用设备,您将不得不开发真正的实时软件,它是现代操作系统的术语,在内核中运行,不受任务切换的影响。这不容易做到,并且需要花费很多精力才能做到正确。我想,还有更多的时间,而不是为了你的目的而建造专用的软件可控设备。

答案 2 :(得分:3)

最常见的操作系统中断可变,足以破坏实验中的时间,无论您的编程语言如何。 Python增加了它自身的不可靠性。 Windows中断特别糟糕。在Windows中,大多数中断在大约4毫秒内得到服务,但偶尔中断的持续时间超过35毫秒! (Windows 7的)。

我建议您尝试使用PsycoPy应用程序查看是否适合您。它通过尝试使图形卡在openGL中完成工作来解决问题,但是其中一些代码仍在图形卡外部运行并受操作系统中断的影响。你现有的python代码可能与PsycoPy不兼容,但至少你会留在Python中。 PsycoPy特别擅长于在没有计时问题的情况下显示视觉刺激。请参阅其文档中的此页面,了解如何按下按钮:http://www.psychopy.org/api/event.html

要以正确的方式解决您的问题,您需要一个实时操作系统,例如LinuxRT或QNX。你可以在其中一个中尝试你的python应用程序,看看在实时环境中运行python是否足够好,但即使python引入了可变性。如果python决定垃圾收集,你会有一个小故障。 Python本身并不是实时的。

NI推出了一种设置,允许您使用一种名为LabviewRT的易于使用的编程语言实时编程。 LabviewRT将您的代码推送到实时运行的FPGA子卡中。它的价格昂贵。

我强烈建议您不要只是尽量减少这个问题,而是解决它,否则,您的审稿人会感到不舒服。

答案 3 :(得分:2)

如果您在Linux机器上运行Python代码,请使内核具有低延迟(抢占式)。 编译内核时会有一个标志。

确保机器上运行的其他进程最小,这样它们就不会中断内核。

为Python脚本分配更高的任务优先级。

答案 4 :(得分:0)

  1. 在实时操作系统或经过调整的linux上运行python解释器。
  2. 在实验过程中关闭垃圾收集器,然后再返回。
  3. 也许在实验结束后主动触发垃圾回收。

此外,请记住,显示图像不是瞬时的。您必须将您的实验与显示器的垂直回溯阶段(传输显示器内容的一帧的最后一行和下一帧的第一行之间的暂停)同步。

我将在传输包含应该对任何候选内容进行响应的帧之后,在vsync阶段的开始启动计时器。

并且必须牢记,为了获得绝对的反应时间,图像的显示时间要比图像的显示时间至少早一点,以得到恰好可比较的结果,而由于监视器内容的非瞬时出现(〜10 ms @ 60Hz)。