# lsd-slam源码解读第六篇:GlobalMapping
标签(空格分隔): lsd-slam
地图优化可以说是整个技术里面最简单的一部分了,核心其实就是g2o,可以看到这个里面代码也不多,总共加起来不到1000行,实际上就是这些工作,都是在为g2o服务
g2oTypeSim3Sophus
这个文件里面定义了图优化需要使用的基本定点class VertexSim3 : public g2o::BaseVertex<7, Sophus::Sim3d>和边class EdgeSim3 : public g2o::BaseBinaryEdge<7, Sophus::Sim3d, VertexSim3, VertexSim3>
在这之前,我们需要知道优化的对象是什么,请看论文中的公式
实际上可以从代码和论文中明白,优化的是sim3(顶点),代表的是相机坐标的位置,通过约束sim3((边),代表的是两个坐标之间的变换关系,他们是g2o的基本元素,请自行研究g2o库的使用方法,即明白这里的函数都有什么作用
TrackableKeyFrameSearch
这个类主要是用于查找可用可keyFrame的,让我们直接进入函数
TrackableKeyFrameSearch::findCandidates
不得不说这是一个返回值及其扭曲的函数,下面这么长一串全部是它的返回值
std::unordered_set<Frame*, std::hash<Frame*>,
std::equal_to<Frame*>,
Eigen::aligned_allocator< Frame* > >
看起来比较难受,其实是返回了一个hash_set,调用的是std::hash的方法吧指针hash,应该会调用这个模板(我没仔细看,不过十有八九是这个)
template<typename _Tp>
static size_t
hash(const _Tp& __val)
{ return hash(&__val, sizeof(__val)); }
比较方法是std::equal_to,实际上就是调用了下面这个模板
template<typename _Tp>
struct equal_to : public binary_function<_Tp, _Tp, bool>
{
bool
operator()(const _Tp& __x, const _Tp& __y) const
{ return __x == __y; }
};
最后一个是空间配置器