第一章
ros查看节点的链接状态rqt——graph
命令:运行vins fusion后运行如下命令:
rosrun rqt_graph rqt_graph
相机配置文件
主要包括相机的ros定义话题、相机的参数配置文件等,设置是否估计相机外参,相机到世界坐标系下的变换矩阵,特征跟踪相关(特征跟踪点数目、特征点之间最小距离等)
评估工具
evo
rpg_trajectory_evaluation
vins算法流程
源码组织架构
第二章
rosNodeTest.cpp
imu主要的数据是:
void imu_callback(const sensor_msgs::ImuConstPtr &imu_msg)//IMU
{
double t = imu_msg->header.stamp.toSec();//时间戳
double dx = imu_msg->linear_acceleration.x;//线加速度
double dy = imu_msg->linear_acceleration.y;
double dz = imu_msg->linear_acceleration.z;
double rx = imu_msg->angular_velocity.x;//角加速度
double ry = imu_msg->angular_velocity.y;
double rz = imu_msg->angular_velocity.z;
Vector3d acc(dx, dy, dz);//加速计的数据
Vector3d gyr(rx, ry, rz);//陀螺仪的数据
estimator.inputIMU(t, acc, gyr);//把三个数据传入到估计器中
return;
}
查看订阅者和发布者成员命令(没有可不用赋值)
rosmsg show sensor_msgs+需要看的东西
rosmsg show nav_msgs+需要看的东西
ros发布的代码-visualization.cpp
可视化的小相机、线段等绘制
读取配置文件后赋值
第三章
针孔相机模型
《视觉slam14讲》p99页
相机内参和外参:内参就是相机的焦距以及相机平面坐标系到像素坐标系的缩放及平移系数;外参就是世界坐标系下的p到相机坐标系下的变换矩阵
trackImage函数流程图(比较重要)
- 光流跟踪函数的参数:
函数的最终流程图:
特征提取与跟踪算法
- LK光流法:《视觉slam14讲》p207页
特征点
外点的剔除
- 这里为了加快外点的剔除速度,当status为0时,不管它,为1时,则向前提,这样不仅提高了速度,而且节省空间,在光流法中status为1表示特征点跟踪失败
- 一般进行正向和反向光流跟踪,如果像素点大于0.5,则删除
一个特征点包含的信息
- 归一化平面不太严谨
- 这里的成像平面的速度指的是像素的变换除以时间
均匀分布特征点
第四章
对极几何(求解R T)
《视觉slam14讲》p165
三角测量(恢复深度)
《视觉slam14讲》p177
PnP
假设空间点是不动的,通过调整相机位姿使其观测到的2维点更加对应3d点
BA
惯性测量单元
加速度计实现原理
胡克定律+牛顿第二定律
IMU建模(简化后)
- 注意:在自己设备进行IMU数据标定时需要注意离散时间和联系时间,必要时要对自己的设备进行转换
IMU标定工具
通过观测艾伦方差曲线得到IMU内参
一般相机与IMU标定外参的过程
由于之前的建模过程中很多误差项都是架设为理想状态而省略,因此在实际标定过程中的外参结果并不准确,因此通常采用以下步骤标定IMU的外参
第五章
VIO中的优化
Ceres优化
视觉惯性里程计部分estimator.cpp
重点:待优化变量的管理、初始化、残差项构建、optimization()、slidWindow()
基于紧耦合优化的滑动窗口优化
- 知道深度后(由于相机的外参是已知的,因此不需要讲世界坐标系下的3d点用xyz表示出来,直接用深度表示后可以方便计算),就能知道3d点的坐标
- 带估计量:x0-xn是相机的位置(因为imu和相机的外参已知,所以这里表示的既可以是相片估计的位置也可以是IMU估计的位置),xbc是相机的外参、λ是特征点的逆深度、td是时间偏移,xk是IMU的数据和两个零偏
- 边缘化后的先验:相机的优化误差是重投影误差,IMU?
- IMU残差项:IMU预积分
- 视觉残差项:重投影误差
滑窗策略
防止相机在静止过程中导致整个滑窗全是该静止时候的相片
三角化和pnp实现初始值
深度初始值通过三角化得到,相机初始值通过pnp得到
视差
其实就是这一帧像素左边-上一帧像素坐标
一些特征点管理的函数
Estimator主要代码流程梳理
- 这里可以修改,假如相机有60hz,可以把2改成6来降低计算
非线性优化
前提必须掌握的知识
《视觉slam14讲》高斯牛顿法
链接: 高斯牛顿法代码
ceres求解的步骤
- 定义每个参数块
- 定义残差块的计算方式
- 残差块需要定义雅可比矩阵的计算方式(自动或手写),自动求导需要指定误差项和优化变量的维度
- 把所有的参数块和残差块加入Ceres定义的Problem对象中
视觉salm的ceres求解
链接: ceres
必要的知识
视觉残差项的构建
注:以单目+IMU为例,在vins fusion中,重投影误差指的是特征3d点的第一帧在其他帧上的投影之间的差
视觉残差计算的推导(同一目不同帧)
- 残差:二维
- 待估计量:两帧的PQ(位置和姿态)、该目与IMU的外参、该特征点的逆深度、时间偏移
- 观测量:特征点在两帧上的像素坐标、特征点在成像平面上的速度、两帧时刻算出的时间偏移
- 时间偏移计算?
- 式中的经典过程是将第i帧的像素坐标乘深度后通过变换矩阵到IMU坐标系下,在乘变换矩阵到世界坐标系下,通过成变换矩阵的逆得到该点在第J帧的IMU坐标系,在乘变换矩阵的逆得到该点在第J帧的像素坐标,观测的像素坐标与转换的像素坐标作差,即可得到视觉残差
- 这个步骤主要在factor文件夹下的projectionOneFrameTwoCamFactor.cpp文件
视觉残差对应雅可比的推导(同目不同帧)
- 残差对待估计量求偏导组成雅可比矩阵
- 注意:此处的推导可以参考《视觉slam14讲》中的p186
imu残差
有点难,暂时没推导
初始化
vins初始化流程
- 如果是双目则不需要以上模块了
IMU初始化第一帧的姿态
- 通过这段时间加速度求解重力方向,得到z轴与重力方向的夹角,进而转换为世界坐标系的坐标,但是通常假设这个过程稿是做了一个匀速运动,因此得到的结果并不准确
回环检测