点击上方“3D视觉工坊”,选择“星标”
干货第一时间送达
BA,即Bundle Adjustment,通常译为光束法平差,束调整,捆绑调整等。但高翔博士觉得这些译名不如英文名称来得直观,所以保留英文名,简称BA。
所谓BA,是指从视觉图像中提炼出最优的3D模型和相机参数。在视觉SLAM里,BA特征点法和直接法两种。前者是最小化重投影误差作为优化目标,后者是以最小化光度误差为目标。
对于特征点法BA,高翔博士所著的《视觉SLAM十四讲》第二版第九章作了非常详细的说明。对于直接法BA,在深蓝学院的课程《视觉SLAM理论与实践》中有用g2o求解的习题,但没有提到Ceres求解。而且,习题中给出的是双线性插值来得到图像点的灰度值。我们知道,直接法BA需要判断图像边界,而且Ceres对双线性插值是不能自动求导的。这都会增加代码实现的难度。
在课后作业里有一题要求用g2o实现直接法BA。相对来说g2o来说,我个人更喜欢用Ceres,毕竟Ceres是谷歌出品,而且,谷歌的非线性优化大多是用Ceres来解决的,功能和效率应该是值得我们信任的。
我们知道,Ceres是推荐我们尽可能使用自动求导的,一是准确性更有保障;二是求解更快速。所以,我们要寻找能实现自动求导的实现方法。
Ceres提供的Ceres的Grid2D和BiCubicInterpolator联合使用可以解决上述两个问题。Grid2D和BiCubicInterpolator的使用需要包含头文件cubic_interpolation.h。
Grid2D是无限二维网格的对象,可以用来载入图像数据,如果是灰度图,其值用标量,如果是彩色图像,其值用3维向量。由于网格的输入数据总是有限的,而网格本身是无限的,因为需要通过使用双三次插值BiCubicInterpolator来计算网格之间的值。而超出网格范围,则将返回最近边缘的值。
将灰度图像数据加载到Grid2D对象,可以避免我们在代码中判断图像边界的问题。而且,Grid2D还可以利用BiCubicInterpolator实现双三次插值,它相对于双线性插值的优点是能实现自动求导。利用它们写出的代码更简洁,执行效率也更高。
Grid2D对象和BiCubicInterpolator对象的定义:
std::unique_ptr关注打赏


微信扫码登录