当前位置: 首页 > 编程日记 > 正文

视觉惯性SLAM: VI ORB-SLAM

视觉惯性SLAM: VI ORB-SLAM

这篇博客

之前看了VI ORB-SLAM的论文,现在终于有时间来写论文的学习笔记(不容易啊)。因为这是第一次看视觉惯性SLAM论文,所以写这篇博客来详细地记录一下,以后发现问题会再做修改。话不多说,直接进入正题。
【转载声明】本篇文字均为原创,如转载请注明出处

视觉惯性SLAM

只使用相机或惯性元件(IMU)传感器搭建的SLAM系统会存在诸多问题。因为相机虽然可以很好地完成闭环检测和定位,但是它易受到模糊等影响,所以运动速度不能过快。而IMU却可以在速度较快,或周围环境纹理较少时完成定位操作。不过它不能实现闭环检测,且很容易产生漂移现象(因为存在加速度偏差和陀螺仪偏差:即使IMU元件不动,测量值也可能不为0)。
 这么看来这两个传感器的功能刚好能够互补,用相机来帮助IMU消除累积误差,并完成闭环检测;用IMU帮助相机解决在纹理少、运动快的情况下的定位问题。因此,视觉惯性SLAM也就诞生了。
 VI ORB-SLAM是由ORB-SLAM和IMU模块组成,它的大部分环节功能和ORB-SLAM是相似的,所以相似部分之后就不会过多地介绍。

预备知识

符号说明:

这里提前说一些之后会在公式中使用的符号和变量。
1、惯性传感器(IMU)的坐标系记为:BBB (Body)
2、相机传感器的坐标系记为:CCC(Camera)
3、世界坐标系记为:WWW
4、IMU中的加速度偏差:bab_{a}ba
5、IMU中的陀螺仪偏差:bgb_{g}bg
6、IMU中两次测量值之间的时间间隔:Δt
7、IMU在世界坐标系中的方向:RWBR_{WB}RWB(从B坐标系到W坐标系的旋转矩阵)
8、将B坐标系的速度在W坐标系中表示:WVB_{W}V_{B}WVB
9、将B坐标系的位置在W坐标系中表示:WPB_{W}P_{B}WPB(B到W坐标系之间的平移变换)
10、重力加速度:gWg_{W}gW
11、重力方向:gW^=gW∗∥gW∗∥\hat{g_{W}}=\frac{g_{W}^{*}}{\left \| g_{W}^{*} \right \|}gW^=gWgW
12、重力的大小GGG
13、IMU测得的加速度大小:aBa_{B}aB
14、IMU测得的角速度大小:wBw_{B}wB
15、B坐标系到相机坐标系的变换矩阵:TCB=[RCB∣CPB]T_{CB}=[R_{CB} | _{C}P_{B}]TCB=[RCBCPB]

相机投影变换矩阵

基于小孔成像模型来算出相机坐标系与像素坐标系之间的变换矩阵,并定义投影函数π\piπ:
π(XC)=[fuXCZC+cufvYCZC+cv],XC=[XCYCZC]T.............(1)\pi(X_{C})=\begin{bmatrix} f_{u}\frac{X_{C}}{Z_{C}}+c_{u}\\ f_{v}\frac{Y_{C}}{Z_{C}}+c_{v} \end{bmatrix} ,X_{C}=[ X_{C} Y_{C} Z_{C}]^{T}.............(1)π(XC)=[fuZCXC+cufvZCYC+cv],XC=[XCYCZC]T.............(1)
式中 [fu,fv]T[f_{u},f_{v}]^{T}[fu,fv]T表示焦距长度,[cu,cv][c_{u},c_{v}][cu,cv]表示主点位置。它们的单位都为像素。

IMU数据更新方程

更新的量有三个:R,p,vR,p,vRpv。更新的公式如下:

这个公式是从参考文献[1]中获得的,表示的是前后两帧之间的变量关系(和参考文献[1]不同的是,这里忽略了噪声对角速度、加速度测量值的影响)。这是之后实现IMU数据预积分的基础。

IMU数据的预积分

预积分就是计算出两相邻帧或关键帧之间的IMU数据的总变化量(ΔR,Δp,Δv)(ΔR,Δp,Δv)ΔRΔpΔv,它由相邻帧或关键帧之间所有的IMU测量数据叠加后获得。在VI ORB-SLAM中用这个公式表示预积分:

 这个公式也是从参考文献[1]中获得的。其中JΔvgbgiJ_{\Delta v}^{g}b_{g}^{i}JΔvgbgi表示第 i 帧的陀螺仪偏差对于ΔvΔvΔv的影响量,JΔvgJ_{\Delta v}^{g}JΔvgΔvΔvΔv关于bgb_{g}bg的雅可比矩阵。其他与此类似的变量也是这个意思。

VI ORB-SLAM各环节工作方式

因为是基于ORB-SLAM搭建的系统,所以VI ORB-SLAM的工作原理和ORB-SLAM十分相似,也是使用三个线程:Tracking、Local Mapping、Loop Close。不过它们各线程的具体工作内容有所不同,下面来介绍这些不同之处。

Initialization

在ORB-SLAM中,初始化的任务有:创建出初始地图、定义第一参考帧和轨迹的尺度。在VI ORB-SLAM中,除了上述任务外,初始化还要估计出IMU设备的重力方向、加速度和陀螺仪偏差等变量。它的步骤是:
1、先使用最原始的视觉初始化,获得初始地图和一定数量的关键帧;
2、进行IMU传感器的初始化,初始化其重力方向、加速度和陀螺仪偏差、速度,以及整个轨迹对应的尺度。
 这个部分的内容放在最后再说。

Tracking

跟踪线程负责计算状态变量:(R,p,v,b)(R,p,v,b)(R,p,v,b),即机器位姿、速度和IMU传感器的偏差。计算速率和相机的帧率相同(因为IMU数据的采集速率快,不能给每个数据找到其对应的图像数据。图像数据则刚好相反)。
 在估计出状态变量后,对估计值进行优化。所以整个线程的工作流程如下:
1、估计出当前帧的状态变量;
2、将地图中的地图点投影到当前帧上,寻找匹配特征点;
3、计算这些匹配点的重投影误差以及相应帧之间的IMU误差;
4、求得总误差,通过最小化总误差来完成状态变量的优化。

图1

这里需要注意的是:根据地图是否更新(有无新的关键帧产生或检测到闭环),上述流程中第3、4步会有两种不同的计算方法
(a)当地图发生了更新:只有优化当前帧的状态
 使用更新后的地图和最后一个关键帧作为优化的参考,它们在优化过程中保持不变。如下图所示:

图2

图中来自最后一个关键帧的变量用下标 iii 表示,来自当前帧的则用下标 jjj 表示。重投影误差用蓝色矩形表示,IMU误差则是绿色矩形。红色框表示固定的变量。
 在当前情况下,待优化的状态变量和优化方式为:


式中EprojE_{proj}Eproj表示地图点与当前帧产生的重投影误差,EIMUE_{IMU}EIMU表示关键帧与当前帧产生的IMU误差。EprojE_{proj}Eproj的计算公式:



式中XCX_{C}XC是地图点在相机坐标系下的坐标(计算原理可理解为:WpB_{W}p_{B}WpB是IMU在世界坐标系下的坐标,用XWX_{W}XW(地图点的世界坐标)减去WpB_{W}p_{B}WpB就能获得该地图点与WpB_{W}p_{B}WpB之间的向量(世界坐标系)。然后对该向量进行旋转平移变换,就能获得地图点在B坐标系下的坐标)。
 IMU误差的计算公式为:


式6是在文献[1]中获得的。
个人理解:感觉ev,epe_{v}, e_{p}ev,ep的计算和文献[1]中不符,使用的b(.)jb_{(.)}^{j}b(.)j应该是b(.)ib_{(.)}^{i}b(.)i
 之后使用非线性优化的方式优化误差。最后将当前帧的优化结果和Hessian矩阵设为一个先验信息,给后续帧做参考。

(b) 地图未更新:同时优化前后两帧,但保持地图点不变

图3

从图中可看出,这个情况下只用地图点保持不变,且优化的对象从一个当前帧增加到前后两帧,对应的待优化状态变量也变成了:

式中EpriorE_{prior}Eprior是前一帧保留的先验信息产生的先验误差(图3中的小灰色正方形),它的计算公式为:

式中带横线的变量表示前一帧的先验信息,不带横线的表示前一帧在当前优化中的结果。ρρρ是一类鲁棒核函数。
个人理解:EpriorE_{prior}Eprior:在当前优化过程中可以调节前一帧的状态变量,但不能使其变化太多(好像可以防止累积误差)
 在完成优化后,上一帧就被边缘化(抛弃),而当前帧的优化结果又将作为新的先验信息。这个方法一直持续到地图发生更新或先验信息无效为止。

LocalMapping

VIORB-SLAM和ORB-SLAM的局部建图环节不同的地方在于:前者在进行LocalBA时要多考虑一个IMU的误差项约束。这两个系统在LocalBA上的对比图如下:

图4

相同点:只保留和优化N个关键帧,以及它们观测到的所有地图点。不过其余能够观测到这些地图点的关键帧也会在LocalBA中被使用。它们给地图点提供重投影误差的约束,自身的状态是不变的(在红色框内的部分)。
不同点:VIORB-SLAM要考虑各关键帧之间的IMU约束,以及第N+1个关键帧(红框最右边)对其下一关键帧的IMU约束。

Loop Closing

VIORB-SLAM 和 ORB-SLAM在闭环检测环节上是差不多的。当检测到闭环之后,会对闭环中的关键帧进行位姿图优化(减少计算量),只优化位姿(R,p)(R,p)R,p,而不优化IMU变量(v,b)(v,b)vb
 值得注意的是,位姿图中优化的状态变量只有6个自由度,因为尺度信息可以在IMU初始化时估计出来。这和ORB-SLAM是不同的。
个人理解:因为闭环匹配上的两个关键帧之间很难有IMU的数据约束,所以位姿优化不优化IMU变量

Full BA

使用一个独立的线程进行Full BA,优化所有状态量:位姿,速度和偏差。

IMU初始化

这是整个VI ORB-SLAM的核心部分,用于估计重力方向、尺度(sss)、速度(vvv)、IMU的偏差(ba,bgb_{a},b_{g}ba,bg)。整个过程为:
1、估计陀螺仪偏差(bgb_{g}bg)
2、粗略估计尺度(sss)和重力向量(gWg_{W}gW)(不考虑加速度偏差的影响)
3、估计加速度偏差(bab_{a}ba),并优化尺度(sss)和重力方向
4、估计速度(vvv)
需要注意的是任两个相邻的关键帧的时间间隔要短,以减少测量噪声的影响。下面介绍各步骤的具体内容。

估计bgb_{g}bg

可以通过每两个相邻关键帧之间的旋转测量值来估计陀螺仪偏差:

式中$R_{(.)}$表示由视觉求出的关键帧间的旋转变换,$\Delta R_{i,i+1}$表示通过预积分求出的关键帧间变换关系。

优化过程中假设bgb_{g}bg保持不变,通过最小化上述误差项来估计出bgb_{g}bg

估计尺度sss和重力向量gWg_{W}gW(不考虑加速度偏差bab_{a}ba

在求出bgb_{g}bg之后,可以预积分出速度(vvv)和位置(ppp)。
 由于单目SLAM估计的轨迹存在一个尺度因子sss,所以在轨迹中描述IMU元件与相机之间的变换关系时要考虑sss,即构建如下变换公式:

将式(10)带入到式(3),同时忽视其中的bab_{a}ba后可得公式:


该式子用于求解 sssgWg_{W}gW ,由求解线性方程来实现。为了避免求解速度变量,降低方程复杂度,使用三个连续关键帧之间存在的两个相对位姿关系,以及式子(3)中的速度计算公式,来构建线性方程组:

为了方便,将关键帧 i、i+1、i+2i、i+1、i+2ii+1i+2写作1、2、31、2、3123。方程组中各项的表达式为:

方程组(12)的形式为A3(N−2)X4x4X1=B3(N−2)X1A_{3(N-2)X4}x_{4X1}=B_{3(N-2)X1}A3(N2)X4x4X1=B3(N2)X1。使用SVD求解方程组(12),获得s∗,gW∗s^{*}, g_{W}^{*}s,gW。由于未知量的自由度为 4,所以至少需要有4个关键帧才能求解方程组。

估计加速度偏差(bab_{a}ba),尺度(sss)和重力方向

前面获得的s∗,gW∗s^{*}, g_{W}^{*}s,gW未考虑加速度偏差(bab_{a}ba),原因是加速度偏差和重力很难区分开==(重力会影响到bab_{a}ba,两者相关性较大)==。而重力的方向和加速度偏差区分性很好,所以可以同时估计这两者的量。
 首先认为在地图的第一参考惯性坐标系I中,重力的方向为gI^={0,0,−1}\hat{g_{I}}=\{0,0,-1\}gI^={0,0,1},大小为GGG。而之前计算出来的gW∗g_{W}^{*}gW的方向为gW^=gW∗∥gW∗∥\hat{g_{W}}=\frac{g_{W}^{*}}{\left \| g_{W}^{*} \right \|}gW^=gWgW。这时计算W、IW、IWI坐标系之间的旋转变换:


个人理解:之前求出的gW∗g_{W}^{*}gW是在地图第一参考帧中的重力在世界坐标系下的向量表示,而gIg_{I}gI是重力方向在第一参考帧中的表示。求出RWIR_{WI}RWI后就能够获得所有轨迹与真实世界之间的旋转关系(修正位姿估计值的方向)
 此时gWg_{W}gW可以表示成:gW=RWIgI^Gg_{W}=R_{WI}\hat{g_{I}}GgW=RWIgI^G …(15)

式中的RWIR_{WI}RWI只包含x、y两个轴上的旋转角度,因为z轴的旋转不会影响到重力的方向。
 通过下面这个扰动来优化旋转RWIR_{WI}RWI

式(16)的一阶近似为:

(PS:关于扰动和一阶近似可以参考《视觉SLAM十四讲》P75、P110)

将式(17)带入到式(11)中,并考虑bab_{a}ba的影响,可得:

仍是使用三个关键帧,得到如下线性方程组:

其中各项的表达式为($\lambda (i)$和方程组(12)中的一样):

式中[](:,1:2)[]_{(:,1:2)}[](:,1:2)表示矩阵的前两列
 方程组(19)的形式为A3(N−2)X6x6X1=B3(N−2)X1A_{3(N-2)X6}x_{6X1}=B_{3(N-2)X1}A3(N2)X6x6X1=B3(N2)X1。通过SVD的方法求解(19),求出s∗,δθxy∗,ba∗s^{*},\delta \theta _{xy}^{*} , b_{a}^{*}s,δθxy,ba,以及条件数。由于待求变量的自由度为6,所以至少需要4个关键帧。
PS:条件数可用于检查此问题是否条件良好(如:IMU执行的运动使所有变量均可观察)[2]

速度(vvv)估计

可以通过式(18)求出(用来初始化使用的)关键帧的速度,因为此时s、gW、ba、bgs、g_{W}、b _{a}、b_{g}sgWbabg都已知。此外,还可以使用公式(3)求出最近的关键帧的速度。

在重定位后重新初始化bg,bab_{g},b_{a}bg,ba

如果系统在长期运行后进行了重定位操作,则使用式(9)重新初始化bgb_{g}bg。而bab_{a}ba则通过式(19)求出,此时s、gWs、g_{W}sgW都是已知的。此过程使用20个连续的帧来完成,这些帧都是由视觉估计位姿。

结尾

这篇博客是自己对视觉惯性SLAM领域的一个初步探索,里面也加入了一些自己的理解。虽然VI ORB-SLAM的作者没有开源代码,但是网上有前辈根据论文复现了系统(感谢前辈!!)。所以又有事情可做了/(-o-)/~~。

参考资料:
1、https://arxiv.org/pdf/1610.05949.pdf
2、https://blog.csdn.net/myarrow/article/details/54694472(这篇博客写的真不错!!)

相关文章:

AEC、AGC、ANS在视音频会议中的作用?

AGC是自动增益补偿功能(Automatic Gain Control),AGC可以自动调麦克风的收音量,使与会者收到一定的音量水平,不会因发言者与麦克风的距离改变时,声音有忽大忽小声的缺点。ANS是背景噪音抑制功能&#xff08…

Java中的拆箱与装箱

我们先来了解一下拆箱与装箱的概念: 装箱:将基本数据类型转换为包装类; 拆箱:将包装类转换为基本数据类型 我们来看两串代码: Integer b1 127;Integer b2 127;System.out.println(b1b2);//trueInteger b3 128;Inte…

WannaCry的UWP版,哈哈哈

转载于:https://www.cnblogs.com/R00R/p/6916731.html

2021年中国工业互联网安全大赛核能行业赛道writeup之数据库登录

附件题:数据库登录(一道MISC、流量分析类型题目) 题目描述: 具体描述已经忘记o(╯□╰)o 大概意思就是分析附件里的.pcapng包,找到flag。流量涉及到 MySQL 数据库了。 附件下载: https://download.csdn.n…

学生管理系统(用maven来导入jar包)

不废话,直接上 先看一下项目列表: 首先创建一个maven工程,然后导入相应的jar包,请参考:使用maven导入jar包 接着在Source Folder创建具体的项目: Main类(客户端) package com.z…

视觉惯性SLAM:VINS-Mono

视觉惯性SLAM:VINS-Mono这篇博客一些符号说明IV 测量数据的预处理A.视觉处理前端B.IMU预积分V. 初始化A.Vision-Only SfM in Sliding WindowB.Visual-Inertial AlignmentVI.TIGHTLY COUPLED MONOCULAR VIOA.公式介绍B.IMU误差C.视觉误差D.边缘化E.位姿优化F.以IMU采…

mysql 0x80004005 unable to connect to any of the specified mysql hosts

语言:c# 问题:偶尔会出现连不上mysql 报标题的这个错误。 解决方法:把server localhost 改为 127.0.0.1 或者静态IP ,按着改暂时没出现了,继续观望! 转载于:https://www.cnblogs.com/wdw31210/p/9857514…

iOS开发-自己定义重用机制给ScrollerView加入子视图

iOS开发-自己定义重用机制给ScrollerView加入子视图 事实上这个问题我非常早就想过,仅仅是没有通过去写程序实现,昨天有人提起,我就巧了一下 不知道大家打印郭tableview:cellforrow中cell初始的次数,也就是重用池中的c…

2021年中国工业互联网安全大赛核能行业赛道writeup之Webshell密码

附件题:Webshell密码 题目描述: 某次攻防演练中,抓到了一个webshell的流量,请分析出密码,flag形式:flag{密码} 附件下载: https://download.csdn.net/download/qpeity/33675356https://downlo…

关于python3与python2同时存在情况下导入pyqt失败解决记录

最近感觉tkinter功能还是比较不适合新手做出高大上的界面,故开始使用pyqt,通过pip安装好了之后,利用qt设计师设计好界面之后,cmd运行之,报错提示没有找到pyqt5模块,IDE运行能正常加载 查找资料后发现&#…

ORBSLAM-Altas:多地图SLAM

ORBSLAM-Atlas:多地图SLAM这篇博客ORBSLAM-Altas这个系统系统方法两类子地图新地图的构建相机位姿的可观测性子地图融合系统线程结尾这篇博客 最近ORB-SLAM3横空出世,马上跑去GitHub膜拜。然后在项目的相关工作中看到了ORB-SLAM3使用了一个多地图方法。这…

Android驱动学习-内部机制_回顾binder框架关键点

内部机制_回顾binder框架关键点server注册服务时, 对每个服务都提供不同的ptr/cookie,在驱动程序里对每个服务都构造一个binder_node, 它也含有ptr/cookie client使用服务前要先getService:会在驱动程序里对该服务构造一个binder_ref, binder_ref含有desc, node成员…

数据库--事务

我们知道数据库中的SQL语句分为DDL(数据定义语言)、DQL(数据查询语言)、DML(数据操纵语言)、DCL(数据控制语言),详情请看SQL语句 当数据库的表中数据执行完添加、删除、和修改等数据操纵语言(DML)后,需要执行commit(提交)数据控制…

2021年中国工业互联网安全大赛核能行业赛道writeup之传统流量取证

附件题:传统流量取证 题目描述: 在某次攻防演练中,小王发现流量探针平台突然告警,小王第一时间下载了告警流量包,并进行分析:发现攻击队攻击在攻入内网后,利用了一个内网OA的一个漏洞&#xff…

ORB-SLAM3 论文笔记

ORB-SLAM3 论文笔记这篇博客ORB-SLAM3系统相机模型的抽象(Camera Model)重定位的问题图片矫正的问题视觉惯性SLAM的工作原理相关公式IMU初始化跟踪和建图系统对跟踪丢失的应对多地图的闭环检测和地图融合位置识别视觉地图融合方法视觉惯性地图的融合方法单个地图中的闭环融合结…

为什么需要 外键 呢?

生活现象: 不知你们是否遇到过这样的现象,就是你辛辛苦苦花了几十块钱注册一个会员,结果家里的七大姑,八大姨都要拿去用,而且完全可以用。还有就是一个淘宝账号里却可以添加好多个收获地址(里面包括收货人的姓名&#…

JavaScript闭包函数箭头函数调用与执行

一、标准的闭包函数 //一、标准的闭包函数 function A() {var i0;i;console.log(i : i);return function b() {return function c() {return i}} }var a A(); // 初始化A,执行A内的非function语句 ‘ i0; i‘,输出 I : 1 console.log(a()); // 执行fu…

jlink api sdk c# 离线数获取 标定

jlink 如何 离开 keil、IAR 监控变量呢? 目前 jlink的 api 可以做到,自己可以用C# 做一个 上位机,监控RAM里面的变量。而不用打开keil 调试。还可以 刷写 flash,可以用在产品量产的刷写上。SEGGER 的 jlink sdk并不是免费的&…

2021年中国工业互联网安全大赛核能行业赛道writeup之usb流量分析

目录 一、USB协议 二、键盘流量 三、鼠标流量 四、writeup 附件题:usb流量分析 题目描述: 具体描述忘记了o(╯□╰)o 大概意思是有个U盘插到电脑上,然后经过一些操作导致该电脑重启了。找到这个过程中的flag。 附件下载: 20…

BOS项目 第2天(BaseDao、BaseAction、用户登录、自定义strust登录拦截器)

BOS项目 第2天 今天内容安排: 1、根据提供的pdm文件生成sql 2、持久层和表现层设计---BaseDao、BaseAction 3、实现用户登录功能 4、jQuery EasyUI 消息提示控件 5、jQuery EasyUI menubutton菜单按钮 6、自定义struts2拦截器,实现用户未登录自动跳转到…

服务器 主动 推送 客户端浏览器 消息***

前言 通常情况下,无论是web浏览器还是移动app,我们与服务器之间的交互都是主动的,客户端向服务器端发出请求,然后服务器端返回数据给客户端,客户端浏览器再将信息呈现,客户端与服务端对应的模式是: 客户端请…

数据库表(字段类型、约束、截断表、修改表字段、重命名表)

字段类型: 在这里只列举一些常用的字段类型: 整数类型:int(Integer):普通大小的整数 小数类型: float(m,d):单精度浮点数,m表示数字长度,d表示小数位数,例如float(5,2)最大值999.99double(m,d…

(转载)动态SLAM系统:VDO-SLAM!

动态SLAM系统:VDO-SLAM!这篇博客是转载 计算机视觉life 公众号中的文章。这篇文章是对VDO-SLAM论文的全文翻译,是 !!真人工翻译!!不是机器翻译,我看了之后觉得挺好,所以分…

2021年中国工业互联网安全大赛核能行业赛道writeup之入门的黑客

附件题:入门的黑客 题目描述: 在某次工控攻防演练中,防守方使用蜜罐捕捉到了某黑客在入侵时留下的恶意程序样本,现在要对该黑客进行画像,需要从该恶意程序中分析出反连时的IP和端口信息,看看聪明的你能否能…

一种视觉惯性+激光传感器的SLAM系统

一种视觉惯性激光传感器的SLAM系统这篇博客论文摘要一些假设和标注系统总览VI 里程计扫描匹配(scan matching)优化提高系统鲁棒性的措施闭环检测和临近检测全局位姿图优化总结这篇博客 这篇论文“Robust High Accuracy Visual-Inertial-Laser SLAM Syste…

抽象类和接口的联系与区别

抽象类和接口联系与区别 关键字: 抽象类与接口的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。 abstract class和interface之间在对于抽象类定义的支持方面具…

P1132 数字生成游戏

题目描述 小明完成了这样一个数字生成游戏,对于一个不包含00的数字ss来说,有以下33种生成新的数的规则: 将ss的任意两位对换生成新的数字,例如143143可以生成314,413,134314,413,134;将ss的任意一位删除生成新的数字&a…

MySQL02-升级

MySQL 版本号由三个数字和可选后缀组成,形式 mysql-x.y.z-suffix。比如 mysql-5.7.21 或者 mysql-5.7.34。 x(5)这位是大版本y(7)这位是小版本,大版本小版本组合成 5.7 就是一个发行版最后一位是bugfix release版本,从1逐渐增加,…

Kinect V1读取图像数据(For Windows)

Kinect V1读取图像数据(For Windows)这篇博客Kinect V1介绍数据读取的基本流程运行代码和注释结尾这篇博客 刚好有一台现成的Kinect V1相机,所以就拿过来学习一下它的数据读取方式和编程方法,毕竟它还能用于跑RGBD-SLAM。Kinect V…

1.IocDI和Spring

1.面向对象回顾和案例 面向对象程序设计:1 2 3 4 案例分析: 需求分析: 报表功能: 报表服务类,检索数据,并生成图标 报表生成器类,生成不同格式的报表文件,例如PDF格式、Html…