IK之FABRIK

 

很久之前就知道反向动力学IK了,但是一直没有详细了解过,只知道他的功能是什么。最近项目很多地方需要用到IK,特仔细学习了一下。如有错误欢迎指正。

关于反向动力学(IK)我就不介绍了,网上大把资料。IK按照求解方法可以分为很多类别,例如分析法,牛顿法,统计法等等。这些方法都有他们各自的缺点,例如计算复杂度高,存在奇异值解,或者变化不光滑等。

而FABRIK属于启发式方法,属于同一类的还有CCD方法。FABRIK不需要计算旋转,只需要计算线性位置就最终可以求得近似解,非常快速并且变化光滑,不会存在断点或者突变。FABRIK的详细理论可以参看Andreas Aristidou的论文,从收敛等各个角度详细阐述了FABRIK的特性。

FABRIK详细阐述

下面详细介绍一下FABRIK。

如上图,给定终点,给定四个点,假定原点P1限制不能移动,如何移动P2,P3使得最终P4到达目标点??(确定目标确实可以到达)。

求解过程分两步,第一步叫做forward过程,如下图:

非常简单,将P4移动到目标点,然后连接目标点和P3,在这条线上取距离为d3得到P3', 然后不断重复这个过程。这样一般得到的结果P1'都会移动到新的位置。接下来进行第二部backward过程,如下图:

这一次从P1'开始,将P1'重新移动到P1的位置,然后从P1开始重复上面过程,最终得到新的末端点(叫做end effector)的新位置P4'', 对比发现P4''比P4距离目标点更近了。

上面是一次迭代的过程,这个迭代过程可以重复很多遍知道末端点和target的距离重合或者足够接近位置(当然,有时候为了性性能考虑这个“足够近”可能也不是很近)。

多个末端点

上面是最简单的FABRIK。一般来说现实生活都不会是仅仅自由一个末端点,例如人的四肢,例如手掌,都包含多个末端点,然后这些末端点一起发挥作用。这种情况如何做呢?

其实也不难。首先我们引入一种叫做“sub-bases”的概念,可以把它想象成道路的分叉口,如下图:

上图中的蓝色点都是sub-base,绿色的都是end effectors,红色是起始点。这个时候给定每个end effector的目标点,如何移动整个网络呢?

其实方法类似,依旧分两步:第一步还是forward,只不过这个时候不是到达start起点,而是从每一个end effector到达距离他最近的sub-base节点。对于有多个end effector的情况,这样做会得到多个sub-base的新位置,我们取所有sub-base新位置的中心点作为最终的sub-base的新位置。如果这个sub-base又连接到另外一个sub-base上面了,那么我们重复上面的过程。如果sub-base连接到了起点上面,我们实际上就最终到达了起始点。

第二部还是backward,这个时候我们从起点出发,然后遇到sub-base的时候我们就把每个支路作为单独的网络分别求解,过程和上面没有任何不同!

关节约束

上面得到的结果显示应用还是差强人意,因为我们还没有加入关节约束。关节约束就是加入实际网络每个节点相对父节点可以变换的范围(主要是旋转变换)。例如人体,你不可能反向弯曲你的膝盖(大多数正常人)。这也是FABRIK中比较难的一部分。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值