一、问题背景
- 个人理解觉得这是一个Bundle Adjustment的过程
- 引用《视觉SLAM十四讲》的一句话“在SLAM中,通常的做法是先使用P3P/EPnP等方法估计相机位姿,然后构建最小二乘优化问题对估计值进行调整(Bundle Adjustment)”。
- 这里“对估计值进行调整”可以用g2o,也可以用ceres进行图优化。
二、二维图优化
- 二维状态包含位置 pp (2维)和 角度 (1维 弧度制)
- 残差:a时刻→→b时刻之间预测值与测量值(p̂ ab,ψ̂ abp^ab,ψ^ab)的误差
- rab=[RTa(pb−pa)−p̂ abNormalize(ψb−ψa−ψab^)]rab=[RaT(pb−pa)−p^abNormalize(ψb−ψa−ψab^)]
- 【NOTE】
- Normalize()将角度限制在[-ππ, ππ)之间
- 需通过测量的不确定性对残差进行加权,即乘以一个协方差矩阵。
三、三维图优化
- 三维状态包含位置 pp (3维向量),方向 (4维向量 四元数)
- 残差:a时刻→→b时刻之间测量值(p̂ ab,q̂ abp^ab,q^ab)与预测值的误差。
- rab=[R(qa)T(pb−pa)−p̂ ab2.0vec((q−1aqb)q̂ −1ab)]rab=[R(qa)T(pb−pa)−p^ab2.0vec((qa−1qb)q^ab−1)]
- 【NOTE】
- 同样需要乘以协方差矩阵对残差进行加权。
- 有一点不能理解,就是方向q的残差部分,还是需要补充一下四元数的知识:-)
【补充】四元数(quaternion)
用四个数表示旋转
★★ 一维情况:+1表示向右走一个单元,-4表示向左走4个单元。
★★二维情况:3+4i表示先向左走3个单元,再向上走4个单元,i可以理解为逆时针转90度。如果你想旋转90度,可以乘以i。
★★三维情况:
1. 规则:i2=j2=k2=ijk=−1i2=j2=k2=ijk=−1
2. h=a+bi+cj+dkh=a+bi+cj+dk 与 h∗=a−bi−cj−dkh∗=a−bi−cj−dk共轭
3. 如果想绕v(v1,v2,v3)v(v1,v2,v3)轴旋转θθ,则h=(cos(θ2),v1∗sin(θ2),v2∗sin(θ2),v3∗sin(θ2))h=(cos(θ2),v1∗sin(θ2),v2∗sin(θ2),v3∗sin(θ2))
4. 假设想旋转空间点p(p1,p2,p3)p(p1,p2,p3),四元数为(0,x,y,z),则h·p·h∗h·p·h∗
5. 逆表示反方向旋转。