slam

视觉SLAM十四讲(1)

蹲街弑〆低调 提交于 2019-12-02 05:57:04
视觉SLAM十四讲(1)——初识SLAM 初识SLAM 经典视觉SLAM框架 初识SLAM SLAM(simultaneous localization and mapping),中文译作“ 同时定位与地图构建 ”。它是指搭载特定传感器的主体,在没有环境先验信息的情况下(不需要在环境中安装传感器),于 运动过程中 建立环境的模型,同时估计自己的运动。 如果这里的传感器主要为相机,以一定的速率拍摄周围的环境,形成一个连续的视频流,那么就称为“ 视觉SLAM ”。 SLAM的目的是解决“ 定位 ”与“ 地图构建 ”这两个问题。也就是说,一边要估计传感器自身的位置,一边要建立周围环境的模型。 在什么地方?——定位(自身的状态) 周围环境是什么样?——建图(外在的环境) 单目相机——照片(三维空间的二维投影):无法通过单张照片来计算场景中物体与我们之间的距离,因此必须移动相机改变其视角才能估计它的运动。当相机移动时,相片中的物体在图像上的运动就形成了视差。通过视差就能知道物体的远近,但这只是一个相对值,无法确定真实尺度,称为“尺度不确定性”。 双目相机——通过两个相机之间的距离(基线)来估计每个像素的空间位置。通过左右眼的差异,判断场景中物体与相机的距离。缺点是计算量大,消耗计算资源,与基线关系大(基线距离越大,能够测量到的就越远)。优点是既可以用在室内,亦可应用与室外。 深度相机—

视觉SLAM十四讲-第四讲笔记

不想你离开。 提交于 2019-12-02 05:56:45
视觉SLAM14讲-第四讲笔记 优化问题 为什么使用李代数 :实际SLAM中,相机位姿R,T未知,需要进行估计,估计的过程可以看做最小误差的优化问题。由于旋转矩阵和变换矩阵有约束(正交、det=1),难以优化。转换成李代数,可以从有约束优化问题转变为无约束优化问题。 对于相机位姿T,观察到世界坐标系上的点P,在噪声w下,得到观测数据z。 z=Tp+w 得到误差: e=z-Tp 对于n个点,要估计位姿T,即找到最优的T,似的误差∑e最小化。 minJ(T)=∑e=∑(z-Tp) J为T的函数,要优化,则要计算J关于T的导数。R、T是群,没有良好的定义加法,作为普通矩阵则有约束。转为李代数,则有良好定义的加法,无约束。 群 群:只对一种运算封闭。 封结幺逆 。 旋转矩阵和变换矩阵属于SO(3)和SE(3)群,它们对乘法封闭,对加法不封闭。 李群:在群基础上连续。 李代数 ^:向量——>反对称矩阵 ˇ:反对称矩阵——>向量 李代数的定义 每个李群都有与之对应的李代数,描述了李群的 局部性质 (导数关系,可以表达李群中矩阵的的导数)。 组成: 集合V 数域F 二元运算 李代数SO(3)_ 哥特体打不出,用SO(3)_代表李代数,SO(3)代表李群 SO(3)_:3*1的向量。记为φ。φ对应的反对称矩阵,记为Φ。 ** SO(3)中的元素是旋转矩阵R,旋转矩阵不一定是反对称矩阵

视觉SLAM十四讲习题答案

余生颓废 提交于 2019-12-02 05:54:59
阅读《视觉SLAM十四讲》中遇到的问题及习题资源整理,或为原创,或来自网络,如有问题请与我联系,会在第一时间加以修正。 后来自己写完看到另一位写的 博客 ,相形见绌,大家可以互相结合的看。 第一讲 1.线性方程的解: 转载自宋洋鹏(youngpan1101) ,了解线性代数可关注B站 3Blue1Brown ,以及 线性代数 ,知乎上有其 精细笔记 。 2.高斯分布参考这位 博主Johnny-Cuii的文章 ,具体学习可去 四川大学概率论与数理统计。 参考链接: 1 | 2 | 3.C++的学习可参考C++Primer(第五版)STL 华山大师兄 。 4.以前用VS写。 5.参考C++11新特性 here。 6.这个 参考鸟哥的讲解 。 7.参考鸟哥1-2,5-8章节。 8.同上。 9.这个好多教程,参考 这位博主。 第二讲 1.文献[1]主要专注于对基于单目视觉的 SLAM 方法的分析和讨论, 系统地介绍和分析目前 3 类(基于滤波,关键帧BA,直接跟踪)主流单目 V-SLAM 方法的优缺点, 并对它们的代表性系统进行性能分析和比较.另外, 也介绍和讨论了 V-SLAM 技术的最新研究热点和发展趋势, 并进行总结和展望. 文献[14]从帧间配准、环形闭合检测以及图优化技术3方面出发, 对基于图优化的SLAM技术进行综述. 2.文献[9]将SLAM发展分为三个年代

ORBSLAM2的mono_euroc.cc

有些话、适合烂在心里 提交于 2019-11-30 16:41:35
概述:ORBSLAM2的mono_euroc.cc为单目SLAM系统的部分,其主要功能为:接收外部参数,初始化SLAM对象,将外部输入传入SLAM对象。 (1)外部参数   main函数接收四个输入,分别为ORBvoc.txt,EuRoC.yaml,euroc pictures的路径,euroc数据的时间戳文件。   分别用vector<string> vstrImageFilenames,vector<double> vTimestamps来存放每一张图片的路径与时间戳。 (2)系统初始化   ORBSLAM2在命名空间System中定义了一个SLAM类,ORBSLAM2对标准数据的整个处理过程都是在这个类中完成的。 (3)将标准数据逐帧传入SLAM对象   SLAM.TrackMonocular(im,tframe);   其中im是每帧图像对应的cv::Mat格式的数据,tframe是每帧对应的时间戳。    来源: https://www.cnblogs.com/npulzb/p/11604575.html

代码解读 | VINS 视觉前端

99封情书 提交于 2019-11-29 00:42:27
本文作者是计算机视觉life公众号成员蔡量力,由于格式问题部分内容显示可能有问题,更好的阅读体验,请查看原文链接: 代码解读 | VINS 视觉前端 vins前端概述 在搞清楚VINS前端之前,首先要搞清楚什么是SLAM前端? SLAM的前端、后端系统本身没有特别明确的划分,但是在实际研究中根据处理的先后顺序一般认为特征点提取和跟踪为前端部分,然后利用前端获取的数据进行优化、回环检测等操作,从而将优化、回环检测等作为后端。 而在VINS_MONO中将视觉跟踪模块(feature_trackers)为其前端。在视觉跟踪模块中,首先,对于每一幅新图像,KLT稀疏光流算法对现有特征进行跟踪。然后,检测新的角点特征以保证每个图像特征的最小数目,并设置两个相邻特征之间像素的最小间隔来执行均匀的特征分布。接着,将二维特征点去畸变,然后在通过外点剔除后投影到一个单位球面上。最后,利用基本矩阵模型的RANSAC算法进行外点剔除。 VINS_MONO原文中还将关键帧的选取作为前端分,本文暂不讨论, 后续文章会详细介绍。 VINS-Mono将前端封装为一个ROS节点,该节点的实现在feature_tracker目录下的src中,src里共有3个头文件和3个源文件: feature_tracker_node.cpp构造了一个ROS节点feature_tracker_node,该节点订阅相机图像话题数据后

综述 | 相机标定方法

跟風遠走 提交于 2019-11-28 20:16:32
本文作者蔡量力,公众号:计算机视觉life成员,由于格式原因,公式显示可能出问题,建议阅读原文链接: 综述 | 相机标定方法 另外推荐几个原创的号 计算机视觉,Python,自然语言处理、数据挖掘相关,汇总最新资源,学习更高效! ​ 在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数(内参、外参、畸变参数)必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在。 ​ 标定的目的主要为解决两个问题: ​ a、确定世界坐标系下三维空间点与像素平面像素点间的转换关系(内外参); ​ b、确定相机成像过程中的畸变系,用于图像矫正。 针孔相机模型 相机将三维世界中的坐标点(单位:米)映射到二维图像平面(单位:像素)的过程能够用一个几何模型来描述,其中最简单的称为 针孔相机模型 (pinhole camera model) ,其框架如下图所示: 其中,涉及到相机标定涉及到了四大坐标系,分别为: 像素坐标系

初始ROS之学习汇总

丶灬走出姿态 提交于 2019-11-28 08:15:06
准研一,暑假在北京一家公司实习,初步学习ROS,在公司里测试了许多机器人,在这里汇总分享一下,实习了俩月虽然学到了满多东西,但觉得自己也不算完全入门,只是对ROS有了初步的了解,实习到现在我掌握的最重要的一个技能应该就是自主学习能力了,Github ros.wiki等网站的学习以及资料查询能力;认识到自己最严重的不足是编程能力,ROS中大多使用c++和python,在初步入门之后尝试开发以及创新时编程能力成了我最大的障碍。 下面是一些自己接触的机器人,大都只是测试了其功能,基础中的基础… KINOVA 在公司里使用的是KINOVA JACO2系列的机械手臂,JACO系列总共有三种类型:按自由度分为4DOF, 6DOF, 7DOF三种;夹抓分为2指和3指;手腕有类型有球型和非球型等等。在功能包中的表示方式为:例j2n7s300表示JACO二代腕部非球型的7自由度3指机械臂。 KINOVA控制方式: 手柄控制 , GUI界面控制(与手柄相似) ROS功能包控制,MoveIt!(功能包地址 https://github.com/Kinovarobotics/kinova-ros)功能包内容较多,需要更加深入研究 机械臂通用:moveit_setup_assistant配置机械臂,控制真实机械臂时需要ros_control功能包(参考http://www.guyuehome.com/890

dependency ‘slam’ is not available when installing TM package

一笑奈何 提交于 2019-11-28 05:51:27
I was able to use the library(tm) in r without problem until today, when loading tm shows: library(tm) Loading required package: NLP Error in loadNamespace(i, c(lib.loc, .libPaths()), versionCheck = vI[[i]]) : there is no package called ‘slam’ Error: package or namespace load failed for ‘tm’ I thought this is a dependency issue and seek to reinstall package install.packages("tm") Warning in install.packages : dependency ‘slam’ is not available and then try to find slam : install.packages("slam") Warning in install.packages : package ‘slam’ is not available (for R version 3.2.4) I also tried

解放双手——相机与IMU外参的在线标定

♀尐吖头ヾ 提交于 2019-11-27 22:41:20
本文作者 沈玥伶,公众号:计算机视觉life,编辑部成员 一、相机与IMU的融合 在SLAM的众多传感器解决方案中,相机与IMU的融合被认为具有很大的潜力实现低成本且高精度的定位与建图。这是因为这两个传感器之间具有互补性:相机在快速运动、光照改变等情况下容易失效。而IMU能够高频地获得机器人内部的运动信息,并且不受周围环境的影响,从而弥补相机的不足;同时,相机能够获得丰富的环境信息,通过视觉匹配完成回环检测与回环校正,从而有效地修正IMU的累计漂移误差。 二、什么是相机与IMU外参? 足够准确的相机与IMU外参是实现相机与IMU融合的定位与建图的前提。相机与IMU之间的外参包括两部分: (1)相机与IMU之间的相对位姿 如下图所示,相机与IMU之间的相对位姿值的是相机坐标系和IMU坐标系之间的变换,包括相对旋转角和相对平移量。 相机坐标系坐标和IMU坐标系坐标之间满足如下变换关系: 将上式展开可以得到分别得到相机坐标系和IMU坐标系之间旋转角和平移量的变换关系: (2)相机与IMU之间的时间差 由于触发延时、传输延时的存在,传感器的采样时间和时间戳的时间不匹配,如下图所示,从而导致相机和IMU之间存在时间差td。 td用公式表示为: 将相机的时间戳平移td后,相机与IMU之间实现了同步。 三、为什么需要在线标定? 大部分同学都是从跑公开的数据集开始入门的

dependency ‘slam’ is not available when installing TM package

不想你离开。 提交于 2019-11-27 01:11:07
问题 I was able to use the library(tm) in r without problem until today, when loading tm shows: library(tm) Loading required package: NLP Error in loadNamespace(i, c(lib.loc, .libPaths()), versionCheck = vI[[i]]) : there is no package called ‘slam’ Error: package or namespace load failed for ‘tm’ I thought this is a dependency issue and seek to reinstall package install.packages("tm") Warning in install.packages : dependency ‘slam’ is not available and then try to find slam : install.packages(