VINS(二)Feature Detection and Tracking

2023-05-16

系统入口是feature_tracker_node.cpp文件中的main函数

1. 首先创建feature_tracker节点,从配置文件中读取信息(parameters.cpp),包括:

  • ROS中发布订阅的话题名称;
  • 图像尺寸;
  • 特征跟踪参数;
  • 是否需要加上鱼眼mask来去除边缘噪点;

%YAML:1.0

#common parameters
imu_topic: "/imu0"
image_topic: "/cam0/image_raw"

#camera calibration 
model_type: PINHOLE
camera_name: camera
image_width: 752
image_height: 480
distortion_parameters:
   k1: -2.917e-01
   k2: 8.228e-02
   p1: 5.333e-05
   p2: -1.578e-04
projection_parameters:
   fx: 4.616e+02
   fy: 4.603e+02
   cx: 3.630e+02
   cy: 2.481e+02

# Extrinsic parameter between IMU and Camera.
estimate_extrinsic: 1   # 0  Have an accurate extrinsic parameters. We will trust the following imu^R_cam, imu^T_cam, don't change it.
                        # 1  Have an initial guess about extrinsic parameters. We will optimize around your initial guess.
                        # 2  Don't know anything about extrinsic parameters. You don't need to give R,T. We will try to calibrate it. Do some rotation movement at beginning. 
ex_calib_result_path: "/config/euroc/ex_calib_result.yaml"  # If you choose 1 or 2, the extrinsic calibration result will be written vins_folder_path + ex_calib_result_path.                        
#If you choose 0 or 1, you should write down the following matrix.
#Rotation from camera frame to imu frame, imu^R_cam
extrinsicRotation: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [0, -1, 0, 
           1, 0, 0, 
           0, 0, 1]
#Translation from camera frame to imu frame, imu^T_cam
extrinsicTranslation: !!opencv-matrix
   rows: 3
   cols: 1
   dt: d
   data: [-0.02,-0.06, 0.01]

#feature traker paprameters
max_cnt: 150            # max feature number in feature tracking
min_dist: 30            # min distance between two features 
freq: 10                # frequence (Hz) of publish tracking result. At least 10Hz for good estimation. If set 0, the frequence will be same as raw image 
F_threshold: 1.0        # ransac threshold (pixel)
show_track: 1           # publish tracking image as topic
equalize: 1             # if image is too dark or light, trun on equalize to find enough features
fisheye: 0              # if using fisheye, trun on it. A circle mask will be loaded to remove edge noisy points

#optimization parameters
max_solver_time: 0.04  # max solver itration time (ms), to guarantee real time
max_num_iterations: 8   # max solver itrations, to guarantee real time
keyframe_parallax: 10.0 # keyframe selection threshold (pixel)

#imu parameters       The more accurate parameters you provide, the better performance
acc_n: 0.2          # accelerometer measurement noise standard deviation. #0.2
gyr_n: 0.02         # gyroscope measurement noise standard deviation.     #0.05
acc_w: 0.0002         # accelerometer bias random work noise standard deviation.  #0.02
gyr_w: 2.0e-5       # gyroscope bias random work noise standard deviation.     #4.0e-5
g_norm: 9.81007     # gravity magnitude


#loop closure parameters
loop_closure: 1   #if you want to use loop closure to minimize the drift, set loop_closure true and give your brief pattern file path and vocabulary file path accordingly;
                     #also give the camera calibration file same as feature_tracker node
pattern_file: "/support_files/brief_pattern.yml"
voc_file: "/support_files/brief_k10L6.bin"
min_loop_num: 25  

该config.yaml文件中的其他参数在vins_estimator_node中被读取,属于融合算法的参数。

  • 优化参数(最大求解时间以保证实时性,不卡顿;最大迭代次数,避免冗余计算;视差阈值,用于选取sliding window中的关键帧);
  • imu参数,包括加速度计陀螺仪的测量噪声标准差、零偏随机游走噪声标准差,重力值(imu放火星上需要改变);
  • imu和camera之间的外参R,t;可选(0)已知精确的外参,运行中无需改变,(1)已知外参初值,运行中优化,(2)什么都不知道,在线初始化中标定
  • 闭环参数,包括brief描述子的pattern文件(前端视觉使用光流跟踪,不需要计算描述子),针对场景训练好的DBow二进制字典文件;

2. 监听IMAGE_TOPIC, 有图像信息发布到IMAGE_TOPIC上时,执行回调函数:


ros::Subscriber sub_img = n.subscribe(IMAGE_TOPIC, 100, img_callback);  

 

 

3. img_callback()

前端视觉的算法基本在这个回调函数中,步骤为:

  1. 频率控制,保证每秒钟处理的image不多于FREQ;

  2. 对于单目:

    1). readImage;

    2). showUndistortion(可选);

    3). 将特征点矫正(相机模型camodocal)后归一化平面的3D点(此时没有尺度信息,3D点p.z=1),像素2D点,以及特征的id,封装成ros的sensor_msgs::PointCloud消息类型; 

  3. 将处理完的图像信息用PointCloud和Image的消息类型,发布到"feature"和"feature_img"的topic:


pub_img = n.advertise<sensor_msgs::PointCloud>("feature", 1000);
pub_match = n.advertise<sensor_msgs::Image>("feature_img",1000);  

 

4. 包含的视觉算法:

1. CLAHE(Contrast Limited Adaptive Histogram Equalization)


cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE(3.0, cv::Size(8, 8));  

2. Optical Flow(光流追踪)


cv::calcOpticalFlowPyrLK(cur_img, forw_img, cur_pts, forw_pts, status, err, cv::Size(21, 21), 3);  

3. 根据匹配点计算Fundamental Matrix, 然后用Ransac剔除不符合Fundamental Matrix的外点


cv::findFundamentalMat(un_prev_pts, un_forw_pts, cv::FM_RANSAC, F_THRESHOLD, 0.99, status);  

4. 特征点检测:goodFeaturesToTrack, 使用Shi-Tomasi的改进版Harris corner


cv::goodFeaturesToTrack(forw_img, n_pts, MAX_CNT - forw_pts.size(), 0.1, MIN_DIST, mask);  

 特征点之间保证了最小距离30个像素,跟踪成功的特征点需要经过rotation-compensated旋转补偿的视差计算,视差在30个像素以上的特征点才会去参与三角化和后续的优化,保证了所有的特征点质量都是比较高的,同时降低了计算量。

转载于:https://www.cnblogs.com/shang-slam/p/7045573.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VINS(二)Feature Detection and Tracking 的相关文章

  • 检测图像是否嵌入

    我开始编写自己的图像主机 但我有一个小问题 如果您通过浏览器直接查看链接 例如 Domain com img 123 我想显示一个 HTML 页面 如果您通过以下方式嵌入链接 我想显示一个图像 img src Domain com img
  • 使用 Android 相机识别颜色

    目前正在从事一项有关 Android 颜色检测的学术项目 我正在尝试使用 Android 相机在实时预览期间或拍照后检测颜色 我正在寻找类似这张图片的东西 这是颜色抓取安卓应用程序截图 基本上我想将每种颜色识别为特定的一种颜色 让我们举个例
  • 从网页检测我自己的 Firefox 扩展

    我正在尝试找到一种简单的方法来检测我的扩展程序是否安装在 Firefox 3 6 中 这应该从网页完成 可能使用 JavaScript 我读过很多博客 说我应该尝试从我的扩展程序加载图像 由于我拥有该扩展 并且我可以编写代码 因此这似乎是不
  • 是否可以通过JavaScript检测插件是否激活?

    这样我通常会检测插件 例如Flash播放器 for var el in navigator plugins if navigator plugins el name navigator plugins el name toLowerCase
  • 在 Woocommerce 3 中的客户电子邮件通知上设置跟踪号码链接

    我已经设法将其整合在一起 现在我正在尝试将输入到自定义字段 保存到订单 中的数字链接到订单电子邮件中 这是代码 create the metabox add action add meta boxes bdev add postnord m
  • 二维等距网格中的点击检测?

    我从事网络开发已经很多年了 我正在慢慢地参与游戏开发 对于我当前的项目 我有这个等轴测图 我需要使用算法来检测正在单击哪个字段 顺便说一句 这一切都是在浏览器中使用 Javascript 实现的 The map看起来像this https
  • 跟踪电子邮件以真实图像打开

    我正在考虑将电子邮件跟踪添加到我为小型客户企业构建的网络服务中 我打算做嵌入式图像解决方案 参考我服务器上的图像 除非其他人有更好的方法 但是当我使用图像标签引用服务器上的 PHP 页面时 它会加载 损坏的图像 图标 我怎样才能使它成为有效
  • Android 和 OpenCV:考虑相机本质和反向投影的相机姿势单应性

    库 OpenCV 目标 Android OpenCV4Android 我尝试计算世界平面 例如监视器屏幕 的单应性以获取相机姿势 对其进行变换并将点重新投影回以进行跟踪任务 我使用 OpenCVs findHomography getPer
  • 检测 Windows Phone 7 是否连接到桌面 Zune 软件

    我已经在 Windows Phone 7 应用程序上工作了几个月 并且拥有一组有用的检测标志 这些标志用于测试代码是否在模拟器中 后台 前台线程上或在设计时间 看完整列表在这里 http silverlightzxing codeplex
  • 锁屏下追踪加速度计

    是否可以在锁定屏幕下跟踪加速度计值 我设法编写了一个简单的应用程序 它使用计时器从 1 计数到 100 该计时器触发一个事件 在该事件上我递增计数器 但是 当我为加速度计的 ReadingChanged 事件注册一个处理程序时 一旦屏幕锁定
  • 如何在 Firefox for Android 中检测 Android 的版本号?

    对于网站 如果用户使用 Android 4 设备 我们希望在 Play 商店中显示链接 我们测试的所有浏览器都在其用户代理字符串中发送 Android 版本号 除了 Firefox for Android Firefox 只是发送这个 Mo
  • 如何跟踪 SQL 更新的进度?

    假设我有一个更新 例如 UPDATE db1 sc1 tb1 SET c1 LEFT c1 LEN c1 1 WHERE c1 like 此更新基本上将遍历数百万行并修剪冒号 如果 c1 列中有冒号 我如何跟踪表中的进展情况 Thanks
  • 如何检测 Android 设备麦克风中的打击

    如何检测用户何时向设备麦克风吹气 然后 这将用于触发应用程序的某些操作 检测用户何时向麦克风吹气的工作可分为两部分 1 从麦克风获取输入 2 监听吹气声音 向麦克风吹气的噪音 声音由低频声音组成 我们将使用低通滤波器来减少进入麦克风的高频声
  • 如何判断 HTML5 音频元素是否正在使用 Javascript 播放

    我有一个audio网页中的元素 我想确保用户在离开页面时不会仍在播放它 我怎样才能确定audio页面卸载时元素未播放 到目前为止 我有以下代码 但它似乎不起作用 卸载报告时弹出的对话框playing is false即使音频正在播放
  • Harris & Stephens 角点检测算法:行列式始终为 0(零)

    作为我的学士论文的一部分 我正在尝试使用 Harris 和 Stephens 算法实现角点检测器 组合角点和边缘检测器 http www bmva org bmvc 1988 avc 88 023 pdf 我确实计算过 使用 sobel 滤
  • C#:GPS跟踪系统[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何在 C net 中构建带有移动设备 带 GPS 的 GPS 跟踪系统 场景是 通过支持 GPS 的手机跟踪用户 服务工程师 这里没
  • 如何检测当前的 JSF 版本?

    我正在开发 jsf webapp 现在我需要知道我正在使用什么 JSF 版本 我在哪里可以查到这个 提前致谢 您的意思是 以编程方式 你可以从Package getImplementationVersion http docs oracle
  • 如何检测数据库类型?

    我需要确保我连接的数据库是 MySQL 而不是 PostgreSQL 或 Microsoft SQL Server 我怎样才能知道正在使用哪种类型的数据库 第一个提示可能是如果您尝试使用 mySQL 数据库驱动程序连接到 PostgreSQ
  • 自动跟踪算法

    我正在尝试写一个simple跟踪例程来跟踪电影中的某些点 本质上我有一系列 100 帧长的电影 在黑暗背景上显示一些亮点 我每帧有大约 100 150 个点 它们在电影的过程中移动 我想跟踪它们 所以我正在寻找一些有效的 但可能不会过度实施
  • 没有第三方 cookie 的跨域用户跟踪?

    跨域网络跟踪服务是如何实现的 例如 行为广告 现在大多数人都在禁用第 3 方 cookie 的情况下浏览 更明确地说 第三方跟踪服务如何识别对不同域的两个请求来自同一个人 我想到了一些选择 Maybe 基于 iframe 的 通过将第三方跟

随机推荐