单目视觉里程计的尺度问题的疑问?

2023-05-16

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

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

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

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

  • VS Code的Git插件

    Visual Studio Code是微软公司推出的一款跨平台代码编辑 Edit 编译 Build 调试 Debug 工具 笔者认为其相当于是Sublime Text这款代码编辑器的升级版 集成了丰富的插件 xff0c 包括代码管理中极为常
  • Ubuntu缺少libncurses.so.5的解决办法

    执行arm none eabi gdb时候出错 xff1a arm none eabi gdb error while loading shared libraries libncurses so 5 cannot open shared
  • freeRTOS的任务抢占和时间片轮转

    实时操作系统的一个特点就是可以任务抢占 xff0c 高优先级的任务可以抢占比自己优先级低的任务 xff0c 如果新任务优先级和当前人任务优先级一样 xff0c 且在使能了时间片的方式的话 xff0c 二者以时间片的方式共享cpu xff0c
  • RH850 F1L freeRTOS 任务栈的切换

    pxCurrentTCB指向的任务块中 xff0c 有2个和栈相关的变量pxTopOfStack和pxStack pxTopOfStack指向当前堆栈栈顶 xff0c 随着进栈出栈 xff0c pxTopOfStack指向的位置是会变化的
  • opencv 3.0 图像去畸变 undistortion

    主要用到的是 initUndistortRectif yMap这个函数 在opencv中这个函数是用于 去除镜头畸变的图像拉伸 为了快速算法 xff1a 使用了坐标查找变和双线性差值的方法 先上结果图 原图 去畸变至全图 去畸变并保留最大图
  • 多传感器融合MSF算法源码阅读(三)

    文章目录 1 触发测量更新回调函数2 测量更新状态量3 总结 无人驾驶算法学习 xff08 六 xff09 xff1a 多传感器融合MSF算法 多传感器融合MSF算法源码阅读 一 多传感器融合MSF算法源码阅读 二 1 触发测量更新回调函数
  • 视觉VIO:S-MSCKF算法学习(一)

    文章目录 1 算法简介2 算法调试3 代码解读3 1 前端 ImageProcessor3 2 后端 Msckf Vio 1 算法简介 Mingyang Li博士于2007年提出MSCKF Multi State Constraint Ka
  • 无人驾驶算法学习(六):多传感器融合MSF算法

    文章目录 1 引言2 算法理论2 1 MSF基本模型2 2 预测2 3 测量与更新 3 核心代码分析4 代码实战 1 引言 本文的多传感器融合是建立在读懂 Quaternion kinematics for the error state
  • 多传感器融合MSF算法源码阅读(一)

    文章目录 1 代码框架1 1代码调用关系图 1 2主要函数调用关系图 2 posemsf阅读2 1程序入口 xff1a 2 2PoseSensorManager类 1 代码框架 论文解读 无人驾驶算法学习 xff08 六 xff09 xff
  • 通过launch文件修改订阅话题的两个操作

    文章目录 1 引言2 利用param修改话题2 利用remap修改话题 1 引言 在调试程序中需要经常修改订阅的话题 如果直接修改每次都要编译 在大型项目中这是难以想象的 所以利用launch中的param机制 通过修改launch文件进行
  • ubuntu下安装vnc出错(灰屏)

    我 win10 用的 vncviewer exe xff0c 在Ubuntu上首先需要安装vnc4server apt get install vnc4server 出现灰色屏幕和 型鼠标是因为vncserver找不到指定的图形化组件 xf
  • 51UWB单片机连接ESP8266实现Wifi接收串口数据

    UWB定位需要电脑读取UWB基站的串口数据来读取距离信息 xff0c 用wifi连接可以实现远程接收串口数据方便连接 这里记录一下如何让51UWB单片机接入WiFi模块ESP8266 前置条件 xff1a 单片机完成基站 xff08 RX
  • Qt中的三种基类

    一 QMainWindow xff1a QMainWindow类提供一个带有菜单条 xff0c 工具条和一个状态条的主应用程序窗口 主窗口通常提供一个大的中央窗口部件 xff0c 以及周围菜单 xff0c 工具条 xff0c 和一个状态栏
  • 如何理解强化学习中迭代线性-二次型调节器(ILQR)算法

    1 强化学习预备知识 xff08 1 xff09 状态 动作价值函数Q s a xff1a 在状态s xff0c 先立即执行动作a xff0c 后面所有的状态都按照最优动作进行执行 xff0c 所能获得价值之和 xff1b xff08 2
  • 字符串中字符查找函数:strchr,wcschr 及strrchr, wcsrchr函数

    xff08 1 xff09 char strchr const char string int c wchar t wcschr const wchar t string wchar t c Find a character in a st
  • C#中委托和事件的区别

    言简意赅的解释 先说总结 xff1a 事件就是委托链 xff08 也就是继承自MulticastDelegate类的委托 xff0c 用delegate声明的委托就是继承自MulticastDelegate类的 xff09 的属性 xff0
  • 采用python对基于moveit的机械臂不同功能操作

    此处对于机械臂的操作是实例类MoveGroupCommander xff08 是一个接口类 xff09 xff0c 其父类是move group xff0c 基本的关系大概就是这样的 类的继承关系如下 xff1a moveit的操作 xff
  • Gazebo系列教程 <构建一个机器人 2.2> 修改模型的外观与添加传感器

    1 修改模型外观 当sdf文件修改后然后保存 xff0c 在gazebo中insert时会自动更新模型文件 xff0c 所以在模型文件修改后 xff0c 不需要关闭然后再重新打开gazebo的 大概的意思就是将某个模型的外观属性 xff08
  • Gazebo系列教程< 构建一个机器人 2.3> 添加夹爪,并组成带有夹爪与传感器的小车

    1 制作一个夹爪 本文介绍通过sdf的编辑 xff0c 实现两指的简单夹爪 1 1制作模型 xff08 1 xff09 新建一个文件夹 mkdir simple gripper tutorial cd simple gripper tuto
  • vslam: 扫盲之旅

    ICCV研讨会 xff1a 实时SLAM的未来以及深度学习与SLAM的比较 http blog csdn net qq 18661939 article details 51919329 The Future of Real time SL

随机推荐

  • RLException: [XXX] is neither a launch file in package [XXX] nor is [XXX] a launch file name报错信息解决方法

    在运行roslaunch时出现了类似下面的错误 xff1a RLException mav hovering example launch is neither a launch file in package rotors gazebo
  • python音频播放问题解决方法

    获取音频 只是为了验证问题存在 xff0c 所以就提供了一个获取音频的方法 xff0c 就是白嫖了 根据有道翻译的发音获取到地址 xff1a https dict youdao com dictvoice le 61 auto amp au
  • 【随笔】Ubuntu远程桌面+Docker显示问题记录

    场景 xff1a 两台Linux主机 B主机需要远程桌面到A主机上运行程序 xff0c 需要运行的程序是跑在A主机的Docker里面的 需要实现的效果就是 xff0c A主机分一些资源给B主机来跑程序 xff0c B在跑程序的时候不能影响A
  • 树莓派4B SD卡烧录、安装 ubuntu mate 20.04 教程

    系统安装 一 下载系统镜像 默认是在树莓派4B上安装ubuntu mate系统 xff0c 当然可以安装其他的系统 xff0c 这里不做介绍 Ubuntu MATE是Ubuntu Linux官方的一个派生版 xff0c 基于桌面环境MATE
  • Movidus 神经计算棒 树莓派平台 ncsdk2.0 完全配置 及 一些问题

    配置之前的琐事和解决方法 之前配置了的1 x版本的ncsdk 错误百出 xff0c 于是有了另一篇文章就是纯API配置 xff0c 没有配完全版 经过我的测试 xff0c 用以下方法配置是可以用的 配置方法和下面的2 0类似 xff0c 不
  • 小猫爪:PMSM之FOC控制12-扩展卡尔曼滤波状态观测器解析

    小猫爪 xff1a PMSM之FOC控制12 扩展卡尔曼滤波状态观测器解析 1 前言2 卡尔曼滤波的原理2 1 卡尔曼滤波的思想2 2 卡尔曼滤波的过程 3 卡尔曼滤波和观测器的联系3 1 观测器的引入3 2 卡尔曼滤波在观测器的体现 4
  • git怎么合并两个分支

    git怎么合并分支代码 1 git 命令 注意 第一步你得把当前分支合到远程分支去才能有下面的操作 另外我是将develop分支代码合并到release分支去 1 推完代码到远程仓库查看本地分支 如果推错分支代码那么请将分支切到刚刚推送上去
  • 小猫爪:嵌入式小知识11-MPU详解及其应用

    小猫爪 xff1a 嵌入式小知识11 MPU详解及其应用 1 前言2 MPU简介3 MPU相关概念3 1 Memory Map3 2 MPU Region3 3 Region优先级3 4 Background Region3 5 Cache
  • MavSDK&Mavros学习笔记

    MavSDK amp Mavros学习笔记 Introduction MAVSDK Guide mavlink io GitHub mavlink MAVSDK源码 C 43 43 MAVSDK API reference paper Gi
  • Ubuntu realsenseSDK2安装方法

    分为两种 xff0c 这里只是Intel的翻译和个人安装记录总结 详细可以参看Intel realsenseSDK2的github仓库Release Intel RealSense SDK 2 0 v2 51 1 IntelRealSens
  • ROS☞通过两种方法提取.bag中的图像数据

    以下两种环境均在Ubuntu16 04环境下测试成功 第一种方法 ROS 从rosbag中提取图像 xff08 by launch文件 xff09 1 新建launch文件 xff08 文件在哪无所谓 xff0c 可以在catkin ws的
  • Git基础教程(二)

    使用Git删除文件 1 直接删除 可以使用rm命令删除文件 xff0c 如 xff1a rm welcome html 然后查看一下状态 xff1a 然后发现welcome html的状态为deleted xff0c 如果你真的想在git管
  • Git基础教程(三)

    Git分支 在git中使用分支非常简单 xff0c 只需要使用Git branch命令即可 xff1a git branch test 新建test分支 此时使用git branch查看一下分支 xff1a 此时的确多了一个分支 xff0c
  • Git基础教程(四)

    工作做到一半需要临时切换到别的任务 1 先commit当前的进度 简单的做法先保存当前的修改 然后切换到有问题的分级 xff0c 先完成别的功能 xff0c 然后切换回原来做到一半的develop分支 xff0c 执行reset命令 xff
  • jupyter notebook matplotlib绘制动态图并显示在notebook中

    有些时候matplotlib 的绘图没法显示在notebook中 xff0c 或者显示不了 这与backend有关 首先启动你的notebook xff0c 输入 pylab 查看你的matplotlib后端 xff0c 我的输出为 xff
  • 主机连接wifi,如何设置虚拟机上网方式

    主机是windows系统 xff08 win7 xff0c win10 xff09 xff0c 如果使用wifi上网 xff0c 虚拟机如何设置 xff1f xff1f 首先打开主机网络 xff08 如下所示 xff09 xff1a 1 点
  • VS2015断点调试方法

    备注 xff1a 部分图片 xff08 打马赛克的 xff09 转自百度 xff0c 侵删 xff01 果真被和谐了 xff0c 大家还是看这个网页吧 xff1a https jingyan baidu com album e75057f2
  • FreeRTOS 源代码的编程标准与命名约定

    一 编程标准 xff08 Coding Standard xff09 FreeRTOS 源代码遵守 MISRA Motor Industry Software Reliability Association 规范 与 MISRA 标准有出入
  • 特征匹配中OpenCV Dmatch类的用法解析以及非常详细的ORB特征提取与匹配解析

    首先说明一点 xff0c 在SLAM中进行特征提取和匹配时 xff0c 需要注意使用的OpenCV版本 xff0c 在使用OpenCV2 x版本时 xff0c 可以创建特征对象如下所示 xff08 省略了参数表 xff09 xff1a OR
  • 单目视觉里程计的尺度问题的疑问?

    SLAM是个坑 经过一段时间对SLAM的了解 xff0c 原来是我理解有错误 xff0c 得到的尺度已经是统一的 xff0c 只是不知道它的真实尺度是多少 贴一个不错的视觉里程计简介的链接 xff1a https blog csdn net