王元杰, 林 都, 鮮 浩
(中北大學電氣與控制工程學院,太原030051)
機器人技術是集機械、電子、控制技術、計算機、人工智能等多個學科領域于一身的一項綜合性應用型技術,是衡量一個國家科技發展水平高低的重要標志[1]。
機器人研究中極為熱門的研究方向之一——仿人機器人,它有著類人的肢體結構(通常具有仿人的頭部或四肢結構),能夠在特定環境中代替人類來完成各種工作,進一步而言,仿人機器人可以說在很多方面擴展了人類的能力范圍。因此,仿人機器人在科研、教育、醫療等多個領域中得到了廣泛的應用,各科研機構在仿人機器人的研究中進行了大量的科研工作,仿人機器人也成為全球各發達國家不惜投入大量人力、物力、財力去角逐的科技制高點[2-3]。
NAO機器人是一款仿人形機器人,是目前世界上應用最廣泛的仿人型機器人之一[4]。
NAO機器人高58 cm,具有25個自由度(圖1),以及大量傳感器(圖2),支持遠程控制,可實現完全編程等功能。他豐富的傳感器資源以及靈活的結構,可以完成各種復雜的操作和功能。

圖1 NAO傳感器示意圖

圖2 NAO機器人關節示意圖
同時,NAO機器人也得到了公眾的肯定,在2007年,它成為機器人世界杯(RoboCup)的標準平臺;在2010年,NAO機器人作為科技大使出現[4]在上海世博會上[5]。
將NAO機器人的技術開放給所有的高等教育項目,因為它使用Linux系統的嵌入式處理器,所以不僅可以使用C++,Python等語言進行編程,也可以使用官方開發的一套可視化編譯軟件進行編程,這就使得NAO機器人的開發有了很大的自由空間和可能性[6]。
NAO的研究范圍覆蓋了包括語音識別,視頻處理,模式識別,自閉癥治療,自動化,喜好處理,路徑規劃等很多的方面和領域。這些領域中間,包括了一些不是以軟件編程為主要方向的研究者,NAO機器人多樣的編譯環境某種程度上給非控制和軟件方向的研究者帶來了一定的困擾[7]。
本文主要以人臉識別為例,使用最常用的可視化編程以及Python語言,具體分析各種編譯方式的優劣,以及其在各類應用場合下的實際情況。
NAO機器人通過攝像頭獲取圖像信息,處理并獲得有效的信息。在機器人的頭部,垂直安裝了兩個高清攝像頭,其參數:輸出YUV422,視場58°,水平視場47.8°,垂直視場 34.8°,聚焦范圍 30 cm ~ ∞,聚焦類型定焦,物理分辨率VGA,QVGA,幀速30 f/s。攝像頭傳感器可捕捉清晰的VGA格式畫面,最高分辨率下可以達到30幀/s的速度。頭部水平方向可以轉動接近239°,垂直方向可轉動接近68°;視角范圍在水平方向約61°,垂直方向約為 34.8°(圖3),因此可以識別各類物體。NAO機器人廣為人知的人臉識別就是根據這個設計而開發的一項互動功能。NAO可以學習記憶不同的人臉信息,并對其進行識別[8-9]。

圖3 機器人攝像頭時域示意圖
Python是一種高級的、解釋性的、交互式的、面向對象的腳本語言,更是一門跨平臺、開源、免費的解釋性高級動態編程語言,是一種通用編程語言。除了可以解釋執行之外,Python還支持將源代碼偽編譯為字節碼來優化程序提高運行效率并對源代碼進行保密。Python支持命令式編程(How to do)和函數式編程(What to do)兩種方式,完全支持嗎?面向對象程序設計,語法簡潔清晰,功能強大且易學易用[10-11]。
Python的設計具有很強的可讀性,相比其他語言經常使用英文關鍵字,以及其他語言的一些標點符號,它具有比其他語言更有特色的語法結構。Python是一種解釋型語言,開發過程中沒有編譯這個環節。Python是面向對象語言,它支持面向對象的風格或代碼封裝在對象的編程技術[12]。
同時,Python已經在很多領域有著非常豐富的應用,可以說是一門非常實用的編程語言。例如:Python是云計算中最流行的語言、大量優秀的Web框架,以及許多用于Python開發的科學計算和人工智能:典型庫numpy等等。而在金融工程領域中,Python同樣被大量使用[13]。
由于Python是一種動態語言,語言結構清晰簡潔,庫豐富、成熟、穩定,科學計算和統計分析功能強大,生產效率比 C,C++和 java要高[14]。
以人臉識別為例,寫了一個這樣一段代碼來完成——一個在看到一個人臉的時候打招呼的程序編譯。
首先構造了一個類,命名為HumanGreeterModule,主要的任務就是設定人臉識別和進行反饋。
其中:subscribeToEvent函數定義了對FaceDetected事件的響應,onFaceDateced函數是具體的執行任務,調用tts文件進行文字轉語音的輸出,完成打招呼的功能。
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")
從這段函數中可以清晰地看到每個過程的具體步驟,調用了什么樣的資源,實現了什么樣的功能。
圖形化編程是官方提供的一種編程方式。在專用的編譯軟件Choregraph中,以官方提供的指令盒為基礎進行編程,通過連線的方式即可完成編程[15]。
Choregraphje軟件(見圖4)是一款編程軟件,可以編寫程序、與NAO鏈接、燒寫程序、與Webots鏈接可以仿真執行程序。

圖4 Choregraph主界面
如圖5~7所示,通過軟件界面,我們可以直觀的看到機器人的姿態信息和機器人上的程序信息。

圖5 機器人視圖

圖6 機器人關節角度
同樣以人臉識別并進行語音問候為例,使用可視化編程方式重新進行編程:首先,在指令盒庫(圖8)中找到需要的模塊,指令盒分為兩個部分,列表和備注。然后,通過圖9所示的操作,很簡單的就完成了這個小程序的編寫工作。可以發現,正好有兩個模塊發現人臉和語音說話,我們將其連接就可以完成操作。

圖7 機器人應用程序列表

圖8 指令盒

圖9 圖形化編程人臉識別并問候
Python和可視化編程可以說是NAO機器人初學者常用的兩種編程語言,那么又該如何選擇呢?
從結構上,明顯可以看出,可視化編程要比Python編程更加簡單。相比之下,可視化編程具有更加簡單的結構和更加清晰的流程順序,可以說是一種非常適合新手來了解機器人的一種編程方式。
但是,可視化編程的局限性同樣也很明顯,即只能使用現有的模塊進行編程,同時,對模塊具體實現過程并不是很了解。以人臉識別及問候的實例為例,如圖10所示打開人臉識別模塊可以看到,觸發的線并沒有接在起始點的位置,而是一個叫做Almemory的event觸點上,如果沒有Python的知識(見圖11),很難解釋這是一個什么樣的event。同時打開最內層的模塊,可以看到,這些模塊最后其實還是使用Python進行編譯的。但是,很明顯,它的指令不單單是內部的函數,還有包括外部接口的一部分內容,因此很難對它進行二次編譯來達到我們的目的或者提高效率。

圖10 Almemory觸點

圖11 人臉識別模塊內部腳本
實際上,可視化編譯可以理解為是一些已經編譯好的、具有較好普適性的Python程序包以一種固定形式進行封裝和圖形化之后的產物。這種編譯方式更適合作為機器人啟蒙性質的教育,或者針對沒有什么編程基礎的群體進行小型實例開發的編譯環境,又或者是新手開發者用來熟悉機器人的一個平臺,因為它具有較好的穩定性和更加易讀的性質。
相較于可視化編程,Python具有更大的靈活空間,可以進行更復雜的運算,或者控制器的設計,實現算法等任務,必須要受到已有的模塊的束縛。同時,我們可以更深入地了解每個功能的具體實現過程,使用更合適的指令,達到更高的執行效率。同樣,如果是針對某個方面的機器人設計,例如我們需要做個算法的控制器,很難找的全部合適的指令盒供我們使用,這個時候我們只能自己進行編譯。
當然對于初學者來說,完全獨立編寫全部功能的指令可能并不是那么容易,在此可以使用折中的辦法,在無法完成的功能處使用官方的指令盒來實現,指令盒不能滿足要求甚至沒有指令盒的部分,調用Python進行編程,混合進行編程,在choregraph中調用Python的指令盒,即可完成這樣的功能,在Python中,可以加載官方naoqi庫,其中也有大量的函數可供使用,可以大幅減少編程的工作量。
編譯環境日新月異的今天,選擇一個合適的編譯環境和編程方式對以后的開發工作有著很大的幫助。明確自己的定位,選擇一個合適的編譯環境是無疑是一個非常重要的卻很容易被忽視的步驟。總結成一句話,以機器人為輔助平臺或者非計算機類專業的開發者更適合圖形化的編譯環境,這個可以讓你更快地了解機器人,完成相應的工作。需要完成相對復雜的任務或者有一定編程基礎的開發者更推薦使用python作為編譯平臺進行程序開發,這樣可以使你擁有更大的發揮空間和拓展余地。