双四元混合(Dual Quaternion Blending)

DynamicFusion 解析之双四元混合(Dual Quaternion Blending)

链接:*Skinning with Dual Quaternions,
DynamicFusion Paper

第一篇csdn的文章,主要是看网上讲DQB的少,所以打算写一个比较全的,希望得到大佬们的指点。

DynamicFusion运用DQB的动机 (Motivation)

如果仔细去看DynamicFusion这篇非刚性3D重构 (no-rigid 3D reconstruction) 的朋友会发现,与刚性变化 (rigid transformation) 不同,非刚性重构要求算式对每帧计算一个扭曲场( Warp Field )。这个扭曲场会作为介质将非刚性变换的点转换成刚性变换的点从而进行进一步传统的刚性变化分析 ( W : S ( x ) → S E 3 ( x ) W: S(x)\rightarrow SE_3(x) W:S(x)SE3(x))。然而,如果用传统的稠密法 (Truncated Signed Distance)去建立这个三维的扭曲场,由于要对每个 3维晶柱点 (voxel) 去做 6DoF 变换的估计,这个过程计算要求是非常大的。

(假如有一张 25 6 2 256^2 2562的图,那么算法则需要生成 25 6 3 256^3 2563的晶柱体 (voxels),每个晶柱体有6个变量 (rotation + translation),则这个算法要生成 6 ∗ 25 6 3 6 * 256^3 62563个变量)

为了缩短计算时间,作者在文章中表示,由于在现实生活中非刚性运动相对平滑,所以我们可以建立一个稀疏的扭曲场,然后用这些稀疏的变量 (6DoF transformation) 去做插值 (interpolation) 从而得到一个稠密的扭曲场。为了保持在做插值中的几何结构,作者在此用到了一个叫dual-quaternion blending (DQB)的算法。

那么下面我们就一起来欣赏一下作者说的这个DQB


双四元混合(Dual-Quaternion Blending)

什么是四元 (What is Quaternion?)

四元是传统意义上的欧拉角旋转矩阵的延伸,其重要性是保持旋转矩阵不进入万向死节所(gimbal lock)。如果一个旋转矩阵进入了gimbal lock中,那么这个矩阵就失去了原有的3DoF,从而不能自由的表示物体接下来的旋转状态。如果我们加入一个维度的话,我们就可以避免gimbal锁的发生。这就是为什么Quarternion是做Graphic大佬们的最爱谈论的东西。
双四元混合(Dual Quaternion Blending)_第1张图片
将一个欧拉角转动矩阵转化为四元的方式很简单,提示:用 R = e x p ( [ w ] × ) R = exp([w]_\times) R=exp([w]×) (skew symmetric的特征)去想此变换式
R S E 3 = [ r 00 r 01 r 02 r 10 r 11 r 12 r 20 r 21 r 22 ] R_{SE_3} = \begin{bmatrix} r_{00} & r_{01} & r_{02} \\ r_{10} & r_{11} & r_{12} \\ r_{20} & r_{21} & r_{22} \end{bmatrix} RSE3=r00r10r20r01r11r21r02r12r22

q ( R S E 3 ) = [ q w = 1 + r 00 + r 11 + r 22 / 2 q x = ( r 21 − r 12 ) / ( 4 q w ) q y = ( r 02 − r 20 ) / ( 4 q w ) q z = ( r 10 − r 01 ) / ( 4 q w ) ] q(R_{SE_3}) = \begin{bmatrix} q_w = \sqrt{1 + r_{00} + r_{11} + r_{22}} / 2 \\ q_x = (r_{21} - r_{12})/(4q_w) \\ q_y = (r_{02} - r_{20})/(4q_w) \\ q_z = (r_{10} - r_{01})/(4q_w) \\ \end{bmatrix} q(RSE3)=qw=1+r00+r11+r22 /2qx=(r21r12)/(4qw)qy=(r02r20)/(4qw)qz=(r10r01)/(4qw)
验证的旋转四元的性质:

  1. 单元性(Unit Vector): ∣ ∣ q ∣ ∣ = 1 ||q|| = 1 q=1
  2. 假设 x ∈ R 3 x \in R^3 xR3,那么 R S E 3 x = q x q − 1 R_{SE_3} \textbf{x} = q \textbf{x} q^{-1} RSE3x=qxq1

对刚性变换的权重插值 (weighted interpolation)

在computer graphics中,非刚性变换主要是由众多刚性变换近似而成。我们在dynamicfusion中提到过,如果对每个voxel都进行一个刚性变换的评估,这种过程非常繁杂,所以我们需要借助权重插值来将稀疏的非刚性变换来转换到稠密的非刚性变换 (non-rigid transformation field)

求刚性变换的权重插值主要是要算出由一个6DoF刚性变换 (quaternion + translation)过渡到另外一个6DoF刚性变换过程中任意一个值:

q ∗ = w 1 q 1 + w 2 q 2 ,  s.t.  w 1 + w 2 = 1 q^* = w_1 q_1 + w_2q_2, \text{ s.t. } w_1 + w_2 = 1 q=w1q1+w2q2, s.t. w1+w2=1

在双四元混合文章中,作者解释说如果对四元(Quaternion)直接用权重插值在过渡过程中会改变quaternion的几何特性,如果要避免表面出现断层现象,我们要保证新的权重插值保持以下几个特性:

  1. 从一个刚性变换( q 1 q_1 q1)到另一个刚性变换( q 2 q_2 q2)过渡中间任意一个插值 q ∗ q^* q都是一个有效的刚性变换( q ∗ q^* q)
  2. 所求的权重插值( q ∗ q^* q)在从一个刚性变换( q 1 q_1 q1)到另一个刚性变换( q 2 q_2 q2)变换的最小路径上
  3. 坐标空间对于所求的权重插值没有影响(invariant to coordinate-space)

(下面这个图表示了如果对四元向量擅用权重插值的话会导致过渡过程出现断层现象)
双四元混合(Dual Quaternion Blending)_第2张图片
如果想要达成以上目标,作者提出用双四元法对刚性变换做权重插值(interpolation)。想必到现在intro已经做得差不多了,下面我们就来详细讲解双四元混合法。


Dual Quaternion (双四元法)

双四元(dual quarternion)可以想象成一个对原来四元的向量的延伸,而其中每一个值都是个双元(dual number)的数值。
q ^ = [ a 0 + ϵ b 0 a 1 + ϵ b 1 a 2 + ϵ b 2 a 3 + ϵ b 3 ] = q 0 + ϵ q ϵ , where  ϵ 2 = 0 \hat{q} = \begin{bmatrix} a_0 + \epsilon b_0 \\ a_1 + \epsilon b_1 \\ a_2 + \epsilon b_2 \\ a_3 + \epsilon b_3 \\ \end{bmatrix} = q_0 + \epsilon q_\epsilon \text {, where } \epsilon^2 = 0 q^=a0+ϵb0a1+ϵb1a2+ϵb2a3+ϵb3=q0+ϵqϵ, where ϵ2=0
大家可以通过complex number对于real number的影响来看双四元是如何解决对四元空间的过渡断层问题(太深奥,我也讲不清楚,希望有大神可以代替我讲一讲)

双四元的基本计算 q ^ = q 0 + ϵ q ϵ \hat{q} = q_0 + \epsilon q_\epsilon q^=q0+ϵqϵ

  1. Conjugate: q ^ ∗ = q 0 ∗ + ϵ q ϵ ∗ \hat{q}^* = q_0^* + \epsilon q_\epsilon^* q^=q0+ϵqϵ
  2. Inverse: q ^ − 1 = q ^ ∗ ∣ ∣ q ^ ∣ ∣ 2 \hat{q}^{-1} = \frac{\hat{q}^*}{||\hat{q}||^2} q^1=q^2q^
  3. Norm: ∣ ∣ q ^ ∣ ∣ = q ^ ∗ q ^ = ∣ ∣ q 0 ∣ ∣ + ϵ < q 0 , q ϵ > ∣ ∣ q 0 ∣ ∣ ||\hat{q}|| = \sqrt{\hat{q}^*\hat{q}} = ||q_0|| + \epsilon \frac{}{||q_0||} q^=q^q^ =q0+ϵq0<q0,qϵ>
  4. 如果是unit dual quaternion的话,inverse = conjugate

熟练运用Dual Quaternion


3D 点 v v v
文章中说通常3D的向量 v = [ x y z ] v = \begin{bmatrix}x \\ y \\ z \end{bmatrix} v=xyz都能转换成 v ^ \hat{v} v^ (单元双四元,unit dual quaternion),转换方式如下:
v ^ = [ 1 ϵ x ϵ y ϵ z ] = [ 1 0 0 0 ] + ϵ [ 0 x y z ] = q 0 + ϵ q ϵ \hat{v} = \begin{bmatrix} 1 \\ \epsilon x \\ \epsilon y \\ \epsilon z \end{bmatrix} = \begin{bmatrix}1 \\ 0 \\ 0 \\ 0 \end{bmatrix} + \epsilon \begin{bmatrix}0 \\ x \\ y \\ z \end{bmatrix} = q_0 + \epsilon q_\epsilon v^=1ϵxϵyϵz=1000+ϵ0xyz=q0+ϵqϵ
其中 ∣ ∣ q 0 ∣ ∣ = 1 ||q_0|| = 1 q0=1, < q 0 , q ϵ > = 0 =0 <q0,qϵ>=0,满足单元双四元的特性。(在文章中,为简洁表示为 v ^ = 1 + ϵ x i + ϵ y j + ϵ z k \hat{v} = 1 + \epsilon xi + \epsilon yj + \epsilon zk v^=1+ϵxi+ϵyj+ϵzk,但是还是感觉写成矩阵简单易懂)如果想从双四元转换回3D点的坐标,逆推这个公式就好了。


旋转 R R R:

我们都知道旋转矩阵转换来的四元( R → q r R\rightarrow q_r Rqr)本身就是一个单元向量( ∣ ∣ q ∣ ∣ = 1 ||q|| = 1 q=1),所以对于 q r q_r qr,它的双四元和四元是一样的。我们知道所有的3D空间中旋转后的点 x ′ = R x x' = R x x=Rx,都可以另用对应的四元来表示 x ′ = q r x q r − 1 x' = q_rxq_r^{-1} x=qrxqr1。在双四元空间,只要先将点和旋转的都转换进入双四元空间,之后两者之间的关系都是相似的 x ′ ^ = q ^ x ^ q ∗ ^ ˉ \hat{x'} = \hat{q}\hat{x}\bar{\hat{q^*}} x^=q^x^q^ˉ 在这里 q ∗ ^ \hat{q^*} q^等同于 q − 1 q^{-1} q1的性质。

我们可以进一步简化上面的式子得出:
x ′ ^ = q ( 1 + ϵ ( x i + y j + z k ) ) q − 1 = 1 + ϵ q ( x i + y j + z k ) q − 1 \hat{x'} = q(1 + \epsilon(xi + yj+zk))q^{-1} = 1 +\epsilon q(xi+yj+zk)q^{-1} x^=q(1+ϵ(xi+yj+zk))q1=1+ϵq(xi+yj+zk)q1
如果我们看原式中 q ϵ q_\epsilon qϵ这项,是不是很像 q x q − 1 qxq^{-1} qxq1


位移 t t t:

文章表示 q x q − 1 qxq^{-1} qxq1这个elegant的公式不仅能表示旋转特性,还能表示translation的几何特性 x ′ ^ = t ^ x ^ t ∗ ^ ˉ \hat{x'} = \hat{t}\hat{x}\bar{\hat{t^*}} x^=t^x^t^ˉ

在这里从 t = [ t 0 t 1 t 2 ] t = \begin{bmatrix}t_0 \\ t_1\\ t_2\end{bmatrix} t=t0t1t2转换到双四元的公式为:
t ^ = [ 1 0 0 0 ] + ϵ / 2 [ 0 t 0 t 1 t 2 ] \hat{t} = \begin{bmatrix}1 \\ 0 \\ 0 \\ 0 \end{bmatrix} + \epsilon/2\begin{bmatrix}0 \\ t_0 \\ t_1 \\ t_2 \end{bmatrix} t^=1000+ϵ/20t0t1t2
如果在这里不除2的话,原点就会向 t t t方向移动两次,如果我们带入到之前的公式的话,我们会看到:

t ^ x ^ t ^ ∗ ˉ = 1 + ϵ ( ( x + t 0 ) i + ( y + t 1 ) j + ( z + t 2 ) k ) \hat{t}\hat{x}\bar{\hat{t}^*} = 1 + \epsilon ((x+t_0)i + (y+t_1)j + (z+t_2)k) t^x^t^ˉ=1+ϵ((x+t0)i+(y+t1)j+(z+t2)k)

有了R和t,我们的rigid transform对应的双四元就可表示为:
( t ^ q ^ ) x ^ ( q ∗ ^ t ∗ ^ ) (\hat{t} \hat{q}) \hat{x} (\hat{q^*}\hat{t^*}) (t^q^)x^(q^t^)
其中 T ^ = ( t ^ q ^ ) = ( 1 + ϵ / 2 ( t 0 i + t 1 j + t 2 k ) ) q r \hat{T} = (\hat{t}\hat{q}) = (1 + \epsilon/2(t_0i + t_1j + t_2k))q_r T^=(t^q^)=(1+ϵ/2(t0i+t1j+t2k))qr
如果想从 T ^ \hat{T} T^转换成Rt的话也很简单:
R ← q r R \leftarrow q_r Rqr
t ← 2 ∗ q ϵ ∗ q r − 1 t \leftarrow 2 * q_\epsilon * q_r ^{-1} t2qϵqr1


双四元混合(Dual Quaternion Blending)

到这里我们终于可以讲一直拖了半天的算法(DQB),看懂Dual Quaternion的同学会发现,这无非就是在双四元空间中做权重的一个算法。文章中的公式如下:

D L B ( w ; q 1 ^ , q 2 ^ . . . q n ^ ) = w 1 q 1 ^ + . . . + w n q n ^ ∣ ∣ w 1 q 1 ^ + . . . + w n q n ^ ∣ ∣ DLB(\textbf{w}; \hat{q_1}, \hat{q_2}...\hat{q_n}) = \frac{w_1\hat{q_1} + ...+w_n\hat{q_n}}{||w_1\hat{q_1} + ... + w_n\hat{q_n}||} DLB(w;q1^,q2^...qn^)=w1q1^+...+wnqn^w1q1^+...+wnqn^

之后的文章通过运用双四元的性质去证明这个在双四元空间下的权重方法达到了之前作者对优秀刚性过渡插值的三点要求(部分证明更新中。。。着急的朋友可以先看原文)

双四元混合(Dual Quaternion Blending)_第3张图片
代码中的M求解方式如下:
在这里插入图片描述


回归DynamicFusion

然而故事还没有结束,DQB文章只说明了怎么取做刚性变换的权重,而没有像DynamicFusion里融合了高斯牛顿优化去求最佳解。这种全新的solver叫做pre-conditioned conjugate gradient descent solver。但是我希望看完这篇讲解,大家能对Quaternion的重要性有一个更好的认知。

你可能感兴趣的:(双四元混合(Dual Quaternion Blending))