T={tk}k=1KT=\{t_k\}^K_{k=1}T={tk}k=1K:静止姿态下的关节点坐标。
R={Rpa(k),k}k=1KR=\{R_{pa(k), k}\}_{k=1}^KR={Rpa(k),k}k=1K:相对旋转。
Q={qk}k=1KQ=\{q_k\}^K_{k=1}Q={qk}k=1K:根据输入的相对旋转,FK计算出的关节点坐标。
KKK: 关节点数目。
pa(k)pa(k)pa(k):第k个节点的父节点。
Rpa(k),kR_{pa(k), k}Rpa(k),k:第k个节点关于其父节点的相对旋转。
前向动力学:
qk=Rk(tk−tpa(k))+qpa(k)q_k = R_k(t_k - t_{pa(k)}) + q_{pa(k)} qk=Rk(tk−tpa(k))+qpa(k)
Rk=Rpa(k)Rpa(k),kR_k=R_{pa(k)}R_{pa(k),k} Rk=Rpa(k)Rpa(k),k
Rk∈SO(3)R_k\in SO(3)Rk∈SO(3):第k个节点关于标注静止姿态空间的全局旋转。
反向动力学:
IK是FK的逆过程,输入静止姿态TTT和目标姿态QQQ, 计算相对旋转矩阵RRR
R=IK(Q,T)R = IK(Q, T) R=IK(Q,T)
理想情况下,求得的旋转矩阵需要满足如下条件:
qk−qpa(k)=Rk(tk−tpa(k))∀1≤k≤Kq_k - q_{pa(k)} = R_k(t_k - t_{pa(k)}) \quad \forall 1 \leq k \leq K qk−qpa(k)=Rk(tk−tpa(k))∀1≤k≤K
FK问题是适定的,IK问题却是病态的,要么无解,要么可能存在许多解可以目前上述条件。
类似FK过程,IK过程可以沿着运动学树迭代进行。
首先,我们要确定根节点的全局旋转R0R_0R0,可以通过spine, left hip, right hip这三个点的位置和SVD分解求得闭式解。之后的每一步,以第k步为例,我们假设其父节点Rpa(k)R_{pa(k)}Rpa(k)的旋转已知
Rpa(k)−1(qk−qpa(k))=Rpa(k),k)(tk−tpa(k))R^{-1}_{pa(k)}(q_k - q_{pa(k)}) = R_{pa(k),k)}(t_k - t_{pa(k)}) Rpa(k)−1(qk−qpa(k))=Rpa(k),k)(tk−tpa(k))
pk⃗=Rpa(k)−1(qk−qpa(k))tk⃗=tk−tpa(k)\begin{aligned} \vec{p_k} &= R^{-1}_{pa(k)}(q_k - q_{pa(k)}) \\ \vec{t_k} &= t_k - t_{pa(k)} \end{aligned} pktk=Rpa(k)−1(qk−qpa(k))=tk−tpa(k)
可以通过下式计算相对旋转:
Rpa(k),k=D(pk⃗,tk⃗,ϕk)R_{pa(k), k} = D(\vec{p_k}, \vec{t_k}, \phi_k) Rpa(k),k=D(pk,tk,ϕk)
ϕk\phi_kϕk是网络预测出的第k个节点的twist角。twist角的集合表示为Φ={ϕk}k=1K\Phi=\{\phi_k\}_{k=1}^KΦ={ϕk}k=1K,因为旋转矩阵是正交阵,因此Rpa(k)−1=Rpa(k)TR^{-1}_{pa(k)}=R^{T}_{pa(k)}Rpa(k)−1=Rpa(k)T,使得解算过程可微。
完整的算法流程如下:
输入:Q, T, Φ\PhiΦ
输出:R
第一步先确定根节点0的全局旋转,再沿着运动学树进行下述迭代处理
pk⃗←Rpa(k)−1(qk−qpa(k))tk⃗←tk−tpa(k)Rpa(k),ksw←Dsw(pk⃗,tk⃗)Rpa(k),ktw←Dtw(pk⃗,ϕk⃗)Rpa(k),k←Rpa(k),kswRpa(k),ktw\begin{aligned} \vec{p_k} &\leftarrow R^{-1}_{pa(k)}(q_k - q_{pa(k)}) \\ \vec{t_k} & \leftarrow t_k - t_{pa(k)} \\ R^{sw}_{pa(k), k} & \leftarrow D^{sw}(\vec{p_k}, \vec{t_k} ) \\ R^{tw}_{pa(k), k} & \leftarrow D^{tw}(\vec{p_k}, \vec{\phi_k} ) \\ R_{pa(k),k} & \leftarrow R^{sw}_{pa(k), k}R^{tw}_{pa(k), k} \end{aligned} pktkRpa(k),kswRpa(k),ktwRpa(k),k←Rpa(k)−1(qk−qpa(k))←tk−tpa(k)←Dsw(pk,tk)←Dtw(pk,ϕk)←Rpa(k),kswRpa(k),ktw
Rsw=Dsw(p⃗,t⃗)=I+sinα[n⃗]×+(1−cosα)[n⃗]×2R^{sw} = D^{sw}(\vec{p}, \vec{t}) = I + sin\alpha[\vec{n}]_{\times} + (1 - cos\alpha)[\vec{n}]_{\times}^2 Rsw=Dsw(p,t)=I+sinα[n]×+(1−cosα)[n]×2
Rtw=Dtw(p⃗,ϕ)=I+sinϕ∣∣t⃗∣∣[n⃗]×+(1−cosϕ)∣∣t⃗∣∣2[n⃗]×2R^{tw} = D^{tw}(\vec{p}, \phi) = I + \frac{sin\phi}{||\vec{t}||}[\vec{n}]_{\times} + \frac{(1 - cos\phi)}{||\vec{t}||^2}[\vec{n}]_{\times}^2 Rtw=Dtw(p,ϕ)=I+∣∣t∣∣sinϕ[n]×+∣∣t∣∣2(1−cosϕ)[n]×2
n⃗=t⃗×p⃗∣∣t⃗×p⃗∣∣\vec{n} = \frac{\vec{t}\times\vec{p}} {||\vec{t} \times \vec{p}||} n=∣∣t×p∣∣t×p
[t⃗]×[\vec{t}]_{\times}[t]×是t⃗\vec{t}t的对称矩阵。
Naive HybrIK过程看着是有效的,它遵循了∣∣qk−qpa(k)∣∣=∣∣tk−tpa(k)∣∣||q_k - q_{pa(k)}||=||t_k - t_{pa(k)}||∣∣qk−qpa(k)∣∣=∣∣tk−tpa(k)∣∣这个假设。
但不幸的是,3D关键点估计方法的预测身体部件结果并不总是能和静止姿态模板一致。如果使用Naive HybrIK的方式,这个误差会沿着运动学树一直累计。