代码改变世界

游戏中反向运动学(ik)的研究与简介

2012-11-12 00:05  风恋残雪  阅读(6291)  评论(0编辑  收藏  举报

 反向运动学(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