陳燕軍
(江西現代職業技術學院 機械學院,江西 南昌 330095)
NAO機器人是由法國Aldebaran Robotics公司研制成功的一款人工智能仿人機器人,有著討人喜歡的外形設計和優良的硬件配置,并提供了豐富的二次開發接口,可以支持多平臺和多種開發語言編程。NAO機器人不僅運用于機器人研究、人工智能和計算機科學領域,還可以運用于社會學和醫療保健領域,其參與的研究項目包括自閉癥治療、多智能體系統、自動化、訊號處理、全身運動以及路徑規劃。NAO作為仿人機器人的杰出代表,向我們提供了一個卓越的研究平臺[1-4]。
LabVIEW是實驗室虛擬儀器工程平臺(Laboratory Virtual Instrument Engineering Workbench)的縮寫,是由美國國家儀器(NI)公司研制開發的一種圖形化的程序開發環境。它為設計者提供了一個便捷、輕松的設計環境,設計者利用它可以像搭積木一樣輕松地進行開發,而無需編寫繁瑣的代碼[5]。
LabVIEW是圖形化的編程語言,它提供了豐富的顯示和控制對象的函數庫,還提供了大量的與外部代碼和軟件進行銜接的外部接口,具有強大的通信功能。作為一種成熟的編程語言,它也提供了對.NET架構的支持[6]。因此,我們選擇LabVIEW作為體感控制系統的開發平臺[7]。


圖1 NAOqi.NET框架結構
運動控制函數模塊(ALMotion)可以實現NAO機器人的運動功能,其主要包括:關節剛度控制(Stiffness control API)、關節控制(Joint control API)、行走控制(Locomotion control API)、根據笛卡爾坐標控制關節(Cartesian control API)、跌倒檢測(Fall manager API)、碰撞控制(Self-collision avoidance API)和全身控制(Whole Body control API)。
內核控制模塊主要包括行為管理器(ALBehavior Mangager)和內存調用。傳感器模塊主要包括超聲波傳感器(ALSonar)、碰撞傳感器(ALInfrared)、壓力傳感器(ALFsr)和LED傳感器(ALLeds)等。
聲音輸入輸出模塊主要包括語言識別(ALSpeech Recognition)、說話(AL Text To Speech)、聲源定位(ALAudio Source Localisation)和播放音頻文件(ALAudio Recoder)。
視覺模塊主要包括攝像頭控制(ALVision Device)、人臉識別(ALFace Detection)、拍照(ALPoto Capture)和標志物識別(ALLandmark Dectection)。
在具體實現中我們對NAOqi.NET的API利用LabVIEW進行了封裝,將API函數封裝成相應的子VI,這樣在LabVIEW中就可以以子VI的形式進行調用。對goToPosture函數進行封裝前、后示意圖如圖2、圖3所示。

圖2 goToPosture封裝前程序圖

圖3 goToPosture封裝成子VI示意圖
對NAO機器人的運動控制,歸根結底是要實現對各個自由度的控制。NAOqi.NET提供了運動控制所需的函數接口,例如剛度控制函數ALMotion Proxy:set Stiffnesses()、關節控制函數get Angles()和set Angles()、行走控制函數walkTo()、全身控制函數wb Foot State()、碰撞檢測函數setCollision Protection Enabled()[10]。
本文以左手運動控制為例來說明在LabVIEW環境下對NAO機器人左手和頭部的運動控制。圖4為用LabVIEW實現的頭部與左手運動控制前面板。前面板包含如下幾個對話框:IP地址輸入,關節名稱,剛度輸入、輸出,角度輸入、輸出。

圖4 頭部與左手運動控制前面板
要實現對NAO機器人的運動控制,首先要解決PC機與機器人的通信問題。通過LabVIEW的.NET工具箱提供的構造器節點來構造Motion Proxy節點。通過輸入機器人的IP地址和端口號(9559)就可以建立PC機與NAO機器人的通信。此外,要實現對電機的控制必須設置電機的剛度和角度控制參數。下文將結合具體函數來說明如何設置剛度及控制角度參數。
在NAOqi.NET中將NAO機器人的自由度分為頭部、左手、右手、左腳、右腳五條運動鏈。get Joint Names()函數可以獲取運動鏈中相關關節的名稱。其可以輸入的參數為Head、LArm、RArm、LLeg、RLeg。get Stiffnesses()和set Stiffnesses()是一對配合使用的函數,通過這對函數可以對各關節的剛度進行設置。剛度的參數可以是0~1的任何數值,當剛度參數設置為0時,電機輸出扭矩為0;當剛度設置為1時,電機輸出100%扭矩;當剛度參數在0~1變化時,電機輸出的扭矩也會相應地變化,數值越大,輸出的扭矩也越大。同理,get Angles()是獲取當前各關節電機轉動幅度,其輸出參數可以通過數組傳遞給下一個函數調用。
NAOqi.NET提供了多種函數來實現NAO機器的控制,例如可以通過angInter polation()、angInter polation With Speed()、angInter polation Bezier()來實現NAO機器人的運動控制。通過angInter polation()函數來控制NAO機器人的頭部和左手。angInter polation()有三個輸入參數,分別為關節名稱輸入、目標角度輸入和最大運動速度輸入。通過目標角度輸入可以給NAO機器人的相應關節賦值,使機器人各個關節運動到給定弧度的絕對位置。
姿勢控制模塊(ALRobot Posture)可以使得NAO機器人運動到不同的初始姿態。系統定義了8種基本姿態,分別為Stand、StandInit、StandZero、Crouch、Sit、SitRelax、Lying Belly、Lying Back,可根據需要自行定義[11]。
NAO機器人的姿態控制可以使機器人迅速運動到某一個穩定狀態,NAOqi.NET提供的ALRobot Posture∶∶go to Posture()可以實現這8種姿態的快速切換。圖5為基于LabVIEW的NAO機器人8種姿態控制程序前面板。通過前面版pIP輸入框可以輸入相應機器人的IP地址,通過“動作選擇”下拉列表可選擇要執行的動作,通過max Speed Fraction參數可以限制最大的運動速度。

圖5 機器人姿態控制前面板
利用NAOqi.NET提供的go To Posture()和apply Posture()函數來實現對機器人姿態的控制。程序是通過調用go To Posture()函數使機器人快速運動到預定義姿態的,該函數包含posture Name和max Speed Fraction兩個參數。其中posture Name是8種預定義的姿態名稱,max Speed Fraction定義了運動時的最大速度,其取值范圍為0~100。apply Posture()函數用于設置初始姿態,通過它可以定義機器人各關節的初始位置并保存成特定的動作姿態,并在需要重現的地方進行調用。
NAO機器人頭部具有兩個攝像頭,用戶可以利用攝像頭來進行圖像采集、紅球識別、人臉識別及錄像等應用[12]。
圖6為NAO機器人的圖像采集前面板,利用這個程序可以實現圖像采集的功能。在前面板中首先需要設置機器人的IP和端口號來建立網絡通信,然后需要設置圖片大小和激活的攝像頭編號。

圖6 NAO圖像采集前面板
在圖像采集程序中主要利用了NAO.qi.NET提供的set Active Cameras()、subscribe Cameras()、get Images Remote()、unsubsribe()等函數。set Active Cameras()函數的功能是設置具體被激活的攝像頭,subscribe Cameras()的功能是設置攝像頭的分辨率和輸出圖像的規格,get Images Remote()的功能是獲取攝像頭識別的圖像,unsubsribe()的功能是關閉攝像頭。
通過LabVIEW提供的.NET架構,并將其應用于NAOqi.NET來進行NAO仿人機器人控制。闡述了LabVIEW中的.NET技術及NAOqi.NET框架,分析了基于LabVIEW的NAO仿人機器人控制開發流程及函數。通過LabVIEW編程實現對NAO機器人的運動、位姿、內核、傳感器、聲音、視覺等控制,進一步簡化了NAO機器人的編程控制,并可以實現遠程控制。