王元杰, 林 都, 鮮 浩
(中北大學(xué)電氣與控制工程學(xué)院,太原030051)
機(jī)器人技術(shù)是集機(jī)械、電子、控制技術(shù)、計(jì)算機(jī)、人工智能等多個(gè)學(xué)科領(lǐng)域于一身的一項(xiàng)綜合性應(yīng)用型技術(shù),是衡量一個(gè)國家科技發(fā)展水平高低的重要標(biāo)志[1]。
機(jī)器人研究中極為熱門的研究方向之一——仿人機(jī)器人,它有著類人的肢體結(jié)構(gòu)(通常具有仿人的頭部或四肢結(jié)構(gòu)),能夠在特定環(huán)境中代替人類來完成各種工作,進(jìn)一步而言,仿人機(jī)器人可以說在很多方面擴(kuò)展了人類的能力范圍。因此,仿人機(jī)器人在科研、教育、醫(yī)療等多個(gè)領(lǐng)域中得到了廣泛的應(yīng)用,各科研機(jī)構(gòu)在仿人機(jī)器人的研究中進(jìn)行了大量的科研工作,仿人機(jī)器人也成為全球各發(fā)達(dá)國家不惜投入大量人力、物力、財(cái)力去角逐的科技制高點(diǎn)[2-3]。
NAO機(jī)器人是一款仿人形機(jī)器人,是目前世界上應(yīng)用最廣泛的仿人型機(jī)器人之一[4]。
NAO機(jī)器人高58 cm,具有25個(gè)自由度(圖1),以及大量傳感器(圖2),支持遠(yuǎn)程控制,可實(shí)現(xiàn)完全編程等功能。他豐富的傳感器資源以及靈活的結(jié)構(gòu),可以完成各種復(fù)雜的操作和功能。
圖1 NAO傳感器示意圖
圖2 NAO機(jī)器人關(guān)節(jié)示意圖
同時(shí),NAO機(jī)器人也得到了公眾的肯定,在2007年,它成為機(jī)器人世界杯(RoboCup)的標(biāo)準(zhǔn)平臺;在2010年,NAO機(jī)器人作為科技大使出現(xiàn)[4]在上海世博會上[5]。
將NAO機(jī)器人的技術(shù)開放給所有的高等教育項(xiàng)目,因?yàn)樗褂肔inux系統(tǒng)的嵌入式處理器,所以不僅可以使用C++,Python等語言進(jìn)行編程,也可以使用官方開發(fā)的一套可視化編譯軟件進(jìn)行編程,這就使得NAO機(jī)器人的開發(fā)有了很大的自由空間和可能性[6]。
NAO的研究范圍覆蓋了包括語音識別,視頻處理,模式識別,自閉癥治療,自動化,喜好處理,路徑規(guī)劃等很多的方面和領(lǐng)域。這些領(lǐng)域中間,包括了一些不是以軟件編程為主要方向的研究者,NAO機(jī)器人多樣的編譯環(huán)境某種程度上給非控制和軟件方向的研究者帶來了一定的困擾[7]。
本文主要以人臉識別為例,使用最常用的可視化編程以及Python語言,具體分析各種編譯方式的優(yōu)劣,以及其在各類應(yīng)用場合下的實(shí)際情況。
NAO機(jī)器人通過攝像頭獲取圖像信息,處理并獲得有效的信息。在機(jī)器人的頭部,垂直安裝了兩個(gè)高清攝像頭,其參數(shù):輸出YUV422,視場58°,水平視場47.8°,垂直視場 34.8°,聚焦范圍 30 cm ~ ∞,聚焦類型定焦,物理分辨率VGA,QVGA,幀速30 f/s。攝像頭傳感器可捕捉清晰的VGA格式畫面,最高分辨率下可以達(dá)到30幀/s的速度。頭部水平方向可以轉(zhuǎn)動接近239°,垂直方向可轉(zhuǎn)動接近68°;視角范圍在水平方向約61°,垂直方向約為 34.8°(圖3),因此可以識別各類物體。NAO機(jī)器人廣為人知的人臉識別就是根據(jù)這個(gè)設(shè)計(jì)而開發(fā)的一項(xiàng)互動功能。NAO可以學(xué)習(xí)記憶不同的人臉信息,并對其進(jìn)行識別[8-9]。
圖3 機(jī)器人攝像頭時(shí)域示意圖
Python是一種高級的、解釋性的、交互式的、面向?qū)ο蟮哪_本語言,更是一門跨平臺、開源、免費(fèi)的解釋性高級動態(tài)編程語言,是一種通用編程語言。除了可以解釋執(zhí)行之外,Python還支持將源代碼偽編譯為字節(jié)碼來優(yōu)化程序提高運(yùn)行效率并對源代碼進(jìn)行保密。Python支持命令式編程(How to do)和函數(shù)式編程(What to do)兩種方式,完全支持嗎?面向?qū)ο蟪绦蛟O(shè)計(jì),語法簡潔清晰,功能強(qiáng)大且易學(xué)易用[10-11]。
Python的設(shè)計(jì)具有很強(qiáng)的可讀性,相比其他語言經(jīng)常使用英文關(guān)鍵字,以及其他語言的一些標(biāo)點(diǎn)符號,它具有比其他語言更有特色的語法結(jié)構(gòu)。Python是一種解釋型語言,開發(fā)過程中沒有編譯這個(gè)環(huán)節(jié)。Python是面向?qū)ο笳Z言,它支持面向?qū)ο蟮娘L(fēng)格或代碼封裝在對象的編程技術(shù)[12]。
同時(shí),Python已經(jīng)在很多領(lǐng)域有著非常豐富的應(yīng)用,可以說是一門非常實(shí)用的編程語言。例如:Python是云計(jì)算中最流行的語言、大量優(yōu)秀的Web框架,以及許多用于Python開發(fā)的科學(xué)計(jì)算和人工智能:典型庫numpy等等。而在金融工程領(lǐng)域中,Python同樣被大量使用[13]。
由于Python是一種動態(tài)語言,語言結(jié)構(gòu)清晰簡潔,庫豐富、成熟、穩(wěn)定,科學(xué)計(jì)算和統(tǒng)計(jì)分析功能強(qiáng)大,生產(chǎn)效率比 C,C++和 java要高[14]。
以人臉識別為例,寫了一個(gè)這樣一段代碼來完成——一個(gè)在看到一個(gè)人臉的時(shí)候打招呼的程序編譯。
首先構(gòu)造了一個(gè)類,命名為HumanGreeterModule,主要的任務(wù)就是設(shè)定人臉識別和進(jìn)行反饋。
其中:subscribeToEvent函數(shù)定義了對FaceDetected事件的響應(yīng),onFaceDateced函數(shù)是具體的執(zhí)行任務(wù),調(diào)用tts文件進(jìn)行文字轉(zhuǎn)語音的輸出,完成打招呼的功能。
class HumanGreeterModule(ALModule):
def__init__(self,name):
ALModule.__init__(self,name)
self.tts=ALProxy( 'ALTextToSpeech')
global memory
memory=ALProxy("ALMemory")
memory. subscribeToEvent ( " FaceDetected","
HumanGreeter","onFaceDateced")
def onFaceDateced(self,*_args):memory.subscribeToEvent
("FaceDetected","HumanGreeter")
self.tts.say("Hallo") memory.subscribeToEvent("
FaceDetected","HumanGreeter","onFaceDateced")
從這段函數(shù)中可以清晰地看到每個(gè)過程的具體步驟,調(diào)用了什么樣的資源,實(shí)現(xiàn)了什么樣的功能。
圖形化編程是官方提供的一種編程方式。在專用的編譯軟件Choregraph中,以官方提供的指令盒為基礎(chǔ)進(jìn)行編程,通過連線的方式即可完成編程[15]。
Choregraphje軟件(見圖4)是一款編程軟件,可以編寫程序、與NAO鏈接、燒寫程序、與Webots鏈接可以仿真執(zhí)行程序。
圖4 Choregraph主界面
如圖5~7所示,通過軟件界面,我們可以直觀的看到機(jī)器人的姿態(tài)信息和機(jī)器人上的程序信息。
圖5 機(jī)器人視圖
圖6 機(jī)器人關(guān)節(jié)角度
同樣以人臉識別并進(jìn)行語音問候?yàn)槔?,使用可視化編程方式重新進(jìn)行編程:首先,在指令盒庫(圖8)中找到需要的模塊,指令盒分為兩個(gè)部分,列表和備注。然后,通過圖9所示的操作,很簡單的就完成了這個(gè)小程序的編寫工作??梢园l(fā)現(xiàn),正好有兩個(gè)模塊發(fā)現(xiàn)人臉和語音說話,我們將其連接就可以完成操作。
圖7 機(jī)器人應(yīng)用程序列表
圖8 指令盒
圖9 圖形化編程人臉識別并問候
Python和可視化編程可以說是NAO機(jī)器人初學(xué)者常用的兩種編程語言,那么又該如何選擇呢?
從結(jié)構(gòu)上,明顯可以看出,可視化編程要比Python編程更加簡單。相比之下,可視化編程具有更加簡單的結(jié)構(gòu)和更加清晰的流程順序,可以說是一種非常適合新手來了解機(jī)器人的一種編程方式。
但是,可視化編程的局限性同樣也很明顯,即只能使用現(xiàn)有的模塊進(jìn)行編程,同時(shí),對模塊具體實(shí)現(xiàn)過程并不是很了解。以人臉識別及問候的實(shí)例為例,如圖10所示打開人臉識別模塊可以看到,觸發(fā)的線并沒有接在起始點(diǎn)的位置,而是一個(gè)叫做Almemory的event觸點(diǎn)上,如果沒有Python的知識(見圖11),很難解釋這是一個(gè)什么樣的event。同時(shí)打開最內(nèi)層的模塊,可以看到,這些模塊最后其實(shí)還是使用Python進(jìn)行編譯的。但是,很明顯,它的指令不單單是內(nèi)部的函數(shù),還有包括外部接口的一部分內(nèi)容,因此很難對它進(jìn)行二次編譯來達(dá)到我們的目的或者提高效率。
圖10 Almemory觸點(diǎn)
圖11 人臉識別模塊內(nèi)部腳本
實(shí)際上,可視化編譯可以理解為是一些已經(jīng)編譯好的、具有較好普適性的Python程序包以一種固定形式進(jìn)行封裝和圖形化之后的產(chǎn)物。這種編譯方式更適合作為機(jī)器人啟蒙性質(zhì)的教育,或者針對沒有什么編程基礎(chǔ)的群體進(jìn)行小型實(shí)例開發(fā)的編譯環(huán)境,又或者是新手開發(fā)者用來熟悉機(jī)器人的一個(gè)平臺,因?yàn)樗哂休^好的穩(wěn)定性和更加易讀的性質(zhì)。
相較于可視化編程,Python具有更大的靈活空間,可以進(jìn)行更復(fù)雜的運(yùn)算,或者控制器的設(shè)計(jì),實(shí)現(xiàn)算法等任務(wù),必須要受到已有的模塊的束縛。同時(shí),我們可以更深入地了解每個(gè)功能的具體實(shí)現(xiàn)過程,使用更合適的指令,達(dá)到更高的執(zhí)行效率。同樣,如果是針對某個(gè)方面的機(jī)器人設(shè)計(jì),例如我們需要做個(gè)算法的控制器,很難找的全部合適的指令盒供我們使用,這個(gè)時(shí)候我們只能自己進(jìn)行編譯。
當(dāng)然對于初學(xué)者來說,完全獨(dú)立編寫全部功能的指令可能并不是那么容易,在此可以使用折中的辦法,在無法完成的功能處使用官方的指令盒來實(shí)現(xiàn),指令盒不能滿足要求甚至沒有指令盒的部分,調(diào)用Python進(jìn)行編程,混合進(jìn)行編程,在choregraph中調(diào)用Python的指令盒,即可完成這樣的功能,在Python中,可以加載官方naoqi庫,其中也有大量的函數(shù)可供使用,可以大幅減少編程的工作量。
編譯環(huán)境日新月異的今天,選擇一個(gè)合適的編譯環(huán)境和編程方式對以后的開發(fā)工作有著很大的幫助。明確自己的定位,選擇一個(gè)合適的編譯環(huán)境是無疑是一個(gè)非常重要的卻很容易被忽視的步驟??偨Y(jié)成一句話,以機(jī)器人為輔助平臺或者非計(jì)算機(jī)類專業(yè)的開發(fā)者更適合圖形化的編譯環(huán)境,這個(gè)可以讓你更快地了解機(jī)器人,完成相應(yīng)的工作。需要完成相對復(fù)雜的任務(wù)或者有一定編程基礎(chǔ)的開發(fā)者更推薦使用python作為編譯平臺進(jìn)行程序開發(fā),這樣可以使你擁有更大的發(fā)揮空間和拓展余地。