RBF 中的旋转表示

解释为什么旋转不适合直接作为欧氏向量插值,并整理 rotation vector、log map 与 exp map 在 RBF 中的用法。

RBF 本身处理的是向量空间里的距离和线性组合,所以平移、位移、权重、PCA 系数、参数向量等都很自然。但旋转不是普通向量,它生活在旋转群上,因此不能随便把旋转表示直接塞进 RBF。

工程中常见的结论是:可以用 quaternion 或旋转矩阵来存储和组合旋转,但在 RBF 里真正作为输入或输出参与插值的,通常应当是 相对于 reference rotation 的 rotation vector

为什么不直接插值常见旋转表示

不同旋转表示各有问题:

  • Euler angle 有旋转顺序、角度跳变、万向节锁问题。
  • 旋转矩阵展平成 9 维后做线性组合,结果通常不再是正交矩阵。
  • Quaternion 在单位球面上,而且 q\mathbf{q}q-\mathbf{q} 表示同一个旋转,直接用欧氏距离或线性混合会有二义性。

RBF 需要的是可以计算距离、可以线性组合、局部看起来像 Rn\mathbb{R}^n 的表示。因此更合适的做法是先把旋转映射到李代数,也就是转成 rotation vector。

rotation vector

rotation vector 是一个三维向量

r=θa\mathbf{r}=\theta \mathbf{a}

其中 a\mathbf{a} 是单位旋转轴,θ\theta 是旋转角度。它的方向表示旋转轴,长度表示旋转角:

r2=θ\|\mathbf{r}\|_2=\theta

也可以把它理解成旋转矩阵的 log map:

r=vee(Log(R))\mathbf{r}=\mathrm{vee}(\mathrm{Log}(\mathbf{R}))

其中

RSO(3),rR3\mathbf{R}\in SO(3),\qquad \mathbf{r}\in \mathbb{R}^3

这里的 Log\mathrm{Log} 不是对矩阵逐元素取普通对数,而是 SO(3)SO(3) 到其李代数的映射。反过来,从 rotation vector 回到旋转矩阵,用 exp map:

R=Exp(r)\mathbf{R}=\mathrm{Exp}(\mathbf{r})

所以在 RBF 中可以采用这样的流程:

rotation -> rotation vector -> RBF -> rotation vector -> rotation

使用相对于 reference rotation 的 delta

在一般场景里,输入特征优先使用局部坐标系下、相对于 reference rotation 的 delta rotation,而不是直接使用全局旋转。

如果当前局部旋转是 Rcurrent\mathbf{R}_{current},reference rotation 是 Rref\mathbf{R}_{ref},那么

ΔR=Rref1Rcurrent\Delta \mathbf{R} = \mathbf{R}_{ref}^{-1}\mathbf{R}_{current}

然后把它转成 rotation vector:

r=vee(Log(ΔR))\mathbf{r} = \mathrm{vee}(\mathrm{Log}(\Delta \mathbf{R}))

如果 reference rotation 就是 identity,那么

ΔR=Rcurrent\Delta \mathbf{R}=\mathbf{R}_{current}

这时 local rotation 和 delta local rotation 在数值上等价。但概念上仍然建议保留 “delta from reference” 的写法,因为这样更换参考坐标系或初始状态时不容易混乱。

多个旋转特征如何拼接

如果一个输出由多个旋转特征共同驱动,可以分别计算它们的 delta rotation vector:

ra=vee(Log(ΔRa))\mathbf{r}_a = \mathrm{vee}(\mathrm{Log}(\Delta \mathbf{R}_a)) rb=vee(Log(ΔRb))\mathbf{r}_b = \mathrm{vee}(\mathrm{Log}(\Delta \mathbf{R}_b))

然后直接拼成一个 6 维输入向量:

x=[rarb]R6\mathbf{x} = \begin{bmatrix} \mathbf{r}_a\\ \mathbf{r}_b \end{bmatrix} \in \mathbb{R}^6

RBF 的输入空间就是这个 6 维欧氏空间。两个样本之间的距离可以写成

xxi2\|\mathbf{x}-\mathbf{x}_i\|_2

也可以根据不同 feature block 的重要性使用加权距离:

ri2=αarara,i22+αbrbrb,i22r_i^2 = \alpha_a\|\mathbf{r}_a-\mathbf{r}_{a,i}\|_2^2 + \alpha_b\|\mathbf{r}_b-\mathbf{r}_{b,i}\|_2^2

这比直接把世界空间矩阵或 Euler 角拼在一起更稳,也更接近 “当前旋转状态离样本旋转状态有多远” 这个语义。

exp map 如何从向量回到矩阵

给定 rotation vector

r=[rxryrz]\mathbf{r}= \begin{bmatrix} r_x\\ r_y\\ r_z \end{bmatrix}

先构造反对称矩阵

[r]×=[0rzryrz0rxryrx0][\mathbf{r}]_\times = \begin{bmatrix} 0 & -r_z & r_y\\ r_z & 0 & -r_x\\ -r_y & r_x & 0 \end{bmatrix}

θ=r2\theta=\|\mathbf{r}\|_2

R=exp([r]×)\mathbf{R} = \exp([\mathbf{r}]_\times)

工程中通常用 Rodrigues 公式计算:

R=I+sinθθ[r]×+1cosθθ2[r]×2\mathbf{R} = \mathbf{I} + \frac{\sin\theta}{\theta}[\mathbf{r}]_\times + \frac{1-\cos\theta}{\theta^2}[\mathbf{r}]_\times^2

θ\theta 很小时,要用小角度近似或库函数的稳定实现,避免除以很小的数。

log map 如何从矩阵得到向量

从旋转矩阵 R\mathbf{R} 到 rotation vector,先由 trace 得到旋转角:

θ=arccos(trace(R)12)\theta = \arccos\left( \frac{\text{trace}(\mathbf{R})-1}{2} \right)

然后

r=θ2sinθ[R32R23R13R31R21R12]\mathbf{r} = \frac{\theta}{2\sin\theta} \begin{bmatrix} R_{32}-R_{23}\\ R_{13}-R_{31}\\ R_{21}-R_{12} \end{bmatrix}

这里假设矩阵下标从 11 开始。实际实现中同样要处理 θ\theta 接近 00 或接近 π\pi 的情况。

quaternion 与 rotation vector 不是二选一

说 RBF 中插值 rotation vector,并不表示工程里完全不用 quaternion。更合理的分工是:

  • quaternion 适合存储旋转、组合旋转、避免矩阵正交漂移、做 slerp。
  • rotation vector 适合作为 RBF / ML / PCA / regression 的欧氏特征。

如果输入原本是 quaternion,可以先计算相对于 reference rotation 的 delta quaternion:

qdelta=qref1qcurrent\mathbf{q}_{delta} = \mathbf{q}_{ref}^{-1}\otimes \mathbf{q}_{current}

做 hemisphere 修正后,再映射成 rotation vector:

r=log(qdelta)\mathbf{r} = \log(\mathbf{q}_{delta})

RBF 输出的 correction 也可以是 rotation vector:

rcorr=f(x)\mathbf{r}_{corr} = \mathbf{f}(\mathbf{x})

最后再转回 quaternion 或旋转矩阵:

qcorr=exp(rcorr)\mathbf{q}_{corr} = \exp(\mathbf{r}_{corr})

所以更完整的流程是

q_current
-> q_delta
-> rotation vector
-> RBF
-> correction rotation vector
-> q_correction

实用建议

对于旋转驱动的 correction problem,第一版通常可以优先使用 normalized RBF blend,因为它稳定、直观、调参成本低。对于必须命中样本输出的 correction vector,可以考虑 exact RBF,但最好加入 regularization、输出 clamp 和 fallback。

旋转特征本身还要注意:

  • 使用 delta rotation,不要直接使用全局旋转。
  • 多个旋转输入可以拼接 rotation vector,但最好给不同 feature block 设置合理尺度。
  • RBF 的样本应覆盖主要输入区域,远离样本时不要期待它自动给出可靠外推。
  • rotation vector 在 reference rotation 附近非常自然,但大角度尤其接近 π\pi 时要小心 log map 的不连续性。
  • quaternion 作为存储格式没有问题,但直接对 quaternion 做 RBF 距离和线性混合通常不是好主意。

简洁地说:RBF 需要的是一个局部欧氏特征空间,而 rotation vector 正是在 reference rotation 附近把旋转问题拉回 R3\mathbb{R}^3 的工具。