ORB-SLAM3 论文笔记
ORB-SLAM3 论文笔记
- 这篇博客
- ORB-SLAM3系统
- 相机模型的抽象(Camera Model)
- 重定位的问题
- 图片矫正的问题
- 视觉惯性SLAM的工作原理
- 相关公式
- IMU初始化
- 跟踪和建图
- 系统对跟踪丢失的应对
- 多地图的闭环检测和地图融合
- 位置识别
- 视觉地图融合方法
- 视觉+惯性地图的融合方法
- 单个地图中的闭环融合
- 结尾
这篇博客
最近ORB-SLAM3全能王横空出世,在看完ORBSLAM-Atlas系统论文后,就直接莽ORB-SLAM3的论文了。关于系统中IMUIMUIMU初始化的相关论文之后在慢慢理解(概率好头疼),剩下的就直接莽了!
【转载声明】本篇文字均为原创,如转载请注明出处
ORB-SLAM3系统
ORB-SLAM3是基于 VI ORB-SLAM 和 ORBSLAM-Atlas 两个系统(点击可查看我写的关于这两个系统论文的笔记)实现的,它相当于是这两个系统的融合升级版,是在视觉、视觉+惯性SLAM中的全能王。下图是ORB-SLAM3的流程框图:
这里大致介绍一下各个线程的工作内容:
a) Atlas:Atlas相当于一个子系统,它保存了许多ORB-SLAM3所创建的子地图。所有子地图可以分成两类:Active Map(跟踪定位所使用的地图),Non-active Map(之前保留下来的地图)。
b) Tracking:处理传感器的输入信息,通过Active Map来实时地对机器进行跟踪定位,同时还会决定是否创建新的关键帧 KF 。如果跟踪丢失,跟踪线程会先在 Atlas 的所有地图上进行重定位:重定位成功,则继续跟踪;否则将当前 Active Map 保存为 Non-active Map ,并重新创建地图。
c) Local Mapping:维护 Active Map 中的一小部分地图,可以帮助提高跟踪定位的精度。如果是惯性系统,则该线程还承担着 IMU 初始化的任务。
d) Loop and Map Merging:检测地图内或地图之间存在的闭环,根据闭环对地图进行修正,降低系统累积误差。
通过整个工作流程图以及各线程的功能,我们可以看出,相比于普通的视觉SLAM、视觉惯性SLAM(这里可用ORB-SLAM2和VI ORB-SLAM作为对比对象),ORB-SLAM3主要有以下几个创新点:
(1)能够进行单目、双目的视觉、视觉+惯性跟踪定位,使用最大后验估计(MAP)方法计算位姿。同时在IMU初始化方面也采用了一种精度、效率更好的新方法;
(2)使用一种新的位置识别方法,来完成重定位和闭环检测操作。这个方法耗时更少,且在保证100%准确率的同时,能够提高闭环的召回率;
(3)加入了 ORBSLAM-Atlas 系统的多地图特性,并使用(2)中的方法完成地图的位置识别+闭环检测;
(4)系统对相机模型进行了抽象表达,把系统中与相机模型有关的所有特性、函数(如投影、反投影函数等)都提取出来,组成一个独立的相机类。这样系统就能适用于不同的相机模型。
相机模型的抽象(Camera Model)
为了让ORB-SLAM3能适应于不同类型相机,这里将相机模型从系统中独立了出来,构建抽象类对象(代码实现是这样的)。用户可通过类继承的方法,创建想要的相机模型类对象。之后就能在ORB-SLAM3代码里生成相应实例并使用。论文里有针孔模型和鱼眼相机模型。这种作法会导致系统使用的相机模型不再是确定的,因此在算法等方面会存在一些问题。
重定位的问题
在重定位方面,ORB-SLAM 是通过 EPnP 算法来计算位姿的。而 EPnP 算法的公式是基于针孔相机模型的。如果系统使用的是鱼眼相机那么 EPnP 就失效了。因此系统需要使用一个不依赖某一个相机模型的PnP算法,即最大似然 PnP(MLPnP) 。
图片矫正的问题
在多数双目SLAM中,都假设双目图片能够矫正好,然后就能通过极线搜索的方法轻松地找到图片间的匹配特征。但这种假设具有较大局限性,且图片矫正在某些时候并不实用,比如矫正鱼眼相机的图片要去掉其中大部分区域。这就丢掉了很多环境信息,会降低系统的鲁棒性。所以ORB-SLAM3不依靠图片矫正,而将双目看作是两个满足下述条件的单目相机:
1)两个单目相机间存在一个固定的相对位姿变换矩阵。
2)(可选)两个相机间存在共视区域(当两个相机一前一后时就没有共视了)。
由于不依靠矫正后的图片,所以 ORB-SLAM3 采用的是暴力匹配的方式,在全局使用knn搜索为两个相机寻找匹配特征。
在跟踪和建图时,使用一个单目相机作为视觉上的参考坐标系,另一个则用来帮助构建地图点。可以通过三角化构建两相机间的共视部分中特征点对应的地图点。而共视部分以外的图片区域则按照单目相机图像的方式来处理(单目建图)。
视觉惯性SLAM的工作原理
相关公式
在视觉惯性SLAM中的状态变量有(用下标C(Camera)表示相机坐标系,下标B(Body)表示惯性元件坐标系):
1)Ti=[Ri,pi]∈SE(3)T_{i}=[R_{i}, p_{i}] \in SE(3)Ti=[Ri,pi]∈SE(3):第 i 时刻Body的位姿;
2)viv_{i}vi:每帧的速度(在地图中第一参考坐标系下表示);
3)bigb_{i}^{g}big:第 i 时刻 IMU 元件的陀螺仪偏差;
4)biab_{i}^{a}bia:第 i 时刻 IMU 元件的加速度偏差;
将这些变量整合起来,用一个向量 S 来公式 (1)表示:


其中ΔRi,i+1,Δvi,i+1,Δpi,i+1ΔR_{i,i+1}, Δv_{i,i+1}, Δp_{i,i+1}ΔRi,i+1,Δvi,i+1,Δpi,i+1 是两帧间 IMU 测量值预积分后的结果。
是所有测量向量的信息矩阵。Ri,piR_{i}, p_{i}Ri,pi 是系统估计(视觉估计)出来的结果,viv_{i}vi 由 IMU 的速度计算公式求出。
视觉误差就是重投影误差,如公式 (3)所示:
其中 rijr_{ij}rij 是第 j 个地图点到第 i 帧上的重投影误差。Π 是相应的相机投影模型,uiju_{ij}uij是地图点对应的像素坐标,它具有一个信息矩阵 ΣijΣ_{ij}Σij。TCBT_{CB}TCB 表示Body–>Camera坐标系的变换矩阵,可以提前标定。
将公式(2)和公式(3)的误差联合起来,就是系统所优化的总误差,如公式 (4)所示:

其中KjK^{j}Kj 是能够观测到第 j 个地图点的所有 KFs 。ρHubρ_{Hub}ρHub 是鲁棒核函数。公式 (4) 的优化问题可由下图表示。
(图中的展示的优化方法在跟踪和建图过程中,会依据情况做出相应调整)
IMU初始化
因为有些IMU的参数:速度 vvv、加速度偏差 bab^{a}ba、陀螺仪偏差 bgb^{g}bg、重力方向 ggg 是未知的,所以要通过初始化将它们估计出来。如果用的是单目相机,还需要估计出尺度 sss。
论文用的初始化方法速度更快、精度更高。由于考虑了传感器的不确定性,所以将初始化当作一个最大后验估计(MAP)问题来求解。以单目系统为例,初始化的步骤为:
1)Vision-only MAP Estimation(这里和普通单目初始化一样):将系统以 4Hz 插入 KF 的频率运行 2s ,构建一个尺度不确定的视觉地图。该地图内应含有 10 个 KFs 和几百个地图点。然后通过Visual-Only BA 来优化各帧的位姿(如图 2b 所示)。通过各帧位姿,获得对应的 Body 位姿Tˉ0:k=[R,pˉ]\bar{T}_{0:k}=[R, \bar{p}]Tˉ0:k=[R,pˉ]。
2)Inertial-only MAP Estimation:通过Tˉ0:k\bar{T}_{0:k}Tˉ0:k和 KFs 间 IMU 预积分的值,来估计 IMU 的参数和尺度。将这些待估计变量用下式表示:
其中 sss 是地图的尺度。Rwg∈SO(3)R_{wg}\in SO(3)Rwg∈SO(3) 是重力的旋转矩阵,它表示的是地图中第一参考坐标系到真实世界坐标系的旋转关系。bbb 则是加速度和陀螺仪偏差(在初始化过程中被认为是定值)。vˉ0:k\bar{v}_{0:k}vˉ0:k 是基于尺度的速度。
(下面部分涉及到论文:Inertial-Only Optimization for Visual-Inertial Initialization)
此时,如果只考虑相邻两帧间的惯性测量值:
那么,根据就能建立以下 MAP 估计问题:
考虑到每个测量值的独立性,MAP 问题可以写成 公式 (7):
再进行一些假设,就能获得最终的优化问题,如公式 (8) 所示:
公式中不包含视觉误差,仅优化惯性误差。rpr_{p}rp 表示先验误差。这个优化过程如 图2c 所示:
其中关于Rwg,sR_{wg}, sRwg,s 两个待估计参数的更新公式如下:
优化完后,地图的尺度就确定了。之后通过估计的重力方向,将地图中所有元素变换到真实世界坐标系下表示。
3)Visual-Inertial MAP Estimation:完成上述两步后,同时优化视觉误差和惯性误差。这一步和图 2c 很相似,但要保证各KFs都有相同的偏差ba,bgb^{a}, b^{g}ba,bg,以及和第二步具有一样的先验信息。
通过上述步骤就能仅根据 2s 内产生的轨迹,获得尺度误差为 5% 的估计结果。在初始化后的 5、15s 会各执行一次视觉 + 惯性 BA(代码中类似于又执行了两次初始化,但稍微有些不同)。这样可将尺度误差降低到 1% 。完成上述所有操作后,就认为地图已经成熟。
双目情况下的初始化和上述类似,只需要将尺度 sss 固定为 1,且不对它进行优化。
跟踪和建图
跟踪定位当前帧可以采用两种方法:通过运动模型跟踪(相邻两帧间的运动矩阵已知)和通过当前参考 KF 跟踪。在完成跟踪之后,需要进行位姿的优化,其方法和VI ORB-SLAM类似(单目系统是一样的优化方法,而双目系统需要考虑地图点是在哪一个相机上成像的。如果在右边相机,那在构建g2o误差边时要考虑两相机间的相对变换矩阵。关于VI ORB-SLAM可以参考这篇博客)。优化过程中只优化两帧的状态变量,且保持地图点不变。但当地图刚更新完毕时,优化方法会有所改变,具体可见VI ORB-SLAM中相关部分。
建图环节的优化主要考虑局部地图优化,优化局部地图中的 KFs 和地图点,其他的共视 KFs (局部地图以外)可以提供约束(重投影误差),但不会被优化(这里和代码实现不一样,也许是自己理解没有到位。代码中共视 KFs 的位姿也会被优化。)
在某些特殊情况下,比如机器移动很慢,IMU参数的可观测性较差。此时使用之前的初始化方法无法在15s内获得精度较好的结果。所以需要采用一个新的尺度提炼方法来预防这种特殊情况。这个方法是 Inertial-only 优化的修改版,它只优化尺度和重力方向。此时不再认为各 KFs 的偏差相同。该优化方法如下图所示(即图 2d ):
这个尺度提炼的方法将在 Local Mapping 线程中每隔10s执行一次,直到地图中已有100个以上KFs或者在初始之后系统已经运行了75s。
系统对跟踪丢失的应对
一般的视觉SLAM,如ORB-SLAM2在跟踪丢失时会直接进行重定位操作。此时地图停止更新,直到重定位完成。而ORB-SLAM3有两种方法来应对跟踪丢失的情况:
1)在视觉上发生跟踪丢失时,则只使用IMU进行位姿估计。根据估计的位姿,将地图点投影到当前图像上以寻找匹配点。然后通过视觉+惯性优化获得最终位姿结果。
2)如果通过上面方法在5s内无法重新定位,则重新构建地图。当前使用的地图根据情况决定是否保存。
(如果当前地图中信息较多( KFs 数量多)则认为其比较重要,将其保留;否则直接残忍抛弃)
多地图的闭环检测和地图融合
由于系统具有多地图特性,所以会构建出多个子地图。为了更有效地检测地图内和地图之间的闭环,ORB-SLAM3使用一种新的位置识别方法和闭环融合方法。
位置识别
将跟踪时正在使用的地图称为Active Map,其余子地图为Non-active Map。在Active Map中的关键帧记为 KaK_{a}Ka 。整个位置识别的大致步骤为:
1)为当前关键帧 KaK_{a}Ka ,找出三个候选者 KmK_{m}Km(不包括之前就与 KaK_{a}Ka 有共视关系的 KFs );
2)为每个 KmK_{m}Km 构建一个局部窗口,其中包含了 KmK_{m}Km 和与之共视程度较高的一些 KFs ,以及它们观测到的所有地图点;
3)先进行几何一致性检测。通过 RANSACRANSACRANSAC 算法,估计 KaK_{a}Ka 和 KmK_{m}Km 间适应性最高的变换矩阵 TamT_{am}Tam;
4)将 KmK_{m}Km 的局部窗口中所有地图点通过 Taw=TamTmwT_{aw}=T_{am}T_{mw}Taw=TamTmw投影到 KaK_{a}Ka 中,寻找其匹配点。反过来也一样,可以把 KaK_{a}Ka 观测到的地图点投影到 KmK_{m}Km 的局部窗口中的KFs上。根据这些匹配关系,通过非线性优化来提高 TamT_{am}Tam 的精度。
5)在 Active Map 中找 3 个和 KaK_{a}Ka 共视程度大于一定阈值的 KFs(与KaK_{a}Ka观测到相同的局部地图中的地图点的数量较多) 。如果没找到,就等待在 KaK_{a}Ka 后面的两个连续KFs**(不需要对这两个KFs进行DBoW2方式的位置识别,所以能节约时间)**。此时用 KaK_{a}Ka 和其他 3 个KFs来验证TamT_{am}Tam。(验证方法应该就是看这两个KFs在经过TamT_{am}Tam变换后能否看到一定数量的地图点(地图点在 KmK_{m}Km 的局部地图中))
6)基于重力方向的验证。在视觉惯性系统中,如果地图已初始化完毕,那么 Tam∈SE(3)T_{am}\in SE(3)Tam∈SE(3)。检查TamT_{am}Tam中 pitch、rollpitch、rollpitch、roll 方向的旋转角度是否低于一定阈值。低于则认为这次位置识别成功。
(对第(6)条的个人理解:如果 KaK_{a}Ka 和KmK_{m}Km形成闭环,那么他们的重力方向应该是差不多的,因为他们只有在 pitch、rollpitch、rollpitch、roll 方向上差不多的位置观测同一区域时,才会形成闭环)
视觉地图融合方法
将系统正在使用的地图定义为Active map,记为 MaM_{a}Ma,其中的 KF 记为KaK_{a}Ka;其余子地图记为Non-active map,记为MmM_{m}Mm;与KaK_{a}Ka匹配的闭环帧记为KmK_{m}Km;KaK_{a}Ka和KmK_{m}Km间相对变换矩阵为TmaT_{ma}Tma。
1)用KaK_{a}Ka+KmK_{m}Km+他们俩的共视图(系统默认KaK_{a}Ka选取 15个,KmK_{m}Km也一样)和观察到的地图点来构建接合窗口。构建前,先将属于MaM_{a}Ma的元素通过TmaT_{ma}Tma变换到 MmM_{m}Mm 地图坐标系中。
2)第一步后,Ma和Mm就完成了融合,一起作为新的Active map。此时会有重复的地图点产生,它们是MaM_{a}Ma与MmM_{m}Mm间的匹配点。对它们进行融合:把在MaM_{a}Ma地图中的地图点信息(它的观测KFs和描述子之类的)转移到与其匹配的MmMmMm中的地图点上。最后再更新融合后地图的共视图和本质图。
3)对融合地图中的接合窗口部分进行局部 BA 优化。其中,对于MmM_{m}Mm地图中剩余的KFs,只要能观测到接合窗口中的地图点,就能参与局部 BA 优化。但它们只是提供约束,不会被优化。这个过程如下面的 图(a) 所示:
4)以优化好的接合窗口为基础(固定其中KFs),通过位姿图优化来优化融合地图中剩余的 KFs 。
PS:融合后的地图直接用于跟踪定位,成为新的Active Map。在融合之前的Active Map中所使用的Local Window(跟踪线程使用的局部窗口),在融合之后的地图中继续使用(仍然是那些 KFs 构建局部窗口)。
视觉+惯性地图的融合方法
这里和视觉地图融合的方法相似,只是原来的第(1)和(3)步做了修改(接合窗口中KFs的数量和选取方法变了):
1)(与上面的第(1)步相比较)如果当前地图成熟了(尺度、重力方向估计优化完成),Tma∈SE(3)T_{ma} \in SE(3)Tma∈SE(3),否则Tma∈Sim(3)T_{ma} \in Sim(3)Tma∈Sim(3)。之后的操作和之前一样。
2)视觉惯性接合窗口的局部 BA 优化:将Ka+KaK_{a}+K_{a}Ka+Ka前面的5个 KFs记为 KaK_{a}Ka 的局部窗口、Km+KmK_{m}+K_{m}Km+Km附近5个 KFs 记为KmK_{m}Km 的局部窗口。将在KmK_{m}Km 局部窗口之前的 KF 记为KbmK_{bm}Kbm,同理 KaK_{a}Ka 那边则记为KbaK_{ba}Kba 。找出上面 KFs 观测到的地图点,记为MpM_{p}Mp,并在MaM_{a}Ma 和 MmM_{m}Mm 地图中找到这些地图点其余的观测帧 KFs,记为KcK_{c}Kc 。
最后将上述所有 KFs 和地图点都包含到优化算法中,其中各部分的优化情况为:
1)KaK_{a}Ka局部窗口中的 KFs 的所有状态变量都会优化;
2)KmK_{m}Km局部窗口中的 KFs 的所有状态变量都会优化;
3)KcK_{c}Kc中的 KFs 只会优化位姿状态变量会被优化;
4)MpM_{p}Mp中的所有地图点都优化;
5)KbaK_{ba}Kba只优化其位姿状态变量,其余状态变量保持不变;
6)KbmK_{bm}Kbm提供约束,但不会被优化。
这个优化过程的示意图如下:
疑问:在查看代码时,代码中进行视觉惯性地图融合的函数应该是 MergeLocal2()
,但是该函数是将 MmM_{m}Mm 地图中的元素变换到了 MaM_{a}Ma 中,而且最后只完成了接合窗口部分优化,而没有对融合地图中剩余部分进行全局位姿优化。看来仍需要继续深入学习。
单个地图中的闭环融合
这里形成闭环的两个KFs都属于Active map。处理方式和上面的地图融合是相似的,即:
在这之后也会进行一次全局的BA优化(优化地图中所有KFs),以获得 MAP 估计结果。如果是视觉地图,最后的全局 BA 优化一定会使用;如果是视觉惯性地图,只有当地图中的 KFs 数量较少时 (代码中默认为200以内) 才会执行最后一步(为了防止计算量过大)。
结尾
上面是自己结合代码对 ORB-SLAM3 论文的初步理解 ,如有错误,请大家指出,谢谢!之后有新的思路会对这篇博客进行更新(路漫漫其修远兮,吾将上下而求索!)。
参考资料:
1、ORB_SLAM3和之前版本有什么不同?
2、ORB-SLAM3: An Accurate Open-Source Library for Visual, Visual-Inertial and Multi-Map SLAM
相关文章:

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

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…

MySQL之模糊查询
先在MySQL数据库里创建一个表,并添加几条数据: create table student(id char(36) primary key,name varchar(8) not null,age int(3) default 0,mobile char(11),address varchar(150) ) insert into student values (9b4435ec-372c-456a-b287-e3c5aa…

rsync工具
rsync工具一、介绍1、可以实现 本地数据 《----------》 远程数据/本地数据 的传输2、两种通信方式(man rsync)(1)remote shell(一个冒号:),通过sshd协议传输(2…

2021年中国工业互联网安全大赛核能行业赛道writeup之日志分析
附件题:日志分析 题目描述: 核电站新来的运维小王粗心把一个办公网地址映射到外网,遭到大量攻击,你能从日志当中找到有效信息吗。 附件下载: 2021-10-12T15_37_51.61064600_00rizhifenxi.rar-网络攻防文档类资源-CSD…

【POJ1509】Glass Beads 【后缀自动机】
题意 给出一个字符串,求它的最小表示法。 分析 这个题当然可以用最小表示法做啦!但是我是为了学后缀自动机鸭! 我们把这个字符串长度乘二,然后建SAM,然后在SAM上每次跑最小的那个字母,找出长度为n的时候就停…

order by总结
先在MySQL数据库里建一个表,并添加几条数据: create table student(id char(36) primary key,name varchar(8) not null,age int(3) default 0,mobile char(11),address varchar(150) ) insert into student values (9b4435ec-372c-456a-b287-e3c5aa23…

Gazebo构建小车模型并通过ROS控制
Gazebo构建小车模型并通过ROS控制介绍编写车子的URDF文件编写控制小车移动的插件(与ROS交互)结尾介绍 突然想试试Gazebo这款仿真软件,因为它可以让你在任何时候都有机器人玩。但Gazebo的机制也比较复杂,所以还是先学习一下如何搭一个简单的小车ÿ…

【杂项】SVN服务器的本地搭建和使用
转载于:https://www.cnblogs.com/haizhibin1989/p/6939025.html

编译vim-8.2并配置jedi-vim插件
目录 一、背景 二、编译vim-8.2 三、配置jedi-vim插件 3.1、安装插件vundle 3.2、用vundle安装jedi-vim插件 一、背景 CentOS 7.9上已经安装了anaconda,python3.7的虚拟环境webenv。现在编译安装vim-8.2,使之支持python3(yum装包是不支…

group by总结(还有having)
先在MySQL数据库里创建一个表,并添加几条数据用于测试: create table fruit(name varchar(4),address varchar(12),type_name varchar(6) )insert into fruit values (香蕉,广西,大香蕉); insert into fruit values (苹果,山东,红富士); insert into fr…

PHP数组基本的操作方法
1、数组操作的基本函数 数组的键和值: array_values($arr);获得数组的值 array_keys($arr);获得数组的键名 array_flip($arr);数组中的值与键名互换(如果有重复前面的会被后面的覆盖) in_array("apple",$arr);在数组中…

linux kafka进程挂了 自动重启
使用crontab,定时监控 kafka进程,发现挂了后重启。 shell脚本如下: #!/bin/sh source /etc/profile proc_dir"/data/kafka" # 程序目录 proc_name"kafka.Kafka" …

Towards Real-time Semantic RGB-D SLAM in Dynamic Environments(动态语义SLAM)
动态环境下的实时语义SLAM简介摘要系统流程实验结果总结简介 在ICRA 2021上看到这样一篇论文:Towards Real-time Semantic RGB-D SLAM in Dynamic Environments,发现它也是使用的语义网络基于深度图的多视图几何方法来去除图片中的动态对象的。这一方法和…

gpupdate /force 遇报错解决过程
windows server 2008 修改策略后,需要更新。在cmd中执行 gpupdate /force,遇到报错。报错内容为 The processing of Group Policy failed. Windows attempted to read the file \\<domain.name>\SysVol\<domain.name>\Policies\{xxxxxxxx-xx…

pytorch学习——torch.cat和torch.stack的区别
合并tensors torch.cat 沿着特定维数连接一系列张量。torch.stack 沿新维度连接一系列张量。 torch.cat 在给定维度中连接给定的 seq 个张量序列。 所有张量必须具有相同的形状(连接维度除外)或为空。 torch.cat(tensors, dim0, *, outNone) → Tens…

Docker将容器制作成镜像并提交到远程仓库
Docker将容器制作成镜像并提交到远程仓库 步骤如下 先在dockerhub上创建一个自己的用户https://hub.docker.com/。或者在阿里云也可以。 2. 然后先创建一个空的镜像名。 3. 在终端上登录。 4. 这里有一个容器ID为fe08a32503b1。想把它制作成镜像以备后期自己用。 5. 将容器制作…