vins-mono前端(1)——图像光流追踪

vins-mono前端光流追踪节点详解
本文详细介绍了vins-mono前端的feature_tracker_node,包括参数设置、相机模型生成、img_callback中的图像处理(包括自适应直方图均衡、特征点提取与追踪、去除外点和特征点速度计算),以及与光流追踪法和特征点+描述子方法的对比。

目录

前言

feature_tracker_node详解

准备工作

img_callback()详解


前言

        在vins前端中主要包含图像光流追踪和imu预积分两部分。光流追踪主要是为了实现追踪相邻两帧图像的相同地图点信息,以供后端求解两帧图像之间的位姿变换。对于相邻两帧图像求得匹配的地图点有两种方案,一种是进行特征点提取,然后根据描述子进行特征匹配;另一种就是光流追踪法,基于灰度不变假设通过求解特征点的运动速度进而估计匹配的特征点像素坐标。在前端feature_tracker_node节点中,主要实现了该功能,还包含了一些其他的细节问题。在vins-fusion中,光流追踪放到了和后端优化同一个节点中。本篇内容详细介绍一下在前端光流追踪节点vins-mono都做了哪些工作。

feature_tracker_node详解

准备工作

         1.读取参数

        在前端中包含很多vins-mono的系统参数,这些参数是通过读取参数文件获得的。前端主要包含的参数如下面代码所示:

fsSettings["image_topic"] >> IMAGE_TOPIC;
    fsSettings["imu_topic"] >> IMU_TOPIC;
    MAX_CNT = fsSettings["max_cnt"];
    MIN_DIST = fsSettings["min_dist"];
    ROW = fsSettings["image_height"];
    COL = fsSettings["image_width"];
    FREQ = fsSettings["freq"];
    F_THRESHOLD = fsSettings["F_threshold"];
    SHOW_TRACK = fsSettings["show_track"];
    EQUALIZE = fsSettings["equalize"];
    FISHEYE = fsSettings["fisheye"];
    if (FISHEYE == 1)
        FISHEYE_MASK = VINS_FOLDER_PATH + "config/fisheye_mask.jpg";
    CAM_NAMES.push_back(config_file);

    WINDOW_SIZE = 20;
    STEREO_TRACK = false;
    FOCAL_LENGTH = 460;
    PUB_THIS_FRAME = false;

    if (FREQ == 0)
        FREQ = 100;

        从上到下依次是原始图像话题名称、imu数据话题名、提取特征点的最大个数、提取特征点的最小像素距离、图像的高度和宽度、前端发布的频率、ransac除杂的像素阈值、是否显示轨迹、是否进行直方图均衡标志位、鱼眼相机标志位。后面其他参数直接在程序里面设置,比较重要的是FOCAL_LENGTH=460,这是虚拟焦距,具体作用在后面有解释。

        2.生成相机模型

        通过trackerData[i].readIntrinsicParameter(CAM_NAMES[i])生成一个相机模型,先从参数文件读取相机类型,vins-mono中是针孔模型。然后再将参数文件中的相机参数赋给该相机模型,该过程在函数CameraPtr
CameraFactory::generateCameraFromYamlFile(const std::string& filename)完成。此外,该函数内还包含camera->setParameters(params)函数,主要是记录一些中间变量,这些中间变量是为了去畸变部分使用。

img_callback()详解

        该部分是前端处理的主要函数,实现的功能是计算出特征点的相关信息。

  • 第一帧图像进来,存储第一帧信息,不进行其他处理;
  • 判断图像时间流是否正常;
  • 控制发布频率小于100Hz;
  • 将ros格式图像转化成opencv格式;
  •  进入光流追踪及特征点相关信息计算,trackerData[i].readImage(ptr->image.rowRange(ROW * i, ROW * (i + 1)), img_msg->header.stamp.toSec());

        该函数第一个参数是确定图像的行的范围,这是为了双目做准备,对于单目相机i就是0,第二个参数是图像的时间戳。函数具体实现的功能下面详细介绍:

  • 自适应图像直方图均衡

        该部分主要是为了解决在过亮或过暗情况下特征点提取困难问题。然而,在vins-fusion版本中,该功能被作者去掉了,可能是对于光流追踪的实际效果增益不大另外比较耗时。

  • 第一帧图像,直接进行特
### VINS-Mono 前端实现 VINS-Mono 是一种基于单目相机和惯性测量单元(IMU)的视觉惯性里程计系统。其前端部分主要包括特征点检测、跟踪以及 IMU 数据预积分处理。 #### 特征点检测与跟踪 在 VINS-Mono前端模块中,`feature_tracker_node` 节点负责图像的处理。具体来说,该节点通过回调函数 `img_callback` 来接收并处理每一帧图像数据[^4]。在这个过程中,主要完成以下几个任务: 1. **特征点检测**: 使用 Harris 角点检测算法或其他类似的角点检测方法,在每张图像上提取稳定的特征点[^3]。 2. **追踪**: 利用 Lucas-Kanade (LK) 光流法对连续两帧间的特征点进行匹配和追踪[^2]。这一步骤能够估计相机的运动变化。 这些操作的结果会生成一组被成功追踪到的特征点及其对应的三维空间坐标信息。 #### IMU 预积分 除了视觉信息外,VINS-Mono 还利用了来自 IMU 的加速度计和陀螺仪读数来进行辅助定位。这部分由专门设计好的 imu_preintegration 工具包完成: - 对于接收到的一段时间内的所有 IMU 测量值,它会执行所谓的 “预积分” 操作来估算这段时间里设备整体位移情况(包括位置改变、速度增量及方向旋转角度)[^5]. - 此外还会同步维护一些必要的统计数值比如 Jacobian 和 Covariance Matrix ,以便后续阶段可以更好地调整参数设置达到最优解. 上述提到的功能共同构成了完整的 VINS-Mono 前端架构体系结构框架图如下所示: ```mermaid graph TD; A[Raw Image Input] --> B{Feature Detection}; C[Harris Corner Detector] --> D[LK Optical Flow]; E[Tracked Features Output] --> F(IMU Pre-integration); G[Accelerometer & Gyroscope Data] --> H[Integrate Measurements]; I[Delta Position/Velocity/Orientation Estimates] --> J[VINS Backend Optimization Inputs]; ``` --- ### 关于开发 Web 界面的可能性探讨 目前官方并没有提供针对 VINS-Mono 的专用Web界面解决方案;然而如果开发者希望构建这样一个平台,则可以从以下几方面入手考虑技术选型方案: 1. 将 ROS 中的数据发布订阅机制转换成 RESTful API 或 WebSocket 形式的接口服务供远程客户端访问请求; 2. 在浏览器端采用 Three.js 库渲染地图模型或者轨迹路径展示给最终用户查看分析结果; 3. 实现一套简单的控制面板允许修改配置文件选项而无需重新编译整个项目源码即可生效新的设定项。 需要注意的是这种类型的跨领域融合工程往往涉及到较多复杂度较高的环节因此建议先从小规模原型做起逐步完善功能直至满足实际需求为止。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值