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_;
}
/*之所以错误的原因是,忽略了平移的方向性,因此左乘旋转矩阵,就规定了它朝哪个方向旋转,这也符合真实的平移情况*/

我的理解是:先旋转后平移再加上原来的平移量才是真实的平移,如上注释。

单目视觉里程计的尺度问题的疑问?相关推荐

  1. 基于地平面的单目视觉里程计绝对尺度估计

    点云PCL免费知识星球,点云论文速读. 文章:Ground Plane based Absolute Scale Estimation for Monocular Visual Odometry 作者 ...

  2. 基于平面几何精确且鲁棒的尺度恢复单目视觉里程计

    标题:Accurate and Robust Scale Recovery for Monocular Visual Odometry Based on Plane Geometry 作者:Rui T ...

  3. 基于地面几何约束的单目视觉里程计精确鲁棒尺度恢复(ICRA 2021)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨paopaoslam 来源丨泡泡机器人SLAM 标题:Accurate and Robust S ...

  4. 单目视觉里程计性能估计

    单目视觉里程计性能估计 D3VO: Deep Depth, Deep Pose and Deep Uncertaintyfor Monocular Visual Odometry 论文地址:https ...

  5. 基于点线特征的激光雷达+单目视觉里程计

    标题:Lidar-Monocular Visual Odometry using Point and Line Features 作者:Shi-Sheng Huang1, Ze-Yu Ma1, Tai ...

  6. SLAM论文笔记-使用点和线特征的激光雷达-单目视觉里程计

    使用点和线特征的激光雷达-单目视觉里程计 首发在泡泡机器人slam公众号 标题:Lidar-Monocular Visual Odometry using Point and Line Feature ...

  7. 单目视觉里程计--基于视差角的单目视觉里程计MPVO

    单目视觉里程计–基于视差角的单目视觉里程计MPVO 图像预处理说明 在介绍本算法之前,先说明图像处理的基本知识.环境中的地图点,地图点的集合就是点云,地图点就是图像处理时的特征点.地图点在相机上的观测 ...

  8. DEMO: 一种单目视觉里程计的深度增强方法

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:robot L | 来源:知乎 https://zhuanlan.zhihu.com/p/149 ...

  9. SLAM | 使用三维位姿图优化减少单目视觉里程计(3D Visual Odometry)定位轨迹的漂移(附源代码)

    ===================================================== github:https://github.com/MichaelBeechan CSDN: ...

最新文章

  1. 工程师如何从技术转型做管理?
  2. python爬虫自学笔记分析解密_Python爬虫自学系列(七) -- 项目实战篇(一)
  3. linux运维入门第一周的学习部分命令!
  4. Vue学习(一)-邂逅Vuejs
  5. LeetCode 198 House Robber Python
  6. php获取当前整点时间_8.PHP的日期和时间
  7. 使用dockerfile自动化构建镜像
  8. springboot使用redis做session会话管理
  9. Node.js压缩与解压数据
  10. postgres复制数据库
  11. linux定时器无法重启pm2,在linux下开机启动pm2 不成功
  12. 媒体连接(2)...
  13. 数据结构 笔记--向量 C++ 语言版 邓俊辉老师
  14. WLC开机卡在launching....(变砖)
  15. 银行用计算机实现了,银行考试计算机专项练习(一)!!!.pdf
  16. netlogon启动后停止_【漏洞通报】微软NetLogon提权漏洞
  17. mysql 建表最佳实践
  18. NVM安装nodejs的方法
  19. HDFS常用命令汇总
  20. 12000字解读白小T:成立1年创收1亿,单品类策略如何引爆流行?

热门文章

  1. bzoj 1191: [HNOI2006]超级英雄Hero
  2. 安卓动画全解:补间动画(视图动画)、布局动画、属性动画、逐帧动画。动画Animation属性、Alpha属性、Scale属性、Translate属性、Rotate属性,动画集AnimationSet
  3. java解析xml文件:创建、读取、遍历、增删查改、保存
  4. Ubuntu虚拟机环境下安装Python3.6
  5. numpy与线性代数(简易版)
  6. Jmeter全局变量设置
  7. Selenium基础篇之5-第一个完整的自动化测试脚本
  8. Fildder之Mac安装
  9. HDU 2256(矩阵快速幂)
  10. Java 窗口菜单