文章目录
本周任务及进展
\qquad 这周的任务是把PoseOptimation函数的优化方程推导出来;通过学习发现PoseOptimation函数中使用了BA的相关知识,向前递推前置知识点:BA——>DLA——>相机模型——>齐次方程。这周把知识点整个串了一便,并列出BA的优化方程及初始的计算思路。
一、齐次方程
1.两条直线能不能相交?
\qquad
“平面空间内的平行两条直线永不相交”,欧式(几何)空间内的两条平行直线是不会相交的。但是我们在日常生活中会遇到如下图的一种现象:道路两旁的车道线是平行的,越向远方两条线距离越近,最终在远方相交了。我们不去讨论这种现象设计到的透视空间原理,只关注结果:如果用几何坐标表示远处的那个点将是
(
∞
,
∞
)
(\infty, \infty)
(∞,∞),对于机器人来说没有任何意义。为了表示平行线在空间中无穷远位置相交为一个点,便有了齐次方程。
2.齐次坐标的具体表示
\qquad
齐次方程一句话来说就是用N+1维坐标来表示N维坐标。对于二维坐标
(
X
,
Y
)
(X,Y)
(X,Y),在齐次坐标下变为
(
x
,
y
,
w
)
(x,y,w)
(x,y,w),x与X,y与Y的关系如下:
X
=
x
w
X=\frac xw
X=wx
Y
=
y
w
Y=\frac yw
Y=wy
例如,二维坐标
(
2
,
3
)
(2,3)
(2,3),对应的齐次坐标可以为
(
2
,
3
,
1
)
(2,3,1)
(2,3,1)。
\qquad
为什么说可以为而不是一定为,是由于齐次坐标有一个很显著的特性:用一个常数去乘齐次坐标,其对应的几何坐标不变。
\qquad
例如:将刚才的齐次坐标同乘
5
5
5变为
(
10
,
15
,
5
)
(10,15,5)
(10,15,5),转换为几何坐标为
(
2
,
3
)
(2,3)
(2,3),所以可能见到的许多齐次坐标都对应同一个几何坐标。
\qquad
总结来说:把齐次坐标转化为笛卡尔坐标的方法是前面n-1个坐标分量分别除以最后一个分量即可。齐次坐标就是一个比例关系,多出来的一维让前两维有了不变成
∞
\infty
∞的意义。回到最开始的
(
∞
,
∞
)
(\infty,\infty)
(∞,∞)坐标,可以用
(
1
,
2
,
0
)
(1,2,0)
(1,2,0)来表示成齐次坐标,这样前两维就不用表示成无穷形式了。
二、相机模型
1.四个坐标系
1.1世界坐标系
如上图蓝色坐标系所示,世界坐标系就是现实场景中的坐标系,也是我们构建的点云排布的坐标系。记作:
P
w
=
{
x
,
y
,
z
}
P_w=\lbrace x,y,z \rbrace
Pw={x,y,z}
单位往往是米(m)
1.2相机坐标系
如上图红色坐标系所示,相机坐标系位于相机平面,可以简单的理解为相机的表面,其坐标原点为相机中心(根据相机不同位置可能不同)。记作:
P
c
=
{
x
,
y
,
z
}
P_c=\lbrace x,y,z \rbrace
Pc={x,y,z}
单位是米(m)
我们把相机坐标系和世界坐标系拿出来看看他们的关系:
不难看出这两个三维坐标系,只需要经过旋转和平移便可以重合,用数学模型表示为:
P
c
=
T
c
w
P
w
P_c=T_{cw}P_w
Pc=TcwPw
T
c
w
T_{cw}
Tcw为旋转平移矩阵,具体转化公式如下:
[
x
w
y
w
z
w
1
]
=
[
R
t
0
T
1
]
[
x
c
y
c
z
c
1
]
\begin{bmatrix} x_w \\ y_w\\z_w\\1 \\ \end{bmatrix}=\begin{bmatrix} R&t \\ 0^T&1 \\ \end{bmatrix}\begin{bmatrix} x_c \\ y_c\\z_c\\1 \\ \end{bmatrix}
⎣⎢⎢⎡xwywzw1⎦⎥⎥⎤=[R0Tt1]⎣⎢⎢⎡xcyczc1⎦⎥⎥⎤
1.3图像坐标系
图像坐标系是相机图像传感器(CMOS)所在平面的坐标系,相机通过小孔成像原理将三维世界映射为二维图像,这也就是相机坐标系转为图像坐标系的关键。
f
f
f为相机焦距,
y
c
y_c
yc和
z
c
z_c
zc为相机坐标系,
y
y
y为图像坐标系,图像坐标系的原点也为图像传感器的中心,数学模型表示为:
P
:
{
x
,
y
}
P:\lbrace x,y \rbrace
P:{x,y}
单位往往是毫米(mm)
根据图像我们可以把两个坐标系的关系表示出来:
z
c
f
=
x
c
x
=
y
c
y
\frac {z_c}{f}=\frac {x_c}{x}=\frac {y_c}{y}
fzc=xxc=yyc
通过
z
z
z和
f
f
f的比例关系来推出图像坐标系的
x
x
x和
y
y
y。
1.4像素坐标系
像素坐标系和图像坐标系是在同一平面上的,区别在于两个:1.坐标原点不同。2.坐标系单位不同。 对于第一点,如下图所示图像坐标系的原点为图像平面中心,像素坐标原点往往是图像平面的左上角。第二点,像素坐标系单位为像素(pixel),而图像坐标单位为毫米(mm)。
p
:
{
u
,
v
}
p:\lbrace u,v \rbrace
p:{u,v}
图像坐标转变为像素坐标就简单多了:
u
=
α
x
+
c
x
v
=
β
y
+
c
y
u=\alpha x+c_x \quad \quad \quad v=\beta y+c_y
u=αx+cxv=βy+cy
这里我有一个思考,
α
\alpha
α和
β
\beta
β应该是一样的,毕竟像素也是一个小方块,经过查到的一些资料,
α
\alpha
α和
β
\beta
β大多数时间并不相等,要受到相机本身的约束,有效像素这个概念说的就是会有一些像素点在成像的时候并不使用或是用来记录其他信息。
2.相机坐标系向像素坐标系的转换
把上面的式子带入得到我们最终的结果:
[
u
v
1
]
=
1
z
c
[
f
x
0
c
x
0
f
x
c
y
0
0
1
]
[
x
c
y
c
z
c
]
=
1
z
c
K
P
c
=
p
\begin{bmatrix} u \\ v\\1 \\ \end{bmatrix}=\frac 1 z_c\begin{bmatrix} f_x&0&c_x \\ 0 &f_x&c_y \\0&0&1\\ \end{bmatrix}\begin{bmatrix} x_c \\ y_c\\z_c\\ \end{bmatrix}=\frac 1 z_cKP_c=p
⎣⎡uv1⎦⎤=z1c⎣⎡fx000fx0cxcy1⎦⎤⎣⎡xcyczc⎦⎤=z1cKPc=p
这里的
K
K
K指的是相机的内参,也就是我们在图像坐标系转像素坐标系里面的平移和换算。
1
z
c
\frac 1 z_c
z1c这里可以省略变成:
K
P
c
=
p
KP_c=p
KPc=p
我们在齐次坐标系里面得出的结论:用一个常数去乘齐次坐标,其对应的几何坐标不变。
这里在最后思考一个问题:世界坐标系该怎么去选,我们怎么去知道相机坐标系和它之间的旋转和平移,有一个思路是相机开始工作的时候,来选取两个坐标系,让两个坐标系重合,换言之:相机初始位置为世界坐标系原点,坐标轴和相机坐标系重合。由于相机的运动是连续线性的,我们只需要关注每一时刻相机的移动就得出了
T
c
w
T_{cw}
Tcw矩阵了。
三、PnP模型(DLA法)
1.已知条件
我们拿相机去拍摄照片能得到什么信息:1.图像特征点的像素坐标。2.相机的内参。3.两张图中特征点的对应关系。4.第一张图的深度信息
Z
c
Z_c
Zc
我们要求的是旋转平移矩阵
T
c
w
T_{cw}
Tcw,求出该矩阵三维点的坐标自然也就求得了。
2.公式表示
我们回顾一下相机坐标系映射像素坐标的公式:
K
P
c
=
p
KP_c=p
KPc=p
接下来我们向世界坐标系做推广,也就是加上旋转平移矩阵
T
c
w
T_{cw}
Tcw:
p
=
[
u
v
1
]
=
1
z
c
[
f
x
0
c
x
0
f
x
c
y
0
0
1
]
[
x
c
y
c
z
c
]
=
1
z
c
K
T
c
w
P
c
p=\begin{bmatrix} u \\ v\\1 \\ \end{bmatrix}=\frac 1 z_c\begin{bmatrix} f_x&0&c_x \\ 0 &f_x&c_y \\0&0&1\\ \end{bmatrix}\begin{bmatrix} x_c \\ y_c\\z_c\\ \end{bmatrix}=\frac 1 z_cKT_{cw}P_c
p=⎣⎡uv1⎦⎤=z1c⎣⎡fx000fx0cxcy1⎦⎤⎣⎡xcyczc⎦⎤=z1cKTcwPc
我们来想想一种情况,相机在刚开始就捕获了一些特征点,此时
P
c
P_c
Pc和
P
w
P_w
Pw两个坐标系重合,也就是说我们在一开始就获得了特征点的三维坐标,在下一时刻我们捕获了相同的特征点,根据这个特征点我们可以算出此时的
T
c
w
T_{cw}
Tcw矩阵,而此时又发现了新的特征点,同样可以取得他们的三维点坐标,由此循环往复,所有的位姿信息都可以得到。
下一时刻的公式表示如下:
p
2
=
[
u
2
v
2
1
]
=
1
z
c
[
f
x
0
c
x
0
f
x
c
y
0
0
1
]
[
t
1
t
2
t
3
t
4
t
5
t
6
t
7
t
8
t
9
t
10
t
11
t
12
]
[
x
c
1
y
c
1
z
c
1
1
]
=
1
z
c
K
T
c
w
2
P
c
1
p_2=\begin{bmatrix} u_2 \\ v_2\\1 \\ \end{bmatrix}=\frac 1 z_c\begin{bmatrix} f_x&0&c_x \\ 0 &f_x&c_y \\0&0&1\\ \end{bmatrix}\begin{bmatrix} t_1& t_2& t_3& t_4 \\ t_5 & t_6& t_7 & t_8\\ t_9& t_{10}& t_{11}& t_{12}\\ \end{bmatrix}\begin{bmatrix} x_{c1} \\ y_{c1}\\z_{c1}\\1\\ \end{bmatrix}=\frac 1 z_cKT_{cw2}P_{c1}
p2=⎣⎡u2v21⎦⎤=z1c⎣⎡fx000fx0cxcy1⎦⎤⎣⎡t1t5t9t2t6t10t3t7t11t4t8t12⎦⎤⎣⎢⎢⎡xc1yc1zc11⎦⎥⎥⎤=z1cKTcw2Pc1
接下来就是求解
T
c
w
T_{cw}
Tcw,用多个匹配的特征点带入求得。
四、Bundel Ajustment(BA优化)
1.引入BA
我们可以根据DLA求出位姿信息,那么我们就可以得到第二帧的二维点坐标(根据位姿求得,不是真实点坐标):
p
2
=
1
z
c
2
K
T
c
w
P
w
2
p_2=\frac 1 z_{c2}KT_{cw}P_{w2}
p2=z1c2KTcwPw2
但是,算出来的p2一定精确吗,换句话说,我们求得的位姿一定精确吗,求解
t
i
t_i
ti时我们需要多个点来求解,难免有一些点匹配的不准确、质量低等等,也就是存在误差,出现下图中的情况,计算位置偏离了真实位置:
Bunbel Ajustment就是来解决这个问题,尽可能的去减少误差,优化位姿矩阵,甚至去优化三维点坐标。
往下继续做铺垫,我们回看最开始的等式,发现存在未知数
P
w
2
P_{w2}
Pw2第二时刻的变换矩阵,接下来把思路从世界坐标系转变成相机坐标系:相机运动是根据时间线性变化的。于是:
P
c
2
=
T
P
c
1
P_{c2}=TP_{c1}
Pc2=TPc1
2.优化方程
e = p 2 − 1 z c 2 K P c 2 = p 2 − 1 z c 2 K e x p ( ξ ! ) P c 1 e=p_2-\frac 1 z_{c2}KP_{c2}=p_2-\frac 1 z_{c2}Kexp(\xi ^!)P_{c1} e=p2−z1c2KPc2=p2−z1c2Kexp(ξ!)Pc1
-
e e e是定义的误差;
-
p 2 p_2 p2是第二时刻的真实像素坐标;
-
K K K是相机内参;
-
P c 2 P_{c2} Pc2是第二时刻的相机坐标;
-
ξ \xi ξ是旋转向量(李代数);
-
ξ ! \xi ^! ξ!是旋转向量的矩阵表达;
-
e x p ( ξ ! ) exp(\xi ^!) exp(ξ!)表达从向量(李代数)到矩阵(李 群)的对数映射。
这里回顾一下李群和李代数上的一些思想:李群(矩阵)对加法不封闭(无法求导),要通过对数映射转成李代数(可以求导)。
3.优化方程求解
我们要优化的就是旋转向量
e
x
p
(
ξ
!
)
exp(\xi ^!)
exp(ξ!),下面我们把它提出来:
E
(
ξ
⊕
+
Δ
ξ
)
=
e
T
(
ξ
⊕
+
Δ
ξ
)
Σ
−
1
e
(
ξ
⊕
+
Δ
ξ
)
E(\xi\oplus+\Delta\xi)=e^T(\xi\oplus+\Delta\xi)\Sigma^{-1}e(\xi\oplus+\Delta\xi)
E(ξ⊕+Δξ)=eT(ξ⊕+Δξ)Σ−1e(ξ⊕+Δξ)
对
e
(
ξ
⊕
+
Δ
ξ
)
e(\xi\oplus+\Delta\xi)
e(ξ⊕+Δξ)进行线性近似就等于
e
(
ξ
)
+
J
Δ
ξ
e(\xi)+J\Delta\xi
e(ξ)+JΔξ
接下来就是求雅各比矩阵
J
J
J了,也就是
e
e
e对
Δ
ξ
\Delta\xi
Δξ求导了。
∂
e
∂
Δ
ξ
=
∂
e
∂
P
c
2
∂
P
c
2
∂
Δ
ξ
\frac {\partial e} {\partial \Delta\xi}=\frac {\partial e} {\partial P_{c2}} \frac {\partial P_{c2}} {\partial \Delta\xi}
∂Δξ∂e=∂Pc2∂e∂Δξ∂Pc2