游戲中反向運動學(ik)的研究與簡介


 反向運動學(ik),英文名稱是inverse kinematics,主要應用在機器人手臂操作及計算機動畫等領域,它與正向運動學即fk是相反的過程,具體定義在此不多說,感興趣的可以看下wikipedia對於ik的定義。本文主要講述一下我所看過的求解ik的方法。求解Ik的方法主要分為兩種,一種是分析法,即通過三角函數等進行分析計算,對於骨骼數少的可以進行此種運算,但是對於鏈很長的情況,用此方法就行不通,有些文章對此進行了改進,可以對多個骨骼進行分析計算得出結果,比如這篇文章:A 12-DOF Analytic Inverse Kinematics Solver for Human Motion Control[1],當然還有其他類似的文章,第二種方法就是數值方法,通過不斷迭代運算求出一個近似解,這類方法比較多,同時也是普遍被接受的一類方法,比如CCD (cyclic coordinate descent)[2], Jacobian Transpose[3], pseudoinverse method[4], damped least squares methods[5], selectively damped least squares methods[6],比較詳細的介紹可以在Introduction to Inverse Kinematics with JacobianTranspose, Pseudoinverse andDamped Least Squares methods這遍文章中看到,從后面的文獻中可以看到你感興趣的東西,下面就簡單的介紹下各種方法。

1 CCD (cyclic coordinate descent),具體解釋請看這里,作者已經解釋的很詳細了,很好的一篇文章,http://multi-crash.com/?p=45 ,作者也把他的動畫庫開源了,可以下載代碼研究下,我也參考作者的代碼實現了下,但是發現效果並不是特別好,這是ccd本身存在的問題,還有其他一些文章,比如Jeff Lander的Oh my God, I Inverseted kine!以及Making Kine More Flexible,這里詳細得介紹了原理。

2 Jacobian Transpose. 雅可比轉置矩陣是整個系統的偏導,它定義了末端效應器(end effector)如何基於整個系統的瞬時變換而變化。末端效應器就是指整個骨骼鏈的末端,比如你現在要對整個手臂做ik,那么手掌(假設手掌上只有一個骨骼)就是末端效應器。如下圖1所示,此圖來自Mathmatics for inverse kinematics,  Ming Yao,里面也有對ccd和jacobian transpose 以及pesudoinverse method的介紹,看完后能對求解Ik的三種方法有個大概了解。Jason CLark的inverse kinematics,以及Chris Hecker的My Adventure with  Inverse Kinematics。圖2是雅可比矩陣的表示形式,具體求解方法可參照Ming Yao的Pdf,然后我們對求得的矩陣示轉置,就可以得到要求的矩陣。

end effector 示例

圖1. 末端效應器                          圖2 雅可比矩陣

 

 

3 Pseudoinverse Jacobian. 由於上面求得的雅可比矩陣可能不為方陣,或者矩陣本身是奇異矩陣,所以不能直接求逆。求出的結果和推導過程如圖3所示,具體請參考Ming Yao的pdf,或者[4]。

圖3 Pseudoinverse Jacobian推導過程

 

4 damped least squares methods 和selectively damped least squares methods請參看文獻里面的[5],[6],在[6]里面作者分別實現了Jacobian Transpose, pseudoinverse Jacobian, damped least squares methods,selectively damped least squares methods,並對其結果進行了分析,指出了他們的優缺點,以及各種方法適合在什么情況下使用,在此感謝作者無私的精神,把代碼貢獻出來。開源建模軟件blender中也使用了這兩種方法,具體可以看這里http://wiki.blender.org/index.php/User:Brecht/SummerOfCode2005/Inverse_Kinematics,因為是開源的,感興趣的也可以看下blender實現部分的源代碼。

游戲中用分析法以及簡單的ccd就足夠了(比如簡單的游戲中角色的腳的放置問題),但就目前我用的ccd效果來看不是特別好,可能有些細節沒有注意到。在ce3一個老版本中是只有分析法和ccd的,不過對於其中有些地方的處理不是特別清楚,如果有熟悉ce3 ik的大牛還請指導一下。:-),如果有時間的話可能把jacobian transpose, pseudoinverse jacobian, sdls集成進去看看效果與效率如何,是否適用於游戲中。

沒什么實質性的東西,大多數都是我看過的文章及個人的理解,如有錯誤還請指正,希望對研究ik的朋友有所幫助。

此文並未完結,我會陸續把我個人在實現中遇到的問題和想法寫到這。

參考文獻:

[1] Xiaomao Wu, Lizhuang Ma, Zhihua Chen, Yan Gao, A 12-DOF Analytic Inverse Kinematics Solver for Human Motion Control  

[2] Li-Chun Tommy Wang and Chih Cheng Chen, A combined optimization Method for solving the inverse kinematics problems of mechanical manipulators  

[3] A. Balestrino, G. De Maria, and L. Sciavicco, Robust control of robotic manipulators

[4] D. E. Whitney, Resolved motion rate control of manipulators and human prostheses 

[5] C. W. Wampler, Manipulator inverse kinematic solutions based on vector formulations and damped least squares methods

[6] Samuel R. Buss, Jin-Su Kim, Selectively Damped Least Squares for Inverse Kinematics


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM