有了C++的腿,便有了SLAM的路_c++

我等小白站在逐渐落成的SLAM大厦下,向上望去看到两朵乌云,一朵是算法数学,一朵是C++。用大大的话讲这两方面就好比“车之双轮,鸟之双翼”,要学好SLAM并将来从事SLAM相关的工作,这两方面的能力缺一不可。

学习视觉SLAM相关的算法原理,相信大家都知道那就是去看高博的《视觉SLAM十四讲》,一步步公式推得明明白白,充分理解通过视觉方法解决定位和建图问题的原理。那么SLAM工程师的另一条腿——C++,要如何学好精通呢?

有了C++的腿,便有了SLAM的路_c++语法_02

学习C++的书籍种类繁多并且每本书都内容充实,研究生期间几乎人手一本《C++ primer plus》,然鹅几乎都逃不过盖泡面垫显示器的下场。即使把这些厚实的书本都啃下来,却发现书中介绍的只是基础的语法,仅仅能够看懂示例代码。

而SLAM所需的C++水平,大抵要高于在书本上看到的那些示例代码。因为那些代码是作者用来向初学者介绍语法的,所以会尽量简单。而实际见到的代码往往结合了各种奇特的技巧,乍看起来会显得高深莫测。比方说你在书里看的是这样的:

int main ( int argc, char** argv ){ vector<string> vec;"abc");for ( int i=0; i<vec.size(); i++ )   {// ...   }return 0; }

然而实际的工程代码大概是这样的:

嵌套的模板类(g2o的块求解器)

g2o::BlockSolver< g2o::BlockSolverTraits<3,1> >::LinearSolverType* linearSolver = new g2o::LinearSolverDense<g2o::BlockSolver< g2o::BlockSolverTraits<3,1> >::PoseMatrixType>(); g2o::BlockSolver< g2o::BlockSolverTraits<3,1> >* solver_ptr = new g2o::BlockSolver< g2o::BlockSolverTraits<3,1> >( linearSolver );    g2o::OptimizationAlgorithmLevenberg* solver = newg2o::SparseOptimizer optimizer;   optimizer.setAlgorithm( solver );


C11新特性(来自SVO特征提取部分)

void{for(size_t i = 0; i < 5; ++i)if(key_pts_[i] != NULL)if(key_pts_[i]->point == NULL)NULL;
std::for_each(fts_.begin(), fts_.end(), [&](Feature* ftr){ if(ftr->point != NULL) checkKeyPoints(ftr); });}


高博看了都觉得头大:

有了C++的腿,便有了SLAM的路_c++_03

SLAM算法的工程实现之所以选择C++,在于其有很高的运行效率的优势。但我们学到的C++语法和工程中实际应用到的语句存在很明显的断层,那该如何消除这种断层呢?