史上最简SLAM零基础解读(7) - Jacobian matrix(雅可比矩阵) → 理论分析与应用详解(Bundle Adjustment)

本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始
 
文末正下方中心提供了本人 联系方式, 点击本人照片即可显示 W X → 官方认证 {\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式,\color{blue}点击本人照片即可显示WX→官方认证} 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX官方认证
 

一、前言

该篇博客主要讲解→雅可比矩阵定义、推导、以及其应用,并且有相应的示例解读
         雅可比在函数行列式方面有一篇著名的论文:《论行列式的形成与性质》(1841)。文中求出了函数行列式的导数公式;还利用函数行列式作工具证明了,函数之间相关或无关的条件是雅克比行列式等于零或不等于零。他又给出了雅可比行列式的乘积定理。
         在该论文中针对 n n n n n n 元函数的相关性,提出了所谓的雅可比行列式,如果这个行列式不为 0 ,则这些函数是独立的。因此,他提出的也叫函数行列式。虽然他没有单独提出雅克比矩阵,但是等到后来有了矩阵的概念,人们还是将其称为雅可比矩阵。雅可比行列式是坐标变换理论的基础之一,在数学分析隐函数理论中发挥着重要作用。雅克比矩阵定义如下所示:
J F = [ ∂ f ∂ x 1 ⋯ ∂ f ∂ x n ] = [ ∂ f 1 ∂ x 1 ∂ f 1 ∂ x 2 ⋯ ∂ f 1 ∂ x n ⋮ ⋱ ⋮ ∂ f m ∂ x 1 ∂ f m ∂ x 2 ⋯ ∂ f m ∂ x n ] (01) \color{green} \tag{01} \begin{aligned} \mathbf J_{F} &=\left[\begin{array}{ccc} \frac{\partial \mathbf{f}}{\partial x_{1}} & \cdots & \frac{\partial \mathbf{f}}{\partial x_{n}} \end{array}\right] &=\left[\begin{array}{cccc} \frac{\partial f_{1}}{\partial x_{1}} & \frac{\partial f_{1}}{\partial x_{2}} & \cdots & \frac{\partial f_{1}}{\partial x_{n}} \\ \vdots & \ddots & \vdots & \\ \frac{\partial f_{m}}{\partial x_{1}} & \frac{\partial f_{m}}{\partial x_{2}} & \cdots & \frac{\partial f_{m}}{\partial x_{n}} \end{array}\right] \end{aligned} JF=[x1fxnf]= x1f1x1fmx2f1x2fmxnf1xnfm (01)那么这个矩阵是如何来的,又有什么作用呢?不要着急,下面就来一一分析。
 

二、基本理论

1、初步了解

假设 F : R n → R m F: \mathbb{R}^{\mathrm{n}} \rightarrow \mathbb{R}^{\mathrm{m}} F:RnRm 是一个从 n n n 维欧氏空间映射到 m m m 维欧氏空间的函数。这个函数由 m m m 个实函数组成: y 1 ( x 1 , ⋯   , x n ) , ⋯   , y m ( x 1 , ⋯   , x n ) (02) \color{green} \tag{02} y_{1}\left(x_{1}, \cdots, x_{n}\right), \cdots, y_{m}\left(x_{1}, \cdots, x_{n}\right) y1(x1,,xn),,ym(x1,,xn)(02)这些函数的偏导数(如果存在)可以组成一个 m m m n n n 列的矩阵,这个矩阵就是所谓的雅可比矩阵,如下所示: [ ∂ y 1 ∂ x 1 ∂ y 1 ∂ x 2 ⋯ ∂ y 1 ∂ x n ⋮ ⋱ ⋮ ∂ y m ∂ x 1 ∂ y m ∂ x 2 ⋯ ∂ y m ∂ x n ] (03) \color{green} \tag{03} \left[\begin{array}{cccc} \frac{\partial y_{1}}{\partial x_{1}} & \frac{\partial y_{1}}{\partial x_{2}} & \cdots & \frac{\partial y_{1}}{\partial x_{n}} \\ \vdots & \ddots & \vdots & \\ \frac{\partial y_{m}}{\partial x_{1}} & \frac{\partial y_{m}}{\partial x_{2}} & \cdots & \frac{\partial y_{m}}{\partial x_{n}} \end{array}\right] x1y1x1ymx2y1x2ymxny1xnym (03)此矩阵用符号为: J F ( x 1 , x 2 , . . . , x n ) \mathbf J_{F}(x_1,x_2,...,x_n) JF(x1,x2,...,xn),或者 ∂ ( y 1 , … , y m ) ∂ ( x 1 , … , x n ) \frac{\partial\left(y_{1}, \ldots, y_{m}\right)}{\partial\left(x_{1}, \ldots, x_{n}\right)} (x1,,xn)(y1,,ym),另外这个矩阵的第 i i i y i ( i = 1 , . . . , m ) y_i(i=1,...,m) yi(i=1,...,m) 是由梯度函数的转置表示的,如果 p p p R n \mathbb{R}^{\mathrm{n}} Rn 中的一点, F F F p p p 点可微分,根据高等微积分, J F ( p ) \mathbf J_{F}(p) JF(p) 是在这点的导数。在此情况下, J F ( p ) \mathbf J_{F}(p) JF(p) 这个线性映射即 F F F 在点 p p p 附近最优线性逼近,也就是说当 x x x 足够靠近点 p p p 时,有 F ( x ) ≈ F ( p ) + J F ( p ) ⋅ ( x − p ) (04) \color{green} \tag{04} F(x) \approx F(p)+\mathbf J_{F}(p) \cdot(x-p) F(x)F(p)+JF(p)(xp)(04)上述公式可以与泰勒展开进行拟比,下面进行一个深层次的理解。
 

2、深度解析

若在 n n n 维欧式空间中的一个向量映射成 m m m 维欧式空间中的另一个向量的对应法则为 F F F F F F m m m 个实函数组成,即: F = { y 1 = f 1 ( x 1 , … , x n ) y 2 = f 2 ( x 1 , … , x n ) … y m = f m ( x 1 , … , x n ) (05) \color{green} \tag{05} F=\left\{\begin{aligned} y_{1}=& f_{1}\left(x_{1}, \ldots, x_{n}\right) \\ y_{2}=& f_{2}\left(x_{1}, \ldots, x_{n}\right) \\ & \ldots \\ y_{m}=& f_{m}\left(x_{1}, \ldots, x_{n}\right) \end{aligned}\right. F= y1=y2=ym=f1(x1,,xn)f2(x1,,xn)fm(x1,,xn)(05)那么雅可比矩阵是一个 m × n m \times n m×n 矩阵: J F = [ ∂ f ∂ x 1 ⋯ ∂ f ∂ x n ] = [ ∂ f 1 ∂ x 1 ∂ f 1 ∂ x 2 ⋯ ∂ f 1 ∂ x n ⋮ ⋱ ⋮ ∂ f m ∂ x 1 ∂ f m ∂ x 2 ⋯ ∂ f m ∂ x n ] (06) \color{green} \tag{06} \begin{aligned} \mathbf J_{F} &=\left[\begin{array}{ccc} \frac{\partial \mathbf{f}}{\partial x_{1}} & \cdots & \frac{\partial \mathbf{f}}{\partial x_{n}} \end{array}\right] &=\left[\begin{array}{cccc} \frac{\partial f_{1}}{\partial x_{1}} & \frac{\partial f_{1}}{\partial x_{2}} & \cdots & \frac{\partial f_{1}}{\partial x_{n}} \\ \vdots & \ddots & \vdots & \\ \frac{\partial f_{m}}{\partial x_{1}} & \frac{\partial f_{m}}{\partial x_{2}} & \cdots & \frac{\partial f_{m}}{\partial x_{n}} \end{array}\right] \end{aligned} JF=[x1fxnf]= x1f1x1fmx2f1x2fmxnf1xnfm (06)其中,雅克比矩阵就是这个变换对应的偏导而组成的矩阵。输入 n n n 维向量 x = ( x 1 , . . . , x n ) x = (x_1, ... , x_n) x=(x1,...,xn),输出 m m m 维向量 y = ( y 1 , . . . , y m ) y=(y_1, ... , y_m) y=(y1,...,ym) x ∈ R n x\in \mathbb{R}_{n} xRn y = F ( x ) ∈ R m y=F(x)\in \mathbb{R}_{m} y=F(x)Rm。如果 p p p 是中的一个点, F F F p p p 点可微分,根据数学分析,雅可比矩阵 J F ( p ) \mathbf J_{F}(p) JF(p) 是在这点的导数,在此情况下, J F ( p ) \mathbf J_{F}(p) JF(p) 这个线性映射即 F F F 在点 p p p 附近最优线性逼近,也就是说当 x x x 足够靠近点 p p p 时,有 F ( x ) ≈ F ( p ) + J F ( p ) ⋅ ( x − p ) (07) \color{green} \tag{07} F(x) \approx F(p)+\mathbf J_{F}(p) \cdot(x-p) F(x)F(p)+JF(p)(xp)(07) m = n m = n m=n 时,矩阵 J F ( p ) \mathbf J_{F}(p) JF(p) 就会变成一个方正, F F F 就变成从 n n n 维欧式空间到 n n n 维欧式空间的映射,方阵的行列式就是雅可比行列式。上式移项得:
F ( x ) − F ( p ) ≈ J F ( p ) ⋅ ( x − p ) (08) \color{green} \tag{08} F(x) -F(p)\approx \mathbf J_{F}(p) \cdot(x-p) F(x)F(p)JF(p)(xp)(08)即可的( Δ y \Delta y Δy Δ x \Delta x Δx 都是 n n n 维空间的向量): Δ y ≈ J F ( p ) ⋅ Δ x (09) \color{green} \tag{09} \Delta y \approx \mathbf{J}_{F}(\mathrm{p}) \cdot \Delta x ΔyJF(p)Δx(09) 则使用微分形式表示如下: d y = J F ( p ) d x (10) \color{green} \tag{10}\mathbf d y=\mathbf{J}_{F}(p) \mathbf{d}x dy=JF(p)dx(10)其中 d y = ( d y 1 , . . . , d y n ) T           d x = ( d x 1 , . . . , d x n ) T (11) \color{green} \tag{11} \mathbf d y=(\mathbf d y_1,...,\mathbf d y_n)^T~~~~~~~~~\mathbf dx=(\mathbf d x_1,...,\mathbf d x_n)^T dy=(dy1,...,dyn)T         dx=(dx1,...,dxn)T(11) [ d y 1 d y 2 ⋮ d y n ] = [ ∂ f 1 ∂ x 1 ∂ f 1 ∂ x 2 ⋯ ∂ f 1 ∂ x n ∂ f 2 ∂ x 1 ∂ f 2 ∂ x 2 ⋯ ∂ f 2 ∂ x n ⋮ ⋮ ⋱ ⋮ ∂ f n ∂ x 1 ∂ f n ∂ x 2 ⋯ ∂ f n ∂ x n ] [ d x 1 d x 2 ⋮ d x n ] (12) \color{green} \tag{12} \left[\begin{array}{c} \mathbf d y_{1} \\ \mathbf d y_{2} \\ \vdots \\ \mathbf d y_{n} \end{array}\right]=\left[\begin{array}{cccc} \frac{\partial f_{1}}{\partial x_{1}} & \frac{\partial f_{1}}{\partial x_{2}} & \cdots & \frac{\partial f_{1}}{\partial x_{n}} \\ \frac{\partial f_{2}}{\partial x_{1}} & \frac{\partial f_{2}}{\partial x_{2}} & \cdots & \frac{\partial f_{2}}{\partial x_{n}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial f_{n}}{\partial x_{1}} & \frac{\partial f_{n}}{\partial x_{2}} & \cdots & \frac{\partial f_{n}}{\partial x_{n}} \end{array}\right]\left[\begin{array}{c} \mathbf d x_{1} \\ \mathbf d x_{2} \\ \vdots \\ \mathbf d x_{n} \end{array}\right] dy1dy2dyn = x1f1x1f2x1fnx2f1x2f2x2fnxnf1xnf2xnfn dx1dx2dxn (12) [ d y 1 d y 2 ⋮ d y n ] = [ ∂ f 1 ∂ x 1 d x 1 + ∂ f 1 ∂ x 2 d x 2 + ⋯ + ∂ f 1 ∂ x n d x n ∂ f 2 ∂ x 1 d x 1 + ∂ f 2 ∂ x 2 d x 2 + ⋯ + ∂ f 2 ∂ x n d x n ⋮ ∂ f n ∂ x 1 d x 1 + ∂ f n ∂ x 2 d x 2 + ⋯ + ∂ f n ∂ x n d x n ] (13) \color{green} \tag{13} \left[\begin{array}{c} \mathbf d y_{1} \\ \mathbf d y_{2} \\ \vdots \\ \mathbf d y_{n} \end{array}\right]=\left[\begin{array}{c} \frac{\partial f_{1}}{\partial x_{1}} \mathbf d x_{1}+\frac{\partial f_{1}}{\partial x_{2}}\mathbf d x_{2}+\cdots+\frac{\partial f_{1}}{\partial x_{n}} \mathbf d x_{n} \\ \frac{\partial f_{2}}{\partial x_{1}} \mathbf d x_{1}+\frac{\partial f_{2}}{\partial x_{2}} \mathbf d x_{2}+\cdots+\frac{\partial f_{2}}{\partial x_{n}}\mathbf d x_{n} \\ \vdots \\ \frac{\partial f_{n}}{\partial x_{1}} \mathbf d x_{1}+\frac{\partial f_{n}}{\partial x_{2}} \mathbf d x_{2}+\cdots+\frac{\partial f_{n}}{\partial x_{n}} \mathbf d x_{n} \end{array}\right] dy1dy2dyn = x1f1dx1+x2f1dx2++xnf1dxnx1f2dx1+x2f2dx2++xnf2dxnx1fndx1+x2fndx2++xnfndxn (13)
将上述向量写成基于正交的单位向量的形式: [ d y 1 0 ⋯ 0 0 d y 2 ⋯ 0 0 0 ⋱ 0 0 0 0 d y n ] = [ ∂ f 1 ∂ x 1 d x 1 ∂ f 1 ∂ x 2 d x 2 ⋯ ∂ f 1 ∂ x n d x n ∂ f 2 ∂ x 1 d x 1 ∂ f 2 ∂ x 2 d x 2 ⋯ ∂ f 2 ∂ x n d x n ⋮ ⋮ ⋱ ⋮ ∂ f n ∂ x 1 d x 1 ∂ f n ∂ x 2 d x 2 ⋯ ∂ f n ∂ x n d x n ] (14) \color{green} \tag{14} \left[\begin{array}{cccc} \mathbf d y_{1} & 0 & \cdots & 0 \\ 0 & \mathbf d y_{2} & \cdots & 0 \\ 0 & 0 & \ddots & 0 \\ 0 & 0 & 0 & \mathbf d y_{n} \end{array}\right]=\left[\begin{array}{cccc} \frac{\partial f_{1}}{\partial x_{1}} \mathbf d x_{1} & \frac{\partial f_{1}}{\partial x_{2}} \mathbf d x_{2} & \cdots & \frac{\partial f_{1}}{\partial x_{n}} \mathbf d x_{n} \\ \frac{\partial f_{2}}{\partial x_{1}} \mathbf d x_{1} & \frac{\partial f_{2}}{\partial x_{2}} \mathbf d x_{2} & \cdots & \frac{\partial f_{2}}{\partial x_{n}} \mathbf d x_{n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial f_{n}}{\partial x_{1}} \mathbf d x_{1} & \frac{\partial f_{n}}{\partial x_{2}} \mathbf d x_{2} & \cdots & \frac{\partial f_{n}}{\partial x_{n}} \mathbf d x_{n} \end{array}\right] dy10000dy2000000dyn = x1f1dx1x1f2dx1x1fndx1x2f1dx2x2f2dx2x2fndx2xnf1dxnxnf2dxnxnfndxn (14)行列式的绝对值表示微元的体积,左侧行列式一定为正,体积不可能为负,右侧行列式加绝对值 ∣ d y 1 0 ⋯ 0 0 d y 2 ⋯ 0 0 0 ⋱ 0 0 0 0 d y n ∣ = ∥ ∂ f 1 ∂ x 1 d x 1 ∂ f 1 ∂ x 2 d x 2 ⋯ ∂ f 1 ∂ x n d x n ∂ f 2 ∂ x 1 d x 1 ∂ f 2 ∂ x 2 d x 2 ⋯ ∂ f 2 ∂ x n d x n ⋮ ⋮ ⋱ ⋮ ∂ f n ∂ x 1 d x 1 ∂ f n ∂ x 2 d x 2 ⋯ ∂ f n ∂ x n d x n ∥ (15) \color{green} \tag{15} \left|\begin{array}{cccc} \mathbf d y_{1} & 0 & \cdots & 0 \\ 0 & \mathbf d y_{2} & \cdots & 0 \\ 0 & 0 & \ddots & 0 \\ 0 & 0 & 0 & \mathbf d y_{n} \end{array}\right|=\left\|\begin{array}{cccc} \frac{\partial f_{1}}{\partial x_{1}} \mathbf d x_{1} & \frac{\partial f_{1}}{\partial x_{2}} \mathbf d x_{2} & \cdots & \frac{\partial f_{1}}{\partial x_{n}} \mathbf d x_{n} \\ \frac{\partial f_{2}}{\partial x_{1}} \mathbf d x_{1} & \frac{\partial f_{2}}{\partial x_{2}} \mathbf d x_{2} & \cdots & \frac{\partial f_{2}}{\partial x_{n}} \mathbf d x_{n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial f_{n}}{\partial x_{1}} \mathbf d x_{1} & \frac{\partial f_{n}}{\partial x_{2}} \mathbf d x_{2} & \cdots & \frac{\partial f_{n}}{\partial x_{n}} \mathbf d x_{n} \end{array}\right\| dy10000dy2000000dyn = x1f1dx1x1f2dx1x1fndx1x2f1dx2x2f2dx2x2fndx2xnf1dxnxnf2dxnxnfndxn (15)将公共因数提出
∣ d y 1 0 ⋯ 0 0 d y 2 ⋯ 0 0 0 ⋱ 0 0 0 0 d y n ∣ = ∥ ∂ f 1 ∂ x 1 ∂ f 1 ∂ x 2 ⋯ ∂ f 1 ∂ x n ∂ f 2 ∂ x 1 ∂ f 2 ∂ x 2 ⋯ ∂ f 2 ∂ x n ⋮ ⋮ ⋱ ⋮ ∂ f n ∂ x 1 ∂ f n ∂ x 2 ⋯ ∂ f n ∂ x n ∥ d x 1 d x 2 ⋯ d x n (16) \color{green} \tag{16} \left|\begin{array}{cccc} \mathbf d y_{1} & 0 & \cdots & 0 \\ 0 & \mathbf d y_{2} & \cdots & 0 \\ 0 & 0 & \ddots & 0 \\ 0 & 0 & 0 & \mathbf d y_{n} \end{array}\right|=\left\|\begin{array}{cccc} \frac{\partial f_{1}}{\partial x_{1}} & \frac{\partial f_{1}}{\partial x_{2}} & \cdots & \frac{\partial f_{1}}{\partial x_{n}} \\ \frac{\partial f_{2}}{\partial x_{1}} & \frac{\partial f_{2}}{\partial x_{2}} & \cdots & \frac{\partial f_{2}}{\partial x_{n}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial f_{n}}{\partial x_{1}} & \frac{\partial f_{n}}{\partial x_{2}} & \cdots & \frac{\partial f_{n}}{\partial x_{n}} \end{array}\right\| \mathbf d x_{1} \mathbf d x_{2} \cdots \mathbf d x_{n} dy10000dy2000000dyn = x1f1x1f2x1fnx2f1x2f2x2fnxnf1xnf2xnfn dx1dx2dxn(16)即,此微元的体积为: d y 1 d y 2 ⋯ d y n = ∣ J F ( p ) ∣ d x 1 d x 2 ⋯ d x n (17) \color{green} \tag{17} \mathbf d y_{1} \mathbf d y_{2} \cdots \mathbf d y_{n}=\left|\mathbf{J}_{F}(p)\right| \mathbf d x_{1} \mathbf d x_{2} \cdots \mathbf d x_{n} dy1dy2dyn=JF(p)dx1dx2dxn(17)
 

三、应用示例→牛顿迭代法

1、一元数量函数

如果学习过高数或者数分,可以知道如何使用牛顿法来计算 f ( x ) = 0 f(x)=0 f(x)=0 的根,假设根在 x k x_k xk 附近,为了找到更好的根 x k + 1 x_{k+1} xk+1,可以考虑如下 ( x k , f ( x k ) ) (x_k,f(x_k)) (xk,f(xk)) 处的切线,如下图所示:
在这里插入图片描述
切线方程为:
y = f ( x k ) + f ′ ( x k ) ( x − x k ) (18) \color{green} \tag{18} y=f(x_k)+f'(x_k)(x-x_k) y=f(xk)+f(xk)(xxk)(18)根据上图,可以很直观的看到,该切向与 x 轴的交点为 ( x k − f ( x k ) f ′ ( x k ) , 0 ) (x_k-\frac{f(x_k)}{f'(x_k)},0) (xkf(xk)f(xk),0),其揭示了比 x k x_k xk 更接近的近似根,记其为 x k + 1 x_{k+1} xk+1,因此牛顿迭代法的公式为:
x k + 1 = x k − f ( x k ) f ′ ( x k ) (19) \color{green} \tag{19} x_{k+1}=x_{k}-\frac{f\left(x_{k}\right)}{f^{\prime}\left(x_{k}\right)} xk+1=xkf(xk)f(xk)(19)该方法的迭代过程如下图所示,实际操作中对初始值是有一定要求的,简而言之需要初始值在实际根附近。
 

2、多元数量函数

对于多元数量 F : R n ↦ R F: \mathbb{R}^{\mathrm{n}} \mapsto \mathbb{R} F:RnR,假设 x k \mathbf x_k xk 接近根,那么下式: y − F ( x k ) = ∇ F ( x k ) T ( x − x k ) (20) \color{green} \tag{20} y-F\left(\mathbf{x}_{k}\right)=\nabla F\left({\mathbf x}_{k}\right)^T\left(\mathbf{x}-\mathbf{x}_{k}\right) yF(xk)=F(xk)T(xxk)(20)是在点 x k \mathbf x_k xk 处对函数 f f f 的仿射逼近,此时可以沿着梯度所在方向找更近似的根,可以令:
x k + 1 = x k + λ ∇ F ( x k ) (21) \color{green} \tag{21} \mathbf{x}_{k+1}=\mathbf{x}_{k}+\lambda \nabla F\left(\mathbf{x}_{k}\right) xk+1=xk+λF(xk)(21)上式的 λ \lambda λ 可以理解为逼近因子,控制逼近的步伐,通常为 − F ( x k ) ∣ ∇ F ( x k ) ∣ 2 -\frac{F(\mathbf{x}_{k}) }{| \nabla F\left(\mathbf{x}_{k}\right)|^2} ∣∇F(xk)2F(xk),也就是可以写成下式: x k + 1 = x k − F ( x k ) ∣ ∇ F ( x k ) ∣ 2 ∇ F ( x k ) (22) \color{green} \tag{22} \mathbf{x}_{k+1}=\mathbf{x}_{k}-\frac{F\left(\mathbf{x}_{k}\right)}{\left|\nabla F\left(\mathbf{x}_{k}\right)\right|^{2}} \nabla F\left(\mathbf{x}_{k}\right) xk+1=xkF(xk)2F(xk)F(xk)(22)

3、多元向量值函数

对于多元数量 F : R n ↦ R m F: \mathbb{R}^{\mathrm{n}} \mapsto \mathbb{R}^m F:RnRm,如前面的(05)式: F = { y 1 = f 1 ( x 1 , … , x n ) y 2 = f 2 ( x 1 , … , x n ) … y m = f m ( x 1 , … , x n ) (23) \color{green} \tag{23} F=\left\{\begin{aligned} y_{1}=& f_{1}\left(x_{1}, \ldots, x_{n}\right) \\ y_{2}=& f_{2}\left(x_{1}, \ldots, x_{n}\right) \\ & \ldots \\ y_{m}=& f_{m}\left(x_{1}, \ldots, x_{n}\right) \end{aligned}\right. F= y1=y2=ym=f1(x1,,xn)f2(x1,,xn)fm(x1,,xn)(23) 计算 F ( x ) = 0 F(x)=0 F(x)=0 的根,稍微一想,你会发现这个其实是在求解一个方程组的解,这里的方程一般来说是非线性的,当然也可以包括特例,线性方程组。如果是线性方程组,一般能一步到位,但如果是非线性的,往往不能一步到位,那就用迭代法一步一步逼近。假设 x k x_{k} xk 在根附近,该点处函数泰勒一级展开(或者说函数的仿射变换)为:
F ( x ) − F ( x k ) ≈ J F ( x k ) ⋅ ( x − x k ) (24) \color{green} \tag{24} F(x) -F(x_k)\approx \mathbf J_{F}(x_k) \cdot(x-x_k) F(x)F(xk)JF(xk)(xxk)(24)那么雅可比矩阵是一个 m × n m \times n m×n 矩阵: J F = [ ∂ f ∂ x 1 ⋯ ∂ f ∂ x n ] = [ ∂ f 1 ∂ x 1 ∂ f 1 ∂ x 2 ⋯ ∂ f 1 ∂ x n ⋮ ⋱ ⋮ ∂ f m ∂ x 1 ∂ f m ∂ x 2 ⋯ ∂ f m ∂ x n ] (25) \color{green} \tag{25} \begin{aligned} \mathbf J_{F} &=\left[\begin{array}{ccc} \frac{\partial \mathbf{f}}{\partial x_{1}} & \cdots & \frac{\partial \mathbf{f}}{\partial x_{n}} \end{array}\right] &=\left[\begin{array}{cccc} \frac{\partial f_{1}}{\partial x_{1}} & \frac{\partial f_{1}}{\partial x_{2}} & \cdots & \frac{\partial f_{1}}{\partial x_{n}} \\ \vdots & \ddots & \vdots & \\ \frac{\partial f_{m}}{\partial x_{1}} & \frac{\partial f_{m}}{\partial x_{2}} & \cdots & \frac{\partial f_{m}}{\partial x_{n}} \end{array}\right] \end{aligned} JF=[x1fxnf]= x1f1x1fmx2f1x2fmxnf1xnfm (25)如果 n = m n = m n=m,此时牛顿法的迭代公式为, x k + 1 = x k − [ J F ( x k ) ] − 1 F ( x k ) (26) \color{green} \tag{26} x_{k+1}=x_{k}-\left[\mathbf J_{F\left(x_{k}\right)}\right]^{-1} F\left(x_{k}\right) xk+1=xk[JF(xk)]1F(xk)(26)上面公式里要计算雅可比矩阵的逆,一般并不会直接去求,而是通过求解下面的方程组: J F ( x k ) Δ x = − F ( x k ) (27) \color{green} \tag{27} \mathbf J_{F\left(x_{k}\right)} \Delta x=-F\left(x_{k}\right) JF(xk)Δx=F(xk)(27)然后更新 x k + 1 = x k + Δ x (28) \color{green} \tag{28} x_{k+1}=x_k+\Delta x xk+1=xk+Δx(28)这里所谓的迭代式求根方法的主要思路就是从当前的近似解如何得到更近似的解。牛顿法就是利用函数局部的仿射逼近来一步一步逼近根。当然,具体实施中还需要处理初始值等一些细节问题。
 

四、应用示例→Bundle Adjustment

1、Gauss-Newton 非线性优化方法

对于一个函数 f ( x ) f(x) f(x),要求其最小值以及最小值对应的 x ∗ x^* x,如果优化问题不方便直接求解,那么通常采用 ‘‘迭代’’ 思想进行求解。即:从一个初始值出发,不断更新当前的优化量,使目标函数值降低,直到优化量的增量足够小或者目标函数值达到要求。其中,使用这种迭代思想的 “Gauss-Newton法” 应用十分广泛。接下来,对高斯牛顿法的基本思想进行简单阐述和数学推导:

已知函数 f ( x ) f(x) f(x) 至少二阶段可微,那么求解 m i n x f ( x ) min_xf(x) minxf(x) 的时候可以进行一阶泰勒近似:
f ( x + Δ x ) ≈ f ( x ) + J ( x ) Δ x (29) \color{green} \tag{29} f(x+\Delta x) \approx f(x)+\mathbf J(x) \Delta x f(x+Δx)f(x)+J(x)Δx(29)其中 J ( x ) \mathbf J(x) J(x) f ( x ) f(x) f(x) 关于 x x x 的一阶偏导,也就是前面讲解的雅克比矩阵。根据迭代思想可知→在是为了找到 f ( x ) f(x) f(x) 的下降方向 Δ x \Delta x Δx 使得函数值逐步达到最小值,因此可以构建一个关于 Δ x \Delta x Δx 的非线性化最小二乘问题:
Δ x ∗ = arg ⁡ min ⁡ x 1 2 ∥ f ( x ) + J ( x ) Δ x ∥ 2 (30) \color{green} \tag{30} \Delta x^{*}=\arg \min _{x} \frac{1}{2}\|f(x)+\mathbf J(x) \Delta x\|^{2} Δx=argxmin21f(x)+J(x)Δx2(30)对上式进行关于 Δ x \Delta x Δx 的求导,一阶导数为0时,当前值就是最优的 Δ x ∗ \Delta x^* Δx,即: J T ( x ) J ( x ) Δ x = − J T ( x ) f ( x ) (31) \color{green} \tag{31} \mathbf J^T(x) \mathbf J(x) \Delta x=-\mathbf J^T(x) f(x) JT(x)J(x)Δx=JT(x)f(x)(31)因为此时的目标变量是 Δ x \Delta x Δx,所以(03)可以看成是关于 Δ x \Delta x Δx 的线性方程,也称为增量方程。通常将 H ≈ J T J \mathbf H \approx \mathbf J^T \mathbf J HJTJ 的作为上式的二阶偏导数,即 H e s s i a n Hessian Hessian 矩阵的近似。避免了二阶导数的计算。Gauss-Newton迭代算法过程总结如下:
( 1 ) \color{blue} (1) (1) 给定初始值 x 0 x_0 x0
( 2 ) \color{blue} (2) (2) 对于第 k k k 次迭代,求出当前的雅克比矩阵 J \mathbf J J
( 3 ) \color{blue} (3) (3) 根据 J F ( x k ) Δ x = − F ( x k ) \mathbf J_{F\left(x_{k}\right)} \Delta x=-F\left(x_{k}\right) JF(xk)Δx=F(xk)方程求解 Δ x \Delta x Δx
( 4 ) \color{blue} (4) (4) Δ x \Delta x Δx足够小,则停止迭代,否则 x k + 1 = x k + Δ x k x_{k+1}=x_k+\Delta x_k xk+1=xk+Δxk,并且返回步骤(2)。
 

2、Bundle Adjustment

对于SLAM,待优化的量包括: 位姿 \color{red} 位姿 位姿 空间点 3 D 位置 \color{red} 空间点3D位置 空间点3D位置。如果采用 ‘‘线性’’ 求解,通常先求解位姿,再根据位姿来求解空间点的3D位置;如果采用“非线性法”,比如Gauss-Newton法,通常是将位姿和空间点位置构成统一的状态空间,进行联合优化。
在这里插入图片描述
如上图,已知大 P P P 世界坐标系下的一点,通过 P w → P c → p u v P_w→P_c→p_{uv} PwPcpuv 多次转换最终投影到像素坐标系上。用李代数 ξ ∧ \xi^{\wedge} ξ 表示世界坐标系到相机坐标系的转换。并且: P w = [ X w Y w Z w ] , P c = [ X c Y c Z c ] , p u v = [ μ v 1 ] (32) \color{green} \tag{32} P_{w}=\left[\begin{array}{l} X_{w} \\ Y_{w} \\ Z_{w} \end{array}\right], \quad P_{c}=\left[\begin{array}{l} X_{c} \\ Y_{c} \\ Z_{c} \end{array}\right], \quad p_{u v}=\left[\begin{array}{l} \mu \\ v \\ 1 \end{array}\right] Pw= XwYwZw ,Pc= XcYcZc ,puv= μv1 (32)
注意 : \color{red} 注意: 注意: 世界系→相机系→像素系 的转换过程一定要注意矩阵的维度,会涉及很多坐标的齐次化处理,如果公式中有维度的问题,就是没有将坐标齐次化处理展示,为避免造成误导,特此说明。通过李群李代数(后续补充相关章节)的学习,可知: exp ⁡ ( ξ ∧ ) = [ R J ρ 0 T 1 ] (33) \color{green} \tag{33} \exp \left(\xi^{\wedge}\right)=\left[\begin{array}{ll} \mathbf R & \mathbf J \boldsymbol{\rho} \\ 0^T & 1 \end{array}\right] exp(ξ)=[R0TJρ1](33)其维度是 4x4,所以根据相机模型有:
Z c [ u v 1 ] = K exp ⁡ ( ξ ∧ ) [ X w Y w Z w 1 ] (34) \color{green} \tag{34} Z_{c}\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right]=\mathbf K \exp \left(\xi^{\wedge}\right)\left[\begin{array}{l} X_{w} \\ Y_{w} \\ Z_{w} \\ 1 \end{array}\right] Zc uv1 =Kexp(ξ) XwYwZw1 (34)其中 Z c Zc Zc 是点 P P P 的深度,常采用逆深度:简记为 d = 1 Z c d=\frac{1}{Z_c} d=Zc1。则上式可以记为: [ u v 1 ] = d K exp ⁡ ( ξ ∧ ) [ X w Y w Z w 1 ] (35) \color{green} \tag{35} \left[\begin{array}{c} u \\ v \\ 1 \end{array}\right]=d \mathbf K \exp \left(\xi^{\wedge}\right)\left[\begin{array}{c} X_{w} \\ Y_{w} \\ Z_{w} \\ 1 \end{array}\right] uv1 =dKexp(ξ) XwYwZw1 (35)即: p u v = d K exp ⁡ ( ξ ∧ ) P w (36) \color{green} \tag{36} p_{u v}=d \mathbf K \exp \left(\xi^{\wedge}\right) P_{w} puv=dKexp(ξ)Pw(36)
在基于特征法的SLAM中,通过ORB匹配或者光流跟踪,可以得到两帧间的像素匹配对。Bundle Adjustment 的思想就是通过特征匹配可以得到两帧间的像素匹配对的观测值;同时利用估计位姿将前帧像素点投影到后帧上得到像素点的估计值。如前面的图像所示,红点 p 2 p_2 p2 是通过光流(或其它方式)得到 p 1 p_1 p1 在当前帧上匹配对,也就是 p 1 p_1 p1 的观测值;黑色 p 2 p_2 p2 是通过估计位姿得到的估计值。因为估计位姿极有可能不准确,所以黑色 p 2 p_2 p2 和红色 p 2 p_2 p2 会有一定的差距,即观测值 != 估计值。那么就需要不断调整估计位姿 ξ ∧ \xi^{\wedge} ξ 使得观测值和估计值的差距无线接近0。用数学语言描述为:

ξ ∧ \xi^{\wedge} ξ 为优化量, e ( ξ ∧ ) = ( p u v ) estimation  − ( p u v ) true  e\left(\xi^{\wedge}\right)=\left(p_{u v}\right)_{\text {estimation }}-\left(p_{u v}\right)_{\text {true }} e(ξ)=(puv)estimation (puv)true  为待优化函数,建立最小二乘问题:
ξ ∗ = arg ⁡ min ⁡ ξ 1 2 ∑ i = 1 n ∥ p i − d i K exp ⁡ ( ξ ∧ ) P w i ∥ 2 2 (37) \color{green} \tag{37} \xi^{*}=\arg \min _{\xi} \frac{1}{2} \sum_{i=1}^{n}\left\|p_{i}-d_{i} \mathbf K \exp \left(\xi^{\wedge}\right) P_{w i}\right\|_{\mathbf{2}}^{2} ξ=argξmin21i=1npidiKexp(ξ)Pwi22(37) ∑ i = 1 n \sum_{i=1}^{n} i=1n:因为两帧图像中存在多对像素匹配点,上图仅仅体现处理一对像素匹配点的关系。 ξ ∗ \xi^{*} ξ 不仅仅是使一对像素点的匹配误差达到最小,而应该是考虑多对点配,考虑多对约束,使 ξ ∗ \xi^{*} ξ 更健壮,即使不可能得到一个 ξ ∗ \xi^{*} ξ 使得所有点对的像素重投影误差为零。

上式中的下标2,因为 p u v p_{uv} puv 的第三项永远为1,所以其重投影误差也为0。那么在后续处理中,可以只考虑前两项。
 

3、重投影误差模型的雅克比矩阵

根据前面的Gauss-Newton法,对 e ( ξ ∗ ) = p i − d i K exp ⁡ ( ξ ∧ ) P w i e\left(\xi^{*}\right)=p_{i}-d_{i} \mathbf K \exp \left(\xi^{\wedge}\right) P_{w i} e(ξ)=pidiKexp(ξ)Pwi进行一阶泰勒展开:
e ( ( ξ + Δ ξ ) ∧ ) ≈ e ( ξ ∧ ) + J ( ξ ∧ ) Δ ξ ∧ (38) \color{green} \tag{38} e\left((\xi+\Delta \xi)^{\wedge}\right) \approx e\left(\xi^{\wedge}\right)+\mathbf J\left(\xi^{\wedge}\right) \Delta \xi^{\wedge} e((ξ+Δξ))e(ξ)+J(ξ)Δξ(38)关键就在于 J ( ξ ∧ ) \mathbf J\left(\xi^{\wedge}\right) J(ξ),即上式对应雅克比矩阵的求解。为使结果简洁,所以通常选在“扰动模型”(涉及李群李代数)。此处使用“左乘扰动模型”,并使用链式求导准则。
J ( ξ ∧ ) = ∂ e ∂ Δ ξ = ∂ e ∂ P c ⋅ ∂ P c ∂ Δ ξ (39) \color{green} \tag{39} \mathbf J\left(\xi^{\wedge}\right)=\frac{\partial e}{\partial \Delta \xi}=\frac{\partial e}{\partial P_{c}} \cdot \frac{\partial P_{c}}{\partial \Delta \xi} J(ξ)=Δξe=PceΔξPc(39)接下来,就一步一步求导,对于 ∂ e ∂ P c \frac{\partial e}{\partial P_{c}} Pce,已知: p i = 1 Z i K P c            u = f x X c Z c + C x           v = f y Y c Z c + C y (40) \color{green} \tag{40} p_i=\frac{1}{Z_i} \mathbf K P_c~~~~~~~~~~u=f_x \frac{X_c}{Z_c}+C_x~~~~~~~~~v=f_y \frac{Y_c}{Z_c}+C_y pi=Zi1KPc          u=fxZcXc+Cx         v=fyZcYc+Cy(40)所以:
∂ e ∂ P c = [ ∂ p i ] 2 ∂ P c = [ ∂ u ∂ v ] [ ∂ X c ∂ Y c ∂ Z c ] = [ ∂ u ∂ X c ∂ u ∂ Y c ∂ u ∂ Z c ∂ v ∂ X c ∂ v ∂ Y c ∂ v ∂ Z c ] = [ f x Z c 0 − f x X c Z c 2 0 f Y Z c − f y Y c Z c 2 ] 2 × 3 (41) \color{green} \tag{41} \frac{\partial e}{\partial P_{c}}=\frac{\left[\partial p_{i}\right]_{2}}{\partial P_{c}}=\frac{\left[\begin{array}{l} \partial u \\ \partial v \end{array}\right]}{\left[\begin{array}{l} \partial X_{c} \\ \partial Y_{c} \\ \partial Z_{c} \end{array}\right]}=\left[\begin{array}{ccc} \frac{\partial u}{\partial X_{c}} & \frac{\partial u}{\partial Y_{c}} & \frac{\partial u}{\partial Z_{c}} \\ \\ \frac{\partial v}{\partial X_{c}} & \frac{\partial v}{\partial Y_{c}} & \frac{\partial v}{\partial Z_{c}} \end{array}\right]=\left[\begin{array}{ccc} \frac{f x}{Z_{c}} & 0 & -\frac{f x X_{c}}{Z_{c}^{2}} \\ \\ 0 & \frac{f Y}{Z_{c}} & -\frac{f y Y_{c}}{Z_{c}^{2}} \end{array}\right]_{2 \times 3} Pce=Pc[pi]2= XcYcZc [uv]= XcuXcvYcuYcvZcuZcv = Zcfx00ZcfYZc2fxXcZc2fyYc 2×3(41)
由李群李代数的扰动模型可知:   ∂ P c ∂ Δ ξ = [ I − ( R P w + t ) ∧ 0 T 0 T ] = [ I − P c ∧ 0 T 0 T ] (42) \color{green} \tag{42} \ \frac{\partial P_{c}}{\partial \Delta \xi}=\left[\begin{array}{cc} \mathbf I & -\left(\mathbf R P_{w}+t\right)^{\wedge} \\ \\ 0^T& 0^T \end{array}\right]=\left[\begin{array}{cc} \mathbf I & -P_{c}^{\wedge} \\ \\ 0^T & 0^T \end{array}\right]  ΔξPc= I0T(RPw+t)0T = I0TPc0T (42)
但是只取前三行 [ ∂ P c ∂ Δ ξ ] 3 = [ I − P c ∧ ] 3 × 6 (43) \color{green} \tag{43} \left[\frac{\partial P_{c}}{\partial \Delta \xi}\right]_{3}=\left[\begin{array}{ll} \mathbf I & -P_{c}^{\wedge} \end{array}\right]_{3 \times 6} [ΔξPc]3=[IPc]3×6(43)由(41)与(43)式可以可得: ∂ e ∂ Δ ξ = [ ∂ e ] 2 ∂ P c ⋅ [ ∂ P c ∂ Δ ξ ] 3 = [ f x Z c 0 f x X c − Z c 2 0 f y Z c f y Y c − Z c 2 ] ⋅ [ 1 0 0 0 Z c − Y c 0 1 0 − Z c 0 X c 0 0 1 Y c − X c 0 ] (44) \color{green} \tag{44} \frac{\partial e}{\partial \Delta \xi}=\frac{[\partial e]_{2}}{\partial P_{c}} \cdot\left[\frac{\partial P_{c}}{\partial \Delta \xi}\right]_{3}=\left[\begin{array}{ccc} \frac{f x}{Z_{c}} & 0 & \frac{f x X_{c}}{-Z_{c}^{2}} \\ & & \\ 0 & \frac{f y}{Z_{c}} & \frac{f_{y} Y_{c}}{-Z_{c}^{2}} \end{array}\right] \cdot\left[\begin{array}{cccccc} 1 & 0 & 0 & 0 & Z_{c} & -Y_{c} \\ 0 & 1 & 0 & -Z_{c} & 0 & X_{c} \\ 0 & 0 & 1 & Y_{c} & -X_{c} & 0 \end{array}\right] Δξe=Pc[e]2[ΔξPc]3= Zcfx00ZcfyZc2fxXcZc2fyYc 1000100010ZcYcZc0XcYcXc0 (44)最终可得: ∂ e ∂ Δ ξ = [ f x Z c 0 − f x X c Z c − f x X c Y c Z c 2 f x + f x X c 2 Z c 2 − f x Y c Z c 0 f y Z c − f y Y c Z c 2 − f y − f y Y c 2 Z c 2 f y X c Y c Z c 2 f y X c Z c ] (45) \color{green} \tag{45} \frac{\partial e}{\partial \Delta \xi} = \left[\begin{array}{cccccc} \frac{f_{x}}{Z_{c}} & 0 & -\frac{f_{x} X_{c}}{Z_{c}} & -\frac{f_{x} X_{c} Y_{c}}{Z_{c}^{2}} & f_{x}+\frac{f_{x} X_{c}^{2}}{Z_{c}^{2}} & -\frac{f_{x} Y_{c}}{Z_{c}} \\ 0 & \frac{f_{y}}{Z_{c}} & -\frac{f_{y} Y_{c}}{Z_{c}^{2}} & -f_{y}-\frac{f_{y} Y_{c}^{2}}{Z_{c}^{2}} & \frac{f_{y} X_{c} Y_{c}}{Z_{c}^{2}} & \frac{f_{y} X_{c}}{Z_{c}} \end{array}\right] Δξe= Zcfx00ZcfyZcfxXcZc2fyYcZc2fxXcYcfyZc2fyYc2fx+Zc2fxXc2Zc2fyXcYcZcfxYcZcfyXc (45)如果需要将位姿和3D空间位置坐标进行联合优化,则还需要求解: ∂ e ∂ P w = ∂ e ∂ P c ∂ P c ∂ P w                 ∂ P c ∂ P w = ∂ ( R P w + t ) ∂ P w = R (46) \color{green} \tag{46} \frac{\partial e}{\partial P_{w}}=\frac{\partial e}{\partial P_{c}} \frac{\partial P_{c}}{\partial P_{w}}~~~~~~~~~~~~~~~\frac{\partial P_{c}}{\partial P_{w}}=\frac{\partial\left(R P_{w}+t\right)}{\partial P_{w}}=R Pwe=PcePwPc               PwPc=Pw(RPw+t)=R(46) ∂ e ∂ P w = [ f x Z c 0 f x X c − Z c 2 0 f y Z c f y Y c − Z c 2 ] R (47) \color{green} \tag{47} \frac{\partial e}{\partial P_{w}}=\left[\begin{array}{ccc} \frac{f x}{Z_{c}} & 0 & \frac{f_{x} X_{c}}{-Z_{c}^{2}} \\ \\ 0 & \frac{f y}{Z_{c}} & \frac{f_{y} Y_{c}}{-Z_{c}^{2}} \end{array}\right] R Pwe= Zcfx00ZcfyZc2fxXcZc2fyYc R(47)至此,雅克比矩阵推导完毕。另外如果 se(3) 的定义方式是旋转在前,平移在后时,只要把这个(45)式矩阵的前三列与后三列对调即可。
 

五、结语

雅可比矩阵是一条比较好的能够将多个内容串起来的线索。简单来看,它能将矩阵、仿射变换、行列式、特征值特征向量、导数、泰勒展开、微分方程组、方程求根、最优化甚至流形及其上的度量张量等等内容有机地牵扯起来。总而言之,雅可比矩阵的应用十分广,后续有时间再为大家更新一些应用示例

猜你喜欢

转载自blog.csdn.net/weixin_43013761/article/details/127203145
今日推荐