對Bhuman中模塊的執行順序的理解

原文網址:http://blog.csdn.net/lzf824446/article/details/7467633

弄懂了Module從創建到運行的機制以及執行順序.

模塊包含兩個部分:requirementsrepresentations.⼀個模塊包含⼀個或多個requirements 和representations.

一個representation只能由一個模塊更新.

在定義⼀個模塊的時候他們分別使用宏REQUIRES 和PROVIDES進行添加到模塊中.

motion(或者cognition)的moduleManager::update的主要作用就是將providers構造出來,也就是將屬於motion(或者cognition)的真正模塊創建出來. 在這裏還將(shared)共享的部分提取出來了. 一是爲了傳遞到sortProvider中作爲算法的輸入, 二是爲了在使用simulator進行模塊的調試時, 不同進程中的模塊通信通過stream進行傳遞,機器人程序是線程的, 因此不需要考慮shared中的stream.(注: 在NAO上和在simulator中,motion與cognition都只是作爲線程運行的)

sortProvider的作用就是將providers進行排序,解決模塊之間的依賴關係.

如:A模塊提供(PROVIDES)給B模塊 representation.A模塊需要(REQUIRES)C模塊的提供(PROVIDES)的representation.
則: 在providers中的整理後的順序爲: 
C--> A --> B

以上解決是僅僅是motion(或者cognition)中的模塊之間的依賴關係. 也就是說, 模塊的順序, 是依靠representation的依賴關係來決定的. 大家可以仔細捉摸B-Human文檔中的模塊關係圖, 再對照Modules中的每一個具體模塊, 看一看模塊的定義部分, 即可知道其中的奧妙. 


那motion與cognition之間的更新順序又是如何的? 需要考慮嗎?
    答:由於motion與cognition是作爲線程運行的.motion運行速度爲10ms運行⼀一次,cognition爲33ms運行⼀一次. motion與cognition是併發運行的.當motion需要用到cognition的模塊時, 直接使用即可, 因爲此時可以保證,motion使用的在cognition中的模塊⼀一定是最新的.在整個進程框架中,motion與cognition之間並沒有任何阻塞條件,他們之間是暢通無阻的. 而僅僅在調試或者作爲進程實現的時候, 就必須通過timeStamp進行同步, 模塊之間通過shared交流. 因此,motion與cognition之間的更新順序就不需要考慮. 


注意: 整個process框架僅僅是爲了調試或者實現進程而添加的.  因此, 在機器人上跑的程序是不需要考慮兩個線程之間的同步問題.

setEventID僅僅設置時間條件. 到了一定的時間就切換.

timeStamp僅僅是用於進程通信或者調試.


由此, 我們可知, B-Human已經保證了整個模塊執行的順序. 不需要考慮順序問題. 僅僅去專注學習各個算法部分即可.



不得不佩服Thomas Roefer. 幾乎整個底層工作全部是他一個人搭建的.  以及一些機器人中關鍵的算法理論部分(特別是運動控制這一塊), 也是由他來設計的. 但我們也得堅信自己可以做到. 畢竟他的工作已經開展了有好幾年了, 纔有了現在的B-Human程序框架.



不知道夠不夠詳細, 如有不詳細的, 可以與我聯繫.QQ:824446 

希望能夠構建一個開放式交流學習氛圍. 也算是另一種開源思想吧.

也可以留言到博客,  我會定期查看, 並更新問題.


發佈了59 篇原創文章 · 獲贊 91 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章