四元数 (Quaternion)微分-四元数导数的矩阵表示推导(8)

一、起点公式

连续时间单位四元数 q(t)q(t)q(t) 的导数为:

q˙=12 q⊗(0,ω). \dot q = \tfrac{1}{2}\, q \otimes (0,\boldsymbol{\omega}). q˙=21q(0,ω).

写出 q=(w,u)q=(w,\mathbf{u})q=(w,u),其中 u=(x,y,z)T\mathbf{u}=(x,y,z)^Tu=(x,y,z)T。四元数乘法公式如下:

(a,b)⊗(c,d)=(ac−b⋅d,  ad+cb+b×d) (a,\mathbf{b})\otimes(c,\mathbf{d})=(ac-\mathbf{b}\cdot\mathbf{d},\; a\mathbf{d}+c\mathbf{b}+\mathbf{b}\times\mathbf{d}) (a,b)(c,d)=(acbd,ad+cb+b×d)

qqq(0,ω)(0,\boldsymbol{\omega})(0,ω) 代入得:

  • 标量部分:

w˙=12(−u⋅ω)=12(−xωx−yωy−zωz). \dot w = \tfrac{1}{2}(-\mathbf{u}\cdot\boldsymbol{\omega}) = \tfrac{1}{2}(-x\omega_x - y\omega_y - z\omega_z). w˙=21(uω)=21(xωxyωyzωz).

  • 向量部分(分量逐项):

v˙=12(wω+u×ω). \dot{\mathbf{v}}=\tfrac{1}{2}\big(w\boldsymbol{\omega} + \mathbf{u}\times\boldsymbol{\omega}\big). v˙=21(wω+u×ω).

写出分量:

x˙=12(wωx+(yωz−zωy)),y˙=12(wωy+(zωx−xωz)),z˙=12(wωz+(xωy−yωx)). \begin{aligned} \dot x &= \tfrac{1}{2}\big(w\omega_x + (y\omega_z - z\omega_y)\big),\\ \dot y &= \tfrac{1}{2}\big(w\omega_y + (z\omega_x - x\omega_z)\big),\\ \dot z &= \tfrac{1}{2}\big(w\omega_z + (x\omega_y - y\omega_x)\big). \end{aligned} x˙y˙z˙=21(wωx+(yωzzωy)),=21(wωy+(zωxxωz)),=21(wωz+(xωyyωx)).


二、目标 —— 以矩阵乘法写成 q˙=12 Ω(ω) q\dot q = \tfrac{1}{2}\,\Omega(\boldsymbol{\omega})\, qq˙=21Ω(ω)q

设想要 4×4 矩阵 Ω(ω)\Omega(\boldsymbol{\omega})Ω(ω) 使得 Ω(ω)q\Omega(\boldsymbol{\omega}) qΩ(ω)q 等于上面的向量(去掉 1/2)。由上面的分量表达,直接写出矩阵的每一行与 q=[w,x,y,z]Tq=[w,x,y,z]^Tq=[w,x,y,z]T 的乘积应当对应:

  • 第一行(对应   2w˙  =  −xωx−yωy−zωz\;2\dot w\; =\; -x\omega_x - y\omega_y - z\omega_z2w˙=xωxyωyzωz):

    [0,  −ωx,  −ωy,  −ωz]⋅[w,x,y,z]T=−xωx−yωy−zωz. [0,\; -\omega_x,\; -\omega_y,\; -\omega_z] \cdot [w,x,y,z]^T = -x\omega_x - y\omega_y - z\omega_z. [0,ωx,ωy,ωz][w,x,y,z]T=xωxyωyzωz.

  • 第二行(对应   2x˙  =  wωx+yωz−zωy\;2\dot x\; =\; w\omega_x + y\omega_z - z\omega_y2x˙=wωx+yωzzωy):

    [ωx,  0,  ωz,  −ωy]⋅[w,x,y,z]T=ωxw+0⋅x+ωzy−ωyz. [\omega_x,\; 0,\; \omega_z,\; -\omega_y] \cdot [w,x,y,z]^T = \omega_x w + 0\cdot x + \omega_z y - \omega_y z. [ωx,0,ωz,ωy][w,x,y,z]T=ωxw+0x+ωzyωyz.

  • 第三行(对应   2y˙  =  wωy+zωx−xωz\;2\dot y\; =\; w\omega_y + z\omega_x - x\omega_z2y˙=wωy+zωxxωz):

    [ωy,  −ωz,  0,  ωx]⋅[w,x,y,z]T=ωyw−ωzx+ωxz. [\omega_y,\; -\omega_z,\; 0,\; \omega_x] \cdot [w,x,y,z]^T = \omega_y w - \omega_z x + \omega_x z. [ωy,ωz,0,ωx][w,x,y,z]T=ωywωzx+ωxz.

  • 第四行(对应   2z˙  =  wωz+xωy−yωx\;2\dot z\; =\; w\omega_z + x\omega_y - y\omega_x2z˙=wωz+xωyyωx):

    [ωz,  ωy,  −ωx,  0]⋅[w,x,y,z]T=ωzw+ωyx−ωxy. [\omega_z,\; \omega_y,\; -\omega_x,\; 0] \cdot [w,x,y,z]^T = \omega_z w + \omega_y x - \omega_x y. [ωz,ωy,ωx,0][w,x,y,z]T=ωzw+ωyxωxy.

把这四行组合成矩阵,就得到:

  Ω(ω)=(0−ωx−ωy−ωzωx0ωz−ωyωy−ωz0ωxωzωy−ωx0).   \boxed{\; \Omega(\boldsymbol{\omega}) = \begin{pmatrix} 0 & -\omega_x & -\omega_y & -\omega_z \\ \omega_x & 0 & \omega_z & -\omega_y \\ \omega_y & -\omega_z & 0 & \omega_x \\ \omega_z & \omega_y & -\omega_x & 0 \end{pmatrix}. \;} Ω(ω)=0ωxωyωzωx0ωzωyωyωz0ωxωzωyωx0.

因此

q˙  =  12 Ω(ω) q \dot q \;=\; \tfrac{1}{2}\,\Omega(\boldsymbol{\omega})\, q q˙=21Ω(ω)q

与上面逐分量展开完全一致(这是对逐元素推导的直接验证)。


三、块矩阵与叉乘矩阵的紧凑表示

用块矩阵形式可更直观地看到结构。设 ω=[ωx,ωy,ωz]T\omega = [\omega_x,\omega_y,\omega_z]^Tω=[ωx,ωy,ωz]T,设叉乘(反对称)矩阵为

[ω]×=(0−ωzωyωz0−ωx−ωyωx0). [\omega]_\times = \begin{pmatrix} 0 & -\omega_z & \omega_y \\ \omega_z & 0 & -\omega_x \\ -\omega_y & \omega_x & 0 \end{pmatrix}. [ω]×=0ωzωyωz0ωxωyωx0.

那么 Ω(ω)\Omega(\omega)Ω(ω) 可写为块形式:

  Ω(ω)(0−ωTω−[ω]×)   \boxed{\; \Omega(\boldsymbol{\omega}) \begin{pmatrix} 0 & -\boldsymbol{\omega}^T \\ \boldsymbol{\omega} & -[\boldsymbol{\omega}]_\times \end{pmatrix} \;} Ω(ω)(0ωωT[ω]×)

即上边第一行是 [0,  −ωT][0,\; -\omega^T][0,ωT],下部左列是 ω\omegaω,右下块是 −[ω]×-[\omega]_\times[ω]×。可以检验:把这个块矩阵乘以 q=[w; u]q=[w;\, \mathbf{u}]q=[w;u] 恰好给出分量展开的结果。


四、关于不同约定(左乘 vs 右乘、角速度参考系)——常见误区说明

  • 上面推导基于公式 q˙=12 q⊗(0,ω)\dot q = \tfrac12\, q \otimes (0,\omega)q˙=21q(0,ω),其中 ω\omegaωbody-frame 的角速度(机体坐标下)。如果你使用的是惯性系表达(inertial-frame)并采用 q˙=12(0,ω)⊗q\dot q = \tfrac12 (0,\omega)\otimes qq˙=21(0,ω)q,则对应的矩阵会不同(会出现 −ΩT-\Omega^TΩT 或其它符号差异)。因此实际使用时必须确认角速度表示的参考系与四元数乘法约定(左/右乘)。
  • 另外,不同库对四元数分量顺序的约定不同(scalar-first 或 scalar-last)。我们的 Ω(ω)\Omega(\omega)Ω(ω) 对应的是 scalar-first q=[w,x,y,z]Tq=[w,x,y,z]^Tq=[w,x,y,z]T。若用 scalar-last q′=[x,y,z,w]Tq'=[x,y,z,w]^Tq=[x,y,z,w]T,矩阵形式需重新排列行列。

五、导数的雅可比(快速引用-详细参考7节内容)

q˙=12Ω(ω)q\dot q = \tfrac12 \Omega(\omega) qq˙=21Ω(ω)q,可直接得到雅可比:

  • 关于 qqq

    ∂q˙∂q=12Ω(ω). \frac{\partial \dot q}{\partial q} = \tfrac12 \Omega(\omega). qq˙=21Ω(ω).

  • 关于 ω\omegaω
    从分量式直接写出一个 4×34\times34×3 矩阵(把乘以 ω\omegaω 的矩阵抽出):

    ∂q˙∂ω=12(−x−y−zw0−z0wx00w) \frac{\partial \dot q}{\partial \boldsymbol{\omega}} = \tfrac12 \begin{pmatrix} -x & -y & -z \\ w & 0 & -z \\ 0 & w & x \\ 0 & 0 & w \end{pmatrix} ωq˙=21xw00y0w0zzxw

    (建议直接使用更清晰的块形式)

    ∂q˙∂ω=12(−uTwI3+[u]×). \frac{\partial \dot q}{\partial \boldsymbol{\omega}} = \tfrac12 \begin{pmatrix} -\mathbf{u}^T \\ w I_3 + [\mathbf{u}]_\times \end{pmatrix}. ωq˙=21(uTwI3+[u]×).

    以上两种形式等价(后者更紧凑且便于实现)。


六、数值/实现——Eigen 风格代码(scalar-first)

下面给出可直接拷贝的 C++ / Eigen 代码片段,用于构造 Ω(ω)\Omega(\omega)Ω(ω) 以及计算 q˙=0.5∗Ω∗q\dot q = 0.5 * \Omega * qq˙=0.5Ωq

#include <Eigen/Dense>

// q is Eigen::Vector4d [w,x,y,z]^T
// omega is Eigen::Vector3d [wx,wy,wz]^T

Eigen::Matrix4d OmegaFromOmega(const Eigen::Vector3d& omega) {
    double wx = omega(0), wy = omega(1), wz = omega(2);

    Eigen::Matrix4d Omega;
    Omega << 0.0,   -wx,   -wy,   -wz,
             wx,    0.0,   wz,    -wy,
             wy,   -wz,    0.0,   wx,
             wz,    wy,   -wx,    0.0;
    return Omega;
}

// usage:
// Eigen::Vector4d q_dot = 0.5 * OmegaFromOmega(omega) * q;

若个人更喜欢用叉乘矩阵的块表达(更易读):

Eigen::Matrix3d skew(const Eigen::Vector3d& v) {
    Eigen::Matrix3d S;
    S <<  0.0,   -v.z(),  v.y(),
          v.z(),  0.0,   -v.x(),
         -v.y(),  v.x(),  0.0;
    return S;
}

Eigen::Matrix4d OmegaFromOmega_block(const Eigen::Vector3d& w) {
    Eigen::Matrix4d M = Eigen::Matrix4d::Zero();
    M(0,1) = -w(0); M(0,2) = -w(1); M(0,3) = -w(2);
    M.block<3,1>(1,0) = w;
    M.block<3,3>(1,1) = -skew(w);
    return M;
}

七、简单验证

举例:令 q=[1,0,0,0]Tq=[1,0,0,0]^Tq=[1,0,0,0]T(单位四元数),ω=[ωx,0,0]T\omega=[\omega_x,0,0]^Tω=[ωx,0,0]T。则

  • 手工分量推导:
    w˙=0\dot w = 0w˙=0(因为 u=0);
    x˙=12(1⋅ωx+0)=12ωx\dot x = \tfrac12 (1 \cdot \omega_x + 0) = \tfrac12 \omega_xx˙=21(1ωx+0)=21ωx;
    y˙=z˙=0\dot y=\dot z=0y˙=z˙=0.

  • 用矩阵 Ω(ω)\Omega(\omega)Ω(ω)
    Ωq=[0,ωx,ωy,ωz]T\Omega q = [0,\omega_x, \omega_y, \omega_z]^TΩq=[0,ωx,ωy,ωz]T with only ωx nonzero -> gives same result. 所以一致。

可以用上面 Eigen 代码快速测试更多随机输入,比较分量展开与矩阵乘法结果必然完全一致。


八、总结要点

  1. Ω(ω)\Omega(\omega)Ω(ω) 的标准块写法: Ω=(0−ωTω−[ω]×)\displaystyle \Omega=\begin{pmatrix}0 & -\omega^T\\[4pt]\omega & -[\omega]_\times\end{pmatrix}Ω=(0ωωT[ω]×)
  2. 本推导假定 q=[w,x,y,z]Tq=[w,x,y,z]^Tq=[w,x,y,z]T(scalar-first)并采用 q˙=12q⊗(0,ω)\dot q = \tfrac12 q\otimes(0,\omega)q˙=21q(0,ω) —— 即 ω\omegaωbody-frame 角速度。
  3. 若大家代码库使用不同的四元数顺序或不同的乘法约定(左/右),请相应重排列或取转置/符号变换。
  4. ∂q˙/∂q=12Ω(ω)\partial \dot q/\partial q = \tfrac12 \Omega(\omega)q˙/q=21Ω(ω) 可直接用于线性化(EKF)或状态转移雅可比。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云SLAM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值