簡體   English   中英

通過Python實時操作

[英]Real-time operating via Python

所以我是一個沒有經驗的 Python 編碼器,我收集到的可能是一個相當復雜的需求。 我是一名認知科學家,我需要精確的刺激顯示和按鈕按下檢測。 有人告訴我最好的方法是使用實時操作,但我不知道如何解決這個問題 go。 理想情況下,每次試驗,程序都會實時運行,然后一旦試驗結束,操作系統可以 go 回到不那么細致的狀態。 將進行大約 56 次試驗。 可能有一種方法可以從我的 python 腳本對此進行編碼嗎?

(話又說回來,我只需要知道什么時候實際顯示刺激。實時方法可以確保刺激在我想要的時候顯示,這是一種自上而下的方法。另一方面,我可以如果只知道記錄計算機實際有機會顯示它的時間會更容易,則采用更自下而上的方法。)

當人們談論實時計算時,他們的意思是從中斷(通常由定時器觸發)到處理正在運行的中斷的應用程序代碼的延遲既小又可預測。 這意味着可以以非常精確的時間間隔重復運行控制過程,或者像您的情況一樣,可以非常精確地定時外部事件。 延遲的變化通常稱為“抖動” - 1ms 最大抖動意味着重復到達的中斷將具有最多變化 1ms 的響應延遲。

“小”和“可預測”都是相對術語,當人們談論實時性能時,它們可能意味着 1μs 最大抖動(例如,構建用於電力傳輸的逆變器的人關心這種性能)或者它們可能意味着幾個毫秒最大抖動。 這一切都取決於應用程序的要求。

無論如何,Python 不太可能是適合這項工作的工具,原因如下:

  • Python 主要在桌面操作系統上運行。 桌面操作系統對最大抖動施加了下限; 在 Windows 的情況下,是幾秒鍾。 多秒事件不會經常發生,每天或每兩天發生一次,如果有一個與您要測量的事物同時發生,您會很不幸,但遲早會發生; 幾百毫秒區域的抖動更頻繁地發生,可能每小時發生一次,而數十毫秒區域的抖動相當頻繁。 桌面 Linux 的數字可能相似,但您可以對 Linux Z50484C19F1AFDAF3841A0D821ED393_D2Z 應用不同的編譯時選項和補丁集以改善這種情況 - Google PREEMPT_FULL。
  • Python 的“停止世界”垃圾收集器使延遲變得不確定。 當 Python 決定它需要運行垃圾收集器時,您的程序將停止,直到它完成。 您可以通過仔細的 memory 管理和仔細設置垃圾收集器參數來避免這種情況,但取決於您使用的庫,您也可能不會。
  • Python 的 memory 管理的其他特性使確定性延遲變得困難。 大多數實時系統避免堆分配(即 C 的malloc或 C++ 的new ),因為它們所花費的時間量是不可預測的。 Python 巧妙地隱藏了這一點,因此很難控制延遲。 同樣,使用大量那些好的現成庫只會讓情況變得更糟。
  • 同樣,實時進程必須將其所有 memory 保存在物理 RAM 中,而不是分頁進行交換。 在 Python 中沒有很好的方法來控制這一點,尤其是在 Windows 上運行(在 Linux 上,您可能能夠在某個地方調用mlockall ,但任何新的分配都會讓事情不安)。

不過,我有一個更基本的問題。 您不會說您的按鈕是物理按鈕還是屏幕上的按鈕。 如果它在屏幕上,操作系統將在物理鼠標按鈕按下和到達您的 Python 應用程序的事件之間施加不可預測的延遲量。 你將如何解釋這一點? 如果沒有更准確的測量方法,你怎么知道它是否存在?

大多數常見操作系統的中斷都是可變的,足以破壞您的實驗中的時間,無論您的編程語言如何。 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 本身不是實時的。

National Instruments 銷售一種設置,允許您使用一種非常易於使用的編程語言 LabviewRT 進行實時編程。 LabviewRT 將您的代碼推送到實時運行的 FPGA 子卡中。 它的價格昂貴。

我強烈建議你不要只是最小化這個問題,而是要解決它,否則,你的審稿人會感到不舒服。

按照純粹主義者的標准,Python 不是一種實時語言——它有太多的庫和函數,無法快速運行。 但是,如果您已經在使用操作系統,而不是嵌入式系統,那么您已經失去了很多真正的實時功能。 (當我聽到“實時”時,我認為 VHDL 代碼流過 FPGA 的線路所花費的時間。其他人用它來表示“我按下一個按鈕,它會做一些事情,從我緩慢的人類角度來看,這是瞬時的“。我假設您使用的是后一種實時解釋。)

通過刺激顯示和按鈕按下檢測,我假設你的意思是你有一些東西(例如),比如你向一個人展示一張圖像並讓他們點擊一個按鈕來識別圖像或確認他們已經看到它——也許是為了測試反應速度。 除非您擔心精確到毫秒(與人類反應的時間相比應該可以忽略不計),否則您可以使用 python 進行這樣的測試。 要使用 GUI,請查看 Tkinter: http://www.pythonware.com/library/tkinter/introduction/ 要處理刺激和按下按鈕之間的時間,請查看時間文檔: http://docs.python.org/library/time.html

祝你好運!

因為您正試圖以毫秒精度對時間延遲進行科學測量,所以我不能推薦任何在通用計算機上進行時間切片的過程。 無論是在C,還是Java,還是Python中實現,如果是分時運行,那結果如何驗證? 您可能會面臨挑戰,以證明 CPU 在測量期間從未中斷過進程,從而扭曲了結果。

聽起來您可能需要為此目的構建一個專用設備,其時鍾電路以已知速率滴答,並且可以測量刺激和響應之間發生的離散滴答數。 然后,該設備可以由沒有此類時序約束的軟件控制。 也許您應該將此問題發布到電氣工程交流。

如果沒有專用設備,您將不得不開發真正的實時軟件,根據現代操作系統,在 kernel 中運行並且不受任務切換的影響。 這並不容易做到,需要付出很多努力才能做到。 我猜想,比您為您的目的構建專用的軟件可控設備所花費的時間更多。

如果您在 Linux 機器上運行 Python 代碼,請將 kernel 設置為低延遲(搶占式)。 編譯 kernel 時有一個標志。

確保機器上運行的其他進程最小,這樣它們就不會中斷 kernel。

為您的 Python 腳本分配更高的任務優先級。

  1. 在實時操作系統上運行 python 解釋器或調整 linux。
  2. 在實驗期間關閉垃圾收集器,然后再重新打開。
  3. 也許在實驗結束后主動觸發垃圾回收輪。

此外,請記住,顯示圖像不是即時的。 您必須將您的實驗與顯示器的垂直回掃階段(傳輸顯示內容的最后一行和下一幀的第一行之間的暫停)同步。

在傳輸包含任何候選者應該做出反應的幀之后,我會在 vsync 階段開始時啟動計時器。

並且必須記住,為了獲得絕對反應時間,由於非監視器內容的瞬時出現(~10 ms @ 60Hz)。

是的,可以在 Python 中編寫實時處理代碼。有幾個可用的庫和框架可用於此目的,例如:

PyAudio -PyAudio 為跨平台音頻 I/O 庫 PortAudio 提供 Python 綁定. 它可用於實時記錄和處理音頻。

Pygame - Pygame 是一組專為編寫視頻游戲而設計的 Python 模塊。 它還可以用於實時音頻和視頻處理。

OpenCV - OpenCV 是一個可用於實時圖像和視頻處理的計算機視覺庫。

Tornado -Tornado 是一個 web 框架和 Python 的異步網絡庫。它可用於構建實時 web 應用程序.

NumPy和SciPy - NumPy和SciPy是Python中的科學計算庫,可用於實時信號處理等數值計算。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM