单目视觉里程计的尺度问题的疑问?
SLAM是个坑…
经过一段时间对SLAM的了解,原来是我理解有错误,得到的尺度已经是统一的,只是不知道它的真实尺度是多少。
贴一个不错的视觉里程计简介的链接:
https://blog.csdn.net/gzj2013/article/details/100878053
关于下面代码中单目视觉里程计中尺度的理解:
https://github.com/yueying/LearningVO/blob/master/src/visual_odometry.cpp
截取片段:
double VisualOdometry::getAbsoluteScale(int frame_id)
{std::string line;int i = 0;std::ifstream ground_truth("C:/dataset/00/00.txt");double x = 0, y = 0, z = 0;double x_prev, y_prev, z_prev;// 获取当前帧真实位置与前一帧的真实位置的距离作为尺度值if (ground_truth.is_open()){while ((std::getline(ground_truth, line)) && (i <= frame_id)){z_prev = z;x_prev = x;y_prev = y;std::istringstream in(line);for (int j = 0; j < 12; j++) {in >> z;if (j == 7) y = z;if (j == 3) x = z;}i++;}ground_truth.close();}else {std::cerr<< "Unable to open file";return 0;}return sqrt((x - x_prev)*(x - x_prev) + (y - y_prev)*(y - y_prev) + (z - z_prev)*(z - z_prev));
}
从以上代码来看,数据集KITTI-00的真实值pose.txt,里面每行是12列数据,12列数据很容易想到是3个平移量和一个3x3的旋转矩阵,这样想没错,但是其排列方式却不是这样的,而是一个3*4的矩阵,其排列方式为一个增广矩阵:[R|t]
也就是说,每一行的最后一列数据为平移的t的数据。
那么是如何得到尺度因子的呢?众所周知,单目无法得到真实尺度的信息,不具有单位的概念,因此上面的基于单目的视觉里程计其尺度信息是来自于groundtruth的,也就是事先知道的真实尺度,如何计算:获取当前帧真实位置与前一帧的真实位置的距离作为尺度值。
也就是最后return的值,其实就是当前帧的(x,y,z)减去上一帧的(x,y,z)这个真实距离作为真实尺度。
只是我不明白为什么更新尺度的时候是这样计算的呢?
bool VisualOdometry::processFrame(int frame_id)
{double scale = 1.00;//初始尺度为1featureTracking(last_frame_, new_frame_, px_ref_, px_cur_, disparities_); //通过光流跟踪确定第二帧中的相关特征cv::Mat E, R, t, mask;E = cv::findEssentialMat(px_cur_, px_ref_, focal_, pp_, cv::RANSAC, 0.999, 1.0, mask);cv::recoverPose(E, px_cur_, px_ref_, R, t, focal_, pp_, mask);scale = getAbsoluteScale(frame_id);//得到当前帧的实际尺度if (scale > 0.1) //如果尺度小于0.1可能计算出的Rt存在一定的问题,则不做处理,保留上一帧的值{cur_t_ = cur_t_ + scale*(cur_R_*t);cur_R_ = R*cur_R_;}// 如果跟踪特征点数小于给定阈值,进行重新特征检测if (px_ref_.size() < kMinNumFeature){featureDetection(new_frame_, px_ref_);featureTracking(last_frame_, new_frame_, px_ref_, px_cur_, disparities_);}px_ref_ = px_cur_;return true;
}
其中第11行和第12行的代码我不是很懂,得到了实际尺度,为什么要那样更新呢?我本以为使用如下这样的更新方式就行了:
// 错误示范
if (scale > 0.1)
{cur_t_ = cur_t_ + scale*t;cur_R_ = R*cur_R_;
}
/*之所以错误的原因是,忽略了平移的方向性,因此左乘旋转矩阵,就规定了它朝哪个方向旋转,这也符合真实的平移情况*/
我的理解是:先旋转后平移再加上原来的平移量才是真实的平移,如上注释。
单目视觉里程计的尺度问题的疑问?相关推荐
- 基于地平面的单目视觉里程计绝对尺度估计
点云PCL免费知识星球,点云论文速读. 文章:Ground Plane based Absolute Scale Estimation for Monocular Visual Odometry 作者 ...
- 基于平面几何精确且鲁棒的尺度恢复单目视觉里程计
标题:Accurate and Robust Scale Recovery for Monocular Visual Odometry Based on Plane Geometry 作者:Rui T ...
- 基于地面几何约束的单目视觉里程计精确鲁棒尺度恢复(ICRA 2021)
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨paopaoslam 来源丨泡泡机器人SLAM 标题:Accurate and Robust S ...
- 单目视觉里程计性能估计
单目视觉里程计性能估计 D3VO: Deep Depth, Deep Pose and Deep Uncertaintyfor Monocular Visual Odometry 论文地址:https ...
- 基于点线特征的激光雷达+单目视觉里程计
标题:Lidar-Monocular Visual Odometry using Point and Line Features 作者:Shi-Sheng Huang1, Ze-Yu Ma1, Tai ...
- SLAM论文笔记-使用点和线特征的激光雷达-单目视觉里程计
使用点和线特征的激光雷达-单目视觉里程计 首发在泡泡机器人slam公众号 标题:Lidar-Monocular Visual Odometry using Point and Line Feature ...
- 单目视觉里程计--基于视差角的单目视觉里程计MPVO
单目视觉里程计–基于视差角的单目视觉里程计MPVO 图像预处理说明 在介绍本算法之前,先说明图像处理的基本知识.环境中的地图点,地图点的集合就是点云,地图点就是图像处理时的特征点.地图点在相机上的观测 ...
- DEMO: 一种单目视觉里程计的深度增强方法
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:robot L | 来源:知乎 https://zhuanlan.zhihu.com/p/149 ...
- SLAM | 使用三维位姿图优化减少单目视觉里程计(3D Visual Odometry)定位轨迹的漂移(附源代码)
===================================================== github:https://github.com/MichaelBeechan CSDN: ...
最新文章
- 工程师如何从技术转型做管理?
- python爬虫自学笔记分析解密_Python爬虫自学系列(七) -- 项目实战篇(一)
- linux运维入门第一周的学习部分命令!
- Vue学习(一)-邂逅Vuejs
- LeetCode 198 House Robber Python
- php获取当前整点时间_8.PHP的日期和时间
- 使用dockerfile自动化构建镜像
- springboot使用redis做session会话管理
- Node.js压缩与解压数据
- postgres复制数据库
- linux定时器无法重启pm2,在linux下开机启动pm2 不成功
- 媒体连接(2)...
- 数据结构 笔记--向量 C++ 语言版 邓俊辉老师
- WLC开机卡在launching....(变砖)
- 银行用计算机实现了,银行考试计算机专项练习(一)!!!.pdf
- netlogon启动后停止_【漏洞通报】微软NetLogon提权漏洞
- mysql 建表最佳实践
- NVM安装nodejs的方法
- HDFS常用命令汇总
- 12000字解读白小T:成立1年创收1亿,单品类策略如何引爆流行?
热门文章
- bzoj 1191: [HNOI2006]超级英雄Hero
- 安卓动画全解:补间动画(视图动画)、布局动画、属性动画、逐帧动画。动画Animation属性、Alpha属性、Scale属性、Translate属性、Rotate属性,动画集AnimationSet
- java解析xml文件:创建、读取、遍历、增删查改、保存
- Ubuntu虚拟机环境下安装Python3.6
- numpy与线性代数(简易版)
- Jmeter全局变量设置
- Selenium基础篇之5-第一个完整的自动化测试脚本
- Fildder之Mac安装
- HDU 2256(矩阵快速幂)
- Java 窗口菜单