# 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要分开,方便后面调试,得到比较好的参数
#### 特技