四元数 (Quaternion)中的扰动知识(6)
1. 左扰动定义
左乘扰动(left-multiplicative)的形式为:
qnew=δq⊗q, q_{\text{new}} = \delta q \otimes q, qnew=δq⊗q,
其中 q=[w,v]q=[w,\mathbf v]q=[w,v](写作 www 为标量部分,v∈R3\mathbf v\in\mathbb R^3v∈R3 为向量部分),并把小扰动 δθ∈R3\delta\theta\in\mathbb R^3δθ∈R3 用四元数近似表示为
δq≈[1, 12 δθ] \delta q \approx \left[1,\; \tfrac{1}{2}\,\delta\theta\right] δq≈[1,21δθ]
(这是指数映射在小角近似下的常用一阶展开: exp(12[δθ])≈[1,12δθ]\exp(\tfrac12[\delta\theta])\approx[1,\tfrac12\delta\theta]exp(21[δθ])≈[1,21δθ])。
2. 四元数乘法公式约定
写成分块形式,若
p=[pw, p],r=[rw, r], p = [p_w, \; \mathbf p],\qquad r=[r_w,\; \mathbf r], p=[pw,p],r=[rw,r],
则
p⊗r=(pwrw−p⊤r, pwr+rwp+p×r). p \otimes r = \big(p_w r_w - \mathbf p^\top \mathbf r,\; p_w \mathbf r + r_w \mathbf p + \mathbf p \times \mathbf r\big). p⊗r=(pwrw−p⊤r,pwr+rwp+p×r).
将上式用于 δq⊗q\delta q \otimes qδq⊗q,设 δq=[δw, δv]\delta q=[\delta_w,\; \delta\mathbf v]δq=[δw,δv](后面代入 δw≈1, δv≈12δθ\delta_w \approx 1,\; \delta\mathbf v \approx \tfrac12\delta\thetaδw≈1,δv≈21δθ):
-
标量部分:
(δq⊗q)w=δw w−δv⊤v. (\delta q \otimes q)_w = \delta_w\; w - \delta\mathbf v^\top \mathbf v. (δq⊗q)w=δww−δv⊤v.
-
向量部分:
(δq⊗q)v=δwv+w δv+δv×v. (\delta q \otimes q)_{\mathbf v} = \delta_w \mathbf v + w\,\delta\mathbf v + \delta\mathbf v \times \mathbf v. (δq⊗q)v=δwv+wδv+δv×v.
3. 左扰动线性化(小扰动展开)
把 δw=1+O(∥δθ∥2)\delta_w = 1 + O(\|\delta\theta\|^2)δw=1+O(∥δθ∥2) 和 δv=12δθ+O(∥δθ∥3)\delta\mathbf v = \tfrac12\delta\theta + O(\|\delta\theta\|^3)δv=21δθ+O(∥δθ∥3) 代入,并忽略二阶以上项:
-
标量部分:
(δq⊗q)w≈(1)⋅w−(12δθ)⊤v=w−12 v⊤δθ. (\delta q \otimes q)_w \approx (1)\cdot w - \left(\tfrac12\delta\theta\right)^\top \mathbf v = w - \tfrac12\,\mathbf v^\top \delta\theta. (δq⊗q)w≈(1)⋅w−(21δθ)⊤v=w−21v⊤δθ.
所以标量部分的线性增量为 −12v⊤δθ-\tfrac12 \mathbf v^\top \delta\theta−21v⊤δθ。
-
向量部分:
(δq⊗q)v≈1⋅v+w⋅(12δθ)+(12δθ)×v=v+12(w δθ+δθ×v). (\delta q \otimes q)_{\mathbf v} \approx 1\cdot\mathbf v + w\cdot\left(\tfrac12\delta\theta\right) + \left(\tfrac12\delta\theta\right)\times \mathbf v = \mathbf v + \tfrac12\Big( w\,\delta\theta + \delta\theta\times \mathbf v \Big). (δq⊗q)v≈1⋅v+w⋅(21δθ)+(21δθ)×v=v+21(wδθ+δθ×v).
向量部分的线性增量为 12(w δθ+δθ×v)\tfrac12\big( w \, \delta\theta + \delta\theta \times \mathbf v\big)21(wδθ+δθ×v)。
把标量与向量线性增量合并为矩阵形式:
qnew≈[wv]12[−v⊤wI3+[v]×]δθ. q_{\text{new}} \approx \begin{bmatrix} w \\ \mathbf v \end{bmatrix}\tfrac12 \begin{bmatrix} -\mathbf v^\top \\ w I_3 + [\mathbf v]_\times \end{bmatrix} \delta\theta. qnew≈[wv]21[−v⊤wI3+[v]×]δθ.
这就是 S(q)S(q)S(q) 的来源:第一行是 −v⊤-\mathbf v^\top−v⊤,下三行是 wI3+[v]×w I_3 + [\mathbf v]_\timeswI3+[v]×。
因此
∂qnew∂δθ∣δθ=0 = 12S(q) \boxed{\; \frac{\partial q_{\text{new}}}{\partial \delta\theta}\Big|_{\delta\theta=0} \;=\; \tfrac12 S(q)\; } ∂δθ∂qnewδθ=0=21S(q)
且
S(q)=[vx−vy−vzw−vzvyvzw−vxvyvxw] S(q)=\begin{bmatrix}v_x & - v_y & - v_z \\ w & -v_z & v_y \\ v_z & w & -v_x \\v_y & v_x & w \end{bmatrix} S(q)=vxwvzvy−vy−vzwvx−vzvy−vxw
(上式按列为对应 δθx,δθy,δθz\delta\theta_x,\delta\theta_y,\delta\theta_zδθx,δθy,δθz 的系数;注意行顺序:第一行为标量分量,接下 3 行为向量分量)。
4. 左扰动显式矩阵(
令 v=(vx,vy,vz)⊤v=(v_x,v_y,v_z)^\topv=(vx,vy,vz)⊤,记 [v]×[v]_\times[v]× 为
[v]×=[0−vzvyvz0−vx−vyvx0]. [v]_\times = \begin{bmatrix} 0 & -v_z & v_y\\ v_z & 0 & -v_x\\ -v_y & v_x & 0 \end{bmatrix}. [v]×=0vz−vy−vz0vxvy−vx0.
则
S(q)=[−vx−vy−vzw−vzvyvzw−vx−vyvxw][−v⊤wI3+[v]×]. S(q)= \begin{bmatrix} -v_x & - v_y & - v_z \\ w & -v_z & v_y \\ v_z & w & -v_x \\ -v_y & v_x & w \end{bmatrix} \begin{bmatrix} -v^\top \\ w I_3 + [v]_\times \end{bmatrix}. S(q)=−vxwvz−vy−vy−vzwvx−vzvy−vxw[−v⊤wI3+[v]×].
5. 代数一致性验证
下面从代数角度用四元数乘法的左乘矩阵 L(δq)L(\delta q)L(δq) 展开:
δq⊗q=L(δq) q \delta q \otimes q = L(\delta q)\, q δq⊗q=L(δq)q
在 δq≈[1,12δθ]\delta q \approx [1,\tfrac12\delta\theta]δq≈[1,21δθ] 时,把 L(δq)L(\delta q)L(δq) 线性化,对 qqq 作用后得到同样的 12S(q)δθ\tfrac12 S(q)\delta\theta21S(q)δθ 结果。两种方法等价。
6. 左扰动代码实现
下面的函数返回矩阵 S(q)S(q)S(q)(4×3),以及封装好的计算 12S(q)δθ\tfrac12 S(q)\delta\theta21S(q)δθ 用法:
#include <Eigen/Core>
#include <Eigen/Geometry>// q assumed to be unit quaternion (Eigen::Quaterniond)
Eigen::Matrix<double,4,3> S_of_q(const Eigen::Quaterniond &q) {Eigen::Matrix<double,4,3> S;Eigen::Vector3d v(q.x(), q.y(), q.z());// first row: -v^TS.row(0) = -v.transpose();// lower 3x3: w * I + [v]_xEigen::Matrix3d v_x;v_x << 0, -v.z(), v.y(),v.z(), 0, -v.x(),-v.y(), v.x(), 0;S.block<3,3>(1,0) = q.w() * Eigen::Matrix3d::Identity() + v_x;return S;
}// 使用示例: compute q_new ≈ q + 0.5 * S(q) * delta_theta
Eigen::Quaterniond left_update_quat(const Eigen::Quaterniond &q, const Eigen::Vector3d &delta_theta) {Eigen::Matrix<double,4,3> S = S_of_q(q);Eigen::Matrix<double,4,1> dq_lin = 0.5 * S * delta_theta; // linearized incrementEigen::Quaterniond q_new;q_new.w() = q.w() + dq_lin(0);q_new.x() = q.x() + dq_lin(1);q_new.y() = q.y() + dq_lin(2);q_new.z() = q.z() + dq_lin(3);q_new.normalize(); // optional: enforce unit length (error is O(|delta|^2))return q_new;
}
7. 右扰动定义
设:
qnew=q⊗δq,δq≈[1,12δθ], δθ∈R3 q_{\text{new}} = q \otimes \delta q, \quad \delta q \approx [1, \frac{1}{2} \delta\theta],\; \delta\theta \in \mathbb{R}^3 qnew=q⊗δq,δq≈[1,21δθ],δθ∈R3
四元数乘法公式(分块):
q⊗δq=[wv]⊗[δwδv][wδw−v⊤δvwδv+δwv+v×δv]. q \otimes \delta q = \begin{bmatrix} w \\ \mathbf v \end{bmatrix} \otimes \begin{bmatrix} \delta_w \\ \delta\mathbf v \end{bmatrix} \begin{bmatrix} w \delta_w - \mathbf v^\top \delta\mathbf v \\ w \delta\mathbf v + \delta_w \mathbf v + \mathbf v \times \delta\mathbf v \end{bmatrix}. q⊗δq=[wv]⊗[δwδv][wδw−v⊤δvwδv+δwv+v×δv].
8. 右扰动线性化(小角近似)
取 δw≈1,δv≈12δθ\delta_w \approx 1, \delta\mathbf v \approx \frac12 \delta\thetaδw≈1,δv≈21δθ,忽略二阶项:
- 标量部分:
(q⊗δq)w≈w−v⊤12δθ=w−12v⊤δθ (q \otimes \delta q)_w \approx w - \mathbf v^\top \frac12 \delta\theta = w - \frac12 \mathbf v^\top \delta\theta (q⊗δq)w≈w−v⊤21δθ=w−21v⊤δθ
- 向量部分:
(q⊗δq)v≈v+w12δθ+12δθ×v=v+12(wI3−[v]×)δθ (q \otimes \delta q)_{\mathbf v} \approx \mathbf v + w \frac12 \delta\theta + \frac12 \delta\theta \times \mathbf v = \mathbf v + \frac12 (w I_3 - [\mathbf v]_\times) \delta\theta (q⊗δq)v≈v+w21δθ+21δθ×v=v+21(wI3−[v]×)δθ
注意与左扰动的区别:
- 左扰动向量增量是 wI3+[v]×w I_3 + [\mathbf v]_\timeswI3+[v]×
- 右扰动向量增量是 wI3−[v]×w I_3 - [\mathbf v]_\timeswI3−[v]×
9. 右扰动矩阵形式
qnew≈q+12[v⊤wI3−[v]×]⏟Sr(q)δθ q_{\text{new}} \approx q + \frac12 \underbrace{ \begin{bmatrix}\mathbf v^\top \\ w I_3 - [\mathbf v]_\times \end{bmatrix}}_{S_r(q)} \delta\theta qnew≈q+21Sr(q)[v⊤wI3−[v]×]δθ
其中:
Sr(q)=[−vx−vy−vzwvz−vyvzwvxvy−vxw]. S_r(q) = \begin{bmatrix} -v_x & - v_y & - v_z \\ w & v_z & -v_y \\v_z & w & v_x \\ v_y & -v_x & w \end{bmatrix}. Sr(q)=−vxwvzvy−vyvzw−vx−vz−vyvxw.
这是右扰动对应的 4×3 雅可比矩阵。
10. 右扰动代码示例
Eigen::Matrix<double,4,3> S_right_of_q(const Eigen::Quaterniond &q) {Eigen::Matrix<double,4,3> S;Eigen::Vector3d v(q.x(), q.y(), q.z());// first row: -v^TS.row(0) = -v.transpose();// lower 3x3: w*I - [v]_xEigen::Matrix3d v_x;v_x << 0, -v.z(), v.y(),v.z(), 0, -v.x(),-v.y(), v.x(), 0;S.block<3,3>(1,0) = q.w() * Eigen::Matrix3d::Identity() - v_x;return S;
}
11.对比
| 左扰动 δq⊗q\delta q \otimes qδq⊗q | 右扰动 q⊗δqq \otimes \delta qq⊗δq | |
|---|---|---|
| 矩阵形式 | S(q)=[−v⊤wI3+[v]×]S(q) = \begin{bmatrix}-v^\top\\ w I_3 + [v]_\times\end{bmatrix}S(q)=[−v⊤wI3+[v]×] | Sr(q)=[−v⊤wI3−[v]×]S_r(q) = \begin{bmatrix}-v^\top\\ w I_3 - [v]_\times\end{bmatrix}Sr(q)=[−v⊤wI3−[v]×] |
| 更新公式 | qnew≈q+12S(q)δθq_{\text{new}} \approx q + \frac12 S(q) \delta\thetaqnew≈q+21S(q)δθ | qnew≈q+12Sr(q)δθq_{\text{new}} \approx q + \frac12 S_r(q) \delta\thetaqnew≈q+21Sr(q)δθ |
| 对应于旋转方向 | 左扰动 | 右扰动 |
注意:Ceres 默认使用 右扰动 的 LocalParameterization,如果你在 Ceres 中定义四元数参数化,实际上它内部使用的就是 Sr(q)S_r(q)Sr(q)。
