s-msckf代码笔记(一)

s-msckf主要由image_processor跟msckf_vio两个节点组成。Image_processor中主要的算法位于ImageProcessor::stereoCallback()。一、前端图像处理image_processor::stereoCallback()接收双目图像数据,首先构建图像金字塔,用于光流跟踪、双目匹配,保存在curr_cam1_pyramid_,curr_...
摘要由CSDN通过智能技术生成

s-msckf主要由image_processor跟msckf_vio两个节点组成。

Image_processor中主要的算法位于ImageProcessor::stereoCallback()。

一 前端图像处理

image_processor::stereoCallback()接收双目图像数据,首先构建图像金字塔,用于光流跟踪、双目匹配,保存在curr_cam1_pyramid_,curr_cam1_pyramid_中,然后判断是否为第一帧。

1 视觉初始化

接收到的图像是第一帧,进行初始化initializeFirstFrame()。
initializeFirstFrame():
(1)把左图像均匀划分成若干个格子,默认参数是把左图像划分成4x4个格子。
(2)检测左图像中的fast特征。
(3)立体匹配stereoMatch(),保留匹配成功的点。(待详细)
(4)把左右相机匹配上的点cam0_inliers和cam1_inliers分配到预先划分的格子grid_new_features里,grid_new_features涉及的数据类型是:

struct FeatureMetaData {
    FeatureIDType id;
    float response;
    int lifetime;//连续跟踪次数
    cv::Point2f cam0_point;//左图像坐标
    cv::Point2f cam1_point;//右图像坐标
  };
  
typedef std::map<int, std::vector<FeatureMetaData> > GridFeatures;

图像中每个格子都有一个索引,在默认4x4个格子的情况下,从左上角到右下角的索引是0~15。对每个格子中的特征点,根据其相应值response排序,取前n个,最终的结果保存在curr_features_ptr变量中。

2 图像跟踪

接收到的图像不是第一帧,进行跟踪。
这部分的执行流程为:trackFeatures() —> addNewFeatures() —> pruneGridFeatures()。

2.1trackFeatures()

(1)在imu数据队列中找到上一帧图像时间对应的imu数据,并用一个迭代器指向它,再在imu数据队列里找到当前图像帧时刻对应的imu数据,再设置一个迭代器指向它。计算这段时间内的imu的平均角速度 I &NegativeThinSpace; ω ˉ {}^I\!\bar{\boldsymbol{\omega}} Iωˉ,然后计算这段时间内在相机坐标系下的平均角速度:
c 0 &NegativeThinSpace; ω ˉ = c 0 I &NegativeThinSpace; R I &NegativeThinSpace; ω ˉ c 1 &NegativeThinSpace; ω ˉ = c 1 I &NegativeThinSpace; R I &NegativeThinSpace; ω ˉ {}^{c_0}\!\bar{\boldsymbol\omega}={}_{c_0}^I\!\textbf{R}{}^I\!\bar{\boldsymbol{\omega}}\\ {}^{c_1}\!\bar{\boldsymbol\omega}={}_{c_1}^I\!\textbf{R}{}^I\!\bar{\boldsymbol{\omega}} c0ωˉ=c0IRIωˉc1ωˉ=c1IRIωˉ
对应代码:

 // Transform the mean angular velocity from the IMU
  // frame to the cam0 and cam1 frames.
  Vec3f cam0_mean_ang_vel = R_cam0_imu.t() * mean_ang_vel;
  Vec3f cam1_mean_ang_vel = R_cam1_imu.t() * mean_ang_vel;

计算旋转角度,得到当前帧相机位姿关于上一帧的旋转向量,再根据罗德里格斯公式得到旋转矩阵并转置,得到cam0_R_p_c,cam1_R_p_c。最后删除已经经过积分的这一段imu数据,释放内存。

(2)预测经过旋转后的特征点位置。根据上一步计算出来的cam0_R_p_c,cam1_R_p_c,记它们分别为 c 0 p &NegativeThinSpace; R {}_{c_0}^p\!\textbf{R} c0pR, c 1 p &NegativeThinSpace; R {}_{c_1}^p\!\textbf{R} c1pR。假设camera0中某特征点i在上一帧的像素坐标的齐次向量为
i p &NegativeThinSpace; P = ( u p v p 1 ) {}_i^p\!\textbf{P} = \begin{pmatrix} u_p \\ v_p \\ 1 \end{pmatrix} ipP=upvp1
则旋转后的像素坐标的齐次向量为:
i c &NegativeThinSpace; P = K c 0 p &NegativeThinSpace; R K − 1 = ( x i y i z i ) {}_i^c\!\textbf{P} = \textbf{K}{}_{c_0}^p\!\textbf{R}\textbf{K}^{-1}=\begin{pmatrix} x_i \\ y_i \\ z_i \end{pmatrix} icP=Kc0pRK1=xiyizi
i c &NegativeThinSpace; P ˉ {}_i^c\!\bar{\textbf{P}} icPˉ除以 z i z_i zi就可以得到旋转后的像素坐标:
i c &NegativeThinSpace; P ˉ = ( x i / z i y i / z i 1 ) {}_i^c\!\bar{\textbf{P}}=\begin{pmatrix} x_i/z_i \\ y_i/z_i \\ 1 \end{pmatrix} icPˉ=xi/ziyi/zi

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值