# visual_lidar_slam **Repository Path**: learing8hard/visual_lidar_slam ## Basic Information - **Project Name**: visual_lidar_slam - **Description**: No description available - **Primary Language**: C++ - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-11-24 - **Last Updated**: 2021-12-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # visual_lidar_slam #### 介绍 本仓库是根据slam的学习,而后参考相应的开源项目实现的slam。 #### 软件架构 config feature camera frame map utils odometry #### 安装教程 1.g2o 图优化库,需要自己写雅可比矩阵,完成图优化问题 ceres是谷歌的一个优化问题求解器 sophus是线性代数库,支持李代数。依赖eigen库 eigen库是线性代数库 #### 使用说明 ## 问题 #### 类或stuct中定义自己的智能指针 在不需要初始化智能指针的时候,方便直接声明智能指针; 在使用智能指针时,可以避免只用vector等扩展内存时,导致的执行效率低下 #### c++工厂函数 其中的id是否需要? #### 什么时候使用struct和class 不进行大量算法操作,主要存数据时,使用struct; 需要进行大量算法运算时,使用类。 #### 限定作用域的枚举 #### 一些重要的固定量要设置为private,访问通过函数,且用const修饰 #### 特征点要区分为是否为成功跟踪的特征点,要注意如何区分 可以通过关联帧特征点的有无作为标志,也可以使用标志量 #### const可以修饰函数的默认参数 但是,const 一般修饰使用&的参数, #### 引用传参的好处,避免拷贝,对于内存较大的参数有好处,但是,对一内存较少的参数,则无意义 #### 写log,可以在log文件中,debug #### sophus需要fmt/core.hpp头文件。没有的话,所有的项目都会报错。 sophus编译的时候,可以不用fmt/core.hpp头文件。 直接apt安装libfmt-dev的时侯,没有core.hpp,估计是因为版本的问题。 一个解决方案是直接在sophus的源码中删除这个头文件include,然后,安装编译 当vscode发现头文件没有报错的时候,才会检查其他错误 #### map的使用 #### 按照关键帧为基础作为数据结构是不太好管理用于优化的图。因为去掉一个关键帧的时候,对应的landmark有可能还可以被其他关键帧观察到。 因此,正确的做法是将关键帧和landmark分开管理。landmark指向有关联的关键帧图像 #### landmark的三角化是使用双目约束实现的,得到landmark之后才能使用pnp(BA)求得下一帧的位姿 BA优化的过程中,设置landmark是不能用于优化的,当前帧的pose是唯一的优化变量。使用左目特征点,同时,landmark增加了当前帧左目特征点为新的观测约束,用于后端图优化的建立 #### 后端图优化约束有三角化该landmark的左右目,下一关键帧的左目等 #### 获得新关键帧之后,需要三角化除了已经被三角化后的landmark #### 由于没有使用特征匹配,而且也往往可能出现误对应的图像特征点。因此,在优化过程中,需要即使判断是否为外点 #### 关键帧需要有一定数量的匹配跟踪的特征点(不多,不少)。一般给地图关联类判断关键帧的处理,根据位姿条件。因为当删除了一个关键帧之后,还得判断是否需要删除landmark #### 图的数据结构 1.以帧(pose)管理,需要指向图像特征点,然后,特征点指向landmark。 2.以landmark管理,需要指向图像特征点,然后,特征点指向帧(pose)。 #### 帧,关键帧是包含一对左右目图像的数据结构 #### 判断是否为好的关键帧,滑动窗口排除不好的关键帧依据是通过SE3的李代数的6维向量的模长 #### 帧的位姿是用T_c_w 相对于当前相机的坐标系 #### BA需要判断图像特征点是否为outlier_,防止优化错误点 #### typedef shared_ptr Ptr;即使自己定义了,在其他地方使用也会报错 还是得用shared_ptr #### 结构体在其他文件声明,在本文件中使用,需要在前面声明struct Frame; #### c++14中使用g2o,要依赖ceres。 #### ros param 变量名问题 实际会带上node name的名字 #### 关键帧id和当前帧id要分开,方便后面调试,得到比较好的参数 #### 特技