移動機器人控制軟件的設計與實現(xiàn)_第1頁
移動機器人控制軟件的設計與實現(xiàn)_第2頁
移動機器人控制軟件的設計與實現(xiàn)_第3頁
移動機器人控制軟件的設計與實現(xiàn)_第4頁
移動機器人控制軟件的設計與實現(xiàn)_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、移動機器人控制軟件的設計與實現(xiàn) 作者:李曉明   文章來源:Blog.RoboticFan.Com  更新時間:2006-8-9 17:25:55   點擊數: 2742簡介:現(xiàn)在做一個移動機器人是很容易的一件事,車體自己可以加工,或買現(xiàn)成的;避障可以用超聲陣列;導航可以用激光測距LMS;定位可以用電子地圖加LMS加陀螺儀;然而控制軟件卻只能自己編寫。本文或許可以給你一些啟示。 相關鏈接基于VIA平臺的移動機器人移動機器人的應用現(xiàn)在非常多,做一個移動機器人似乎也很容易,車體自己可以加工,也可以去買現(xiàn)成的;避障可以用超聲陣列;導航可以用

2、激光測距LMS;定位可以用電子地圖加LMS加陀螺儀;驅動可以用各種電機及配套驅動器或者自己做;通訊可以去買現(xiàn)成的無線通訊模塊,可以是數字的,也有模擬的;大范圍定位可以用GPS模塊,也是現(xiàn)成的;至于什么紅外,藍牙,甚至計算機視覺都可以去市場上買,但是(然而)為什么做一個移動機器人還是這么難呢?尤其是對一個新手而言。一個老外說過,硬件是現(xiàn)成的,軟件算法雜志里有的是,很多可以在網上當,但即使是一個博士生也要花費很長的時間完成一個實際可用的移動機器人。為什么?因為機器人應用的困難在應用軟件的設計上。前面那個老外也說過,現(xiàn)在什么都可以在網上當,唯獨應用程序不能。有過自己寫移動機器人程序的人可能會理解這段

3、話,當然也僅僅是可能,因為不排除有很多機器人大拿一上來就可以寫出很棒的移動機器人軟件。移動機器人的控制軟件開發(fā)是和硬件緊密相關的,甚至和機器人的體系結構也密切相關,同樣是移動機器人,有的是用PC控制的,有的是用多個嵌入式系統(tǒng)實現(xiàn)的,有的則是多機器人協(xié)同工作的,操作系統(tǒng)有人會用DOS,有人會用Windows,有人會用Linux,有人會用Embeded Operation System。硬件平臺有的用x86,有的用ARM芯片,有的會用DSP,通訊里面會有串口,TCP/IP網絡,無線以太網,紅外,藍牙等,甚至驅動機構也不一樣,有的是用腿,有的是用輪子,即使是輪子也有好多種情況,兩個輪子,三個輪子(包

4、括兩個獨立驅動輪一個隨動輪,或者兩個同步驅動輪一個轉向輪等),四個輪子,五個輪子等等,有的是集中控制的體系結構,有的是分布式控制的體系結構。應用也不同,有智能行走的,有人遠程控制的,也有人機結合的,諸如此類,這樣看來,移動機器人應用程序的開發(fā)的確是很復雜,“無法從網上直接當了”,看來只能自己從頭開始編寫代碼了這一條路好走了。的確如此,但自己從頭編程序也存在一個問題,那就是如何著手。我們寫文章希望有模板,同樣寫機器人應用程序也希望能有一個模板,按照模板的約定,把自己編寫的模塊嵌進去,就可以得到一個應用程序了。可惜程序設計里面的模板無法移植到機器人程序設計領域,但是我們可以采用一個框架,在這個框架

5、的規(guī)范下,我們寫的模塊或者利用他人寫的模塊進行組合就可以得到一個合理的應用程序。框架的概念很廣,可大可小,大的可以做到像J2EE或者CORBA那么復雜,做企業(yè)級開發(fā),小的則只能在一個CPU上構件一個簡單的應用程序。我在開發(fā)移動機器人的時候設計了一種簡單框架,專門用來給采用PC對機器人進行集中控制的情況下編寫應用程序。在我的博士論文(在個人主頁里可以找到)里則設計了一種較復雜的框架,可以采用P2P技術實現(xiàn)多機器人或多系統(tǒng)的軟件應用開發(fā),而我現(xiàn)在正打算設計一種更通用,更復雜的,可以實現(xiàn)多平臺,多CPU,多系統(tǒng)環(huán)境下的移動機器人應用快速開發(fā),包括框架和中間件技術。這里只是先介紹一下目前正在使用的那個

6、PC用的軟件框架。值的一提的是,國內外已經有很多人在做或者已經做過這方面的工作了,我寫在這里的目的只是為了和大家交流。由于最近時間很緊張,每次只能寫一小點,所以打算分數次把這部分內容介紹完,主要包括框架的模型,模塊的接口定義,模塊之間的通訊,動態(tài)模塊的加載和配置,以及采用該框架實現(xiàn)的移動機器人應用舉例,并提供相應的框架的源代碼。1、引言我們初次編寫機器人軟件,通常有種“老虎啃天,無處下嘴”的感覺。編寫移動機器人程序和普通程序稍有不同,因為通常意義上的移動機器人程序都是多任務,實時的,甚至是分布式的。我們可以很容易的在計算機終端上顯示出“Hello,world”,也可以毫不費力的在移動機器人的液

7、晶屏上顯示出“Hello, World”,但是一邊讓機器人行走,一邊要避障,同時還要處理通訊、定位等工作就決不是那么容易了。這個時候我們需要的就是框架了。2、面向移動機器人的應用程序框架2.1、什么是框架?我的理解中,軟件里框架的概念很有點像計算機硬件里面的主板,它提供了系統(tǒng)運行所需要的電源,通訊等手段,并且所有符合總線協(xié)議的卡都可以往主板上插,從而實現(xiàn)所需要的功能和性能。例如把數據采集卡查到主板上,計算機就具有了數據采集的能力;把視頻卡插到主板上,計算機就具有了壓縮視頻的功能,此外還有顯卡,聲卡,網卡,電視卡,運動控制卡,傳真卡等等。軟件里的框架也是如此,它有點類似中間件的概念,提供了相當程

8、度的代碼支持,同時也定義了一些規(guī)范,這些規(guī)范包括通訊協(xié)議,模塊的接口定義等。用戶可以自己編寫模塊,也可以使用別人已經寫好的模塊,通過框架的運行,帶動模塊的運行,從而實現(xiàn)一些預期的功能。由此可見,框架必定是一種集成工具,其自身是一個完整的應用程序,而且可以通過模塊來擴展應用系統(tǒng)的功能和改進其性能;或者說,框架提供了應用程序的入口和出口,并能夠根據配置,加載相關的模塊實現(xiàn)功能的擴展和性能的提高。其中,功能的擴展通過編寫新的模塊實現(xiàn);性能提高則通過對原有模塊進行升級實現(xiàn)??蚣芎腕w系結構之間存在著微妙的關系,一方面可以說框架和體系結構無關,例如同樣用MFC,可以開發(fā)出各種體系結構的軟件系統(tǒng)來;另一方面

9、,框架和體系結構又結合的那么的緊密,例如J2EE是一種框架,而看到J2EE就令人想起了分布式的體系結構。CORBA亦是如此。主板和體系結構之間的關系就更令人弄不清了。因此我認為執(zhí)著的追求框架和體系結構的區(qū)別是沒有意義的,關鍵在于如何設計框架,使它更好用,效率更高。2.2、框架的設計框架設計的好壞對系統(tǒng)性能的影響當然非常重要,應當仔細考慮,全面分析,更重要的是能夠在實踐的過程中不斷的進行改進。目前我設計的這個軟件框架比較簡單,適合比較簡單的應用,當然可以在此基礎上進行進一步的完善,使之能夠適應更復雜應用的開發(fā)。1、R.A. Brooks的包容體系結構和分層遞階體系結構首先讓我們來看看目前移動機器

10、人所主要采用的體系結構。移動機器人目前所采用控制軟件的體系結構可以分為三類:一類是分層遞階式結構,一類是包容體系結構,最后一類是上述兩種結構的綜合。在分層遞階體系結構中,它把各種模塊安排成若干個層次,使不同層次的模塊具有不同的工作性能和操作方式,一般說來,位于高層的模塊負責復雜的判斷、推理等操作,其智能化程度較高;而較低的層次用于與外界交互,具有較強的實時響應能力,因此在底層往往是一些視覺,驅動,傳感,伺服等工作模塊。其中具有代表性的是Saridis的三級模型,即執(zhí)行級,協(xié)調級和組織管理級等。分層遞接體系結構主要特點是層次向上,智能增加,精度降低,實時性降低;層次向下則相反。分層遞接結構能夠較

11、好的解決智能和控制精度的關系,因此獲得了廣泛的應用,但也有一些明顯的缺陷,最主要的是它的反應性極差,因為處理問題的能力主要由高層解決,需要自下而上然后自上而下的來回過程,從而失去了高度智能性的實時反應能力。為了解決這個問題,R.A.Brooks提出了包容體系結構。包容體系結構結構圖如下圖所示:與分層遞接結構相比,包容體系結構是一種水平分片的結構,它的主要特點是按照“任務和行為”進行分類,把系統(tǒng)分解為若干個子系統(tǒng),每個子系統(tǒng)不是技術功能模塊,而是能夠獨立產生動作行為的系統(tǒng);每個子系統(tǒng)都能夠直接接收傳感器信號,也可以直接產生行為動作;每個子系統(tǒng)平行工作,由一個協(xié)調機制負責集成,從而產生總體的行為。

12、該體系結構設計目標為多任務,魯棒性,可擴展性以及較強的可判斷性。其基本設計思想來源于Brooks對智能的理解,即他認為能產生復雜行為的機器內部其控制系統(tǒng)不一定是復雜的,復雜的行為僅僅是復雜環(huán)境的反射;一個自主式智能系統(tǒng)必須具有永久的生存能力等。Brooks采用包容式體系結構,構造了多種機器人,這些機器人能夠實現(xiàn)其設計目標,表現(xiàn)出較強的智能行為,因此包容式體系結構在智能機器人領域產生了極大的影響,對傳統(tǒng)人工智能(基于符號和推理)產生了強烈的沖擊。但包容體系結構也存在不足之處,那就是功能層次之間缺乏協(xié)調和組織,盡管在局部行為上表現(xiàn)出靈活的反應能力和魯棒性,但對長遠目標和全局性的目標跟蹤缺乏主動性;

13、而且限制了對知識的運用,包括人的知識。因此,最近許多研究人員提出了一些新的體系結構,基本上是在包容體系結構的基礎上集成了傳統(tǒng)人工智能的方法,或者以分層遞接為骨架,在每一層次上引入了類似包容體系結構的布置,提高每一層次的響應能力。我把此類體系結構歸于第三類。分析分層遞接結構與包容體系結構,不難發(fā)現(xiàn),兩者都是基于模塊的基礎之上構建的,不同之處在于分層遞接結構中的模塊是功能模塊,而包容體系結構中的模塊是行為模塊。但即使是行為模塊也是由一些功能模塊組合實現(xiàn)的,因此模塊實際上是所有體系結構的基礎,不同之處就在于如何組織這些模塊,使其能夠發(fā)揮其在整個智能機器人體系中的作用。本項目在借鑒包容體系結構的基礎上

14、,結合多智能體技術,提出了一種基于模塊協(xié)同的體系結構。在此體系結構中,模塊既可以是功能模塊,也可以是行為模塊,對模塊的唯一要求是其必須能夠主動的對輸入的信號進行處理,并產生響應(類似智能體,即Agent)。體系結構如下圖所示2、移動機器人控制軟件框架的設計框架的設計一方面考慮了對體系結構的支持,另一方面又打算盡量與體系結構保持一定的獨立性,所以對框架做了高度的抽象,整體框架被抽象成了三個部分,即Platform平臺、Module模塊和Wire通訊連線等。整個框架的結構(部分)如下圖所示。其中Platform類負責模塊的加載,對模塊的配置以及模塊之間通訊的建立,Platform對象是整個應用程序

15、的入口(有Main函數)和出口,并不考慮體系結構和機器人功能的實現(xiàn),這些都是模塊和配置實現(xiàn)的。Module定義了模塊應該遵守的接口,和模塊要實現(xiàn)的基本功能。模塊和Applet類似,有初始化init,開始start,停止Stop和退出Destroy等行為,該接口沒有定義模塊應該實現(xiàn)哪些功能,這些是模塊的具體實現(xiàn)應該考慮的,模塊里有兩個很重要的變量,分別是該模塊的ModuleDoc和端口Ports。ModuleDoc描述了該模塊的具體配置信息,例如和硬件通訊時使用的串口名稱,或者是網絡地址,IP地址,也可能是其他需要傳遞給具體模塊的參數,其中最重要的是模塊的名稱,用來在系統(tǒng)中唯一的標識模塊用的,不

16、能重復;其次是該模塊的實現(xiàn)類,供Platform在加載該模塊的時候實例化所需。端口Port是模塊必須具備的,一個模塊至少有一個端口,端口分為輸入端口和輸出端口,是模塊之間通訊的唯一途徑。端口也是一個接口,符合該接口的任意實現(xiàn)類都可以作為端口來供模塊使用,目前端口是硬編碼在模塊的代碼中的,因此一旦模塊編碼完畢,使用何種端口也就確定不可更改了。在后續(xù)研究中可以考慮把端口與模塊的實現(xiàn)分離開來,在系統(tǒng)運行時動態(tài)組合,實現(xiàn)更靈活的配置。下圖是模塊的一個典型配置。模塊實現(xiàn)的基本操作是根據輸入的數據進行處理后,從輸出端口把數據輸送出去,當然數據處理的過程可能很復雜,例如可能是圖像識別,也可能是障礙物檢測,有

17、些還需要進行網絡數據庫等操作等;有些模塊沒有輸入端口,例如一些人機接口模塊(操作面板);也有些模塊沒有輸出端口,例如圖形化顯示模塊等。整個軟件的功能是由模塊決定的,確切的說是由模塊之間的協(xié)作實現(xiàn)的,模塊之間的協(xié)作,則是利用端口之間的通訊實現(xiàn)的。在本系統(tǒng)中,端口之間通過虛擬的“線”連接起來的,在系統(tǒng)中用WireConfig來表示,線從輸出端口引出,可以連接至多個不同的輸入端口;不同線之間可能會存在著交點,根據不同的方式,交點有不同的類型,如下圖所示。在輸入端口的交點稱之為抑制連接,即抑制線輸入來的信號可以取代原線上的信號輸送到輸入端口里去,在輸出端口的交點稱之為禁止連接,即如果禁止信號線上有數據

18、,則會禁止原信號線上的信號輸出。這些概念均取自Brooks的包容體系結構。在Brooks的包容體系結構中,模塊之間的通訊是異步的,分層的。在同一功能層內模塊的數據是直接發(fā)送的;在不同層之間數據則是通過抑制(Inhibit)和禁止(Suppress)進行傳遞的。這種通訊機制最大的優(yōu)點就是魯棒性。即上層模塊工作時,可以利用抑制取代原有底層模塊的輸出;當上層模塊失效時,抑制功能喪失,下層模塊的輸出重新有效,從而避免因模塊失效帶來的整體功能失效,保證了機器人的基本安全。在我們設計的框架中,同樣采用了抑制和禁止這兩個通訊功能,不同的是沒有分層,而是根據設計者的意圖來確定哪些通訊直接相連,哪些通訊之間要互

19、相抑制和禁止。通過這三種通訊方式實現(xiàn)模塊之間的協(xié)作,實現(xiàn)各種自主智能功能。 其實在一般使用當中,模塊之間基本上都是直接線連,出現(xiàn)交叉的情況很少,這種情況的設計主要是為了有軟件魯棒性考慮的應用設計的。例如模塊A、B都連接到模塊C上,而B優(yōu)先級大于A,則BA連接屬于抑制連接,當B有信號的時候,會取代A的信號輸入到C中,當B沒有信號的時候(例如出現(xiàn)了故障,或者沒有輸出),A的數據仍然可以輸入到C中。2.3 框架的實現(xiàn)前面分析的主要是思想,這部分講述的是實現(xiàn)方法。由于本人一直在用Java語言做開發(fā),所以這里也選用Java語言作為該框架的實現(xiàn)語言,但原則上講用C語言來實現(xiàn)更好,但C語言面向對象

20、特性不好,而且編程的難度大,更不能跨平臺,而我的項目所剩時間無多,所以最終開始確定用Java開發(fā)。事實證明Java開發(fā)的效果也還不錯(在實驗過程出現(xiàn)了響應緩慢的癥狀,其原因在于導航的算法,而非語言的問題),而且更可以把某些實時性要求比較高的模塊用JNI來實現(xiàn),速度就更有保障了。(1)框架的結構 框架由一個平臺對象Platform和一個系統(tǒng)配置文件構成,這兩者之間的關系,打個比方,配置文件好比一個設計藍圖,描述了整個框架里應該加載多少模塊,每個模塊的加載信息,以及模塊之間的通訊線路等;而Platform對象就像一個裝配車間,按照圖紙的要求,把模塊加載進來,然后建立模塊之間的通訊線路。其

21、中,Platform的編程比較容易,因為Java虛擬機能夠實現(xiàn)類的動態(tài)加載,而且讀取XML文檔的能力也很強。實現(xiàn)模塊的動態(tài)加載代碼如下(有刪改): /*  * loading module from xml configuration  * param md - ModuleDoc, the robot configuration file  * throws Exception - Something wrong, check the message  * return the Module Object that has just been

22、 generated  */ protected Module loadModule(ModuleDoc md) throws Exception   String cn = md.getClassName(); /讀取XML文件中的類名稱  if(cn = null | cn.length() = 0)     throw new Exception("Wrong Configuration for Module");   

23、 Object m = Class.forName(cn).newInstance(); /創(chuàng)建模塊對象  if(m instanceof Module)     return (Module) m;  else   throw new Exception("Failed loading module: " + cn);   加載模塊的啟動如下(有刪改) /*  * booting th

24、e platform,   * install all the modules and make the system working.  *   * throws Exception   * see c onfig(String)  */ public void booting() throws Exception   Iterator iterator = confdoc.getModuleDocs();  while(iterator.hasNext()  &

25、#160;  /Loading modules.   ModuleDoc md = (ModuleDoc) iterator.next();   Module m = loadModule(md);   /initialize the modules   m.init(md);   /put it in the module hash   module_hash.put(m.getName(),

26、m);    /start the modules  iterator = module_hash.values().iterator();  while(iterator.hasNext()     Module m = (Module) iterator.next();   m.start();   logit("Module " + m.getName() + " has

27、 been started.");  模塊之間的通訊信息則存儲在對象WireConfig的集合中,該類存儲了從源模塊某端口出發(fā)的通訊線路,描述了該線路如何與其他模塊的什么端口進行連接,這樣在模塊發(fā)送數據時,可以動態(tài)的到該集合中搜索與自己關聯(lián)的通訊線路,并根據該線路的描述,尋找到可以寫入的模塊和端口。這些工作都是由端口Port完成的,模塊本身無需干預。輸出端口發(fā)送數據的實現(xiàn)代碼: public void setValue(Module module, Object v, long duration)   /1 

28、60;/*judge if output is disabled*/  if(i_flag && (System.currentTimeMillis() - timestamp)<i_time)     return; /output is disabled    /* Looking for the target module and port */  Platform platform = Platform.getPlatform();&#

29、160; if(wc = null)           wc = platform.getWireConfig(module.getName()+"."+name);         if(wc = null)          return;    

30、60; List list = wc.getWireTargets();  for(int i=0; i<list.size(); i+)     WireConfig.WireTarget wt = (WireConfig.WireTarget) list.get(i);   Module m = platform.getModule(wt.getTModule();   if(WireConfig.WireTarget.WTT_DIRECT.eq

31、uals(wt.getType()        /direct connect    m.getPort(wt.getTPort().setValue(module, v, 1000);      else if(WireConfig.WireTarget.WTT_SUPPRESS.equals(wt.getType()       /to lower l

32、ayer    m.getPort(wt.getTPort().setValue(module, v, wt.getDuration();   else       m.getPort(wt.getTPort().setValue(module, v, wt.getDuration();       /1 輸入端口接收數據的代碼如下: public void setV

33、alue(Module m, Object v, long duration)   if(m.getLayer() >= update_level | (System.currentTimeMillis() - update_timestamp) > valid_duration)     /do not care about the valide duration   value = v;   valid_duration = duratio

34、n;   update_timestamp = System.currentTimeMillis();   bReady = true;   if(listener != null)    listener.valueUpdated();   至此,完成了模塊的加載和通訊線路的建立。(2)靈活的配置文件本系統(tǒng)的一個有點就在于其靈活的配置文件,通過使用XML文檔描述系統(tǒng)框架,可以在不修改任何代碼的情況下通過修改XML配置文件就可以實現(xiàn)不同

35、模塊的加載以及模塊之間通訊方式的改變,從而可以動態(tài)的修改應用的類型,這個在后面的例子中可以看到。首先介紹配置文件的格式如下:該圖描述了一個非常簡單的配置文件,只包括了兩個模塊Sick和Monitor,一條線路連接了SIck模塊的sick端口到Monitor模塊的monitor端口。這個應用非常簡單,就是把激光測距LMS測得的數據圖形化的顯示在屏幕上而已。可見,配置文件包括了兩部分,一部分描述了模塊的信息,另一部分描述了通訊線路的信息。目前該模塊需要手工進行編輯,期望能夠在下一個版本中做一個可視化的圖形編輯界面,從而實現(xiàn)移動機器人圖形化編程。(3)模塊間通訊模塊間是通過端口進行通訊的,端口只是定

36、義了一些接口,凡是實現(xiàn)該接口的對象都可以做端口,實際上這也是設計的初衷,期望通過采用不同的端口實現(xiàn)類來實現(xiàn)不同的通訊能力。例如目前我們實現(xiàn)的簡單端口SimpleInPort和SimpleOutPort就僅僅能夠實現(xiàn)同一程序內的數據通訊,可以想象也可以設計可以通過以太網絡的通訊端口!然而這部分工作我們還沒有做,原因是涉及到網絡間的遠程調用,實現(xiàn)起來比較復雜,就暫時先放放了。目前網絡通訊是通過相應模塊實現(xiàn)的。在目前的實現(xiàn)中,通訊是通過傳遞對象的引用實現(xiàn)的,這也就意味著無法實行跨系統(tǒng)跨應用,這是這個框架的缺點。優(yōu)點是這樣效率較高,而且可以通過一些折衷手段實現(xiàn)所謂的跨進程跨平臺。通訊也分兩種,同步和異

37、步。本系統(tǒng)也實現(xiàn)了這兩種通訊方式。3、兩個例子3.1 移動機器人的遠程控制 如前所述,在我們搭建的移動機器人的運動平臺的基礎上,通過所提供的軟件模塊,僅僅修改其配置用的XML文件就可以實現(xiàn)具有不同功能的智能移動機器人。在本節(jié)中,我們使用該移動平臺,實現(xiàn)了一個可以通過Internet進行控制的移動機器人遠程控制系統(tǒng)。該系統(tǒng)包括具有局部智能的移動平臺,遠程操作界面以及客戶端和服務器的通訊機制。所有的硬件系統(tǒng)都是基于我們所研制的移動機器人平臺,所有的軟件都是按照上面的控制軟件框架和模塊結構設計實現(xiàn)的。通過該節(jié)的研究,一方面我們驗證了前述軟件平臺的可靠性,另一方面我們開發(fā)了許多用于Inter

38、net遠程控制、數據采集用的通訊模塊。(1)遠程控制系統(tǒng)的軟硬件配置遙操作移動機器人系統(tǒng)分兩個部分,一部分是移動機器人本體,另一部分是遠程控制計算機和控制界面。這兩部分通過Internet網絡進行通訊和協(xié)調。機器人本體的硬件配置包括超聲模塊,激光雷達模塊,無線通訊模塊,視覺模塊、蓄電池電源模塊、電機驅動單元以及控制用上位機。移動機器人的遠程控制是在實驗室局域網絡內的另外一臺PC機上進行的,該PC機通過網線接入到實驗室網絡內。該PC機上運行著與移動機器人上位PC機相同的軟件,通過TCP/IP協(xié)議進行通訊。移動機器人的軟件模塊包括超聲數據模塊,防碰撞模塊,避障模塊,激光雷達數據模塊,激光雷達障礙物

39、檢測模塊,圖像數據模塊,網絡通訊模塊、電機驅動模塊等,這些模塊相互聯(lián)接組成網絡,實現(xiàn)了局部的自主智能(主要指防碰撞和避障)、向遙操作端發(fā)送傳感器數據以及接收遙操作端發(fā)送過來的控制命令等功能。該軟件的軟件結構如下圖所示。 遠程控制計算機的軟件結構如下圖所示:由于激光雷達能夠基本上代替超聲波實現(xiàn)障礙物的檢測和避障等功能,因此在試驗時我們以激光雷達的數據代替超聲波的數據用于避障和防碰撞以盡量減少系統(tǒng)中加載的模塊數量。經過修改后的機器人和遠程控制端的配置文件內容如下2圖:(2) 通訊模塊的設計和控制原理在遠程控制中,通訊模塊的設計非常重要,一方面所有的數據都要通過通訊模塊在客戶端和服務器之間

40、傳遞,另一方面在網絡控制中的時延會對控制系統(tǒng)的穩(wěn)定性造成一定的影響,應該盡量予以消除。為了提高遠程控制系統(tǒng)的應用性,我們在該系統(tǒng)中采用了TCP/IP協(xié)議,該協(xié)議是Internet上的通用協(xié)議,使用該協(xié)議,理論上就可以通過任何接入Internet的計算機來控制移動機器人。為了進一步提高它的開放性,我們采用了HTTP協(xié)議,利用超文本來傳遞數據和控制命令。使用HTTP協(xié)議的另一優(yōu)點是目前幾乎所有的網關代理都支持HTTP代理,這樣使得該系統(tǒng)的應用范圍更廣。a)客戶機/服務器模式的通訊模塊設計為了簡化網絡通訊的實現(xiàn),增加代碼的重用性,在本系統(tǒng)中我們采用了系統(tǒng)架構中模塊的思想,構建了網絡數據通訊模塊。該模

41、塊分客戶端和服務器兩個模塊,遵循客戶端/服務器架構,可以根據需要配合使用。通訊模塊的工作流程如上圖所示。該模塊是一個通用的網絡數據傳輸模塊,使用的時候只需要在其模塊的Data端口上寫入要發(fā)送的對象數據,或者從Data端口讀入欲獲得的對象(下圖)。在使用該模塊的時候需要在配置文件中配置好該模塊所使用的網絡端口號,或者欲連接的網絡IP地址和端口號等參數。b)基于XML技術的數據描述和命令封裝在上一部分中,對象能夠通過網絡通訊模塊在不同的主機之間進行傳送,這里的對象主要是從傳感器獲得的數據對象,或是從客戶端發(fā)送的控制命令。這些對象或者命令都必須要轉化成網絡能夠傳遞的文本或者字節(jié)流才能夠通過網絡進行傳

42、遞。由于我們所使用的是HTTP(超文本傳輸協(xié)議),這種協(xié)議最適合文本數據的傳輸;此外,XML具有良好的數據表達能力和數據標準化,以及其開放型等優(yōu)點,因此在數據傳輸的時候我們使用XML技術來實現(xiàn)對對象的文本序列化。序列化是面向對象編程的一種技術,指的是對象能夠在需要永久保存或者傳輸的時候轉化成相應的數據,之后可以從該數據中恢復出該對象。對于一個對象而言,其方法是所有對象都擁有的,因此只有其屬性代表的數據才能夠確定對象的唯一性,所謂的序列化實質上就是研究對象的屬性數據的保存和讀取的一種方法。XML具有很強的數據表達能力,能夠輕而易舉的描述任何對象的數據,因而可以用來做為對象的序列化媒介。利用XML

43、實現(xiàn)對象序列化的方法很簡單,我們只需要在所需要進行序列化的對象里添加一個方法toXMLDoc(),并在該方法中根據對象該時刻數據生成一個XML文檔即可。關于如何實現(xiàn)XML文檔的生成可以參考有關XML編程的書籍。從XML文檔中恢復對象包括兩個步驟:首先根據XML文檔的描述創(chuàng)建所需要的對象,然后利用該對象的fromXMLDoc()方法恢復數據。例如LMS200激光雷達系統(tǒng)掃描得到的數據對象經過序列化后可以得到的XML文本為:<RangeData start_angle=0 end_angle=180 data_count=181>  <data> 

44、60;   35-34-35-56-78-98-120-.-380  </data></RangeData>該文本描述了激光雷達一次掃描后獲得的全部前方0180度范圍內測量的距離信息。該信息在程序內被封裝到了一個對象中(RangeData),該對象序列化后得到該XML文本。同樣,通過生成一個空的RangeData對象,然后利用該XML文本即可重新恢復出該對象。c) 局部自主智能的實現(xiàn)由于我們在移動機器人上安裝了激光雷達系統(tǒng)和超聲傳感器陣列,并對相應的避障和導航算法等單元技術進行了研究,因此該移動機器人已經具備了一定的智能(例如能夠判斷障礙物

45、的距離實現(xiàn)急停,局部避障等功能)。但是由于人工智能的發(fā)展現(xiàn)狀以及機器人所處環(huán)境的復雜性,完全依賴機器的智能在現(xiàn)實環(huán)境中自主行走就目前而言還沒有可靠的技術保證。因此在實際應用中還不能避免人工的干預,這就要求我們從人機結合的角度來看待這個問題,盡量能夠開發(fā)出人機協(xié)同控制移動機器人的環(huán)境。在我們開發(fā)的軟件框架內,所有模塊的輸出最終都通過影響電機的驅動模塊來體現(xiàn)出來(例如防碰撞,局部避障等),而人(遠程操作者)對機器人的控制同樣也是通過影響電機的驅動模塊而實現(xiàn)的,這與所有模塊的工作原理是一樣的。因此,通過對每個行為模塊指定不同的優(yōu)先級別,就可以在一定程度上實現(xiàn)對移動機器人行為的人機協(xié)同控制。在本項目中

46、,我們把遠程命令的處理模塊賦予較高的等級(高于避障模塊,但是低于防碰撞模塊,這樣可以解決操作過程中的誤操作導致的碰撞過程),當有遠程控制命令過來的時候,機器人由遠程控制人員進行操縱;當遠程命令失效(例如1秒內沒有新的命令進入)后,本地避障、漫游等模塊的控制命令就可以對機器人進行控制,在控制的同時,用戶仍然可以通過遠程計算機進行對機器人的運行狀態(tài)進行監(jiān)視并隨時切入控制。下圖顯示的就是機器人在遙操作過程中客戶端顯示的激光雷達數據(可視化)和機器人運行狀態(tài)數據以及控制命令輸入窗口。3.2 基于激光雷達的移動機器人避障漫游(1)避障算法避障算法不是這里研究的重點,所以簡單提一些。激光測距雷達相對于超聲

47、波具有很多優(yōu)越之處,它的測量精度高,穩(wěn)定性好,方向性強,受到的干擾小等等,因此利用激光雷達進行避障要比超聲波可靠的多。在本項目中我們使用了較常用的虛擬力算法(VFF),利用雷達獲得的數據實現(xiàn)機器人的自主避障和漫游。VFF方法是在勢場法(Potential field method,PFM)的基礎上建立起來的。該方法認為,障礙物會對機器人施加一定虛擬的排斥力(Virtual repulsive force),目標對機器人也會產生一定的吸引力,這兩個力的合力決定機器人的速度和方向。漫游機器人的軟件配置如下圖所示。其中比較重要的幾個模塊包括防碰撞模塊(collide),虛擬力計算模塊(force),

48、避障模塊(Runaway)等。防碰撞模塊有一個參數threashold,用來定義危險距離,當障礙物與機器人的距離低于此值則會產生急停的命令;虛擬力計算模塊有兩個參數threashold_near和threashold_far,分別用來定義兩個邊界值。虛擬力的計算函數是一個分段函數,當距離大于threashold_far的時候該值被忽略,即計算得到的力值為0,當距離小于threashold_near的時候,計算得到的力被平方,即增大近距離障礙物在力場中的分量。Runaway模塊則根據計算出來的虛擬力的大小,并參考目標點的位置來生成下一步運動的方向和速度等命令。<?xml version=&

49、quot;1.0" encoding="utf-8"?><mobile name="Field_Rolver"> <module name="motor" class="cie.mobile.pmac.MotorModule" description="motor module" version="1.0" author="Richard Lee" layer="0" > &#

50、160;<param name="com" value="COM1" />  <param name="scale_move" value="900" />  <param name="scale_turn" value="30000" /> </module> <module name="rangefinder" class="ci

51、e.mobile.sick.SickModule" description="" author="Richard Lee" version="1.0" layer="0">  <param name="com" value="COM3"/>  <param name="baudrate" value="9600" />  <para

52、m name="mode" value="MODE_181" /> </module> <module name="sickserver" class="name.lxm.robot.arch.module.NetBridgeServer" layer="0" description="" author="me" version="1.0">  <param n

53、ame="listen_port" value="10003" />  <param name="verify_string" value="rangefinder" /> </module> <module name="collide" class="cie.mobile.CollideModule" layer="0" description="" auth

54、or="Richard Lee" version="1.0">  <param name="threadhold" value="200" /> </module> <module name="force" class="cie.mobile.FeelForce" layer="0" description="" author="Richard Lee" version="1.0">  <param name="threashold_far" value="1500" />  <param na

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論