本發明屬于自動化和人機交互領域,具體涉及一種實時模仿人體上半身動作的人形機器人控制方法。
背景技術:
目前,大多數研究專注于機器人對人體上下肢動作的模仿以及模仿時的全身平衡控制,尚沒有系統地控制人體上肢、頭部轉動和手掌開合的模仿方法,如果能系統實現這些模仿,則功能更為完善。具有頭部模仿功能的機器人可通過利用控制機器人頭部攝像機轉向,改變攝像頭視野,從而擴大機器人視野,在更大范圍內尋找操作對象,實現相應地作業。而手部模仿將使機器人能夠完成抓取、釋放等動作,從而使得通過模仿技術來操縱機器人完成某種任務成為可能。
技術實現要素:
為了克服現有機器人模仿中無法完全模仿上半身動作的不足,本發明提出一種實時模仿人體上半身動作的人形機器人控制方法,包括上肢、手部和頭部。
為了實現上述目的,采用的技術方案如下。
一種實時模仿人體上半身動作的人形機器人控制方法,其包括如下步驟:
1)通過Kinect傳感器獲取人體骨骼信息、彩色信息和深度信息;
2)從骨骼信息中提取上肢各關節的三維坐標,通過幾何分析方法計算出人體上肢左右手臂的關節角度;
3)利用彩色信息和深度信息作為輸入,通過Kinect SDK中的面部追蹤算法獲取人的面部轉動角度;
4)在深度圖像中分割出人的手部并判斷手掌開合狀態;
5)用步驟2)-4)計算出的人體上肢左右手臂角度、頭部轉動角度和判斷出的手部狀態驅動機器人完成與人相同的動作。
進一步地,所述步驟2)使用幾何分析方法,具體是提取人的肩部、肘部、手部、髖部的三維坐標,用坐標構成向量,分析手臂運動過程中關節角度與向量之間的關系,找出能代表關節角度的向量夾角,用數量積公式求出向量夾角。
進一步地,所述步驟3)具體是:使用Kinect SDK的面部追蹤算法,輸入彩色和深度信息,實時識別和追蹤人臉,存儲追蹤結果并提取人臉轉動角度。
進一步地,步驟4)使用手掌分割方法分割出人的手部并判斷手掌開合狀態,具體是利用深度信息獲取手部的深度區間[DMIN,DHAND]從而將手部分割出來,用像素點的個數判斷是否檢測到手部,并使用手部在深度圖中的坐標定位手部的位置,判斷分割出的部分是屬于左手還是右手;同時,將手部開合狀態判斷轉化為手掌拳頭面積比較,為了使面積差異更為明顯,繪制包圍手部的最小圓,通過比較最小圓面積S和設定閾值S1的大小判斷手部的開合狀態,如果S>1,則手掌狀態為開,否則為合;結合左右手判斷和手掌拳頭判斷,可區分雙手四種狀態:左手開、左手閉、右手開、右手閉。
與現有技術相比,本發明具有如下優點和技術效果:本發明能系統地構成人形機器人模仿人上半身動作,克服現有機器人模仿中無法完全模仿上半身動作的不足。本發明基于向量運算的幾何分析方法無需建模即可計算出上肢左右手臂的關節角度;基于面部識別的角度獲取方式解決了機器人模仿人頭部轉動的問題;利用深度信息進行手掌分割的方法簡便地判斷人手部狀態。
附圖說明
圖1為本實例中一種實時模仿人體上半身動作的人形機器人控制方法的流程圖;
圖2為左上肢各關節角度計算示意圖;
圖3為Nao機器人的左臂關節各自由度及其范圍示意圖;
圖4為頭部轉動角度示意圖;
圖5為面部識別追蹤流程圖;
圖6為手部分割示意圖;
圖7為左右手檢測的矩形框;
圖8為包圍手部的最小圓以及手掌拳頭面積比較;
圖9為手部檢測流程圖。
具體實施方式
下面結合附圖和實例對本發明的具體實施作進一步說明,但本發明的實施和保護不限于此。
圖1所示的實時模仿人體上半身動作的人形機器人控制方法主要由圖像數據采集和預處理1,基于向量法的幾何分析、Kinect SDK面部追蹤算法、手掌檢測算法2,人形機器人3三個執行部分組成。先通過Kinect傳感器獲取骨骼信息、彩色信息和深度信息,完成圖像數據采集和預處理,再通過基于向量法的幾何分析、Kinect SDK面部追蹤算法、手掌檢測算法獲取相關角度和手部開合狀態信息,將關節角度和手部狀態等數據傳遞給機器人,實現上半身模仿。
圖2以Nao機器人左臂為例給出了求解關節角度的方法。當機器人雙臂向前平舉時各角度為0。推導過程在Kinect坐標系下進行,公式考慮機器人關節角度的正負限制,機器人關節活動范圍如圖3所示。從Kinect的角度看,Kinect坐標系以攝像頭為原點,x軸指向左側,y軸指向上方,z軸指向前方。為便于描述,將需要使用的點用數字代替:左肩-1,右肩-2,左肘-3,左手-4,左髖-5,右髖-6;用表示從點x到y的向量;關節角度LShoulderRoll(左肩翻滾角)、LShoulderPitch(左肩俯仰角)、LElbowRoll(左肘翻滾角)、LElbowYaw(左肘偏航角)依次用θSR,θSP,θER,θEY表示。
θSR:引入一個從人體左髖部指向右髖部的向量θSR即為從左肩指向左肘的向量與該向量的夾角:
θSP:設則θSP可以表示為:
θER:該角度可以直接由上臂和下臂的夾角求得:
θEY:該角度可認為是由左肩、右肩、左肘三點構成的平面和由左肩、左肘、左手三點構成的平面的夾角,這兩個平面的法向量分別用表示,
設則:
Kinect SDK中的面部追蹤算法支持對人臉進行實時識別和跟蹤,以彩色圖像和深度圖像作為輸入,可以估算頭部姿態。圖4為人的頭部的三種轉動角度:俯仰角(pitch)、翻滾角(roll)和偏航角(yaw),這三種角度在Kinect坐標系中定義。追蹤步驟如下:啟動Kinect后初始化變量,獲取深度數據、彩色數據以及頸部和頭部的三維坐標,作為面部追蹤的輸入,并開始追蹤。如果沒有追蹤到,那么追蹤繼續執行;如果追蹤到了面部,生成的數據將被存儲。提取數據中的頭部姿態,其輸出結果的單位為角度,根據機器人關節度數設置的需要可進行角度-弧度的轉換。其流程如圖所示。在更明亮的場景下圖像質量更好,識別率更高,在臉部可識別范圍內,臉部離Kinect更近,識別效果也更好。面部識別追蹤流程如圖5所示。
對于機器人手部控制,首先在深度圖像中遍歷所有像素點尋找距離Kinect最近的點,其深度值為DMIN。在DMIN上加上一個合適的深度值h,得到比人手部最大深度像素點的深度更大的深度值DHAND:
DHAND=DMIN+h,
根據深度區間[DMIN,DHAND]可將人的手部與身體其他部位區別開從而將手部分割出來,如圖6所示。利用左右手在深度圖中的坐標,設置兩個各自能夠完全包含左手和右手的矩形框,對深度圖中深度值介于DMIN和DHAND之間并且位于矩形框中部分的像素點進行計數,得到左矩形框和右矩形框中的點數分別為N1和N2。我們可以根據以下情況判斷是左手被檢測到還是右手被檢測到:
如果有左手或右手被檢測到時,摳出手形,如圖7所示。為避免當手部距離身體其他部位太近時其他部位也會被檢測到,利用3維坐標計算手部與身體的距離d,當d小于某個閾值d1時,將暫停手部檢測。在摳出手形后要進行手部狀態判斷,換句話說,就是區分此時手部展示的是手掌還是拳頭。因為目標只是判斷手部的開合兩種狀態,因而問題可以轉化為比較手掌和拳頭的面積大小,為了使兩種面積差異更明顯,使用Opencv庫函數畫出包圍手部的最小圓,通過比較最小圓的面積S來判斷手部狀態,圖8展示了兩手分別為手掌和拳頭時的面積比較。當S大于某一個閾值S1時判定為手掌,否則為拳頭。記左手和右手某種狀態連續出現次數分別為t1和t2,為了提高準確度,只有當t1或t2大于閾值a時才會被最終確定。整個流程如圖9所示。根據上述檢測方法,可以得到4種狀態:左手開、左手閉、右手開、右手閉。
將上述求得的角度和手部狀態傳送給機器人,從而控制機器人模仿人體上半身動作,實現本發明的方法。