引言
刚体卫星的姿态、机械臂末端位形、分子动力学中刚性水分子的取向,其位形空间都不是欧氏空间,而是旋转群 $SO(3)$ 或刚体运动群 $SE(3)$ 这样的李群。若直接对旋转矩阵的九个元素做 Runge–Kutta 积分,几步之后矩阵便不再正交——数值解悄悄离开了物理上容许的流形,产生虚假的”形状漂移”。欧拉角参数化存在万向锁奇点,四元数需要反复归一化。李群积分方法的思想是在每一步把运动”摊平”到李代数上做积分,再通过指数映射精确回到群流形上,从构造上保证几何约束恒成立。本文介绍其数学基础,并用自由刚体姿态仿真做数值验证。
理论基础
李群与李代数
李群是同时具有光滑流形结构的群。三维旋转群
$$SO(3) = {,R \in \mathbb{R}^{3\times 3} : R^{T}R = I, \det R = 1,}$$
是三维紧流形:九个矩阵元受六个独立约束(正交性),再加行列式条件选出连通分支。在单位元处的切空间即李代数
$$mathfrak{so}(3) = {,widehat{omega} : omega in mathbb{R}^3,},qquad
widehat{omega} = begin{pmatrix} 0 & -omega_3 & omega_2 \ omega_3 & 0 & -omega_1 \ -omega_2 & omega_1 & 0 end{pmatrix}$$
hat 映射把角速度向量映为反对称矩阵,使 $\widehat{\omega},v = \omega \times v$。李括号 $[\widehat{u}, \widehat{v}] = \widehat{u},\widehat{v} - \widehat{v},\widehat{u}$ 恰对应叉乘:
$$[\widehat{u}, \widehat{v}] = \widehat{u \times v}$$
即 $mathfrak{so}(3)$ 作为李代数与 $(\mathbb{R}^3, \times)$ 同构——这正是刚体运动学里叉乘无处不在的代数根源。
指数映射与姿态运动学
李代数到李群的桥梁是指数映射。对 $mathfrak{so}(3)$,矩阵指数有闭式表达(Rodrigues 公式):
$$\exp(\widehat{\omega}) = I + \frac{\sin\theta}{\theta},\widehat{\omega} + \frac{1-\cos\theta}{\theta^2},\widehat{\omega}^{2}, \qquad \theta = |\omega|_2$$
它把”绕轴 $\omega/\theta$ 转 $\theta$ 角”精确实现为旋转矩阵,且恒有 $\exp(\widehat{\omega}) \in SO(3)$——正交性与行列式在机器精度内自动保持。姿态运动学方程写为
$$\dot{R} = R,\widehat{\omega}$$
其中 $\omega$ 是体坐标系下的角速度。关键在于:右乘 $\widehat{\omega}$ 后的 $R\widehat{\omega}$ 仍落在切空间 $T_R SO(3)$ 中,因此一步李群格式 $R_{k+1} = R_k\exp(h,\widehat{\omega}_k)$(Lie–Euler)把更新限制在群上。更一般地,RKMK(Runge–Kutta–Munthe-Kaas)框架先把微分方程通过指数映射局部平凡化到李代数,在李代数(线性空间)上跑任意经典 RK 格式,再指数化回来,可获得与经典格式同阶的精度。相邻两步的复合由 BCH 公式 $\log(e^X e^Y) = X + Y + \frac{1}{2}[X,Y] + \cdots$ 控制,括号项正是非交换性带来的修正。
动力学方程
无力矩自由刚体由 Euler 方程描述:$I\dot{\omega} + \omega \times (I\omega) = 0$,其中 $I$ 为惯量张量。它与姿态运动学 $\dot{R} = R\widehat{\omega}$ 耦合,构成 $SO(3)$ 上的完整动力学系统;空间角动量 $RI\omega$ 守恒是 Noether 定理(旋转对称性)的直接产物,好的几何积分器应长期近似保持它。
数值方法与实现
import numpy as np
def hat(w):
return np.array([[0.0, -w[2], w[1]],
[w[2], 0.0, -w[0]],
[-w[1], w[0], 0.0]])
def exp_so3(w):
"""Rodrigues 公式:so(3) -> SO(3),恒落在旋转群上"""
th = np.linalg.norm(w)
W = hat(w)
if th < 1e-12:
return np.eye(3) + W
return np.eye(3) + np.sin(th)/th * W + (1.0 - np.cos(th))/th**2 * (W @ W)
I = np.diag([1.0, 2.0, 3.0]) # 惯量张量(主轴系)
Ii = np.linalg.inv(I)
def euler_rhs(w): # 无力矩 Euler 方程
return Ii @ np.cross(I @ w, w)
def rk4(f, y, h):
k1 = f(y); k2 = f(y + h/2*k1); k3 = f(y + h/2*k2); k4 = f(y + h*k3)
return y + h/6.0*(k1 + 2*k2 + 2*k3 + k4)
def simulate(h, steps, method):
w = np.array([0.8, 0.2, 0.1]); R = np.eye(3)
for _ in range(steps):
w = rk4(euler_rhs, w, h)
if method == 'lie': # Lie–Euler:李代数步进 + 指数化
R = R @ exp_so3(h*w)
else: # 朴素显式 Euler:直接步进矩阵元
R = R + h*(R @ hat(w))
det_err = abs(np.linalg.det(R) - 1.0)
orth_err = np.linalg.norm(R.T @ R - np.eye(3), ord=np.inf)
return det_err, orth_err
for method in ('lie', 'naive'):
d, o = simulate(h=0.05, steps=2000, method=method)
print(f"{method:5s} |det R - 1| = {d:.2e}, ||R^T R - I|| = {o:.2e}")
典型结果显示:李群格式的正交性误差停留在 $10^{-15}$ 量级(仅含乘法舍入),而朴素格式的行列式误差随时间线性增长,数百步后 $R$ 已明显”发胖”——对应的物理图像是个伪影:刚体在仿真中缓慢膨胀。
工程案例分析
消费级与工业级 MEMS 陀螺姿态解算是李群积分的日常战场。陀螺直接输出体角速度 $\omega(t)$,姿态更新 $R \leftarrow R\exp(\Delta t,\widehat{\omega})$ 每拍执行一次;高频振动下的圆锥误差(coning error)本质上正是 BCH 公式中被忽略的括号项 $\frac{1}{2}[\widehat{\omega}_i, \widehat{\omega}_j]$,多子样圆锥补偿算法就是在离散层面对它的修正。在视觉/激光 SLAM 中,位形群升级为 $SE(3)$,关键帧之间成百上千个 IMU 测量用李群上的预积分(preintegration)压缩为单个相对位形约束,避免每次线性化时重复积分整条轨迹,这已成为主流后端框架的标准部件。
| 方法 | 每步额外代价 | 群约束保持 | 长期定性行为 |
|---|---|---|---|
| 直接积分矩阵元 + 周期 SVD 投影 | 一次 SVD | 投影后恢复,两步间漂移 | 能量/动量面漂移 |
| 四元数 RK + 归一化 | 一次归一化 | 由归一化保证 | 结构间接保持 |
| Lie–Euler / RKMK | 一次指数映射 | 机器精度内恒成立 | 动量面行为良好 |
| 李群变分积分器 | 中等 | 恒成立且保辛 | 长期能量几乎无漂移 |
分子模拟中刚性水分子(TIP3P 等模型)的取向传播、直升机旋翼的多体动力学、绳索头发的离散杆模型(discrete elastic rods),同样以 $SO(3)$/$SE(3)$ 上的积分为基础构件。航天领域的使用场景同样典型:大型挠性卫星的姿轨耦合仿真要连续运行数千轨道周期,若姿态矩阵以每周期 $10^{-6}$ 的速率漂移,任务末期累积的姿态误差将直接污染指向精度预算——这类长时仿真招标时明确要求”保结构积分器”,正是看中了李群格式误差有界、不随时间线性累积的定性优势。
结论与展望
李群理论把”约束”从需要事后修补的代数条件,改写为积分格式的出发结构:在切空间走一步、指数映射回家。这套语言统一了姿态解算、SLAM 预积分与多体动力学中的诸多工程技巧,并与辛几何结合产生李群变分积分器,实现长期稳定仿真。开放方向包括随机李群积分(带噪 IMU 的严格化处理)、与深度学习耦合的可微分刚体动力学,以及高阶组合格式对 BCH 截断误差的系统性压制。
发表回复