【SLAM】ORB-SLAM3解析——综述(1)

2023-05-16

之前学习VINS和LIO-SAM的时候都是代码流,不是很重视看论文,现在有空学ORB-SLAM3了,这一次,先看一下论文。考虑到边上班边学,更新的会比较慢。看完论文之后,对这个系统最大的主观感受就是它的多图系统Atlas。机器人运行过程中是可能会跟丢的,一旦跟丢了就新建一个map,如果走到之前的位置,一旦发现和之前的map是同一个地方,就可以合并map。它的初始化和VINS很像,地图操作,回环检测,重定位很鲁棒。

github: https://github.com/UZ-SLAMLab/ORB_SLAM3
论文:   https://arxiv.org/pdf/2007.11898.pdf

相关代码解析如下(未完待续):

【SLAM】ORB-SLAM3解析——综述(1)

【SLAM】ORB-SLAM3解析——关键帧Frame()的构建(2)

【SLAM】ORB-SLAM3解析——视觉里程计Track()(3)

【SLAM】ORB-SLAM3解析——Mapping(4)

【SLAM】ORB-SLAM2代码流程图


Abstract

ORB-SLAM3有以下特点:基于ORB-SLAM2和ORB-SLAM-VI开发的,支持V-SLAM(mono, stereo),VI-SLAM,RGBD-SLAM模式,相机可以是针孔或鱼眼。
它的第一大特点是基于特征点的VI-SLAM,依赖极大后验估计MAP,哪怕和IMU的初始化都用MAP,一说这个我就想到了最小二乘和BA。
它的第二大特点是具备multiple map system,所以说它的定位精度,回环检测,重定位能力很顶。

I.Introduction & II.Related Work

现在的V-SLAM和VO都依赖于极大后验估计MAP,具体的来说就是Bundle Adjustment最小化重投影误差。V-SLAM的目的既包括状态估计也包括建图,而VO更关注于状态估计。
V-SLAM的优势体现在它能利用上以下三个信息:

①短期数据匹配:短时间内一帧和一帧之间的联系来恢复运动。这是V-SLAM和VO的一个共同点,不过长时间会造成漂移。
②中期数据匹配:把当前相机状态和全局地图中没有漂移的那部分进行匹配。这比带回环检测的VO效果都好。
③长期数据匹配:回环检测。

说白了,就是当前的状态估计分别可以用 当前帧次新帧比较准的全局地图(同时也可能比较新) 和 比较久远的全局地图 分别匹配进行BA,这样定位精度很高没有drift,作者说这是ORB-SLAM3的优点。

它的重定位和一般用词袋模型的VIO/VO不一样,词袋模型是先根据词袋匹配,再判断位置一致性,这样的缺点是慢(VINS好像就是这么干的)。
ORB-SLAM3先根据位置找可能的回环(可能是对定位很自信吧),然后再用3个共视关键帧确定回环,这么做会更精确,但是会有点费算力。
Atlas,也就是multiple map system,结合了重定位,地图识别,回环检测等技术,用这些方式可以把几块地图(可以是几次不同的运行)拼在一起。所以一旦跟丢了,系统就建一个新图,如果走着走着和之前匹配上了就可以再连起来。

ORB-SLAM3用ORB特征进行短期,中期的数据进行匹配;通过创建的共视图covisibility graph可以减少跟踪和建图的复杂度,回环检测和重定位用了词袋实现长期的数据匹配;作者说ORBSLAM3是唯一集齐以上3个手段的系统,是它定位准确的关键所在。
ORB-SLAM3的初始化是基于ORB-SLAM-VI并拓展成stereo的,基于极大后验估计,2s做到误差5%,15s做到误差1%。

III.System Overview 

ORB-SLAM3包括以下几个部分:
Atlas:也就是多地图系统,由一系列离散的地图组成。其中有一个active map,tracking线程基于这个地图进行定位,local map线程会把新的关键帧加到这个地图里;除此以外还有很多non-active map;还有一个DBoW2关键帧数据集用于重定位,回环检测和地图合并。
Tracking:处理传感器数据;通过最小化重投影误差实时计算最新位姿;选择关键帧;VI模式下,计算body速度和IMU误差;如果跟丢了,在Atlas多图系统中进行重定位,成功了就切换对应地图,失败了就新建一个地图。
Local Mapping:把新的关键帧和地图点加到active map里,删掉多余点和多余关键帧;在最新的滑窗内进行BA优化地图;初始化时估计IMU参数。
Loop和Map Merging:以关键帧的频率搜索active map和Atlas里其它map的共同区域,如果这个共同区域属于active map,就搞一次回环矫正,如果属于别的map,这两个map合并,然后变成active map;回环矫正后,会新建一个线程进行全局BA优化位姿。

上图是ORB-SLAM3的总体流程。Tracking是前端,包括IMU预积分,关键帧的构建,然后是Local Mapping,这两步就构成了最基础的里程计。图片中间是它最具特色的Atlas多图系统,包括DBoW2词袋数据库,当前正在使用的Acitive Map,和历史保存的多个Inactive Map。一旦在Loop中发现了Place recognition,就会把Active Map和Loop Map进行merging,再进行Full BA。 

IV.相机模型

整个系统是假设为针孔模型的,所以为了适用其它相机模型(鱼眼),把相机抽象出来。对于鱼眼相机而言(FOV>180°),去畸变会出现问题(外围物体放大,中间物体损失分辨率)。如果要像针孔相机那样去畸变,就要把照片外围裁掉,会损失信息。
对于双目而言,这个问题的影响更大,为了解决这个问题,他们把双目是为两个单目,而这两个单目之间有着固定的SE3和共视区。开始时通过共视区特征的三角化获得真实scale,之后就按照单目的玩法来。

V.VI-SLAM

A. 公式

相较于ORB-SLAM-VI,当前系统的初始化的速度更快了。在V-SLAM里,只用估计相机位姿,但是在VI-SLAM里,还需要估计body位姿,世界坐标系下的速度,IMU误差,同样需要i到i+1帧之间进行IMU预积分。公式(2)表示的是由IMU获得的状态关系所计算的残差。


公式(3)表示由相机模型获得的重投影误差,如果给定一系列的关键帧,状态量和路标点,那么优化问题就是最小化IMU误差和重投影误差,如公式(4),是不是很眼熟。

B. IMU初始化

目标是获得body速度,重力方向,IMU bias。光看论文感觉这初始化的办法和VINS-Mono的很像啊。
初始化有3个关键点:
->纯单目初始化能提供非常精确的map,仅scale不知道;
->如果把scale当成一个被优化的变量,速度会更快;
->不能忽视IMU的误差。

所以,他们把IMU初始化作为一个MAP估计问题,并分为3步:
①仅有视觉的MAP估计:2s进行mono-slam初始化,以4Hz插入关键帧,获得10个相机位姿和几百个点,然后来一个纯视觉BA。
②仅有IMU的MAP估计:优化目标是重力向量,IMU bias,尺度,速度。公式(8)是优化目标。
③VI MAP估计:这部分论文说的不是很具体,到时候看看代码是咋实现的把。

对于初始化时运动量过小导致初始化失败的情况,他们就只优化尺度和重力,至于IMU bias就在优化部分处理了。

C. Tracking & Mapping 

Tracking:  最后2帧会被优化,路标点会被固定。
Mapping:  维护了一个滑窗,pose会被固定,路标点会被优化。

D. Track Loss

暂时跟丢了:根据IMU估计位姿,把已有地图点根据这个位姿投影到照片上进行匹配,然后优化位姿,连这都不行那就是跟丢了。
彻底跟丢了:重开一张新地图。

VI.地图合并和回环检测部分

短期和中期的数据匹配是通过重投影实现的,长期数据匹配依赖词袋。在传统的词袋模型回环检测中,先根据词袋确定潜在回环,为了提高准确率然后再根据位置关系筛选,从而做到100%准确率和30-40%的召回率。
但是这么玩的结果就是认出的回环帧会延后3帧,而且总在相同的位置找到回环(不懂)。

ORB-SLAM3的Atlas这么搞:
每来一个关键帧,就在Atlas里找关联,如果关联的关键帧在active map里(见D.),就来一次回环矫正,否则就把active map和被关联的关键帧所在的map进行合并(见B.和C.)。
一旦回环关系找到了,就分别把回环两帧和各自(共视图里的)相邻帧捞出来,他们作为一个local window,在其中进行稠密的mid-term数据匹配。

A. 回环检测

ORBSLAM3这部分要比VINS复杂的多。
(1)利用DBoW2词袋找到与重定位帧Ka最像的3帧Km做为备胎回环帧,它们不能是重定位帧Ka的共视帧;
(2)对于每一个Km,都能借助DBoW2找到它与Ka之间共视路标点的对应关系,包括2D和3D坐标;
(3)根据匹配点+RANSAC计算Km帧到Ka帧的位姿变换Tam;我们知道RANSAC每次迭代会随机取少量的数据去拟合一个模型,用剩下的点计算和这个模型的距离确定是它是内点还是外点,最后内点数最多的模型为结果。在这里,重投影误差小于阙值的点会作为内点;
(4)Tam求出来后,各自的特征点相互之间重投影找到更多的匹配关系,然后玩一次非线性优化来优化Tam;
(5)为了避免假阳性,会在active map里再在Ka帧的共视帧找2个小伙伴,与回环帧验证回环关系;
(6)对于带IMU的模式,会增加pitch和roll约束限定匹配关系;

B. Visual模式下的Map合并

重定位帧Ka的map是Ma(active map),回环帧Km的map是Mm。B.和C.针对的是重定位帧回环帧在不同的map下这种情况。
(1)将Ma和Mm合并到同一个window下。上一步把Tma求出来了,那么就把Ka帧和它的共视帧,特征点都用Tma变换到Mm的坐标系下;
(2)合并之后就会有重复的路标点,那么就把Ka帧对应的重复点删掉,之后利用mid-term的数据匹配建立共视图;
(3)在这个window里进行BA,Mm中那些不在window里的关键帧的pose会被固定住,其余所有window中的路标点和关键帧pose都会被优化;
(4)全局位姿图优化。window里的pose会被固定,其余pose会被优化。

C. VI模式下的Map合并

和Visual模式下的Map合并基本一样,就是(1)(3)会有补充操作;
(1)如果Ma成熟了,那么Tma是SE(3),否则是Sim(3);
(3)优化项增加了速度和bias。Mm中,window之前紧挨着的5帧会被固定住不优化,所有的路标点,Km,Ka帧和他们的共视帧都会根据重投影模型被优化。

D. Loop Closing

本部分针对的是重定位帧回环帧都在active map下这种情况。对于匹配上的两帧同样会创建一个window,它们和共视路标点也会构造一个共视图,然后对map中其它帧进行一次位姿图优化。
最后根据mid-term和long-term的数据匹配关系进行一次全局BA。对于VI模式,全局BA仅在关键帧数量不多时进行,以控制计算量。

1. 系统入口

入口函数都在\Examples\目录下,这里以Stereo-Inertial\stereo_inertial_euroc.cc为例逐渐进入到系统内部,其它的入口函数都是类似的。我们看他的main(),开始时会创建一系列输入数据的容器,保存IMU的数据和image的路径。然后就会创建一个System对象:

// Create SLAM system. It initializes all system threads and gets ready to process frames.
ORB_SLAM3::System SLAM(argv[1],argv[2],ORB_SLAM3::System::IMU_STEREO, false);

之后,把一对image,时间戳<image的IMU数据(a,w,time)组成一帧数据,进行当前轮次的track:

// Pass the images to the SLAM system
SLAM.TrackStereo(imLeft,imRight,tframe,vImuMeas);

1.1 System对象的构建

在路径\src\System.cc。构造函数中,会把整个SLAM系统涉及到的主要功能类(Tracking, Mapping, Loop Closing, Viewer)和数据结构类(Vocabulary, KeyFrame, Atlas)作为成员变量进行实例化。同时,会把相互依赖的功能类的指针传入到对应成员模块的构造函数中。

//Load ORB Vocabulary
mpVocabulary = new ORBVocabulary();
bool bVocLoad = mpVocabulary->loadFromTextFile(strVocFile);

//Create KeyFrame Database
mpKeyFrameDatabase = new KeyFrameDatabase(*mpVocabulary);

//Create the Atlas
mpAtlas = new Atlas(0);

//Create Drawers. These are used by the Viewer
mpFrameDrawer = new FrameDrawer(mpAtlas);
mpMapDrawer = new MapDrawer(mpAtlas, strSettingsFile, settings_);

//Initialize the Tracking thread
mpTracker = new Tracking(this, mpVocabulary, mpFrameDrawer, mpMapDrawer, mpAtlas, mpKeyFrameDatabase, strSettingsFile, mSensor, settings_, strSequence);

//Initialize the Local Mapping thread and launch
mpLocalMapper = new LocalMapping(this, mpAtlas, mSensor==MONOCULAR || mSensor==IMU_MONOCULAR, mSensor==IMU_MONOCULAR || mSensor==IMU_STEREO || mSensor==IMU_RGBD, strSequence);
mptLocalMapping = new thread(&ORB_SLAM3::LocalMapping::Run,mpLocalMapper);

//Initialize the Loop Closing thread and launch
mpLoopCloser = new LoopClosing(mpAtlas, mpKeyFrameDatabase, mpVocabulary, mSensor!=MONOCULAR, activeLC); // mSensor!=MONOCULAR);
mptLoopClosing = new thread(&ORB_SLAM3::LoopClosing::Run, mpLoopCloser);

//Set pointers between threads
mpTracker->SetLocalMapper(mpLocalMapper);
mpTracker->SetLoopClosing(mpLoopCloser);

mpLocalMapper->SetTracker(mpTracker);
mpLocalMapper->SetLoopCloser(mpLoopCloser);

mpLoopCloser->SetTracker(mpTracker);
mpLoopCloser->SetLocalMapper(mpLocalMapper);

//Initialize the Viewer thread and launch
mpViewer = new Viewer(this, mpFrameDrawer,mpMapDrawer,mpTracker,strSettingsFile,settings_);
mptViewer = new thread(&Viewer::Run, mpViewer);
mpTracker->SetViewer(mpViewer);

以上几个功能类中,需要注意的是LocalMapping,LoopClosing和Viewer是另外开了3个线程做各自的事情。

1.2 SLAM算法入口函数TrackStereo()

在路径\src\System.cc。根据输入image关于stereo,mono,rgbd的不同,分别执行:

// Proccess the given stereo frame. Images must be synchronized and rectified.
// Input images: RGB (CV_8UC3) or grayscale (CV_8U). RGB is converted to grayscale.
// Returns the camera pose (empty if tracking fails).
Sophus::SE3f TrackStereo(const cv::Mat &imLeft, const cv::Mat &imRight, const double &timestamp, const vector<IMU::Point>& vImuMeas = vector<IMU::Point>(), string filename="");

// Process the given rgbd frame. Depthmap must be registered to the RGB frame.
// Input image: RGB (CV_8UC3) or grayscale (CV_8U). RGB is converted to grayscale.
// Input depthmap: Float (CV_32F).
// Returns the camera pose (empty if tracking fails).
Sophus::SE3f TrackRGBD(const cv::Mat &im, const cv::Mat &depthmap, const double &timestamp, const vector<IMU::Point>& vImuMeas = vector<IMU::Point>(), string filename="");

// Proccess the given monocular frame and optionally imu data
// Input images: RGB (CV_8UC3) or grayscale (CV_8U). RGB is converted to grayscale.
// Returns the camera pose (empty if tracking fails).
Sophus::SE3f TrackMonocular(const cv::Mat &im, const double &timestamp, const vector<IMU::Point>& vImuMeas = vector<IMU::Point>(), string filename="");

这里我们以Stereo模式为例。在这个函数里面,首先是对image的预处理,然后确定SLAM运行的模式是纯定位还是定位+建图模式,是否reset系统等,不过,最核心的内容是这4行:

if (mSensor == System::IMU_STEREO)
    for(size_t i_imu = 0; i_imu < vImuMeas.size(); i_imu++)
        mpTracker->GrabImuData(vImuMeas[i_imu]);

Sophus::SE3f Tcw = mpTracker->GrabImageStereo(imLeftToFeed,imRightToFeed,timestamp,filename);

GrabImuData()的作用是把IMU数据放到mlQueueImuData中。GrabImageStereo()中,最核心的也只有2行:

mCurrentFrame = Frame();
Track();

分别是构建最新帧和进行track。

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

【SLAM】ORB-SLAM3解析——综述(1) 的相关文章

  • No rule to make target

    No rule to make target 引言 解决方法 引言 报错 No rule to make target Thirdparty g2o lib libg2o so needed by lib libygz SLAM so 停止
  • 《视觉SLAM十四讲》第一版源码slambook编译调试

    slambook master ch2 编译正常 log如下 slambook master ch2 mkdir build cd build cmake make j8 The C compiler identification is G
  • 各向异性(anisotropic)浅提

    文章目录 各向异性 anisotropic 定义 哪种物体具有各向异性反射 什么导致各向异性反射 总结 各向异性 anisotropic 定义 它指一种存在方向依赖性 这意味着在不同的方向不同的特性 相对于该属性各向同性 当沿不同轴测量时
  • 【大一立项】如何亲手搭建ROS小车:硬件和软件介绍

    本次博客将详细介绍上篇博客中提到的ROS小车的硬件和软件部分 由于十一实验室不开门 所以部分代码还没有上传到Github 下位机 下位机使用Arduino 因为大一上刚学完用Arduino做循迹小车 其实Arduino作为ROS小车的下位机
  • 视觉SLAM漫谈(二):图优化理论与g2o的使用

    视觉SLAM漫谈 二 图优化理论与g2o的使用 1 前言以及回顾 各位朋友 自从上一篇 视觉SLAM漫谈 写成以来已经有一段时间了 我收到几位热心读者的邮件 有的希望我介绍一下当前视觉SLAM程序的实用程度 更多的人希望了解一下前文提到的g
  • Difference Between LiDAR and RADAR——LiDAR和RADAR的不同

    Difference Between LiDAR and RADAR 原文连接 https www differencebetween com difference between lidar and vs radar 翻译 RADAR和L
  • 图像匹配算法

    图像匹配算法分为3类 基于灰度的匹配算法 基于特征的匹配算法 基于关系的匹配算法 1 基于灰度的模板匹配算法 模板匹配 Blocking Matching 是根据已知模板图像到另一幅图像中寻找与模板图像相似的子图像 基于灰度的匹配算法也称作
  • 关于GPS、惯导、视觉里程计的几个定义

    1 首先写几个定义 惯性导航系统 Inertial Navigation System INS 全球定位卫星系统 Global Navigation Satellite System GNSS GNSS 包括全球定位系统 Global Po
  • 互转(经纬度、地心坐标、东北天坐标)

    Part1三种坐标系介绍 经纬度坐标 假设空间某点P 用经纬度表示的话 你们B代表纬度 L代表经度 H代表大地高 纬度B P点沿着地球法线方向与赤道面的夹角 向北为正称为北纬 0 90 向南为负称为南纬 0 90 实际表示可以用 90 90
  • Lego-LOAM IMU坐标系变换的详细记录

    Lego LOAM IMU坐标系变换的详细记录 0 基础知识 1 IMU 重力加速度消除 2 相机坐标系 camera 到初始坐标系 camera init 的转换 最近看了Lego LOAM 的IMU部分 没看懂IMU的坐标系变换 看其它
  • GMAPPING的参数设置

    二 运行gmapping 我总结了运行gmapping的两种方法 1 基于命令行 rosrun gmapping slam gmapping scan scan delta 0 1 maxUrange 4 99 xmin 5 0 ymin
  • Ceres Solver从零开始手把手教学使用

    目录 一 简介 二 安装 三 介绍 四 Hello Word 五 导数 1 数值导数 2解析求导 六 实践 Powell函数 一 简介 笔者已经半年没有更新新的内容了 最近学习视觉SLAM的过程中发现自己之前学习的库基础不够扎实 Ceres
  • 无人车

    1 无人车四大核心技术 自动驾驶实际包含三个问题 一是我在哪 二是我要去哪 三是如何去 第一个问题是环境感知和精确定位 无人车需要的是厘米级定位 厘米级定位是无人驾驶的难点之一 不光是车辆本身的语义级定位 还有一个绝对坐标定位 第二个问题是
  • 舒尔补-边际概率-条件概率

    margin求边际概率的时候喜欢通过舒尔补的形式去操作信息矩阵 如p b c 求积分p a b c da 从上图可知 边缘概率直接看协方差矩阵比较方便 边际概率的方差就是取对应联合分布中相应的协方差块 信息矩阵是由舒尔补的形式计算 此形式也
  • LOAM算法详解

    激光SLAM 帧间匹配方法 Point to Plane ICP NDT Feature based Method 回环检测方法 Scan to Scan Scan to Map LOAM创新点 定位和建图的分离 里程计模块 高频低质量的帧
  • Object SLAM: An Object SLAM Framework for Association, Mapping, and High-Level Tasks 论文解读

    是一篇来自机器人顶刊T RO的文章 发表于2023 5 An Object SLAM Framework for Association Mapping and High Level Tasks 论文 An Object SLAM Fram
  • 3.Open3D教程——点云数据操作

    点云数据 本教程阐述了基本的点云用法 随需要的文件链接 1 显示点云 import open3d as o3d import numpy as np print Load a ply point cloud print it and ren
  • 什么是深度学习的无监督学习与有监督学习

    无监督学习 深度学习中的无监督学习方法是一种训练算法 它在没有标注输出的情况下从输入数据中学习模式和特征 这种方法的核心是探索和理解数据的内在结构和分布 而不是通过已知的输出来指导学习过程 无监督学习在深度学习领域有许多不同的形式和应用 以
  • ORB 计算错误:它删除了小图像的所有关键点

    我有一个 50x50 的小图像 我找到 ORB 关键点 请注意 我必须将 patchSize 的默认参数从 31 更改为 14 才能检测到一些关键点 OrbFeatureDetector det 500 1 2f 8 14 0 2 0 14
  • OpenCV 3 中的 FLANN 错误

    我运行的是 Ubuntu 14 04 我正在尝试使用 openCV 3 运行 FLANN 但出现错误 下面的所有内容都是通过使用 AKAZE 和 ORB 进行尝试的 但代码来自我尝试使用 ORB 的情况 我使用 ORB 来查找描述符和关键点

随机推荐

  • C语言 矩阵乘法

    问题描述 给定一个N阶矩阵A xff0c 输出A的M次幂 xff08 M是非负整数 xff09 例如 xff1a A 61 1 2 3 4 A的2次幂 7 10 15 22 输入格式 第一行是一个正整数N M xff08 1 lt 61 N
  • C语言 分解质因数

    问题描述 求出区间 a b 中所有整数的质因数分解 输入格式 输入两个整数a xff0c b 输出格式 每行输出一个数的分解 xff0c 形如k 61 a1a2a3 a1 lt 61 a2 lt 61 a3 xff0c k也是从小到大的 具
  • 编译原理 赋值语句翻译成四元式

    赋值语句及算数表达式的翻译 将赋值语句翻译成四元式的语义描述 1 S gt id 61 A 2 A gt id 3 A gt int 4 A gt real 5 A gt A1 43 A2 6 A gt A1A2 7 A gt A1 8 A
  • 关联容器知识点通关

    关联容器 1 关联容器与顺序容器的区分2 关联容器的数据2 1 数据存储2 1 1 pair类型2 1 2 关联容器的类型别名2 1 3 关联容器迭代器 2 2 关联容器的初始化 3 关联容器的增删改查3 1 关联容器增加元素3 2 删除关
  • django JWT 验证401错误

    因为前端请求时携带了Authorization请求头 xff08 主要是JWT xff09 xff0c 而如果用户未登录 xff0c 此请求头的JWT无意义 xff08 没有值 xff09 xff0c 为了防止REST framework框
  • “轻松搞定 CMake”系列之 find_package 用法详解

    一 find packakge 命令基本介绍 在我们实际开发过程中 xff0c 经常不可避免会使用到第三方开源库 xff0c 这些开源库可能是通过 apt get install 命令自动安装到系统目录中 xff0c 也可能是由我们自己下载
  • STL中的string类

    一 string是什么 xff1f string类是专门的字符串操作的一个类 xff0c 非常的强大 二 string与char 的区别 xff1a char 呢就是指向字符数组地址的指针 xff0c 然后我们提供了一个string h x
  • Cpp 对象模型探索 / 父类和子类调用构造函数和析构函数的顺序

    2018 03 19 创建人 xff1a Ruo Xiao 邮箱 xff1a xclsoftware 64 163 com 一 建立对象过程 father son 栗子 xff1a span class token keyword clas
  • 串口通信 / 奇校验、偶校验、0 校验和 1 校验

    时间 xff1a 2019 01 28 创建人 xff1a Ruo Xiao 邮箱 xff1a xclsoftware 64 163 com 一 目的 对数据传输的正确与否进行校验 二 方法 奇校验 xff1a 让主体数据加上校验位中的 1
  • 堆栈向下增长和向上增长的理解

    时间 xff1a 2019 01 31 创建人 xff1a Ruo Xiao 邮箱 xff1a xclsoftware 64 163 com 假设堆栈为数组Taskstk unsigned int Taskstk 255 堆栈压数从栈顶压向
  • C++--名字修饰

    名字修饰 在C C 43 43 中 xff0c 一个程序要运行起来 xff0c 需要经历以下几个阶段 xff1a 预处理 编译 汇编 链接 名字修饰 xff08 Name Mangling xff09 是一种在编译过程中 xff0c 将函数
  • 【ROS入门】解决Could not find a package configuration file provided by “nmea_msgs“问题

    笔者Linux虚拟机系统为Ubuntu20 04 xff0c 安装ROS我参考的是https blog csdn net weixin 45168199 article details 106910446 安装完成后创建ROS工作空间 mk
  • C#中的屏蔽、覆写和抽象

    屏蔽基类成员 虽然派生类不能删除其继承的任何成员 xff0c 但可以声明一个与基类成员签名相同的成员来屏蔽之 xff08 注意方法的签名由名称和参数列表组成 xff0c 不包括返回值类型 xff09 要让编译器知道你在故意屏蔽继承的成员 x
  • 【计算机网络】第一章:计算机网络概述

    各个章节的知识点总结传送门如下 xff0c 欢迎自取 xff1a 计算机网络 第一章 xff1a 计算机网络概述描述 计算机网络 第二章 xff1a 物理层 计算机网络 第三章 xff1a 数据链路层 计算机网络 第四章 xff1a 网络层
  • 【计算机网络】第二章:物理层

    各个章节的知识点总结传送门如下 xff0c 欢迎自取 xff1a 计算机网络 第一章 xff1a 计算机网络概述https blog csdn net iwanderu article details 103795715 计算机网络 第二章
  • 【计算机网络】第四章:网络层

    各个章节的知识点总结传送门如下 xff0c 欢迎自取 xff1a 计算机网络 第一章 xff1a 计算机网络概述https blog csdn net iwanderu article details 103795715 计算机网络 第二章
  • ASCII码与16进制的互相转换(表)

    所谓的ASCII和16进制都只是概念上的东西 xff0c 在计算机中通通是二进制 转换应该是输出的转换 xff0c 同样是一个数 xff0c 在计算机内存中表示是一样的 xff0c 只是输出不一样 ASCII是针对字符的编码 xff0c 几
  • 【操作系统】 Operation System 第一章:概述

    各部分总结知识点如下 xff1a 操作系统 Operation System 第一章 xff1a 概述 操作系统 Operation System 第二章 xff1a 操作系统基础操作 操作系统 Operation System 第三章 x
  • 【openCV踩坑日记】人工数据集Synthetic Shapes dataset的生成方法

    1 为什么要介绍这个方法 xff1f 2018年的时候 xff0c D DeTone等人发表了Self Supervised Interest Point Detection and Description xff0c 提出了一种特征提取S
  • 【SLAM】ORB-SLAM3解析——综述(1)

    之前学习VINS和LIO SAM的时候都是代码流 xff0c 不是很重视看论文 xff0c 现在有空学ORB SLAM3了 xff0c 这一次 xff0c 先看一下论文 考虑到边上班边学 xff0c 更新的会比较慢 看完论文之后 xff0c