2011-10-02 86 views
5

我有一個紅外攝像機/跟蹤器,我正在通過串口進行通信。我正在使用pyserial模塊來做到這一點。相機以60 Hz的速率更新被跟蹤物體的位置。爲了獲得跟蹤對象的位置,我執行一個pyserial.write(),然後用pyserial.read(serialObj.inWaiting())監聽一個傳入的回覆。一旦接收到回覆/位置,重新進入while循環等等。我的問題與這種方法的可靠性和速度有關。我需要計算機以至少60Hz的速率獲得位置(然後位置將通過UDP發送到實時操作系統)。這是Pyserial/Python的能力嗎?或者我應該考慮其他基於C的方法嗎?pyserial/python和實時數據採集

感謝, 盧克

+1

這是怎麼產生的?你能用Python獲得什麼樣的採樣率?我已經做了一些簡單的數據採集,通過RS232的奧豪斯規模,但只能得到5hz(可能是規模) – Chris

回答

0

Python 應該保持良好狀態,但最好的辦法是確保您監控您每秒讀取多少條讀取數據。計算每秒完成讀取的次數,如果此數字太低,請寫入性能日誌或類似內容。您應該考慮將python程序的其餘部分(如果有的話)的I/O部分從pyserial讀取調用阻塞中解耦出來。

+1

謝謝大家的所有答案。我想我會在考慮轉移到別的東西之前測試讀/寫pyserial函數的性能。但是你能解釋一下阻塞的串口調用以及爲什麼它們可能需要解耦其餘的程序(你是對的,讀/寫只是所需功能的一小部分)。 – dataman

+0

Pyserial將默認阻止讀取調用(您可以配置它,所以它不會這樣做)。這意味着當你調用'read'時,整個程序都會等待寫入內容,然後讀取它,然後你的程序就可以繼續。有幾種解決方法,無論是使用非阻塞調用('read'立即返回,但可能什麼都不用),事件驅動框架如扭曲(扭曲知道你在等待,並在此期間做其他事情),或通過使用進程/線程(儘管您在收聽進程中的傳入消息時遇到同樣的問題)。 – jozzas

+1

是的,我已經設置了超時= 0,然後最終得到一次一個字符。也就是說,我在while循環中執行serial.read(1),並檢查表示返回命令結束的'\ r',並且在滿足條件時,我發出一個新的get位置請求。從一些簡單的實驗來看,似乎我沒有錯過相機系統中的任何相框,這很棒,雖然我想以某種方式確保這種情況總是如此。就像我在程序執行時打開瀏覽器一樣,是否有強制腳本具有最高優先級的方法? – dataman

1

這是潛伏期比速度更加的問題。

Python總是執行內存分配和釋放,但是如果數據被重用,C庫會重用相同的內存。因此,操作系統(C庫/ UDP/IP協議棧)比Python本身具有更多的影響力。

我真的認爲你應該在你的RTOS機器上使用串口,​​並使用C代碼和預先分配的緩衝區。

0

我會懷疑Python會跟上數據就好了。我的建議是嘗試一下,如果Python中顯得滯後,然後嘗試PyPy代替 - 的Python的實現,編譯大部分的內循環到機器代碼的速度接近,這樣C.

http://pypy.org/