李代数求导:从旋转矩阵到优化算法的核心推导与应用
2026/8/23 13:13:43 网站建设 项目流程

1. 从“旋转”到“扰动”:为什么我们需要李代数求导

在机器人、计算机视觉或者SLAM(即时定位与地图构建)领域摸爬滚打过的朋友,对“李群李代数”这个词组一定不陌生。它常常和“姿态估计”、“优化”、“后端”这些词捆绑出现,听起来既高深又晦涩。很多教程会直接甩给你一堆公式:SO(3)、so(3)、SE(3)、se(3),然后告诉你,李群是旋转矩阵的集合,李代数是反对称矩阵的集合,它们通过指数映射和对数映射联系起来。公式背下来了,代码也许也能照着敲,但一到要自己推导一个雅可比矩阵,或者理解优化框架里那个“扰动模型”时,脑袋就一片空白了。

问题的核心,往往就出在“求导”这一步。我们最熟悉的求导,是对一个标量函数f(x)关于变量x的求导。但当我们的变量是一个“旋转”或者“刚体变换”时,事情就变得棘手了。旋转矩阵R本身有9个元素,但它们并不是独立的(需要满足R^T R = Idet(R)=1),你无法直接对这9个数进行“自由”的加减和求导,因为随便加一个小量,得到的矩阵很可能就不再是旋转矩阵了。这就好比在一个球面上移动,你不能直接在三维坐标上加减,那样会跑到球面外面去。

李代数求导,就是为了解决在像旋转矩阵(李群)这样的“约束空间”上进行微积分运算而诞生的工具。它的核心思想是:我们不直接对群元素(如旋转矩阵R)求导,而是对与之对应的李代数元素(如旋转向量φ)求导。李代数空间是一个向量空间,在这里我们可以自由地进行加法、数乘,从而可以定义我们熟悉的导数。而连接群和代数的,正是那个关键的“扰动”模型。

简单来说,当我们需要计算一个函数f(R)关于旋转R的导数时,我们不是计算f(R+ΔR),因为ΔR没有定义。而是计算f(R ⊕ δφ)关于小扰动δφ的导数,这里的表示李群上的左乘或右乘扰动,δφ是李代数空间中的一个微小向量。这个导数,就是所谓的“李代数求导”,它最终会给出一个雅可比矩阵,这个矩阵是优化算法(如高斯-牛顿法、列文伯格-马夸尔特法)能够直接使用的。

所以,如果你曾被VINS-Mono、ORB-SLAM等开源项目里那些关于旋转的雅可比推导搞得头晕眼花,或者想自己手写一个基于李代数的BA(光束法平差)而不知从何下手,那么彻底搞懂李代数求导,就是你从“会用轮子”到“能造轮子”的关键一步。接下来,我将抛开复杂的数学外壳,用尽可能直观的方式,带你走过从概念理解到公式推导,再到代码实现的完整路径。

2. 重温基石:李群与李代数的“前世今生”

在直接切入求导之前,我们必须对操作对象有一个清晰的认识。李群和李代数不是两个孤立的概念,它们是一体两面的关系,理解这种关系是理解后续所有推导的基础。

2.1 李群:我们操作的“舞台”

李群首先是一个,满足封闭性、结合律、单位元和逆元这四个基本性质。其次,它还是一个光滑流形,这意味着在它上面可以进行微积分。对于我们工程师来说,最关心的就是那几个具体的李群:

  • SO(3) - 特殊正交群(三维旋转群):所有合法的三维旋转矩阵R的集合。R ∈ R^{3×3}, 满足R^T R = Idet(R) = 1。它描述了物体在三维空间中的所有可能朝向。
  • SE(3) - 特殊欧氏群(三维刚体运动群):所有合法的三维刚体变换T的集合。T = [R, t; 0, 1],其中R ∈ SO(3),t ∈ R^3。它同时描述了物体的朝向和位置。

关键障碍:这些群元素(R,T)本身对加法不封闭。R1 + R2通常不是一个旋转矩阵。因此,f(R)R的导数∂f/∂R在通常意义下是病态的,因为我们无法定义R的一个“微小变化”ΔR使得R + ΔR仍然在 SO(3) 中。

2.2 李代数:群元素“家门口”的切线空间

可以把李群想象成一个弯曲的空间(比如球面),而李代数就是这个弯曲空间在单位元(Identity)处切空间。这个切空间是一个向量空间,对加法和数乘封闭,完美适合做微积分。

  • so(3) - SO(3)对应的李代数:其元素是三维反对称矩阵φ^^表示将向量映射为反对称矩阵)。实际上,我们更常用与之同构的三维向量φ = [φ1, φ2, φ3]^Tφ的方向代表旋转轴,模长代表旋转角度。这就是旋转向量角轴表示。
  • se(3) - SE(3)对应的李代数:其元素是一个六维向量ξ = [ρ, φ]^T,其中φ同上,代表旋转;ρ与平移相关,但并非直接的平移向量。通常也写作ξ^为一个4x4的矩阵。

指数映射与对数映射:这是连接群和代数的桥梁。

  • 指数映射 exp: 将李代数φ(so(3)) 映射到李群R(SO(3))。物理意义是:绕着轴φ/|φ|旋转|φ|弧度。公式为罗德里格斯公式:R = exp(φ^) = I + sinθ/θ * φ^ + (1-cosθ)/θ^2 * (φ^)^2,其中θ=|φ|
  • 对数映射 log: 将李群R映射回李代数φ。是指数映射的逆运算。

最重要的一点:指数映射在单位元附近是局部微分同胚的。这意味着,在φ=0(对应R=I)附近,李代数空间中的一个小向量δφ,可以通过指数映射唯一地对应到李群元素R附近的一个小扰动。这正是我们能够进行李代数求导的理论根基。

个人心得:刚开始学的时候,我总是试图去记忆 so(3) 和 se(3) 的具体矩阵形式,后来发现这反而增加了负担。对于工程应用,最重要的是抓住两个核心:1) so(3) 对应三维向量φ,2) se(3) 对应六维向量ξ。具体的指数/对数映射计算,都有成熟且高效的库函数(如 Sophus, Eigen)来实现,我们更需要理解的是它们所建立的“群-代数对应关系”,以及如何利用这种关系来定义导数。

3. 两种核心扰动模型:左乘与右乘

既然不能直接对R求导,我们就采用“曲线救国”的策略:在李群上施加一个微小扰动,这个扰动由李代数描述。根据扰动相乘的方向,主要分为两种模型,这两种模型在公式上略有不同,但核心思想一致。

假设我们有一个函数f(R),其中R ∈ SO(3)。我们想求f关于R的导数。

3.1 左乘扰动模型

我们考虑在R左边乘以一个由李代数δφ描述的微小扰动:f(R)相对于R的导数,定义为f相对于这个左扰动δφ的导数,在δφ=0处取值。

数学上,我们构造:f(exp(δφ^) R)然后计算:∂f(exp(δφ^) R) / ∂δφ,在δφ = 0处求值。

为什么叫“左乘”?因为扰动exp(δφ^)乘在了原始旋转R的左边。这个模型非常自然,可以理解为在世界坐标系下对姿态R施加了一个微小旋转δφ

3.2 右乘扰动模型

我们考虑在R右边乘以一个由李代数δφ描述的微小扰动:f(R exp(δφ^))然后计算:∂f(R exp(δφ^)) / ∂δφ,在δφ = 0处求值。

为什么叫“右乘”?因为扰动exp(δφ^)乘在了原始旋转R的右边。这个模型可以理解为在物体自身坐标系下对姿态R施加了一个微小旋转δφ

3.3 左扰动与右扰动的关系与选择

两种模型求出的雅可比矩阵是不同的,但它们之间存在一个简单的关系。通常,在视觉SLAM的BA问题中,我们更常用左乘扰动模型,因为它导出的雅可比形式更简洁,并且与优化变量(通常是世界坐标系下的相机姿态)的更新方向一致。

一个非常重要的结论是:∂(R p)/∂δφ(左扰动) =-(R p)^(一个3x3的反对称矩阵)∂(R p)/∂δφ(右扰动) =-(R p)^ R或等价的-R (p)^(取决于定义)

其中p是一个三维点坐标,(·)^表示将向量转换为反对称矩阵。

踩坑实录:早期我自己推导雅可比时,常常混淆左扰动和右扰动,导致优化时梯度方向错误,算法不收敛。一个很实用的检查方法是:假设R是相机姿态,p是世界点。用左扰动模型(exp(δφ^) R)意味着扰动施加在世界系,那么R pδφ的雅可比应该只和旋转后的点R p有关(即-(R p)^)。用右扰动模型(R exp(δφ^))意味着扰动施加在相机系,雅可比则会多出一个R。记住一种模型(推荐左扰动)并贯穿始终,可以避免很多混乱。

4. SO(3)上的李代数求导实战:以重投影误差为例

理论说了这么多,我们来点实际的。在视觉SLAM中,一个最经典的例子就是**重投影误差(Reprojection Error)**关于相机旋转R的雅可比计算。这是Bundle Adjustment的核心组成部分。

问题设定

  • 相机内参矩阵K已知。
  • 一个世界点P_w = [X, Y, Z]^T
  • 相机姿态由旋转R和平移t描述,即T = [R, t]
  • 该点在相机坐标系下的坐标为:P_c = R P_w + t
  • 该点的归一化相机坐标为:p_n = [u_n, v_n, 1]^T = P_c / Z_c,其中Z_cP_c的第三个分量(深度)。
  • 该点的像素观测坐标为:z = [u_s, v_s]^T = K p_n(只取前两维)。
  • 我们有一个实际的像素测量值z_meas
  • 重投影误差定义为:e = z - z_meas

我们的目标是计算误差e关于旋转R的导数∂e/∂R。由于R是群元素,我们采用左乘扰动模型,即计算∂e/∂δφ,其中扰动作用于RR' = exp(δφ^) R

4.1 链式法则分解

这是一个典型的复合函数求导问题,我们使用链式法则一步步拆解:

∂e/∂δφ = (∂e/∂z) * (∂z/∂p_n) * (∂p_n/∂P_c) * (∂P_c/∂δφ)

  1. ∂e/∂z:很简单,e = z - z_meas,所以∂e/∂z = I_{2×2}(单位矩阵)。
  2. ∂z/∂p_nz = K p_n,这里p_n是三维齐次坐标[u_n, v_n, 1]^Tz是二维像素坐标[u_s, v_s]^T。假设内参矩阵K = [[fx, 0, cx], [0, fy, cy], [0, 0, 1]],那么:z = [fx * u_n + cx, fy * v_n + cy]^T所以∂z/∂p_n是一个 2x3 的矩阵:
    ∂z/∂p_n = [[fx, 0, 0], [0, fy, 0]]
    (因为z只与p_n的前两个分量有关,且是线性关系)。
  3. ∂p_n/∂P_cp_n = P_c / Z_c,其中P_c = [X_c, Y_c, Z_c]^T。这是一个三维向量对三维向量的求导,结果是 3x3 的雅可比矩阵。p_n = [X_c/Z_c, Y_c/Z_c, 1]^T我们分别对X_c, Y_c, Z_c求偏导:
    ∂p_n/∂P_c = [[1/Z_c, 0, -X_c/Z_c^2], [ 0, 1/Z_c, -Y_c/Z_c^2], [ 0, 0, 0 ]]
    注意第三行都是0,因为p_n的第三个分量恒为1,与P_c无关。
  4. ∂P_c/∂δφ:这是最关键的一步,用到李代数求导的核心结论。在左乘扰动模型下,P_c = (exp(δφ^) R) P_w + t。我们求P_cδφδφ=0处的导数。 根据SO(3)的求导公式(可以通过泰勒展开或直接微分推导得出):∂(exp(δφ^) R P_w) / ∂δφ |_{δφ=0} = ∂( (I + δφ^ + ...) R P_w) / ∂δφ |_{δφ=0} = ∂(δφ^ (R P_w)) / ∂δφ = -(R P_w)^其中(·)^是向量到反对称矩阵的算子。 因为tδφ无关,所以∂P_c/∂δφ = -(R P_w)^。 注意R P_w正是P_c减去平移t之前的部分,即P_c - t。但在求导这一刻,δφ=0,所以R就是原来的R。因此,更直接地:∂P_c/∂δφ = -(P_c - t)^ = -(R P_w)^

4.2 雅可比矩阵的最终形式

将以上四部分用链式法则乘起来,我们得到重投影误差e关于旋转左扰动δφ的雅可比矩阵J_R

J_R = ∂e/∂δφ = I_{2×2} * (∂z/∂p_n) * (∂p_n/∂P_c) * (-(R P_w)^)

由于I_{2×2}是单位阵,可以忽略。代入具体矩阵:

`J_R = [[fx, 0, 0], * [[1/Z_c, 0, -X_c/Z_c^2], * ( - (R P_w)^ ) [0, fy, 0]] [0, 1/Z_c, -Y_c/Z_c^2], [0, 0, 0 ]]

先计算前两个矩阵的乘积J_tempJ_temp = [[fx/Z_c, 0, -fx*X_c/Z_c^2], [0, fy/Z_c, -fy*Y_c/Z_c^2]]

这是一个 2x3 的矩阵。然后让它与 3x3 的反对称矩阵-(R P_w)^相乘。注意,我们只需要前两行误差关于三维扰动δφ的导数,所以J_temp是 2x3,-(R P_w)^是 3x3,结果J_R是一个 2x3 的矩阵。

J_R = J_temp * ( - (R P_w)^ )

P_w旋转后的部分为P_r = R P_w = [X_r, Y_r, Z_r]^T,则(P_r)^为:

[0, -Z_r, Y_r] [Z_r, 0, -X_r] [-Y_r, X_r, 0]

所以-(P_r)^就是上面矩阵的每个元素取负。

最终,通过矩阵乘法,我们可以得到J_R每个元素的具体表达式。这个 2x3 的雅可比矩阵,就是我们在优化算法中要使用的,它描述了像素误差如何随着相机旋转的微小变化(用李代数δφ表示)而变化。

实操技巧:在实际代码实现中,我们很少会像上面那样展开成标量形式然后相乘,因为既不高效也不利于阅读。通常的做法是使用线性代数库,按照链式法则的顺序进行矩阵乘法运算。例如,在C++中使用Eigen库,你可以清晰地写出每一步:

Eigen::Vector3d Pc = R * Pw + t; // 相机坐标系点 double Zc = Pc.z(); Eigen::Vector3d Pr = R * Pw; // 用于反对称矩阵 Eigen::Matrix<double, 2, 3> J_temp; J_temp << fx/Zc, 0, -fx*Pc.x()/(Zc*Zc), 0, fy/Zc, -fy*Pc.y()/(Zc*Zc); Eigen::Matrix3d skew_Pr = -Sophus::SO3d::hat(Pr); // 计算 -(R*Pw)^ Eigen::Matrix<double, 2, 3> J_R = J_temp * skew_Pr;

这样的代码既高效,又清晰地反映了数学推导的过程。

5. SE(3)上的李代数求导:统一处理旋转与平移

在SLAM中,我们更常同时优化相机的旋转和平移,即姿态T ∈ SE(3)。对应的李代数是ξ ∈ se(3),是一个六维向量ξ = [ρ, φ]^T,其中φ对应旋转,ρ对应平移(但注意,ρ并不直接等于平移向量t,它们通过指数映射关联)。

对于重投影误差e,我们现在需要求它关于完整姿态T的李代数ξ的导数,即∂e/∂ξ。同样采用左乘扰动模型,扰动为exp(δξ^),其中δξ = [δρ, δφ]^T

5.1 扰动对相机坐标系点的影响

在左扰动下,变换后的点为:P_c' = exp(δξ^) T P_w(这里P_w是齐次坐标)。我们需要求P_c'关于δξδξ=0处的导数。

根据SE(3)的指数映射性质和李代数求导公式,可以推导出:∂P_c / ∂δξ = [I, -(P_c)^]

这是一个 3x6 的矩阵。其中:

  • I是 3x3 的单位矩阵,对应扰动平移部分δρ的导数。这很直观:平移扰动直接加到坐标上。
  • -(P_c)^是 3x3 的反对称矩阵,对应扰动旋转部分δφ的导数。这和我们在SO(3)中推导的完全一致。

注意:这里的P_c是三维坐标,不是齐次坐标。这个公式是SE(3)李代数求导的核心结论之一。

5.2 完整的雅可比矩阵

现在,我们可以类似SO(3)的情况,用链式法则计算∂e/∂ξ

∂e/∂ξ = (∂e/∂z) * (∂z/∂p_n) * (∂p_n/∂P_c) * (∂P_c/∂δξ)

前三项(∂e/∂z),(∂z/∂p_n),(∂p_n/∂P_c)与第4节中完全一样。 第四项(∂P_c/∂δξ)就是我们刚得到的 3x6 矩阵[I, -(P_c)^]

因此,重投影误差关于SE(3)左扰动δξ的雅可比矩阵J_T为:

J_T = J_temp * [I, -(P_c)^]

其中J_temp是第4.2节中定义的 2x3 矩阵[[fx/Z_c, 0, -fx*X_c/Z_c^2], [0, fy/Z_c, -fy*Y_c/Z_c^2]]

进行矩阵乘法后,J_T是一个 2x6 的矩阵。我们可以把它分成左右两块:

  • 左边 2x3 块:J_temp * I = J_temp,这就是关于平移扰动δρ的雅可比。实际上,它就是关于相机坐标系点P_c的平移的导数。
  • 右边 2x3 块:J_temp * (-(P_c)^),这就是关于旋转扰动δφ的雅可比,与第4节中求得的J_R完全一致。

所以,J_T = [J_temp, J_temp * (-(P_c)^)] = [J_t, J_R]

这个结果非常优美且直观:重投影误差关于SE(3)姿态的雅可比,就是关于平移的雅可比和关于旋转的雅可比的并置。这为我们分别理解和计算两者提供了便利。

5.3 与反函数求导法则的微妙联系

在微积分中,我们学过反函数的求导法则:如果y = f(x)可逆,且x = f^{-1}(y),那么dx/dy = (dy/dx)^{-1}。在李群求导中,虽然不直接是反函数关系,但指数映射和对数映射作为一对互逆的映射,它们的微分(即雅可比)也存在紧密联系。

具体来说,exp(φ^)φ=0处的雅可比(即从李代数到李群的映射微分)是一个单位矩阵。而log(R)R=I处的雅可比(即从李群到李群的映射微分)也是单位矩阵。但在非原点处,它们的雅可比矩阵互为逆矩阵(在相应的意义下)。这一点在需要进行BCH(Baker-Campbell-Hausdorff)公式近似,或者当扰动不是加在群元素旁边而是加在指数映射内部时(即f(exp(φ+δφ)^)模型),会变得非常重要。

深度思考:我们常用的左乘扰动模型f(exp(δφ^) R),本质上是在对“乘法”中的增量进行求导。而另一种模型f(exp(φ + δφ)^)是直接对李代数参数φ进行求导。后者求导时,需要额外乘上一个J_r(φ)(或J_l(φ)),即exp(φ^)的右雅可比(或左雅可比),这个雅可比来自于exp函数的微分。在φ很小(即R接近单位阵)时,这个雅可比接近单位阵,两种模型近似等价。但在优化迭代中,当R离初始值较远时,两种模型得到的更新步长会有差异。大多数SLAM库为了简洁和效率,默认使用左乘扰动模型,因为它避免了计算J_r(φ)

6. 从理论到代码:雅可比计算的实现与验证

理解了数学推导,最终还是要落地到代码。一个正确且高效的雅可比实现,是优化算法快速收敛的保障。

6.1 代码实现示例(C++ with Eigen & Sophus)

以下是一个计算重投影误差关于SE(3)姿态雅可比的函数示例。我们假设使用左乘扰动模型。

#include <Eigen/Dense> #include <sophus/so3.hpp> #include <sophus/se3.hpp> /** * @brief 计算重投影误差关于相机姿态(SE3)的雅可比矩阵(左乘扰动模型) * @param[in] P_w 世界坐标系下的3D点坐标 * @param[in] T_cw 相机姿态,将世界点变换到相机坐标系:P_c = T_cw * P_w * @param[in] K 相机内参矩阵 (3x3) * @param[out] J_T 重投影误差关于SE3扰动ξ的雅可比矩阵 (2x6) * @param[out] P_c_proj 计算过程中的相机坐标系点和投影点(可选,用于调试) * @return 如果点在前方(Z>0),返回true,否则返回false(雅可比无意义) */ bool computeReprojectionJacobianSE3( const Eigen::Vector3d& P_w, const Sophus::SE3d& T_cw, const Eigen::Matrix3d& K, Eigen::Matrix<double, 2, 6>& J_T, Eigen::Vector3d* P_c_proj = nullptr) { // 1. 将世界点变换到相机坐标系 Eigen::Vector3d P_c = T_cw * P_w; // Sophus::SE3d 重载了 * 运算符,作用于三维点 // 检查深度是否为正(点在相机前方) if (P_c.z() <= 1e-6) { return false; } double Z = P_c.z(); double Z_inv = 1.0 / Z; double Z2_inv = Z_inv * Z_inv; // 2. 计算归一化平面坐标 (x', y') double x_n = P_c.x() * Z_inv; double y_n = P_c.y() * Z_inv; // 3. 计算像素坐标 (u, v) double fx = K(0, 0), fy = K(1, 1), cx = K(0, 2), cy = K(1, 2); // 这里我们只计算雅可比,不实际计算误差值 // Eigen::Vector2d z_proj(fx * x_n + cx, fy * y_n + cy); if (P_c_proj) { *P_c_proj = P_c; } // 4. 计算中间雅可比 J_temp = ∂e/∂P_c (实际上∂e/∂z * ∂z/∂p_n * ∂p_n/∂P_c) // e = z_proj - z_meas, 所以 ∂e/∂z_proj = I,因此 J_temp = ∂z/∂p_n * ∂p_n/∂P_c // ∂z/∂p_n = [[fx, 0, 0], [0, fy, 0]] // ∂p_n/∂P_c = [[1/Z, 0, -X/Z^2], [0, 1/Z, -Y/Z^2], [0,0,0]] // 相乘得到 J_temp (2x3): // J_temp = [[fx/Z, 0, -fx*X/Z^2], // [0, fy/Z, -fy*Y/Z^2]] Eigen::Matrix<double, 2, 3> J_temp; J_temp << fx * Z_inv, 0, -fx * P_c.x() * Z2_inv, 0, fy * Z_inv, -fy * P_c.y() * Z2_inv; // 5. 计算 ∂P_c/∂δξ (3x6) // 根据公式 ∂P_c/∂δξ = [I, - (P_c)^] Eigen::Matrix<double, 3, 6> J_Pc_se3; J_Pc_se3.setIdentity(); // 设置左边3x3块为单位阵 I J_Pc_se3.block<3, 3>(0, 3) = -Sophus::SO3d::hat(P_c); // 设置右边3x3块为 -(P_c)^ // 6. 链式法则:J_T = J_temp * J_Pc_se3 J_T = J_temp * J_Pc_se3; return true; }

6.2 数值微分验证:确保你的推导万无一失

在复杂的系统中,手动推导的雅可比很容易出错。一个黄金法则是:用数值微分(Numerical Differentiation)来验证你解析推导(Analytic Differentiation)的雅可比矩阵。

数值微分的原理很简单,就是利用导数的定义:∂f/∂x ≈ (f(x + Δ) - f(x)) / Δ,其中Δ是一个很小的数(例如1e-61e-7)。

对于我们的问题,我们要验证J_T的每一列。J_T是2x6的,共有12个元素。第j列对应第j个李代数扰动分量δξ_j

验证步骤如下:

  1. 计算当前姿态T下的投影点z0和解析雅可比J_analytic
  2. δξ的第j个分量加上一个小扰动epsilon,构造扰动向量delta_xi_j
  3. 用扰动后的李代数ξ + delta_xi_j通过指数映射得到扰动后的姿态T_perturbed
  4. 计算扰动后的投影点z_perturbed
  5. 数值微分得到的雅可比第j列:J_numeric_col_j = (z_perturbed - z0) / epsilon
  6. 比较J_analytic的第j列和J_numeric_col_j。它们应该非常接近。

如果每一列的数值微分结果都与解析解匹配(相对误差在1e-6量级或以下),那么恭喜你,你的雅可比推导和代码实现很可能是正确的。

避坑指南:数值微分验证时,epsilon的选择很关键。太小会受浮点数精度限制,放大舍入误差;太大则不满足导数的线性近似条件。通常尝试1e-6,1e-7,1e-8,观察结果是否稳定。另外,验证要在多个不同的随机姿态T和空间点P_w上进行,以确保普适性。这是我调试任何优化问题雅可比时的必备步骤,它能帮你快速定位是推导错误还是代码笔误。

7. 超越重投影:李代数求导在其他场景中的应用

李代数求导的应用绝不限于重投影误差。在任何涉及旋转或刚体变换的优化问题中,它都是基石。

场景一:点云配准(ICP)在迭代最近点算法中,我们需要优化一个变换T使得两个点云对齐。误差函数通常是点对之间的距离e_i = T * P_i - Q_i(或点到平面的距离)。这里T ∈ SE(3)。计算误差e_i关于T的导数,就必须用到SE(3)的李代数求导。导数形式会比视觉重投影更简单,因为误差直接定义在三维欧氏空间。

场景二:IMU预积分在融合视觉和IMU的VIO(视觉惯性里程计)中,IMU测量值需要在两个关键帧之间进行预积分。预积分的结果(相对旋转、速度、位置变化)是定义在流形上的。对这些预积分量进行优化时,关于关键帧姿态的雅可比计算,本质上就是李代数求导,并且由于BCH公式的存在,形式会更加复杂。

场景三:机器人运动学在机械臂控制中,我们需要计算末端执行器位姿关于关节角度的雅可比(几何雅可比)。当使用旋转矩阵表示末端姿态时,姿态部分的雅可比计算就涉及到SO(3)的求导。更进阶的,如果考虑动力学,角速度、加速度与姿态导数的关系,也通过李代数(旋转向量)及其时间导数来联系,表述会非常简洁。

场景四:全局姿态优化(Pose Graph Optimization)在SLAM的后端,位姿图优化中的误差项常定义为两个位姿之间相对变换的差:e_{ij} = log(T_{ij}^{-1} * T_i^{-1} * T_j),其中log是SE(3)的对数映射。这个误差本身就在李代数空间中。优化变量T_i,T_j是群元素,我们需要计算误差e_{ij}关于T_iT_j的导数,这同样需要李代数求导的知识,并且会涉及到伴随矩阵Adjoint的出现。

经验之谈:当你面对一个包含旋转的优化问题,感觉无从下手时,不妨问自己两个问题:1) 我的优化变量是什么(是否是SO(3)或SE(3)的元素)?2) 我的误差函数是如何定义的?只要误差函数可以表示为优化变量的函数,你就可以尝试用扰动模型(左乘或右乘),然后通过链式法则,结合SO(3)/SE(3)的求导公式,一步步推导出雅可比。第一次推导可能会很慢,但这个过程对于深入理解问题本质至关重要。推导完成后,务必用数值微分进行验证。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询