1. 程式人生 > >兒童節特刊 | 如何練好手眼協調能力(手眼標定詳解,附原始碼)

兒童節特刊 | 如何練好手眼協調能力(手眼標定詳解,附原始碼)

當嬰幼兒看到物體時,首先通過眼睛獲取資訊,傳輸到大腦進行理解,最終通過手來操作完成玩具的抓取、放置。手、眼、腦協同是人類和少數動物的一項特殊技能,通過經常玩一些簡單的益智玩具,可以逐漸鍛鍊增強孩子的手眼協調能力,同時可以作用到大腦,促進孩子的智力發育。

商家們也看到了這塊領域,設計出很多益智玩具和遊戲,如圖1中所示。孩子需要把玩具抓起並放入車裡。孩子的空間思維能力、協調能力在遊戲中得到了鍛鍊。



圖1

在智慧機器人領域,機器人需要完成高效、複雜的工作,否則無法稱之為“智慧”。然而,機器人要想獲得同人類一樣的協調能力並不容易。如何才能實現像人一樣的手眼協同能力呢?

再回到這個遊戲。孩子在玩玩具時,大腦中有一個座標系,可看做是基礎座標系;靈活的手在運動中形成一個軌跡,稱之為手的座標系;玩具要放置的點又有一個目標座標系。三個座標系協同,遊戲才能順利地玩下去。如果為此遊戲場景加入座標,會是這個樣子,如圖2所示。



圖2

智慧機器人領域,四軸、六軸、並聯等機械臂可認為是機器人的手臂(雖然自由度較高、速度快,但相比人手的靈活性還遠遠不如)。機器人的眼睛,一般指攝像機(包括2D和3D)。目前智慧機器人的主流是使用3D視覺相機。機器人的大腦一般指進行核心控制和計算的工控機或嵌入式晶片。
一般而言,機器人的“手眼協調”需要一個“手眼標定”(Hand-eye calibration)的過程。手眼標定是機器人領域的一個經典的問題,其核心是計算出相機座標系在機器人座標系下的轉移矩陣。轉移矩陣是4×4的矩陣,一般用齊次座標表示。其中最重要的兩個分量是旋轉矩陣\(R\)和平移向量\(t\),分別表示旋轉分量和平移分量。得到轉移矩陣後,可將相機下的座標轉換到機械臂座標系下,從而完成工作。如圖3所示。



圖3

兩個座標系,如何建立關係?這是手眼標定要解決的核心問題。
手眼標定和核心是解決一個\(AX=XB\)的矩陣。解此矩陣的演算法就是手眼標定演算法。
小藍( 杭州藍芯科技有限公司簡稱)公司依賴Eigen庫實現了經典Tsai的方法並且開源,不想進行理論推導的讀者可直接用此程式碼:https://github.com/zjulion/handeyecat。

如何進行手眼標定

注意:以下涉及公式推導,不想推數學公式的可跳過。
理解手眼標定的核心是如何將機器人的手眼關係代入\(AX=XB\)的公式中。
首先要理解\(A\),\(B\),\(X\)分別代表什麼含義。
\(X\),表示未知量,即手眼標定的轉移矩陣。

\(A\)和\(B\)呢?
先看機器人手眼分離的示意圖。


圖 4

圖4中,機器人底座一般認為是世界座標系的原點。攝像機(眼睛)識別的位置通過轉移矩陣,可以轉換到機器人座標系(同時也是世界座標系)下。在手眼標定的過程中,需要連續移動機械臂終端,採集一組末端執行器的位姿;與此同時,相機採集掛在末端執行器的標記(例如,棋盤格)的位姿,組成另一組資料。
預警:下面是一些真正的數學推導。
假設採集的資料有\(N\)對,根據圖中的幾何關係,未知量有兩個,分別是標記在末端執行器下的位姿\(H_{grid}\)和相機在世界座標系下的座標\(H_{camera}\)。
其中\(H_{camera}\)是我們手眼標定的目標,\(H_{grid}\)是多少我們並不關心。
根據標記是空間中的位姿,我們可以得到(兩邊都是標記的位姿)
\[ H_{camera}\ \ast\ H_{grid\_in\_c}=H_{end}\ \ast\ H_{grid} \]
觀察上面公式,

  • \(H_{camera}\)未知,是目標矩陣,不變數;
  • \(H_{grid\_in\_c}\)已知,是可以通過相機讀到的資料,變數;
  • \(H_{end}\)已知,是機械臂末端讀數,變數;
  • \(H_{grid}\)未知,我們很不喜歡它,不變數。
    故此方程有兩個已知量,兩個未知量,一組資料不可解!
    一組資料不行,那就多來幾組吧!
    假設我們有兩組資料,分別是第i組合第j組,兩組座標在公式裡的括號內表示。
    回想初中代數,我們可以通過類似方程組的解法,消去我們不喜歡的\(H_{grid}\)。
    有如下兩組方程,
    \[ {H_{camera}\ \ast\ H}_{grid\_in\_c(i)}=H_{end(i)}\ \ast\ H_{grid},\\ {H_{camera}\ \ast\ H}_{grid\_in\_c(j)}=H_{end(j)}\ \ast\ H_{grid} \]
    聯立方程,消去\(H_{grid}\),最終我們得到,
    \[ H_{end(j)}\ast H_{end(i)}^{-1}*H_{camera}=H_{camera}\ast H_{grid\_in\_c(j)}\ast H_{grid\_in\_c(i)}^{-1} \]
    至此,回想矩陣乘法的結合律,我們驚喜的發現,方程的形式正是AX=XB!
    其中\(A\)和\(B\)分別已知,\(X=H_{camera}\)。什麼?\(A\)和\(B\)是什麼?自己觀察一下!
    數學推導結束。

小朋友們,不對,工程師們,可以用此資料帶入標準演算法計算了!
一般來說,採集的資料越多,標定的結果越準確。採集時,為防止陷入區域性陷阱,需儘可能多的採集機器人姿態,同時,要保證標記在機械臂末端位姿固定,相機和機械臂的相對位姿也要保持固定。
有人說,不對,我用的相機不是這樣裝的。我把相機裝在了機械臂上,同其一起移動,可以用這種方法嗎?
答案當然是可以。
這涉及到手眼協同機器人的兩種模式,分別是eye-in-handeye-to-hand。剛剛我們一直研究的是eye-to-hand的模式。對於eye-in-hand模式,可以採用類似方法,消去我們不喜歡的中間變數,最終歸結到\(AX=XB\)的形式,就可以解了。
兩種模式在公開的原始碼中都可以找到。

總結

1、孩子的手眼協調能力會在遊戲中得到鍛鍊,只要給玩具讓她/他玩,基因會逐漸教會她/他靈活的手眼協同能力。
2、智慧機器人的手眼協調,需要工程師們的認真調教!一般來說,資料越多,誤差越小。手眼協調能力,是機器人完成分揀、抓取、放貨工作的前提。



手眼系統作業

原始碼地址

  • https://github.com/zjulion/handeyecat