Jacobian与切空间
0.引言
知识的融会贯通,只是一个小的知识点,记录一下。
1.Jaocibian与切空间
众所周知,Jaocibian矩阵本质上就是导数。初中时学习的一元二次方程 a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0求导,当 x x x确定时可以得到 x x x处的切线方程,切线就是一维的切空间。切空间是在某一点所有的切向量组成的线性空间。
由于线性化本质就是微分, d f / d x df/dx df/dx表示了雅克比矩阵是 f f f对 x x x的导数,是函数变化的斜率,因此也可类比一元函数的概念理解雅克比矩阵的线性化作用。而与此同时,对于向量空间而言,微分就是以微元为基底,得到的切空间,雅克比矩阵也是一个切空间的坐标变换矩阵。
J = [ ∂ f ∂ x 1 ⋯ ∂ f ∂ x n ] = [ ∂ f 1 ∂ x 1 ⋯ ∂ f 1 ∂ x n ⋮ ⋱ ⋮ ∂ f m ∂ x 1 ⋯ ∂ f m ∂ x n ] \mathbf{J}=\left[\begin{array}{lll} \frac{\partial \mathbf{f}}{\partial x_{1}} & \cdots & \frac{\partial \mathbf{f}}{\partial x_{n}} \end{array}\right]=\left[\begin{array}{ccc} \frac{\partial f_{1}}{\partial x_{1}} & \cdots & \frac{\partial f_{1}}{\partial x_{n}} \\ \vdots & \ddots & \vdots \\ \frac{\partial f_{m}}{\partial x_{1}} & \cdots & \frac{\partial f_{m}}{\partial x_{n}} \end{array}\right] J=[∂x1∂f⋯∂xn∂f]=⎣⎢⎡∂x1∂f1⋮∂x1∂fm⋯⋱⋯∂xn∂f1⋮∂xn∂fm⎦⎥⎤
和一元二次方程类似,当 x x x确定时,就可以找到具体的切线方程;当具体的点确定时,就可以通过Jacobian得到具体的切空间。
2.旋转矩阵中的切空间
在使用旋转矩阵表达三维世界中刚体的运动方式时,我们需要对其进行估计和优化。例如在优化位姿 T T T时,就需要构建一个残差方程,也就是估计值与观测值之间的误差,而此时需要求解残差方程 e e e对变化矩阵 T T T的求导,变成了矩阵求导问题,而且对于变换矩阵是并不封闭的,所谓的不封闭就是两个变换矩阵相加得到的并不是变换矩阵,而不像是实数1加上实数2得到的3仍然是一个实数。
除此之外,由上面的变换矩阵的定义我们知道,旋转矩阵本身是带有约束的矩阵,也就是旋转矩阵为一个行列式为1的正交矩阵,额外的约束会增加优化的困难,为了简化求解的方式,引入了李群。
简单的说群就是一种集合加上一种运算的代数结构。虽然旋转矩阵对于加法是不封闭的,但是对于乘法是封闭的,两个旋转矩阵相乘代表做了两次旋转。
对于旋转矩阵和变换矩阵的群定义如下:
S
O
(
3
)
=
{
R
∈
R
3
×
3
∣
R
R
T
=
I
,
det
(
R
)
=
1
}
S O(3)=\left\{R \in \mathbb{R}^{3 \times 3} \mid R R^{T}=I, \operatorname{det}(R)=1\right\}
SO(3)={R∈R3×3∣RRT=I,det(R)=1}
S
E
(
3
)
=
{
T
=
[
R
t
0
T
1
]
∈
R
4
×
4
∣
R
∈
S
O
(
3
)
,
T
∈
R
3
}
S E(3)=\left\{T=\left[\begin{array}{cc} R & t \\ 0^{T} & 1 \end{array}\right] \in \mathbb{R}^{4 \times 4} \mid R \in S O(3), T \in \mathbb{R}^{3}\right\}
SE(3)={T=[R0Tt1]∈R4×4∣R∈SO(3),T∈R3}
所谓的李群是指具有连续(光滑)性质的群,
S
o
(
3
)
So(3)
So(3)和
S
E
(
3
)
SE(3)
SE(3)在实数空间上都是连续的,所以他们都是李群。到此为止李群的引入解决了变换矩阵额外约束的问题,
接下来解决矩阵的求导问题。首先对于任意矩阵
R
R
R,假设
R
R
R是某个刚体的旋转,它会随着时间连续变换即为时间的函数
R
(
t
)
R(t)
R(t),因此:
R
(
t
)
R
(
t
)
T
=
I
R(t) R(t)^{T}=I
R(t)R(t)T=I
对时间
t
t
t进行求导,其中
R
^
(
t
)
\hat{R}(t)
R^(t) 代表函数
R
(
t
)
R(t)
R(t)的导数:
R ( t ) R ( t ) T + R ( t ) R ( t ) T = 0 R(t) R(t)^{T}+R(t) R(t)^{T}=0 R(t)R(t)T+R(t)R(t)T=0 R ( ^ t ) R ( t ) T = − R ( t ) R ( t ) T = − ( R ( t ) ^ R ( t ) T ) T R \hat{(} t) R(t)^{T}=-R(t) R(t)^{T}=-\left(R \hat{(t)} R(t)^{T}\right)^{T} R(^t)R(t)T=−R(t)R(t)T=−(R(t)^R(t)T)T显然, R ( ^ t ) R ( t ) T R \hat{(} t) R(t)^{T} R(^t)R(t)T是一个反对称函数。其特征是主对角线上的元素是0,关于主对角线对称的元素互为相反数。因此对于任意反对称矩阵,总能找到一个唯一与之对应的向量。
a
∧
=
A
=
[
0
−
a
3
a
2
a
3
0
−
a
1
−
a
2
a
1
0
]
a^{\wedge}=A=\left[\begin{array}{ccc} 0 & -a_{3} & a_{2} \\ a_{3} & 0 & -a_{1} \\ -a_{2} & a_{1} & 0 \end{array}\right]
a∧=A=⎣⎡0a3−a2−a30a1a2−a10⎦⎤因此对于反对称矩阵
R
(
t
^
)
R
(
t
)
T
R \hat{(t}) R(t)^{T}
R(t^)R(t)T,同样也可以找到一个三维向量
ϕ
(
t
)
∈
R
3
\phi(t) \in \mathbb{R}^{3}
ϕ(t)∈R3 ,即:
R
(
t
)
R
(
t
)
T
=
ϕ
(
t
)
∧
R(t) R(t)^{T}=\phi(t)^{\wedge}
R(t)R(t)T=ϕ(t)∧
等式两边右乘
R
(
t
)
R(t)
R(t),且
R
R
R为正交矩阵,所以得到:
R
(
t
^
)
=
ϕ
(
t
)
∧
R
(
t
)
=
[
0
−
ϕ
3
ϕ
2
ϕ
3
0
−
ϕ
1
−
ϕ
2
ϕ
1
0
]
R
(
t
)
R \hat{(t})=\phi(t)^{\wedge} R(t)=\left[\begin{array}{ccc} 0 & -\phi_{3} & \phi_{2} \\ \phi_{3} & 0 & -\phi_{1} \\ -\phi_{2} & \phi_{1} & 0 \end{array}\right] R(t)
R(t^)=ϕ(t)∧R(t)=⎣⎡0ϕ3−ϕ2−ϕ30ϕ1ϕ2−ϕ10⎦⎤R(t)
至此我们就得到了矩阵的导数,每次对旋转矩阵求导只需要左乘
ϕ
(
t
)
\phi(t)
ϕ(t)即可。李代数描述了旋转矩阵
R
R
R局部的导数关系,也叫正切空间。
- 通过 ϕ ( t ) \phi(t) ϕ(t)可以映射到正切空间,这里的 ϕ ( t ) ∧ R ( t ) \phi(t)^{\wedge} R(t) ϕ(t)∧R(t)扮演的就是Jacobian的角色,当数值给定时,就能确定具体的正切空间,即是 R ( t ^ ) R(\hat{t}) R(t^).
下面给出旋转矩阵和变换矩阵的群所对应的李代数:
s o ( 3 ) = { ϕ ∈ R 3 , Φ = ϕ ∧ ∈ R 3 × 3 } s o(3)=\left\{\phi \in \mathbb{R}^{3}, \Phi=\phi^{\wedge} \in \mathbb{R}^{3 \times 3}\right\} so(3)={ϕ∈R3,Φ=ϕ∧∈R3×3} s e ( 3 ) = { ξ = [ ρ ϕ ] ∈ R 6 , ρ ∈ R 3 , ϕ ∈ s o ( 3 ) , ξ ∧ = [ ϕ ∧ ρ 0 T 0 ] ∈ R 4 × 4 } s e(3)=\left\{\xi=\left[\begin{array}{l} \rho \\ \phi \end{array}\right] \in \mathbb{R}^{6}, \rho \in \mathbb{R}^{3}, \phi \in s o(3), \xi^{\wedge}=\left[\begin{array}{cc} \phi^{\wedge} & \rho \\ 0^{T} & 0 \end{array}\right] \in \mathbb{R}^{4 \times 4}\right\} se(3)={ξ=[ρϕ]∈R6,ρ∈R3,ϕ∈so(3),ξ∧=[ϕ∧0Tρ0]∈R4×4}
- 引入李群的目的是解决旋转矩阵本身的约束问题,简化后面的优化过程。
- 引入李代数是为了解决旋转矩阵的求导问题,当然李群和李代数之间也存在指数映射和对数映射的相互转换。
3.MLPnP中的切空间
MLPnP中,方位向量转置的零空间:
J
v
r
(
v
)
=
null
(
v
T
)
=
[
r
s
]
=
[
r
1
s
1
r
2
s
2
r
3
s
3
]
\mathbf{J}_{\mathbf{v}_{\mathbf{r}}}(\mathbf{v})=\operatorname{null}\left(\mathbf{v}^{\mathbf{T}}\right)=\left[\begin{array}{ll} \mathbf{r} & \mathbf{s} \end{array}\right]=\left[\begin{array}{cc} r_{1} & s_{1} \\ r_{2} & s_{2} \\ r_{3} & s_{3} \end{array}\right]
Jvr(v)=null(vT)=[rs]=⎣⎡r1r2r3s1s2s3⎦⎤
从零空间的定义,方位向量在零空间的投影为0,即是方位向量与零空间是垂直的,怎么能说零空间是它的切空间呢?
论文中提到,
J
v
r
\mathbf{J}_{\mathbf{v}_{r}}
Jvr表示了从正切空间到原始向量的变换的雅可比矩阵 ,
J
v
r
T
\mathbf{J}_{\mathbf{v}_{r}}^{T}
JvrT表示从原始齐次向量
v
v
v到其简化后的等价向量
v
r
v_r
vr的变换:
v r = [ d r d s ] = J v r T ( v ) v = 0 \mathbf{v}_{r}=\left[\begin{array}{l}d r \\ d s\end{array}\right]=\mathbf{J}_{\mathbf{v}_{r}}^{T}(\mathbf{v}) \mathbf{v}=\mathbf{0} vr=[drds]=JvrT(v)v=0
个人理解这里的空间就是零空间,不是切空间, J v r \mathbf{J}_{\mathbf{v}_{r}} Jvr也不是通常意义的Jacobian矩阵,只是一个变换矩阵。 J v r T ( v ) \mathbf{J}_{\mathbf{v}_{r}}^{T}(\mathbf{v}) JvrT(v)表示将方位向量 v v v变换到零空间,再乘以 v v v即为0.
[
d
r
d
s
]
=
[
r
T
s
T
]
λ
i
−
1
(
R
p
i
+
t
)
=
0
\left[\begin{array}{l} d r \\ d s \end{array}\right]=\left[\begin{array}{c} \mathbf{r}^{T} \\ \mathbf{s}^{T} \end{array}\right] \lambda_{i}^{-1}\left(R p_{i}+t\right) = 0
[drds]=[rTsT]λi−1(Rpi+t)=0
其中,
[
r
T
s
T
]
\left[\begin{array}{l} \mathbf{r}^{T} \\ \mathbf{s}^{T} \end{array}\right]
[rTsT]则为从2D像素坐标系经过相机内参求得方位向量再求得的零空间,
λ
i
−
1
(
R
p
i
+
t
)
\lambda_{i}^{-1}\left(R p_{i}+t\right)
λi−1(Rpi+t)则为世界坐标系到相机系的变换,理论上两者相乘应为0,但是由于
R
R
R、
t
t
t有误差,因此不为0,则构建出了目标函数。