1. 概述
通过“顶点”和“边”来定义一个优化问题:
(1)顶点需要包含如下信息:
变量
x
i
x_i
xi是什么类型的:
D
o
m
(
x
i
)
Dom(x_i)
Dom(xi);
变量
Δ
x
i
\Delta x_i
Δxi是什么类型的:
D
o
m
(
Δ
x
i
)
Dom(\Delta x_i)
Dom(Δxi);
如何通过
x
i
x_i
xi和
Δ
x
i
\Delta x_i
Δxi得到新的
x
i
x_i
xi:
⊞
:
D
o
m
(
x
i
)
×
D
o
m
(
Δ
x
i
)
→
D
o
m
(
x
i
)
\boxplus : Dom(x_i) \times Dom(\Delta x_i) \rarr Dom(x_i)
⊞:Dom(xi)×Dom(Δxi)→Dom(xi)
(2)边需要包含如下信息:
对于每一种类型的边,都代表error,需要满足:
D
o
m
(
Δ
x
i
1
)
×
D
o
m
(
Δ
x
i
2
)
.
.
.
D
o
m
(
Δ
x
i
n
)
→
D
o
m
(
z
i
)
Dom(\Delta x_{i1}) \times Dom(\Delta x_{i2})...Dom(\Delta x_{in}) \rarr Dom(z_i)
Dom(Δxi1)×Dom(Δxi2)...Dom(Δxin)→Dom(zi)。
当
x
i
⊞
Δ
x
i
x_i \boxplus \Delta x_i
xi⊞Δxi的结果完全满足观测量
z
i
z_i
zi时,上面的error应该等于0
(3)雅各比矩阵
在g2o的框架里,可以默认进行雅各比矩阵的数值求解。但还是推荐自己手推一个雅各比矩阵公式。
1.1 常用点和边类型
1.1.1 BaseVertex
需要指定:
(1)
x
i
x_i
xi和
Δ
x
i
\Delta x_i
Δxi的维度,是同一个数
(2)
x
i
x_i
xi的类型
(3) oplusImpl(double* v) 函数,也就是
⊞
\boxplus
⊞运算符,用来更新估计值_estimate,这个_estimate是一个vertex内部的成员变量
1.1.2 BaseUnaryEdge
需要指定:——下面的解释有问题
(1)对应的vertex的类型
(2)error的类型和维度
(3)computeError函数,将计算出的error存入 Eigen::Matrix类型的 _error变量当中
1.1.3 BaseBinaryEdge
需要指定:——下面的解释有问题
(1)对应的两个vertex的类型
(2)测量值measurement的类型和维度?
(3)compute error函数
这里是对的
重新解释一下:D是误差的维度,E是measurement的类型
这里D是误差维度,E是measurement类型,VertexXi 和VertexXj分别是两个顶点的类型