版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
面向服務(wù)的計(jì)算和web數(shù)據(jù)管理第9章面向服務(wù)和事件驅(qū)動(dòng)的機(jī)器人應(yīng)用面向服務(wù)計(jì)算SOC的研究和應(yīng)用很大程度上局限于電子和基于Web應(yīng)用的軟件開(kāi)發(fā)。面向服務(wù)的機(jī)器人軟件開(kāi)發(fā)將SOC從目前的領(lǐng)域擴(kuò)展到一個(gè)新的領(lǐng)域,從計(jì)算和通信方面的效率而言,它曾被視為是不可能的。本章介紹了SOC和基于SOC的機(jī)器人軟件開(kāi)發(fā)的概念、原理和方法,并將它們應(yīng)用于分布式機(jī)器人應(yīng)用的設(shè)計(jì)。最后通過(guò)英特爾公司的安全機(jī)器人設(shè)計(jì)和微軟機(jī)器人開(kāi)發(fā)工作室的迷宮穿越機(jī)器人應(yīng)用,說(shuō)明了這些概念和方法的使用。
由于附加了標(biāo)準(zhǔn)接口層,SOC應(yīng)用的效率不及OOC應(yīng)用。標(biāo)準(zhǔn)接口使與語(yǔ)言和平臺(tái)無(wú)關(guān)的通信以及Web服務(wù)中的遠(yuǎn)程調(diào)用實(shí)現(xiàn)成為可能。嵌入式系統(tǒng)和機(jī)器人應(yīng)用常需要具有實(shí)時(shí)性能,因此SOC對(duì)于需要實(shí)時(shí)通信和計(jì)算的嵌入式系統(tǒng)和機(jī)器人應(yīng)用的開(kāi)發(fā)來(lái)說(shuō)是不合適的范型,這是可以理解的。9.1面向服務(wù)的機(jī)器人計(jì)算然而,SOC并不是必須通過(guò)Web才可實(shí)現(xiàn),因此,標(biāo)準(zhǔn)接口可以更加簡(jiǎn)單和快速。此外,遠(yuǎn)程服務(wù)可以被遷移到本地機(jī)以減少通信成本。在SOC出現(xiàn)之前,嵌入式系統(tǒng)和機(jī)器人應(yīng)用的某些需求受制于軟件開(kāi)發(fā)范型。
(1)嵌入式系統(tǒng)和機(jī)器人應(yīng)用在處理所有可能發(fā)生的情況時(shí)只有有限的能力;
(2)不可預(yù)見(jiàn)的環(huán)境會(huì)發(fā)生;
(3)可能會(huì)出現(xiàn)故障,而現(xiàn)場(chǎng)維修往往是不可能的;
(4)用戶(hù)想在不關(guān)閉系統(tǒng)的情況下修改系統(tǒng)(需求)。相比較于機(jī)器人的傳統(tǒng)技術(shù),把SOC用于機(jī)器人有一定的優(yōu)勢(shì)。主要的好處就是有一個(gè)具有標(biāo)準(zhǔn)接口的通用服務(wù)層。每個(gè)服務(wù)代表一個(gè)組件,如傳感器、驅(qū)動(dòng)器和孝感器。這些服務(wù)的調(diào)用是設(shè)備獨(dú)立的。這樣,只要將服務(wù)調(diào)用重新綁定到為機(jī)器人平臺(tái)建立的服務(wù)上面,我們就可以將同樣的應(yīng)用部署到不同的機(jī)器人平臺(tái)上。編寫(xiě)應(yīng)用和服務(wù)的語(yǔ)言可以不同,這允許我們?cè)诙嗑€程環(huán)境和事件驅(qū)動(dòng)編程范型中使用高級(jí)語(yǔ)言編寫(xiě)機(jī)器人應(yīng)用,如可視化編程語(yǔ)言VPL,C#以及Java語(yǔ)言。根據(jù)現(xiàn)有的驅(qū)動(dòng),把它們封裝成服務(wù)之前,我們可以使用不同的語(yǔ)言,如C、C++和匯編語(yǔ)言編寫(xiě)驅(qū)動(dòng)控制程序。服務(wù)層的可用性使得我們可以在較短的時(shí)間內(nèi)開(kāi)發(fā)不同的機(jī)器人應(yīng)用。圖9.1給出了一個(gè)基于SOC的機(jī)器人應(yīng)用的例子。這個(gè)應(yīng)用包含一個(gè)遠(yuǎn)程協(xié)作中心(RCC)和一個(gè)連接到機(jī)器人的機(jī)載計(jì)算機(jī)。除了特意為給定的應(yīng)用開(kāi)發(fā)組件之外,這些組件的需求發(fā)布到一個(gè)服務(wù)中介。服務(wù)提供商開(kāi)發(fā)服務(wù)并將它們發(fā)布到中介。然后,應(yīng)用構(gòu)建者查詢(xún)可用的服務(wù),并將服務(wù)遷移到應(yīng)用當(dāng)中。遷移可以節(jié)省遠(yuǎn)程調(diào)用的時(shí)間。根據(jù)時(shí)間和靈活性需求,服務(wù)可以運(yùn)行于機(jī)載計(jì)算機(jī)或者RCC。運(yùn)行在RCC的服務(wù)可以在不停止機(jī)器人任務(wù)的情況下替換。當(dāng)運(yùn)行于RCC的服務(wù)被修改或替換時(shí),機(jī)器人的任務(wù)將被修改。圖9.1基于SOC的機(jī)器人應(yīng)用開(kāi)發(fā)對(duì)于同樣的需求和接口,可以開(kāi)發(fā)不同設(shè)備的不同實(shí)現(xiàn),如圖9.2所示。假定應(yīng)用是遍歷一張地圖或者一個(gè)迷宮,同樣的應(yīng)用可以用來(lái)驅(qū)動(dòng)不同的工具,只要將服務(wù)綁定到新工具的服務(wù)。圖9.2對(duì)于同一需求可開(kāi)發(fā)不同的服務(wù)
SOC軟件本質(zhì)上是分布式的,并且服務(wù)位于不同的計(jì)算機(jī)上。本節(jié)給出事件驅(qū)動(dòng)的、分布式的、面向服務(wù)的體系結(jié)構(gòu)的需求和設(shè)計(jì),并以“無(wú)人偵察機(jī)”的安全機(jī)器人作為例子。9.2事件驅(qū)動(dòng)的機(jī)器人應(yīng)用整個(gè)分布式系統(tǒng)包含以下組件:
(1)一個(gè)遠(yuǎn)程協(xié)作中心RCC和幾個(gè)帶有機(jī)載計(jì)算機(jī)的機(jī)器人。RCC有一個(gè)用戶(hù)界面,它可以將系統(tǒng)變成人工控制模式或自動(dòng)模式。我們將關(guān)注自動(dòng)模式。
(2)每個(gè)機(jī)器人配備有多個(gè)傳感器,如照相機(jī)、聲納傳感器、觸摸傳感器以及驅(qū)動(dòng)器,如發(fā)動(dòng)機(jī)、伺服電動(dòng)機(jī)和警報(bào)器。
(3)每個(gè)機(jī)器人向其他機(jī)器人提供一個(gè)匯報(bào)其狀態(tài)的服務(wù)。
(4)每個(gè)機(jī)器人都可以訪問(wèn)其他機(jī)器人的服務(wù),并且可以根據(jù)收集的信息做出獨(dú)立的決策和行動(dòng)。為了降低機(jī)載機(jī)器人軟件的復(fù)雜性,機(jī)器人之間不能直接通信,它們通過(guò)RCC獲得其他機(jī)器人的狀態(tài)。每個(gè)機(jī)器人包含以下組件:
(1)一個(gè)機(jī)器人包含一個(gè)機(jī)載計(jì)算機(jī)和一組傳感器和驅(qū)動(dòng)器,包括一個(gè)聲納傳感器、觸摸傳感器、鍵盤(pán)、帶有水平和垂直控制伺服電動(dòng)機(jī)的攝像機(jī),和兩個(gè)可以控制輪子的獨(dú)立伺服電動(dòng)機(jī);
(2)傳感器和驅(qū)動(dòng)器被包裝成服務(wù);
(3)每個(gè)服務(wù)包括一個(gè)事件發(fā)生器、一個(gè)事件訂閱向量和一個(gè)事件監(jiān)聽(tīng)器,而事件處理和編排流程相關(guān);
(4)一個(gè)編排流程讀取本地和遠(yuǎn)程傳感器值、處理事件、根據(jù)值和應(yīng)用需求做出決策;(5)機(jī)載計(jì)算機(jī)可以使用公共服務(wù),如數(shù)學(xué)函數(shù)、路由和計(jì)時(shí)。
自動(dòng)模式下,RCC和機(jī)器人是對(duì)等的,而且它和機(jī)器人有同樣的體系結(jié)構(gòu),包含一組服務(wù)和一個(gè)編排流程。然而,RCC的服務(wù)和機(jī)器人的服務(wù)是不同的。RCC通常運(yùn)行在功能更強(qiáng)大的計(jì)算機(jī)上,耗費(fèi)時(shí)間的公共服務(wù)也將在RCC上執(zhí)行。此外,RCC有一個(gè)用戶(hù)界面,不直接和傳感器和驅(qū)動(dòng)器連接。手動(dòng)模式下,RCC處于控制地位,而機(jī)器人是從屬地位。圖9.3RCC和分布式機(jī)載計(jì)算機(jī)事件和處理程序是完全分散到每個(gè)子系統(tǒng)和子系統(tǒng)的不同服務(wù)中,如圖9.4所示。如果組件對(duì)服務(wù)的事件感興趣,如觸摸傳感器的事件,就可以訂閱這個(gè)事件。服務(wù)維護(hù)一個(gè)訂閱者向量,T1,T2,…,Tm(對(duì)于觸摸傳感器)。一旦傳感器被觸動(dòng),將激發(fā)一個(gè)事件,這個(gè)事件將依次調(diào)用T1,T2,…,Tm的處理程序。聲納傳感器可被設(shè)置為兩種模式,在周期模式下,傳感器在一定時(shí)間間隔發(fā)送它看到的障礙物的距離值。在這種情況下,事件通知可以不需要。在另一種模式下,如果距離值與先前的值不同,那么就會(huì)激發(fā)事件。觸摸傳感器和聲納傳感器都是單向服務(wù)。伺服電動(dòng)機(jī)是雙向服務(wù)。一方面,電機(jī)通過(guò)電機(jī)控制獲得移動(dòng)機(jī)器人的指令。另一方面,在每次移動(dòng)之后電動(dòng)機(jī)返回位置數(shù)據(jù),這樣就可以在所獲信息的基礎(chǔ)上計(jì)算機(jī)器人的位置。圖9.4機(jī)器人裝載的服務(wù)所有的事件處理和編排流程直接關(guān)聯(lián),這樣,流程就具備了做出需要采取行動(dòng)的決策所需的所有信息。此外編排流程可以訂閱其他機(jī)器人的傳感器和驅(qū)動(dòng)器的服務(wù),以做出協(xié)調(diào)決策。例如,如果一個(gè)機(jī)器人偵察到一個(gè)入侵者,這個(gè)入侵者正在遠(yuǎn)離偵察的機(jī)器人,那么其他機(jī)器人根據(jù)來(lái)自于所有參與的機(jī)器人的位置信息和傳感器信息向入侵者靠攏。
編排流程也運(yùn)行在RCC上。然而,為了將它和機(jī)器人的編排流程區(qū)分開(kāi),而且也為了強(qiáng)調(diào)它在協(xié)調(diào)機(jī)器人之間的動(dòng)作時(shí)所起的作用,它被稱(chēng)為協(xié)作流程。RCC有相同的軟件體系結(jié)構(gòu),而且在原理上,和機(jī)器人對(duì)等,而不是機(jī)器人的命令者。只有在手動(dòng)模式下,RCC才會(huì)成為機(jī)器人的命令者。既然RCC運(yùn)行在功能更強(qiáng)大的計(jì)算機(jī)上,所以給RCC分派更多的耗時(shí)的任務(wù),而機(jī)器人只和RCC通信就顯得更為合理。RCC與機(jī)器人之間的通信也通過(guò)事件發(fā)生器和事件處理程序?qū)崿F(xiàn),如圖9.5所示。
在后面的章節(jié),將介紹如何用VPL實(shí)現(xiàn)事件驅(qū)動(dòng)的機(jī)器人編程,其中,為了幫助機(jī)器人通過(guò)一個(gè)未知的迷宮,會(huì)實(shí)現(xiàn)不同的事件。圖9.5RCC和機(jī)器人之間的協(xié)作
面向服務(wù)計(jì)算(SOC)把軟件系統(tǒng)看做一個(gè)松耦合的服務(wù)的集合,這些服務(wù)通過(guò)標(biāo)準(zhǔn)接口和標(biāo)準(zhǔn)消息交換協(xié)議相互通信。云計(jì)算把SOC的范圍擴(kuò)展到包含開(kāi)發(fā)平臺(tái)和執(zhí)行的基礎(chǔ)設(shè)施,這樣,云計(jì)算的典型特征通過(guò)這些特性,如軟件即服務(wù)(SaaS)、平臺(tái)即服務(wù)(PaaS)、基礎(chǔ)設(shè)施即服務(wù)(IaaS)和硬件即服務(wù)(HaaS)來(lái)描述。9.3云計(jì)算中機(jī)器人即服務(wù)然而,只要遵循標(biāo)準(zhǔn),任何其他虛擬服務(wù),也就是說(shuō),X即服務(wù)(XaaS),都能提交到云基礎(chǔ)設(shè)施上。通過(guò)云計(jì)算,徹底從基于桌面的計(jì)算轉(zhuǎn)移到完全基于Web的開(kāi)發(fā)和應(yīng)用成為可能,開(kāi)發(fā)者通過(guò)Web瀏覽器使用Web上的開(kāi)發(fā)平臺(tái),在Web上開(kāi)發(fā)軟件并存儲(chǔ)數(shù)據(jù),在Web上配置硬件/基礎(chǔ)設(shè)施(處理能力,內(nèi)存容量,通信帶寬),并執(zhí)行應(yīng)用。本節(jié)介紹機(jī)器人即服務(wù)(RaaS)的概念和設(shè)計(jì),RaaS迫使機(jī)器人或設(shè)備的設(shè)計(jì)和實(shí)現(xiàn)是一體化的SOC單元,也就是說(shuō),單元包括執(zhí)行功能的服務(wù)、發(fā)現(xiàn)和發(fā)布的服務(wù)目錄和客戶(hù)直接訪問(wèn)的應(yīng)用??紤]云計(jì)算環(huán)境中RaaS的基本需求??赡軙?huì)有各種機(jī)器人云單元或者自主設(shè)備。例如,機(jī)器人警察、餐廳機(jī)器人服務(wù)員、機(jī)器人寵物、照顧病人的機(jī)器人。這些機(jī)器人分布在不同的地方,可以通過(guò)Internet網(wǎng)訪問(wèn)。這里考慮的基本需求是RaaS要具備SOA的所有功能,也就是,作為服務(wù)提供者、作為服務(wù)中介、作為服務(wù)客戶(hù):
(1)一個(gè)RaaS云單元是一個(gè)服務(wù)提供者:每個(gè)單元托管一個(gè)預(yù)裝載的服務(wù)庫(kù)。開(kāi)發(fā)人員或者客戶(hù)可以給一個(gè)機(jī)器人部署新的服務(wù),或者從一個(gè)機(jī)器人上移走服務(wù)。服務(wù)可以被這個(gè)機(jī)器人使用,也可以被其他機(jī)器人共享。(2)一個(gè)RaaS云單元包含一組部署的應(yīng)用:開(kāi)發(fā)者或者客戶(hù)可以用單元內(nèi)和單元外可用的服務(wù)構(gòu)成新的應(yīng)用(功能)。
(3)一個(gè)RaaS單元是一個(gè)服務(wù)中介:客戶(hù)可以在單元目錄中查詢(xún)可用的服務(wù)和應(yīng)用。通過(guò)瀏覽目錄,客戶(hù)可以搜索和發(fā)現(xiàn)部署在機(jī)器人上的應(yīng)用和服務(wù)。服務(wù)和應(yīng)用可以組織成類(lèi)的層次結(jié)構(gòu),以便有助于發(fā)現(xiàn)。圖9.6給出了RaaS單元的主要組件、一組部署的應(yīng)用和服務(wù)示例。圖9.7說(shuō)明了RaaS單元如何適應(yīng)云計(jì)算環(huán)境。RaaS中的SOC軟件與驅(qū)動(dòng)程序和其他操作系統(tǒng)組件通信,這些組件進(jìn)一步與設(shè)備和其他硬件組件通信。如果無(wú)線基礎(chǔ)設(shè)施可用或者有藍(lán)牙技術(shù),并且兩個(gè)單元對(duì)彼此是封閉的,通過(guò)Wi_Fi,RaaS單元可以直接相互通信。通過(guò)標(biāo)準(zhǔn)服務(wù)接口WSDL,RaaS和云中的其他服務(wù)通信。支持調(diào)用的通信協(xié)議是SOAP或REST協(xié)議。圖9.6服務(wù)、目錄、應(yīng)用組成的RaaS單元圖9.7云計(jì)算環(huán)境中的RaaS單元對(duì)RaaS單元的所有請(qǐng)求是由一個(gè)作為唯一入口點(diǎn)的響應(yīng)裝置處理的,這里,會(huì)根據(jù)目錄對(duì)請(qǐng)求進(jìn)行緩沖和檢查。如果應(yīng)用或者服務(wù)沒(méi)有注冊(cè),那么請(qǐng)求將被立即拒絕。否則,請(qǐng)求將被重定向到托管工作進(jìn)程。一個(gè)工作進(jìn)程將啟動(dòng)一個(gè)服務(wù)作為線程,并管理服務(wù)的生命周期。我們有兩個(gè)工作進(jìn)程,一個(gè)用于應(yīng)用,一個(gè)用于服務(wù)。RaaS托管和執(zhí)行模型如圖9.8所示。
由Intel公司嵌入式系統(tǒng)組贊助,并與卡爾海登社區(qū)高中的機(jī)器人俱樂(lè)部合作,RaaS單元在亞利桑那州立大學(xué)已經(jīng)實(shí)現(xiàn)。此系統(tǒng)的視頻演示在(/9740048)。為了支持微軟的用于機(jī)器人應(yīng)用的VPL(可視化編程語(yǔ)言)圖形組合語(yǔ)言,在RaaS系統(tǒng)上實(shí)現(xiàn)了一個(gè)服務(wù)層。VPL應(yīng)用組合將在下一節(jié)討論。圖9.8RaaS托管和執(zhí)行模型
2006年6月,微軟發(fā)布基于SOC的RoboticsDeveloperStudio(MRDS)是面向服務(wù)計(jì)算的一個(gè)重要的里程碑。很多機(jī)器人公司已經(jīng)將它們的軟件開(kāi)發(fā)平臺(tái)移到了MRDS上,這是第一個(gè)商業(yè)化的、用于機(jī)器人應(yīng)用的面向服務(wù)開(kāi)發(fā)環(huán)境。本節(jié)和下節(jié)將介紹MRDS,并用它開(kāi)發(fā)面向服務(wù)的應(yīng)用。9.4RoboticStudio和可視化編程語(yǔ)言面向服務(wù)的設(shè)計(jì)原則使MRDS平臺(tái)獨(dú)立?;跒楦鞣N機(jī)器人平臺(tái)提供的服務(wù),同樣的應(yīng)用可以部署到不同的機(jī)器人平臺(tái)上,如iRobot、Fischertechnik、LegoMindstormNXT、和Parallax。
此外,為了幫助用戶(hù)在將軟件裝載到硬件平臺(tái)(機(jī)器人)之前測(cè)試他們的應(yīng)用,RoboticsDeveloperStudio提供了三維機(jī)器人虛擬仿真環(huán)境。使用AGEIA的PhysX技術(shù),它是硬件加速方面的先驅(qū)者,MRDS為機(jī)器人模型實(shí)現(xiàn)真實(shí)世界的物理模擬。圖9.9顯示了三維機(jī)器人虛擬環(huán)境的兩個(gè)截圖,模擬兩個(gè)在相撲競(jìng)賽中的iRobot機(jī)器人。圖9.9MRDS中的仿真環(huán)境MRDS是基于.Net框架的,如圖9.10所示。MRDS使用的編程語(yǔ)言稱(chēng)為可視化編程語(yǔ)言(VPL),它可以用來(lái)編寫(xiě)服務(wù),以及應(yīng)用的工作流。你也可以使用.Net中的C#和VB編寫(xiě)服務(wù),并將它們添加到MRDS的服務(wù)庫(kù)中。然而,我們關(guān)心使用VPL編寫(xiě)服務(wù)(作為服務(wù)提供者)和開(kāi)發(fā)應(yīng)用(作為服務(wù)客戶(hù))。并發(fā)與協(xié)調(diào)運(yùn)行時(shí)(CCR)為SOA應(yīng)用開(kāi)發(fā)提供了一個(gè)并發(fā)的面向消息的編程模型,并且它管理異步操作、處理并發(fā)、開(kāi)發(fā)并行硬件和處理故障。用戶(hù)不需要處理線程、鎖和信號(hào)。圖9.10MRDS和他的開(kāi)發(fā)環(huán)境分布式系統(tǒng)服務(wù)(DSS)提供了一個(gè)服務(wù)托管環(huán)境和一組基本服務(wù),這組基本服務(wù)幫助如調(diào)試、日志、監(jiān)控、安全、發(fā)現(xiàn)和數(shù)據(jù)存儲(chǔ)任務(wù)的執(zhí)行。它也可以管理仿真引擎和CCR之間的互操作,允許使用遠(yuǎn)程服務(wù)進(jìn)行應(yīng)用組合。DSS運(yùn)時(shí)環(huán)境建立在CCR和標(biāo)準(zhǔn)通信協(xié)議之上。它不使用HTTP之上的SOAP協(xié)議,而使用HTTP之上的REST(RepresentationalStateTransfer),REST可以更好地處理機(jī)器人應(yīng)用的實(shí)時(shí)需求。可視化編程語(yǔ)言VPL是一個(gè)設(shè)計(jì)在圖形化數(shù)據(jù)流編程模型上的應(yīng)用開(kāi)發(fā)環(huán)境,而不是傳統(tǒng)編程中的控制流模型。數(shù)據(jù)流程序不使用按順序執(zhí)行的一系列命令,它更像裝配線上的一組工人(服務(wù)),當(dāng)原料到達(dá)時(shí),他們就做分配給他們的任務(wù)。因此,VPL更適合各種并行或者分布式場(chǎng)景的編程。
開(kāi)始學(xué)VPL很簡(jiǎn)單,它基于基本的編程概念,例如變量、數(shù)據(jù)、if_then_else語(yǔ)句、循環(huán)、合并和連接。然而,VPL不局限于初學(xué)者。編程語(yǔ)言的組合本質(zhì)吸引了更多的高級(jí)程序員將其用于快速原型或代碼開(kāi)發(fā)。而且,可以裁減它的工具箱以適應(yīng)機(jī)器人應(yīng)用,底層體系結(jié)構(gòu)不局限于編寫(xiě)機(jī)器人程序。它可以用于其他應(yīng)用,例如,游戲、工廠的復(fù)雜過(guò)程和其他設(shè)計(jì)過(guò)程。圖9.11顯示了工作流和服務(wù)之間的映射。清單文件說(shuō)明了真實(shí)服務(wù)與代理之間的映射。對(duì)于相同的工作流,不同的清單文件可以將它映射到不同的機(jī)器人平臺(tái)上,如iRobot、NXT和Parallax。
開(kāi)發(fā)一個(gè)應(yīng)用的時(shí)候,用戶(hù)或者使用實(shí)際的服務(wù)進(jìn)行組合,或者使用通用服務(wù)進(jìn)行組合,這些通用服務(wù)被綁定到支持清單配置文件的實(shí)際服務(wù)。使用通用服務(wù)可以為應(yīng)用提供靈活性,它也允許使用不同的清單綁定到不同的服務(wù)。用戶(hù)可以在不同仿真機(jī)器人的虛擬環(huán)境中,或者在不同機(jī)器人硬件的真實(shí)環(huán)境中,運(yùn)行同樣的應(yīng)用。仿真任務(wù)按以下步驟執(zhí)行:
(1)首先,加載清單文件;
(2)啟動(dòng)并配置清單中列出的服務(wù),并且綁定到工作流中的通用服務(wù);
(3)基于工作流描述的邏輯,執(zhí)行仿真過(guò)程。
通過(guò)內(nèi)潛在仿真引擎服務(wù)內(nèi)的虛擬服務(wù),可以監(jiān)控整個(gè)仿真過(guò)程。圖9.11RoboticsDeveloperStudio和它的環(huán)境和其他編程語(yǔ)言一樣,VPL包含一系列被稱(chēng)做“基本活動(dòng)”的結(jié)構(gòu),如下所述:
變量:一個(gè)變量活動(dòng)代表一個(gè)內(nèi)存位置,通過(guò)這個(gè)位置,程序可以存儲(chǔ)和查找值,如字符串或數(shù)字。
計(jì)算:計(jì)算活動(dòng)是用來(lái)計(jì)算數(shù)學(xué)公式(加,減,乘,除),以及從其他組件提取數(shù)據(jù),例如變量或者文本框。
它和C#中的賦值語(yǔ)句類(lèi)似,例如,x=5+7;對(duì)于數(shù)值類(lèi)數(shù)據(jù)操作,我們使用下面的操作符:
操作加減乘除模
操作符+*/%對(duì)于邏輯操作,使用下面符號(hào):
操作邏輯加邏輯或邏輯否操作符&&或者使用AND||或者使用OR!或者使用NOT
數(shù)據(jù):這個(gè)活動(dòng)是向另一個(gè)活動(dòng)或者服務(wù)提供一個(gè)簡(jiǎn)單的數(shù)據(jù)值。定義一個(gè)特定類(lèi)型的數(shù)據(jù)時(shí),從文本框的下拉框中選擇它的類(lèi)型,然后在文本框輸入一個(gè)值。下面的表格是VPL支持的數(shù)據(jù)類(lèi)型清單。
連接:這個(gè)活動(dòng)聯(lián)合兩個(gè)(或多個(gè))數(shù)據(jù)流。它與合并的不同之處在于:在活動(dòng)進(jìn)入下一步之前,所有輸入分支接收到其所需的數(shù)據(jù)項(xiàng)。VPL中的所有活動(dòng)只有一個(gè)輸入線。連接用來(lái)將多個(gè)輸入值變成一個(gè)輸入線。
合并:合并就是將兩個(gè)(或多個(gè))數(shù)據(jù)流合并在一起。當(dāng)?shù)谝粋€(gè)數(shù)據(jù)項(xiàng)到達(dá)后,活動(dòng)就進(jìn)入下一個(gè)步。不需要等待其他數(shù)據(jù)項(xiàng)的到來(lái)。合并用來(lái)實(shí)現(xiàn)循環(huán)。一個(gè)輸入用來(lái)初次進(jìn)入循環(huán)體,而其他輸入用于再次進(jìn)入循環(huán)體。
如果:在輸入條件的基礎(chǔ)上,活動(dòng)提供了一個(gè)輸出選擇以轉(zhuǎn)發(fā)接收的消息。VPL中的if語(yǔ)句可以檢查一個(gè)語(yǔ)句中的多個(gè)條件。換句話(huà)說(shuō),它可以將多個(gè)連續(xù)的if語(yǔ)句(C#)組合成一個(gè)。條件表達(dá)式可用下面的操作來(lái)判斷:等于(=或者==)、不等于(!=或者<>)、小于(<)、大于(>)、小于等于(<=)、大于等于(>=)。
如果給活動(dòng)添加額外的條件,在活動(dòng)塊點(diǎn)擊添加按鈕(+)。
開(kāi)關(guān):和C#中的“switch”語(yǔ)句相似,根據(jù)輸入消息和文本框中輸入的表達(dá)式的匹配情況,開(kāi)關(guān)活動(dòng)路由消息。要給活動(dòng)塊中添加Case分支(匹配條件),在活動(dòng)塊點(diǎn)擊添加按鈕(+)。列表:列表活動(dòng)為數(shù)據(jù)項(xiàng)創(chuàng)建空列表。為了創(chuàng)建列表,從活動(dòng)塊(或者屬性視圖)上的選擇下拉列表中,為數(shù)據(jù)項(xiàng)選擇類(lèi)型(數(shù)據(jù)類(lèi)型)。使用列表功能活動(dòng),給列表增加條目。使用變量活動(dòng)創(chuàng)建列表變量,以便存儲(chǔ)列表并在圖中其他地方使用。
列表功能:列表功能活動(dòng)可以使用戶(hù)修改已存在的列表。
注釋?zhuān)鹤⑨尰顒?dòng)使用戶(hù)可以在圖中添加一段用于說(shuō)明的文本。
活動(dòng):一個(gè)活動(dòng)代表了預(yù)建立的服務(wù)、數(shù)據(jù)流控制、功能或其他代碼模塊。生成的應(yīng)用通常被稱(chēng)為編排,即不同流程的組成的序列?;顒?dòng):這個(gè)“活動(dòng)”不是一個(gè)基本活動(dòng),它用基本活動(dòng)、其他活動(dòng)和服務(wù)組合成構(gòu)件。它使組合新的活動(dòng)和重用活動(dòng)成為可能?;顒?dòng)只能被用在當(dāng)前應(yīng)用中(稱(chēng)為圖)。如果想和其他應(yīng)用共享活動(dòng),只需簡(jiǎn)單地選擇菜單命令“作為服務(wù)編譯”,它將活動(dòng)包裝成一個(gè)服務(wù),一旦MRDS重新啟動(dòng),那么MRDS庫(kù)中的服務(wù)就是可用的。
圖形:為開(kāi)發(fā)的VPL應(yīng)用設(shè)計(jì)接口。它用基本活動(dòng)、當(dāng)前應(yīng)用中開(kāi)發(fā)的活動(dòng)、和庫(kù)中的服務(wù)組合成應(yīng)用。
MRDS也有大量的服務(wù),包括輸入和輸出的服務(wù)、傳感器服務(wù)和驅(qū)動(dòng)服務(wù)。圖9.12顯示一個(gè)活動(dòng)的設(shè)計(jì),這個(gè)活動(dòng)在給定的初始值小于7時(shí)產(chǎn)生數(shù)值直到為增加到7為止。圖的下半部分顯示了圖中初始化計(jì)數(shù)器的代碼,并且發(fā)送計(jì)數(shù)器的輸出值到TextToSpeech服務(wù)。在計(jì)數(shù)器活動(dòng)中,使用了三個(gè)基本活動(dòng):計(jì)算、變量和if。在圖的上半部分,使用了基本活動(dòng)數(shù)據(jù)、計(jì)數(shù)活動(dòng)和TextToSpeeckTTS服務(wù)。注意計(jì)數(shù)活動(dòng)的循環(huán)點(diǎn)(通知/事件輸出)被連接到TextToSpeeckTTS服務(wù),它可以通知服務(wù)一個(gè)新輸入的到達(dá)。對(duì)于鏈接之間建立數(shù)據(jù)值的詳細(xì)描述,請(qǐng)參考附錄中的VPL教程。圖9.12從給定的初始值產(chǎn)生數(shù)字直到它變成7的活動(dòng)
仿真是用一系列數(shù)學(xué)公式和模型模擬一個(gè)現(xiàn)實(shí)現(xiàn)象的過(guò)程。在創(chuàng)建有用的仿真過(guò)程中,高級(jí)計(jì)算機(jī)和程序是主要驅(qū)動(dòng)力,例如,它可以模擬天氣條件、化學(xué)反應(yīng)、原子反應(yīng)、生物過(guò)程甚至硬件和軟件的設(shè)計(jì)。理論上,任何現(xiàn)象,只要被抽象為數(shù)學(xué)公式和模型,就可在計(jì)算機(jī)上仿真。9.5用VPL仿真ALU然而,在實(shí)踐中,由于大多數(shù)自然現(xiàn)象有無(wú)限的影響因素,因此仿真非常困難。開(kāi)發(fā)仿真的一個(gè)挑戰(zhàn)是,為了創(chuàng)建有用和可行的仿真,需要確定最主要的影響因素是什么。另一個(gè)挑戰(zhàn)是發(fā)現(xiàn)模擬真實(shí)現(xiàn)象的數(shù)學(xué)模型和公式。9.5.1算術(shù)和邏輯單元的邏輯設(shè)計(jì)
算術(shù)和邏輯單元(ALU)是處理器的關(guān)鍵組件之一。圖9.13顯示了一個(gè)使用與門(mén)、或門(mén)、非門(mén)和與或門(mén)的一位加法器(左)的邏輯設(shè)計(jì),和一個(gè)使用與門(mén)、或門(mén)、二對(duì)一多工器、四對(duì)一多工器,以及一個(gè)一位加法器的一位算術(shù)邏輯單元(ALU)(右)的設(shè)計(jì)。圖9.13一位加法器(左)和一位ALU(右)的邏輯設(shè)計(jì)9.5.2創(chuàng)建VPL活動(dòng)
在本節(jié),用以下步驟開(kāi)發(fā)和仿真一個(gè)ALU組件,我們將采用基于組件的和面向服務(wù)的設(shè)計(jì)方法。
(1)設(shè)計(jì)每個(gè)基本構(gòu)建塊(與門(mén)、或門(mén)、非門(mén)和與或門(mén))作為活動(dòng)(組件)。在真值表的基礎(chǔ)上,直接開(kāi)發(fā)這些活動(dòng)。
(2)用已存在的活動(dòng)創(chuàng)建大的活動(dòng)。一個(gè)活動(dòng)只能用于當(dāng)前的應(yīng)用。如果我們想在其他應(yīng)用中使用這些活動(dòng),只需將活動(dòng)包裝成服務(wù)。
(3)利用可用的組件/服務(wù)創(chuàng)建一個(gè)一位加法器。
(4)創(chuàng)建一個(gè)測(cè)試環(huán)境測(cè)試你的加法器。(5)設(shè)計(jì)更多的組件:二對(duì)一多工器和四對(duì)一多工器。
(6)利用可用的組件/服務(wù)創(chuàng)建一個(gè)一位ALU。
下面的VPL活動(dòng)顯示了與門(mén)、或門(mén)、非門(mén)和與或門(mén)的VPL實(shí)現(xiàn)。這些實(shí)現(xiàn)直接基于門(mén)的真值表(數(shù)學(xué)模型)。圖9.14顯示了與門(mén)的設(shè)計(jì)。圖的左側(cè)顯示了MRDS中可用的基本活動(dòng)的面板。為了創(chuàng)建一個(gè)新的組件(活動(dòng)),只需將活動(dòng)從活動(dòng)面板拖到設(shè)計(jì)界面,然后,使用if活動(dòng)檢測(cè)輸入。如果兩個(gè)輸入值都是1,那么輸出也是1;否則,輸出是0?!癳lse”在圖中沒(méi)有顯示,它和一個(gè)錯(cuò)誤的消息連接,表明無(wú)效的輸入值??梢钥吹?if活動(dòng)可以順序的檢查多個(gè)條件,像C#中的if語(yǔ)句的順序。對(duì)創(chuàng)建的每個(gè)活動(dòng),需要定義動(dòng)作、輸入和輸出。更多的詳情,請(qǐng)參閱本書(shū)附錄中的VPL教程。圖9.14使用基本活動(dòng)組合一個(gè)與門(mén)
圖9.15使用基本活動(dòng)組合成或門(mén)、非門(mén)和與或門(mén)一旦有一些基本的門(mén),就可以創(chuàng)建一位加法器,如圖9.16所示,嚴(yán)格按照?qǐng)D的上半部分加法器的邏輯設(shè)計(jì)。在調(diào)試過(guò)程中,可以使用叫做“簡(jiǎn)單對(duì)話(huà)框”的服務(wù)插入多個(gè)輸入點(diǎn)。一個(gè)簡(jiǎn)單的對(duì)話(huà)框顯示在圖的右上角。對(duì)于每個(gè)活動(dòng),需要定義動(dòng)作,對(duì)于每個(gè)連接,需要設(shè)置數(shù)據(jù)值。更多的詳情,請(qǐng)參閱本書(shū)附錄中的VPL教程。圖9.16組合的一位加法器9.5.3VPL圖和測(cè)試
活動(dòng)被用來(lái)開(kāi)發(fā)組件。使用了活動(dòng)和服務(wù)的應(yīng)用被稱(chēng)為圖。加法器作為一個(gè)活動(dòng)被實(shí)現(xiàn)。為了測(cè)試這個(gè)活動(dòng),需要將它放入圖中,并在圖中添加輸入和輸出。圖9.17說(shuō)明了輸入值(carryIn,firstInput,secondInput)=(010)的測(cè)試配置。因?yàn)榧臃ㄆ餍枰热齻€(gè)輸入數(shù)據(jù)都到達(dá),所以使用了“連接”活動(dòng)。使用兩個(gè)“簡(jiǎn)單對(duì)話(huà)框”服務(wù)顯示輸出,分別用于顯示總和以及carryOut。圖9.17一位加法器的測(cè)試測(cè)試配置存在的問(wèn)題是,每個(gè)測(cè)試之后我們必須手動(dòng)改變輸入值。圖9.18是一個(gè)計(jì)數(shù)器活動(dòng)的自動(dòng)測(cè)試用例的生成機(jī)制。十進(jìn)制輸出映射為一個(gè)二進(jìn)制數(shù),用作加法器的測(cè)試用例。注意計(jì)數(shù)器活動(dòng)輸出的循環(huán)點(diǎn)(一個(gè)通知輸出)是連接到計(jì)算器的,它可以激發(fā)一個(gè)新的事件進(jìn)行新的測(cè)試。
現(xiàn)在,進(jìn)一步討論一位ALU的組合。從ALU設(shè)計(jì)中可以看到,需要兩個(gè)額外的組件:二對(duì)一和四對(duì)一多工器。二對(duì)一多工器有兩個(gè)數(shù)據(jù)輸入線和一個(gè)數(shù)據(jù)輸出線??刂凭€選擇連接到輸出線的輸入數(shù)據(jù)線,如圖9.19所示。圖9.18使用測(cè)試用例自動(dòng)生成機(jī)制測(cè)試一位加法器三個(gè)if活動(dòng)用于確認(rèn)輸入。只允許二進(jìn)制輸入。三個(gè)輸入通過(guò)連接活動(dòng)聯(lián)結(jié)。然后,我們使用if活動(dòng)檢查控制線op。如果op的值為0,我們將數(shù)據(jù)線d0連接到輸出上。否則,將d1連接到輸出上。在右端,用合并活動(dòng)代替連接活動(dòng),因?yàn)橹挥泻喜⒃试S輸入分支的某一個(gè)接收數(shù)據(jù)就行,而連接需要所有輸入分支都接收數(shù)據(jù)。圖9.19使用基本活動(dòng)組合成一個(gè)二對(duì)一多工器四對(duì)一多工器的原理和二對(duì)一多工器一樣,但它有4個(gè)輸入線和2個(gè)控制線——op1和op0,并從4個(gè)輸入線中選擇某一個(gè)。四對(duì)一多工器的VPL設(shè)計(jì)在圖9.20中給出。圖9.20使用基本活動(dòng)組合成四對(duì)一多工器現(xiàn)在,用VPL活動(dòng)給出一位ALU的設(shè)計(jì),如圖9.21。
這個(gè)活動(dòng)有6個(gè)輸入。其中3個(gè)是控制線,其他3個(gè)是數(shù)據(jù)線。VPL設(shè)計(jì)遵循圖9.20給出的邏輯設(shè)計(jì)。圖9.22中,為了測(cè)試,將ALU放入一個(gè)圖中。根據(jù)圖9.18中的例子,可以設(shè)計(jì)一個(gè)測(cè)試用例自動(dòng)產(chǎn)生機(jī)制來(lái)測(cè)試所有的輸入組合。圖9.21一位ALU設(shè)計(jì)圖9.22在VPL圖中測(cè)試一位ALU
有限自動(dòng)機(jī)(FSM),也稱(chēng)為狀態(tài)圖或狀態(tài)轉(zhuǎn)換圖,是有限個(gè)狀態(tài)、狀態(tài)之間的轉(zhuǎn)換以及動(dòng)作組成的行為模型。一個(gè)有窮自動(dòng)機(jī)是帶有內(nèi)部存儲(chǔ)機(jī)器的抽象模型(/wiki/Finite_state_machine)。當(dāng)前狀態(tài)由系統(tǒng)過(guò)去的狀態(tài)決定。因此,可以說(shuō)它記錄了過(guò)去的信息,也就是,它反映了從系統(tǒng)啟動(dòng)到當(dāng)前時(shí)刻的輸入變化。9.6有限自動(dòng)機(jī)和VPL圖一個(gè)轉(zhuǎn)換表明了狀態(tài)的改變,并通過(guò)激發(fā)狀態(tài)轉(zhuǎn)換需要滿(mǎn)足的條件來(lái)描述。動(dòng)作是在給定時(shí)刻執(zhí)行的活動(dòng)的描述。
FSM可以用來(lái)說(shuō)明(建模)包含存儲(chǔ)(變量)的不同系統(tǒng),例如:
(1)以硬幣或者賬單的序列為輸入的自動(dòng)售貨機(jī);
(2)查看二進(jìn)制數(shù)(0和1組成的字符串)中的1的個(gè)數(shù)的奇偶性(奇數(shù)或偶數(shù))校驗(yàn)器;
(3)讀取字符序列作為字符串,并在讀的過(guò)程中處理字符的字符過(guò)濾器(處理器);
(4)機(jī)器人的行為,例如,使用它當(dāng)前和過(guò)去的狀態(tài)信息決定下一步的移動(dòng)。有兩種有窮自動(dòng)機(jī):
①純有窮自動(dòng)機(jī),以狀態(tài)作為唯一的存儲(chǔ)。換句話(huà)說(shuō),它不使用額外的存儲(chǔ)。
②帶有額外存儲(chǔ)的有窮自動(dòng)機(jī)。
首先,我們來(lái)看描述自動(dòng)售貨機(jī)的純有窮自動(dòng)機(jī)。假定自動(dòng)售貨機(jī)出售40美分/瓶的蘇打水,它有下面5個(gè)輸入:①放入25美分;②放入10美分;③放入5美分;④按按鈕取蘇打水;⑤按返回按鈕取回錢(qián)。
因?yàn)樗行畔⒈仨毚鎯?chǔ)到有限個(gè)狀態(tài)中,我們必須假定機(jī)器可容納的最大金額。例如,我們假設(shè)機(jī)器最多可容納50美分。圖9.23給出了一個(gè)有窮自動(dòng)機(jī),具體指明了狀態(tài)、狀態(tài)轉(zhuǎn)化和激發(fā)轉(zhuǎn)換的輸入。圖9.23純的有窮自動(dòng)機(jī)為了保證圖的清晰度,并非所有的轉(zhuǎn)換都在圖中顯示。遺漏的轉(zhuǎn)換如下:
(1)如果返回輸入給定(按下返回按鈕),那么從每個(gè)狀態(tài)到狀態(tài)0都有一個(gè)轉(zhuǎn)換。在圖中,顯示了從狀態(tài)25和狀態(tài)50的返回轉(zhuǎn)換。
(2)在每個(gè)狀態(tài),消費(fèi)者都可以按蘇打水按鈕。對(duì)于狀態(tài)40、45和50,自動(dòng)售貨機(jī)將給蘇打水,同時(shí)有窮自動(dòng)機(jī)轉(zhuǎn)換到減少40美分的狀態(tài)。在其少于40美分的狀態(tài),有窮自動(dòng)機(jī)保持不變。例如,狀態(tài)20和狀態(tài)30顯示了兩個(gè)蘇打水轉(zhuǎn)化。如果使用額外的存儲(chǔ),那么就可以消除金額上的限制,而且,可以減少狀態(tài)的個(gè)數(shù)。圖9.24顯示了一個(gè)有額外變量“sum”的有窮狀態(tài)機(jī),它記錄放入自動(dòng)售貨機(jī)的總金額。本例中,我們假定自動(dòng)售貨機(jī)可以接收硬幣和美元作為輸入,而且蘇打水是75美分/瓶。
圖9.25顯示了有窮自動(dòng)機(jī)的VPL實(shí)現(xiàn)。這個(gè)實(shí)現(xiàn)基于活動(dòng)之間的連接所表示的控制流。圖9.24具有存儲(chǔ)的有窮自動(dòng)機(jī)
圖9.25實(shí)現(xiàn)有窮自動(dòng)機(jī)的VPL圖VPL也支持事件驅(qū)動(dòng)的編程,在VPL中,可以產(chǎn)生通知(事件)并用來(lái)激發(fā)下一個(gè)活動(dòng)。下面幾個(gè)圖給出了自動(dòng)售貨機(jī)的事件驅(qū)動(dòng)的實(shí)現(xiàn)。首先定義一個(gè)稱(chēng)為“GenerateState”的活動(dòng),它為三個(gè)輸入:金額>=75、金額>0并且<75、金額等于==0,分別產(chǎn)生三個(gè)狀態(tài)“金額充足”、“金額不足”、“空”。圖9.26給出了活動(dòng)圖。圖9.26活動(dòng)GenerateState接下來(lái),定義一個(gè)叫做“VendingMachine”的活動(dòng),以及三個(gè)動(dòng)作(添加金額,獲取蘇打水和返回金額)和帶有兩個(gè)可能值的通知(自動(dòng)售貨機(jī)狀態(tài)和金額),來(lái)處理添加金額、獲取蘇打水和返回金額(如果有充足的金額,并按下“蘇打水”按鈕)的情況,如圖9.27。圖9.27活動(dòng)VendingMachine的動(dòng)作和通知的定義圖9.28顯示了活動(dòng)的三個(gè)動(dòng)作的VPL代碼。我們用一個(gè)整型變量funds存儲(chǔ)自動(dòng)售貨機(jī)的狀態(tài)。當(dāng)變量值改變時(shí),一個(gè)通知(事件)將被激發(fā)(觸發(fā)),提醒狀態(tài)的改變。每個(gè)活動(dòng)也包含一個(gè)起始動(dòng)作,這類(lèi)似對(duì)象的構(gòu)造函數(shù)。在起始動(dòng)作中設(shè)置變量funds=0。圖9.28活動(dòng)VendingMachine(a)起始;(b)添加金額;(c)獲取蘇打水;(d)返回金額圖9.29中有兩個(gè)分離的代碼段,它們由圖9.28中定義的自動(dòng)售貨機(jī)活動(dòng)中的事件連接。程序的執(zhí)行場(chǎng)景如下所述:
(1)用戶(hù)點(diǎn)擊一個(gè)FlexibleDialog的圖形用戶(hù)界面按鈕,它就發(fā)送一個(gè)輸入字符串到開(kāi)關(guān)活動(dòng)。
(2)如果按下money按鈕(10美分、25美分或者1美元),自動(dòng)售貨機(jī)活動(dòng)的添加金額活動(dòng)(方法)將被調(diào)用,并添加選擇的錢(qián)數(shù)。圖9.29售貨機(jī)的事件驅(qū)動(dòng)實(shí)現(xiàn)的主圖(3)如果按了蘇打水或者返回按鈕,那么將調(diào)用自動(dòng)售貨機(jī)活動(dòng)的獲取蘇打水或者返回金額的活動(dòng)。
(4)執(zhí)行了自動(dòng)售貨機(jī)活動(dòng)的一個(gè)動(dòng)作之后,執(zhí)行主圖的第二部分,它計(jì)算并顯示有限狀態(tài)機(jī)新的狀態(tài)和新的金額。
以上已經(jīng)學(xué)習(xí)了開(kāi)發(fā)活動(dòng)、服務(wù)和應(yīng)用的通用編程語(yǔ)言VPL,在本節(jié),我們將重點(diǎn)放到機(jī)器人應(yīng)用上。9.7開(kāi)發(fā)面向服務(wù)的機(jī)器人應(yīng)用9.7.1RoboticsStudio的服務(wù)庫(kù)
MRDS和VPL都是機(jī)器人開(kāi)發(fā)環(huán)境,因?yàn)樗幸粋€(gè)大的機(jī)器人服務(wù)庫(kù),使得用戶(hù)容易地選擇服務(wù)來(lái)構(gòu)建他們的應(yīng)用。圖9.30顯示了與不同的機(jī)器人平臺(tái)相關(guān)的庫(kù)的一部分,包括來(lái)自iRobot和LEGONXT的,也有用于不同機(jī)器人平臺(tái)的通用服務(wù)。仿真服務(wù)允許用戶(hù)創(chuàng)建不同類(lèi)型的仿真機(jī)器人,并且在三維虛擬環(huán)境中操作機(jī)器人。圖9.30MRDS庫(kù)中的部分服務(wù)庫(kù)中還提供了服務(wù)開(kāi)發(fā)指南、仿真設(shè)計(jì)指南以及機(jī)器人應(yīng)用指南。用戶(hù)可以在指南的指導(dǎo)下使用MRDS環(huán)境。
本章重點(diǎn)關(guān)注仿真機(jī)器人平臺(tái)。下一節(jié)將在開(kāi)發(fā)機(jī)器人服務(wù)和應(yīng)用上使用這些服務(wù)。詳細(xì)的LEGONXT平臺(tái)的介紹參見(jiàn)附錄。9.7.2傳感器服務(wù)
機(jī)器人通過(guò)它的傳感器和處理能力獲得從傳感器中提取有用的信息的智能。圖9.30給出服務(wù)庫(kù)中的許多傳感器服務(wù)。
在本節(jié),我們將研究SimulatedLaserRangeFinder傳感器,它可以用來(lái)測(cè)量距離,并協(xié)助機(jī)器人通過(guò)迷宮。
MRDS庫(kù)中的SimulatedLaserRangeFinder模擬真正的SickLMS200系列范圍傳感器(/en_us/library/cc998493.aspx),它通過(guò)激光照射一個(gè)旋轉(zhuǎn)的鏡子進(jìn)行操作。由于鏡子旋轉(zhuǎn),激光可以?huà)呙鑲鞲衅髑胺?80°的范圍,有效地創(chuàng)建激光扇,如圖9.31所示。任何破壞激光扇的對(duì)象,將激光反射回傳感器,并根據(jù)激光返回傳感器的時(shí)間計(jì)算距離。距離存儲(chǔ)在數(shù)組DistanceMeasurements[index]中,其中index可以取0°到180°之間的值。如果取值DistanceMeasurements[90],可以獲取傳感器正前方障礙物的距離。如果想測(cè)量旁邊的距離,可以取值DistanceMeasurements[0]或者DistanceMeasurements[180]。因?yàn)殓R子高速旋轉(zhuǎn),可以認(rèn)為機(jī)器人在同一時(shí)刻可以讀和用所有的181個(gè)值。圖9.31180°視覺(jué)范圍的激光范圍傳感器我們可以使用181個(gè)距離值在仿真中做出決策。但是,如果想用有限的預(yù)算測(cè)試真實(shí)機(jī)器人,例如NXT的Mindstorm和iRobot,只需使用一個(gè)或者多個(gè)測(cè)量值,因?yàn)榉秶鷤鞲衅饔靡粋€(gè)單獨(dú)光束測(cè)量距離。如果DistanceMeasurements的值的個(gè)數(shù)多于機(jī)器人可以處理的范圍傳感器的個(gè)數(shù),仿真程序就不能操作這些機(jī)器人。例如,為了實(shí)現(xiàn)摸墻算法走出迷宮,要安裝兩個(gè)范圍傳感器,一個(gè)向前,一個(gè)向后。9.7.3迷宮導(dǎo)航算法
有很多不同的算法幫助人或機(jī)器人從迷宮的起點(diǎn)走到終點(diǎn)。根據(jù)迷宮的形狀和路線,同樣的算法效率可以好或壞。進(jìn)一步,即使兩個(gè)算法解決同樣的問(wèn)題,但一個(gè)算法從起點(diǎn)移動(dòng)到終點(diǎn)使用的時(shí)間(或者轉(zhuǎn)的圈數(shù))可能比另一個(gè)更短。在本節(jié),我們將簡(jiǎn)要討論一些算法。
1.隨機(jī)算法
如果有足夠的空間,機(jī)器人就會(huì)向前移動(dòng)。當(dāng)機(jī)器人發(fā)現(xiàn)前面有障礙物時(shí),它就隨機(jī)的向左或向右轉(zhuǎn)。用觸摸傳感器或者超聲波傳感器,這個(gè)算法很容易實(shí)現(xiàn)。
2.摸墻算法
機(jī)器人用左邊(或右邊)的范圍傳感器測(cè)量到側(cè)壁的距離,并且在它的前方使用額外的觸摸傳感器或范圍傳感器。在這個(gè)算法中,機(jī)器人與墻保持恒定的距離。如果有足夠的空間,并且到側(cè)墻的距離是恒定的,機(jī)器人就會(huì)向前移動(dòng)。如果測(cè)量的距離比預(yù)定的距離大,那么機(jī)器人就轉(zhuǎn)向側(cè)傳感器的一側(cè)。如果前方的傳感器發(fā)現(xiàn)墻,那么機(jī)器人將轉(zhuǎn)向反面。
3.基于首次工作方案的貪婪算法
機(jī)器人使用范圍傳感器測(cè)量前方的距離,向前移動(dòng)直到發(fā)現(xiàn)障礙物轉(zhuǎn)向左側(cè)。也就是,它將測(cè)量距離,如果有足夠的空間,就向前移動(dòng)。如果沒(méi)有足夠的空間,向左旋1800,然后向前移動(dòng)。
4.局部最優(yōu)決策的啟發(fā)式算法
假設(shè)機(jī)器人裝有測(cè)量它前方距離的范圍傳感器。機(jī)器人開(kāi)始向前移動(dòng)。當(dāng)發(fā)現(xiàn)障礙物時(shí),機(jī)器人就會(huì)左轉(zhuǎn)900并測(cè)量距離。將距離保存在一個(gè)變量中。然后旋轉(zhuǎn)1800,并測(cè)量距離。它將剛測(cè)量的距離值和存儲(chǔ)在變量中的距離值作比較,如果當(dāng)前的值大,機(jī)器人就向前移動(dòng);如果當(dāng)前的值小,機(jī)器人將旋轉(zhuǎn)1800,并向前移動(dòng)。9.7.4用VPL實(shí)現(xiàn)迷宮導(dǎo)航算法
本節(jié),我們將使用VPL在仿真環(huán)境中實(shí)現(xiàn)啟發(fā)式算法。由于VPL是事件驅(qū)動(dòng)語(yǔ)言,所以最好的方法是用有窮自動(dòng)機(jī)說(shuō)明這個(gè)算法,如圖9.32所示。在圖中,使用了兩個(gè)變量。變量“Status”有6個(gè)可能的字符串類(lèi)型的值:Forward,TurningRight,TurnedRight,TurningLeft(Spin180),TurnedLeft,Resume180。Int類(lèi)型變量“RightDistance”用來(lái)存放機(jī)器人右轉(zhuǎn)后到障礙物的距離。圖9.32迷宮導(dǎo)航算法的狀態(tài)圖圖9.32中的狀態(tài)圖實(shí)現(xiàn)了一個(gè)啟發(fā)式算法,以下的步驟詳細(xì)說(shuō)明這個(gè)算法。
①機(jī)器人開(kāi)始向前移動(dòng);
②如果范圍傳感器測(cè)量的距離小于400mm,機(jī)器人向右轉(zhuǎn)(90°);
③事件RightFinished發(fā)生后,機(jī)器人將測(cè)量的距離保存在變量RigthDistance中;
④然后,機(jī)器人左轉(zhuǎn)180°測(cè)量另一側(cè)的距離;
⑤事件LeftFinished發(fā)生后,它比較測(cè)量的距離和保存在變量RigthDistance中的值;⑥如果當(dāng)前的值大,它轉(zhuǎn)換到“Forward”狀態(tài),向前移動(dòng);
⑦否則,它將重新開(kāi)始到其他的方向(旋轉(zhuǎn)180°);
⑧然后,它轉(zhuǎn)換到“Forward”狀態(tài),向前移動(dòng)。
這個(gè)算法之所以被稱(chēng)為啟發(fā)式的,是因?yàn)樗荒転樗忻詫m找到解決方案。然而,在大多數(shù)迷宮中,根據(jù)單個(gè)范圍傳感器收集的信息,它找到解決方案的可能性還是很高的。例如,對(duì)于圖9.33給出的迷宮,算法將會(huì)發(fā)現(xiàn)一條路線。圖9.33仿真中實(shí)現(xiàn)的迷宮MRDS的仿真工具可以創(chuàng)建仿真迷宮。用戶(hù)可以參考MRDS文檔中的指南:在Windows起始菜單中,選擇開(kāi)始→程序→MicrosoftRoboticDeveloperStudio→文檔。一旦文檔窗口打開(kāi),用戶(hù)可以從以下路徑找到仿真指南:可視化仿真環(huán)境→仿真指南→仿真指南概述。
本節(jié)剩余部分將逐步開(kāi)發(fā)VPL代碼實(shí)現(xiàn)上面的算法。為了遵循書(shū)中程序開(kāi)發(fā)的步驟,用戶(hù)需要按以下步驟下載和部署迷宮服務(wù):①在安裝服務(wù)之前,確保VPL應(yīng)用關(guān)閉。
②從ASU(亞利桑那州立大學(xué))機(jī)器人庫(kù),地址為http:///srlab/research/roboticscamp/downloads.html,下載仿真迷宮文件“MazeForLRF2Directions.zip”。解壓文件,將文件夾中的4個(gè)文件復(fù)制到用戶(hù)的MicrosoftRoboticDeveloperStudio主目錄中的/samples/Config目錄中。
③一旦部署,當(dāng)用戶(hù)開(kāi)發(fā)自己的VPL圖(應(yīng)用)時(shí),就可以用一個(gè)名為MazeLRFBack.Manifest.xml的清單。
現(xiàn)在,你可以按照下面的步驟實(shí)現(xiàn)Right_Then_Left算法。注意,如果你理解和按照這些步驟執(zhí)行時(shí)有困難,可以先參考附錄C中給出的教學(xué)練習(xí)。第1步:在MRDS中啟動(dòng)VPL,并將項(xiàng)目保存為RightThenLeftMaze。
第2步:在VPL圖中創(chuàng)建活動(dòng)“drive”。雙擊drive活動(dòng)打開(kāi)它。在活動(dòng)中添加動(dòng)作列表:“forward”,“backward”,“right90”,“l(fā)eft180”,“resum180”和“stop”,并且添加一個(gè)事件列表,如圖9.34所示。圖9.34drive活動(dòng)的動(dòng)作和事件動(dòng)作的程序在下面的活動(dòng)圖中給出。我們不要編寫(xiě)默認(rèn)動(dòng)作Start的程序,并且我們預(yù)留一個(gè)動(dòng)作empty。動(dòng)作“right”,“l(fā)eft”,“turnaround”和“stop”不僅有一個(gè)輸出數(shù)據(jù),而且還有激發(fā)其他活動(dòng)的事件輸出。
圖9.35給出了“forward”和“backward”動(dòng)作的代碼。在forward動(dòng)作中,兩個(gè)輪子的輸入端口和GenericDifferentialDrive之間的數(shù)據(jù)連接設(shè)置成0.3;在backward動(dòng)作中,兩個(gè)輪子的輸入端口和GenericDifferentialDrive之間的數(shù)據(jù)連接設(shè)置成-0.3。圖9.35drive活動(dòng)的“forward”和“backward”動(dòng)作圖9.36顯示了“right90”動(dòng)作的代碼。在這個(gè)動(dòng)作中,左右兩個(gè)輪子到第一個(gè)GenericDifferentialDrive的輸入數(shù)據(jù)連接分別設(shè)置為0.2和-0.2。到第一個(gè)Timer的輸入數(shù)據(jù)連接設(shè)置為“value”,它將值600(ms)傳遞給Timer。調(diào)整這個(gè)數(shù)字使得機(jī)器人旋轉(zhuǎn)90°。旋轉(zhuǎn)90°后,機(jī)器人可以測(cè)量右側(cè)的距離。兩個(gè)輪子到第二個(gè)GenericDifferentialDrive的輸入數(shù)據(jù)連接設(shè)置為0以停止旋轉(zhuǎn)。
留下“null”值是不正確的。你必須選擇:并且輸入0,你的配置應(yīng)該如下,如圖9.38所示。圖9.36drive活動(dòng)的“right90”動(dòng)作圖9.37圖9.38第二個(gè)timer的600ms允許機(jī)器人穩(wěn)定停止。第二個(gè)Timer完成后,它會(huì)激發(fā)一個(gè)rightFinished事件。
根據(jù)計(jì)算機(jī)的速度和內(nèi)存,調(diào)整時(shí)間值來(lái)決定所需的旋轉(zhuǎn)度。
圖9.39顯示了“l(fā)eft180”動(dòng)作的代碼。左右輪子到第一個(gè)GenericDifferentialDrive的輸入數(shù)據(jù)連接分別設(shè)置為0.2和-0.2。第一個(gè)Timer設(shè)置為1150ms,允許機(jī)器人右轉(zhuǎn)180°。兩個(gè)輪子到第二個(gè)GenericDifferentialDrive的輸入數(shù)據(jù)連接設(shè)置為0以停止旋轉(zhuǎn)。圖9.39drive活動(dòng)的“l(fā)eft180”動(dòng)作除了活動(dòng)產(chǎn)生的事件不同外,resume180的代碼和left180的代碼相似。left180的事件說(shuō)明可以讀左側(cè)的距離,resume180的事件說(shuō)明向前是下一個(gè)動(dòng)作。請(qǐng)參考程序的有窮狀態(tài)機(jī)說(shuō)明。圖9.40給出了動(dòng)作的代碼。即使左轉(zhuǎn)180°有同樣的效果,但這個(gè)動(dòng)作使用了右轉(zhuǎn)180°。圖9.40drive活動(dòng)的resume180動(dòng)作圖9.41給出了stop動(dòng)作的代碼。到第一個(gè)GenericDifferentialDrive的數(shù)據(jù)連接設(shè)置為0,0用于機(jī)器人的停止。到第二個(gè)GenericDifferentialDrive的數(shù)據(jù)連接設(shè)置為-0.1,-0.1用于向后移動(dòng)。動(dòng)作完成后,它會(huì)激發(fā)一個(gè)stopFinished事件,其他動(dòng)作可以繼續(xù)使機(jī)器人移動(dòng)。圖9.41drive活動(dòng)的stop動(dòng)作機(jī)器人發(fā)現(xiàn)前方有障礙物之后,stop動(dòng)作的向后移動(dòng)操作在它前面留下很大空間。作為選擇,可以讓機(jī)器人在600mm處停下來(lái),而不是400mm。由于測(cè)量的不精確和范圍傳感器角度判斷的不完善,如果機(jī)器人停止在遠(yuǎn)離障礙物的地方,可容忍更多的錯(cuò)誤。
第3步:設(shè)計(jì)好drive活動(dòng)和它的動(dòng)作之后,就可以給出實(shí)現(xiàn)啟發(fā)式算法的主圖。因?yàn)閳D較大,我們將圖表示成多個(gè)片段。圖9.42顯示了圖的第一部分。我們也使用DirectDialog儀表板啟動(dòng)機(jī)器人。為此,只需要定義Forward操作。我們定義了一個(gè)變量Status(字符串),在手動(dòng)啟動(dòng)后,變量被初始化為“Forward”。圖9.42主圖第一部分:就緒,讀入距離并計(jì)算輸入數(shù)據(jù)的主要來(lái)源是SimulatedLaserRangeFinder。它不斷地測(cè)量用于決策的距離。傳感器的視力范圍是0~180°,它存儲(chǔ)于數(shù)組DistanceMeasurements[0180]中。由于NXT超聲波傳感器有只一個(gè)測(cè)量距離的獨(dú)立的聲納光束,這個(gè)程序使用中間值DistanceMeasurements[92]。然后,根據(jù)當(dāng)前狀態(tài)和到墻的距離,使用if動(dòng)作決定下一步做什么。首先,需要知道機(jī)器人的當(dāng)前狀態(tài)。它有六個(gè)可能的狀態(tài)值:Forward,TurningRight,TurnedRight,TurningLeft,TurneLeft和Resume180,如程序的有窮狀態(tài)機(jī)中解釋的。當(dāng)前值存儲(chǔ)在程序狀態(tài)空間變量的Status中,因此被寫(xiě)作state.Status。根據(jù)if動(dòng)作的四個(gè)條件采取不同的動(dòng)作,每個(gè)動(dòng)作將引起不同的后續(xù)動(dòng)作。圖9.43顯示了處理前兩個(gè)條件的代碼。第一個(gè)條件是機(jī)器人向前移動(dòng)并且靠近墻。因此,第一個(gè)動(dòng)作就是停止機(jī)器人,且將變量Status改為T(mén)urningRight。出現(xiàn)的stopFinished事件將激發(fā)drive活動(dòng)采取right90動(dòng)作。在事件rightFinished發(fā)生之前,程序?qū)tatus變量改為T(mén)urnedRight。
如果狀態(tài)變?yōu)門(mén)urnedRight,第二個(gè)條件將變?yōu)檎?。在這種情況下,程序?qū)istanceMeasurements[92]的當(dāng)前值存儲(chǔ)在變量RightDistance中,將狀態(tài)變量改為RuningLeft,并且開(kāi)始向左轉(zhuǎn)180°。在另一面的距離測(cè)量之后,使用存儲(chǔ)在變量RightDistance中的值。圖9.43主圖第二部分:前兩種情況的代碼圖9.44顯示了處理第三和第四個(gè)條件的代碼。在這種情況下,如果第三個(gè)條件是真,新測(cè)量的距離大于或等于保存的另一面的距離,機(jī)器人會(huì)簡(jiǎn)單地向前移動(dòng)。在第四個(gè)條件為真的情況下,新測(cè)量的距離小于存儲(chǔ)的另一面的距離,機(jī)器人將恢復(fù)到另一面。它將狀態(tài)值改變?yōu)镽esume180,且采取Resume180動(dòng)作,機(jī)器人將旋轉(zhuǎn)180°到對(duì)面的一側(cè),然后開(kāi)始向前移動(dòng)。圖9.44主圖第三部分:第三和第四種情況的代碼根據(jù)圖9.25中的狀態(tài)機(jī),一旦機(jī)器人返回Forward狀態(tài),機(jī)器人就返回到初始狀態(tài)并重復(fù)狀態(tài)機(jī)循環(huán)中的動(dòng)作。
觀察程序圖,可以看到程序?qū)崿F(xiàn)了一個(gè)有窮自動(dòng)機(jī),并且是事件驅(qū)動(dòng)范型。組件/服務(wù)沒(méi)有連接到控制流。當(dāng)事件發(fā)生時(shí),它們才會(huì)連接。
第4步:雙擊SimulatedLaserRangeFinder服務(wù),然后為傳感器服務(wù)導(dǎo)入MazeLRFBack.Manifest.xml清單,如圖9.45所示。
第5步:打開(kāi)drive活動(dòng),然后雙擊GenericDifferentialDrive服務(wù)。為drive服務(wù)選擇同樣的清單MazeLRFBack.Manifest.xml,如圖9.45所示。圖9.45為傳感器和drive服務(wù)定義清單
在特別設(shè)計(jì)的機(jī)器人平臺(tái)和它們的組件上,例如iRobot,LEGONXTMindstorm,NexRobotics和Parallax,MRDS和VPL已經(jīng)實(shí)現(xiàn)。VPL沒(méi)有運(yùn)行在通用的體系架構(gòu)上,如Intel和通用USB或者串行端口設(shè)備(傳感器和驅(qū)動(dòng)器)。9.8VPL到其他平臺(tái)的映射在RaaS實(shí)現(xiàn)中,亞利桑那州立大學(xué)實(shí)現(xiàn)了一個(gè)從設(shè)備驅(qū)動(dòng)到MRDS的DSS(分布式軟件服務(wù))的映射服務(wù)層,這樣,VPL應(yīng)用可以調(diào)用不同廠商提供的USB設(shè)備驅(qū)動(dòng)。為了把每個(gè)設(shè)備添加到RaaS平臺(tái),需要編寫(xiě)一個(gè)DSS服務(wù),它將設(shè)備驅(qū)動(dòng)映射到VPL接口。
在MRDS和VPL的典型應(yīng)用中,應(yīng)用和DSS服務(wù)運(yùn)行在后臺(tái)計(jì)算機(jī)上,而設(shè)備和設(shè)備驅(qū)動(dòng)運(yùn)行在機(jī)器人上。機(jī)器人和它的設(shè)備是后臺(tái)計(jì)算機(jī)的主要輸入/輸出設(shè)備。在這種設(shè)計(jì)中,因?yàn)镽aaS運(yùn)行在功能強(qiáng)大的Intel嵌入式處理器Atom上,所以將所有的應(yīng)用、服務(wù)和機(jī)器人上的設(shè)備或者9.3節(jié)討論的RaaS單元集成在一起成為可能。在RaaS中,我們實(shí)現(xiàn)了很多DSS服務(wù),包括封裝各種傳感器和驅(qū)動(dòng)器。圖9.46給出了使用三個(gè)USB聲納傳感器服務(wù)的VPL圖(應(yīng)用),以及控制Intel平臺(tái)上的發(fā)動(dòng)機(jī)的VPL圖。給使用Visualstdio的MRDSVPL平臺(tái)和C#創(chuàng)建DSS服務(wù)的步驟為:選擇文件→新建工程→微軟機(jī)器人→DSS服務(wù)。
下面的C#代碼給出了圖9.46發(fā)動(dòng)機(jī)服務(wù)的實(shí)現(xiàn),它實(shí)現(xiàn)了映射到設(shè)備驅(qū)動(dòng)操作的服務(wù)契約和服務(wù)端口。C#代碼在VisualStudio項(xiàng)目模板“微軟機(jī)器人”中開(kāi)發(fā),并編譯為DSS服務(wù)。圖9.46用VPL實(shí)現(xiàn)支持RaaS的DSS服務(wù)usingSystem;usingSystem.Collections.Generic;
usingSystem.ComponentModel;usingMicrosoft.Ccr.Core;
usingMicrosoft.Dss.Core.Attributes;
usingMicrosoft.Dss.ServiceModel.Dssp;
usingMicrosoft.Dss.ServiceModel.DsspServiceBase;usingW3C.Soap;
namespaceRobotics{
publicsealedclassContract{
[DataMember]
publicconststringIdentifier="/2009/11/motorservice2.html";
}
[DataContract]
publicclassMotorService2State{
privateOperationName_operation=OperationName.Stop;
[DataMember(IsRequired=true)]
publicOperationNameoperation{
get{return_operation;}set{_operation=value;}
}
}
[Data
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)業(yè)生產(chǎn)三農(nóng)村脫貧攻堅(jiān)方案
- 化工原料承運(yùn)合同樣本
- 加工成品承攬合同范本
- 航空航天銷(xiāo)售居間合同范本
- 市級(jí)運(yùn)營(yíng)商合作協(xié)議書(shū)范本
- 亭子小學(xué)維修學(xué)校校園合同范本
- 碳匯交易項(xiàng)目合作協(xié)議
- 房地產(chǎn)項(xiàng)目委托開(kāi)發(fā)管理協(xié)議
- 西餐廳裝修終止合同協(xié)議書(shū)
- 住宅裝修合同終止協(xié)議書(shū)
- 電子線檢驗(yàn)標(biāo)準(zhǔn)
- 建筑施工安全員理論考核試題與答案
- 人教版七年級(jí)歷史下冊(cè)教學(xué)計(jì)劃(及進(jìn)度表)
- 建筑工程節(jié)后復(fù)工自查表
- 華萊士標(biāo)準(zhǔn)化體系
- 快捷smt全自動(dòng)物料倉(cāng)儲(chǔ)方案
- keysight眼圖和抖動(dòng)噪聲基礎(chǔ)知識(shí)與測(cè)量方法
- TPU材料項(xiàng)目可行性研究報(bào)告寫(xiě)作參考范文
- 試用期考核合格證明表
- 鍋爐補(bǔ)給水陰陽(yáng)混床操作步序表
- 2005年第4季度北京住房租賃指導(dǎo)價(jià)格
評(píng)論
0/150
提交評(píng)論