【ORB-SLAM3】CreateNewKeyFrame()函数阅读
void Tracking::CreateNewKeyFrame()
void Tracking::CreateNewKeyFrame()
{// 如果局部建图线程正在初始化且没做完或关闭了,就无法插入关键帧if(mpLocalMapper->IsInitializing() && !mpAtlas->isImuInitialized())return;if(!mpLocalMapper->SetNotStop(true))return;// Step 1:将当前帧构造成关键帧KeyFrame* pKF = new KeyFrame(mCurrentFrame,mpAtlas->GetCurrentMap(),mpKeyFrameDB);if(mpAtlas->isImuInitialized()) // || mpLocalMapper->IsInitializing())pKF->bImu = true;pKF->SetNewBias(mCurrentFrame.mImuBias);// Step 2:将当前关键帧设置为当前帧的参考关键帧// 在UpdateLocalKeyFrames函数中会将与当前关键帧共视程度最高的关键帧设定为当前帧的参考关键帧mpReferenceKF = pKF;mCurrentFrame.mpReferenceKF = pKF;if(mpLastKeyFrame){pKF->mPrevKF = mpLastKeyFrame;mpLastKeyFrame->mNextKF = pKF;}elseVerbose::PrintMess("No last KF in KF creation!!", Verbose::VERBOSITY_NORMAL);// Reset preintegration from last KF (Create new object)if (mSensor == System::IMU_MONOCULAR || mSensor == System::IMU_STEREO || mSensor == System::IMU_RGBD){mpImuPreintegratedFromLastKF = new IMU::Preintegrated(pKF->GetImuBias(),pKF->mImuCalib);}// 这段代码和 Tracking::UpdateLastFrame 中的那一部分代码功能相同// Step 3:对于双目或rgbd摄像头,为当前帧生成新的地图点;单目无操作if(mSensor!=System::MONOCULAR && mSensor != System::IMU_MONOCULAR) // TODO check if incluide imu_stereo{// 根据Tcw计算mRcw、mtcw和mRwc、mOwmCurrentFrame.UpdatePoseMatrices();// cout << "create new MPs" << endl;// We sort points by the measured depth by the stereo/RGBD sensor.// We create all those MapPoints whose depth < mThDepth.// If there are less than 100 close points we create the 100 closest.int maxPoint = 100;if(mSensor == System::IMU_STEREO || mSensor == System::IMU_RGBD)maxPoint = 100;// Step 3.1:得到当前帧有深度值的特征点(不一定是地图点)vector<pair<float,int> > vDepthIdx;int N = (mCurrentFrame.Nleft != -1) ? mCurrentFrame.Nleft : mCurrentFrame.N;vDepthIdx.reserve(mCurrentFrame.N);for(int i=0; i<N; i++){float z = mCurrentFrame.mvDepth[i];if(z>0){// 第一个元素是深度,第二个元素是对应的特征点的idvDepthIdx.push_back(make_pair(z,i));}}if(!vDepthIdx.empty()){// Step 3.2:按照深度从小到大排序sort(vDepthIdx.begin(),vDepthIdx.end());// Step 3.3:从中找出不是地图点的生成临时地图点 // 处理的近点的个数int nPoints = 0;for(size_t j=0; j<vDepthIdx.size();j++){int i = vDepthIdx[j].second;bool bCreateNew = false;// 如果这个点对应在上一帧中的地图点没有,或者创建后就没有被观测到,那么就生成一个临时的地图点MapPoint* pMP = mCurrentFrame.mvpMapPoints[i];if(!pMP)bCreateNew = true;else if(pMP->Observations()<1){bCreateNew = true;mCurrentFrame.mvpMapPoints[i] = static_cast<MapPoint*>(NULL);}// 如果需要就新建地图点,这里的地图点不是临时的,是全局地图中新建地图点,用于跟踪if(bCreateNew){Eigen::Vector3f x3D;if(mCurrentFrame.Nleft == -1){mCurrentFrame.UnprojectStereo(i, x3D);}else{x3D = mCurrentFrame.UnprojectStereoFishEye(i);}MapPoint* pNewMP = new MapPoint(x3D,pKF,mpAtlas->GetCurrentMap());// 这些添加属性的操作是每次创建MapPoint后都要做的pNewMP->AddObservation(pKF,i);//Check if it is a stereo observation in order to not//duplicate mappointsif(mCurrentFrame.Nleft != -1 && mCurrentFrame.mvLeftToRightMatch[i] >= 0){mCurrentFrame.mvpMapPoints[mCurrentFrame.Nleft + mCurrentFrame.mvLeftToRightMatch[i]]=pNewMP;pNewMP->AddObservation(pKF,mCurrentFrame.Nleft + mCurrentFrame.mvLeftToRightMatch[i]);pKF->AddMapPoint(pNewMP,mCurrentFrame.Nleft + mCurrentFrame.mvLeftToRightMatch[i]);}pKF->AddMapPoint(pNewMP,i);pNewMP->ComputeDistinctiveDescriptors();pNewMP->UpdateNormalAndDepth();mpAtlas->AddMapPoint(pNewMP);mCurrentFrame.mvpMapPoints[i]=pNewMP;nPoints++;}else{// 因为从近到远排序,记录其中不需要创建地图点的个数nPoints++;}// Step 3.4:停止新建地图点必须同时满足以下条件:// 1、当前的点的深度已经超过了设定的深度阈值(35倍基线)// 2、nPoints已经超过100个点,说明距离比较远了,可能不准确,停掉退出if(vDepthIdx[j].first>mThDepth && nPoints>maxPoint){break;}}//Verbose::PrintMess("new mps for stereo KF: " + to_string(nPoints), Verbose::VERBOSITY_NORMAL);}}// Step 4:插入关键帧// 关键帧插入到列表 mlNewKeyFrames中,等待local mapping线程临幸mpLocalMapper->InsertKeyFrame(pKF);// 插入好了,允许局部建图停止mpLocalMapper->SetNotStop(false);// 当前帧成为新的关键帧,更新mnLastKeyFrameId = mCurrentFrame.mnId;mpLastKeyFrame = pKF;
}
1、将当前帧构造为关键帧
// Step 1:将当前帧构造成关键帧KeyFrame* pKF = new KeyFrame(mCurrentFrame,mpAtlas->GetCurrentMap(),mpKeyFrameDB);if(mpAtlas->isImuInitialized()) // || mpLocalMapper->IsInitializing())pKF->bImu = true;pKF->SetNewBias(mCurrentFrame.mImuBias);
在KeyFrame.h中,写了关键帧类的定义。其中构造函数为,KeyFrame(Frame &F, Map* pMap, KeyFrameDatabase* pKFDB);表示构造一个关键帧需要的参数为:Frame类型的当前帧:mCurrentFrame;保存所有关键帧和地图点的地图集:mpAtlas->GetCurrentMap();保存关键帧的数据库:mpKeyFrameDB
其实从ORB-SLAM3的框图中可以看出,关键帧衔接了前端和后端,后端开始和地图点有关。从代码的角度看,通过构造关键帧,将普通帧 mCurrentFrame 携带的信息复制给 关键帧pKF 。一个关键帧对象上除了有普通帧的帧信息,还新增了和地图生成与管理相关的操作。
2、将当前关键帧设置为当前帧的参考关键帧
3、对于双目或rgbd摄像头,为当前帧生成新的地图点
(1)从当前帧中筛选出深度值为正的特征点,深度值无效或为负的点会被过滤,并存储为(深度, 特征点索引)
的键值对。
vector<pair<float,int> > vDepthIdx;int N = (mCurrentFrame.Nleft != -1) ? mCurrentFrame.Nleft : mCurrentFrame.N;vDepthIdx.reserve(mCurrentFrame.N);for(int i=0; i<N; i++){float z = mCurrentFrame.mvDepth[i];if(z>0){// 第一个元素是深度,第二个元素是对应的特征点的idvDepthIdx.push_back(make_pair(z,i));}}
(2)按深度从小到大排序
这是因为,近的点深度更准确,更适合用于建图。(也是因为这个原因,深度相机更适合室内环境)
sort(vDepthIdx.begin(),vDepthIdx.end());
(3)从中找出不是地图点的生成临时地图点
①如果这个点对应在上一帧中的地图点没有, 或者创建后就没有被观测到,那么就需要生成一个临时的地图点。(将bCreateNew标志位设置为true,表示需要创建):
// 如果这个点对应在上一帧中的地图点没有,或者创建后就没有被观测到,那么就生成一个临时的地图点MapPoint* pMP = mCurrentFrame.mvpMapPoints[i];if(!pMP)bCreateNew = true;else if(pMP->Observations()<1){bCreateNew = true;mCurrentFrame.mvpMapPoints[i] = static_cast<MapPoint*>(NULL);}
②创建地图点:根据mCurrentFrame.Nleft == -1是否成立,判断使用什么反投影函数
if(mCurrentFrame.Nleft == -1){mCurrentFrame.UnprojectStereo(i, x3D);}else{x3D = mCurrentFrame.UnprojectStereoFishEye(i);}
- mCurrentFrame.Nleft == -1 , 双目 / RGBD 相机:当某个特征点的深度信息或者双目信息有效时,将它反投影到三维世界坐标系中。
从深度图到 3D 网格与点云:完整实现_深度图转点云-CSDN博客
bool Frame::UnprojectStereo(const int &i, Eigen::Vector3f &x3D)
{const float z = mvDepth[i];if(z>0) {const float u = mvKeysUn[i].pt.x;const float v = mvKeysUn[i].pt.y;const float x = (u-cx)*z*invfx;const float y = (v-cy)*z*invfy;Eigen::Vector3f x3Dc(x, y, z);x3D = mRwc * x3Dc + mOw;return true;} elsereturn false;
}
- mCurrentFrame.Nleft != -1 ,单目 / 鱼眼相机:表示当前帧为单目模式(无右图像),或使用鱼眼相机但未启用立体模式,需要根据位姿将第i个点投到世界坐标系下。
如何将相机坐标系得到的位姿转换到世界系下机体的位姿_imu坐标系转换到机体坐标系-CSDN博客
Eigen::Vector3f Frame::UnprojectStereoFishEye(const int &i){return mRwc * mvStereo3Dpoints[i] + mOw;
}
将x3D添加到地图点中:
MapPoint* pNewMP = new MapPoint(x3D,pKF,mpAtlas->GetCurrentMap());
④停止生成地图点的条件:当前的点的深度已经超过了设定的深度阈值(35倍基线)&& nPoints已经超过100个点,说明距离比较远了,可能不准确,停掉退出
(4)插入关键帧
// Step 4:插入关键帧// 关键帧插入到列表 mlNewKeyFrames中,等待local mapping线程临幸mpLocalMapper->InsertKeyFrame(pKF);// 插入好了,允许局部建图停止mpLocalMapper->SetNotStop(false);// 当前帧成为新的关键帧,更新mnLastKeyFrameId = mCurrentFrame.mnId;mpLastKeyFrame = pKF;
其中,InsertKeyFrame(KeyFrame *pKF)成员函数,将关键帧插入到list类型的mlNewKeyFrames中:
void LocalMapping::InsertKeyFrame(KeyFrame *pKF)
{unique_lock<mutex> lock(mMutexNewKFs);// 将关键帧插入到列表中mlNewKeyFrames.push_back(pKF);mbAbortBA=true;
}
相关文章:
【ORB-SLAM3】CreateNewKeyFrame()函数阅读
void Tracking::CreateNewKeyFrame() void Tracking::CreateNewKeyFrame() {// 如果局部建图线程正在初始化且没做完或关闭了,就无法插入关键帧if(mpLocalMapper->IsInitializing() && !mpAtlas->isImuInitialized())return;if(!mpLocalMapper->SetNotStop(t…...
腾讯开源实时语音大模型VITA-audio,92mstoken极速响应,支持多语言~
简介 VITA-Audio 是一个由腾讯优图实验室(Tencent Youtu Lab)、南京大学和厦门大学的研究人员共同开发的项目,旨在解决现有语音模型在流式生成(streaming)场景下生成第一个音频令牌(token)时的高…...
使用 TypeScript + dhtmlx-gantt 在 Next.js 中实现
1. 安装依赖(确保已安装) npm install dhtmlx-gantt2. 创建 pages/gantt.tsx use clientimport { useRef, useEffect } from react import { gantt } from dhtmlx-gantt import dhtmlx-gantt/codebase/dhtmlxgantt.cssinterface Task {id: number | st…...
web第四次课后作业--页面操作实现数据库的增删查改
一、环境配置 1. 创建一个java web(maven构建)的项目2. 配置tomcat3. 连接数据库二、页面呈现 登录页面 详细信息 删除一条信息后 更新 更新后的信息 三、目录结构 四、代码实现 4.1 denglu.jsp <% page language"java" cont…...
DeepSearch:字节新一代 DeerFlow 框架
项目地址:https://github.com/bytedance/deer-flow/ 【全新的 Multi-Agent 架构设计】独家设计的 Research Team 机制,支持多轮对话、多轮决策和多轮任务执行。与 LangChain 原版 Supervisor 相比,显著减少 Tokens 消耗和 API 调用次数&#…...
uniapp中vue3和pinia安装依赖npm install失败
目录 一、问题描述 二、问题原因 三、问题解析及解决方案 一、问题描述 用uni-app开发小程序的时候,使用了vue3pinia,安装依赖的时候发现vue和pinia的版本问题,安装失败, npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve np…...
【java】synchronized关键字详解
目录 一、线程同步与线程安全问题线程不安全Demo线程不安全的原因 二、synchronized关键字关键字锁粒度修饰对象修饰代码块修饰方法修饰静态方法修饰类 synchronized 锁总结 synchronized加锁原理MarkWordsynchronized锁升级synchronized锁原理synchronized关键字总结 其他同步…...
使用 `perf` 和火焰图(Flame Graph)进行性能分析
在现代软件开发中,性能优化是提升应用程序响应速度和资源利用率的关键步骤。当一个进程的 CPU 占用率异常高时,识别并优化性能瓶颈显得尤为重要。本文将详细介绍如何使用 Linux 下强大的性能分析工具 perf 以及火焰图(Flame Graph)…...
Cocos Creator 3.8.5 构建依赖环境配置文档
Cocos Creator 3.8.5 构建依赖环境配置文档 文章目录 Cocos Creator 3.8.5 构建依赖环境配置文档✅ 构建依赖汇总表✅ 构建平台配置说明👉 Windows 构建👉 Android 构建 ✅ 推荐构建环境组合(稳定)✅ 常见问题提示 适用于打包 An…...
# FlyEnv 环境下 MySQL 操作全攻略:从基础到字段修改
在使用 FlyEnv 搭建开发环境时,MySQL 数据库的操作是开发过程中不可或缺的一环。无论是修改字段结构,还是执行其他常见操作,都需要熟练掌握相关技能。下面将为你详细介绍 FlyEnv 环境下 MySQL 的操作,以及修改字段的多种方法。 一…...
C语言_自动义类型:联合和枚举
1. 联合体 1.1 联合体类型的声明 与结构体相似,联合体也是有一个或多个成员(可以是不同类型)构成;但是编译器只为最大的成员分配足够的内存空间 联合体的特点是所有成员共用同一块内存空间,所以联合体也叫ÿ…...
Golang基础知识—cond
cond 通常指 sync.Cond,它是标准库 sync 包中用于实现 条件变量 的同步原语。条件变量在多 goroutine 协作场景中非常有用,尤其在需要根据特定条件协调多个 goroutine 的执行顺序时。 sync.Cond 的核心作用 条件变量用于 等待某个条件满足 或 通知其他等…...
深入探索向量数据库:构建智能应用的新基础
📌 友情提示: 本文内容由银河易创AI(https://ai.eaigx.com)创作平台的gpt-4-turbo模型辅助生成,旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证,建议读者通过官方文档或实践进一步确认…...
实验5 DNS协议分析与测量
实验5 DNS协议分析与测量 1、实验目的 了解互联网的域名结构、域名系统DNS及其域名服务器的基本概念 熟悉DNS协议及其报文基本组成、DNS域名解析原理 掌握常用DNS测量工具dig使用方法和DNS测量的基本技术 2、实验环境 硬件要求:阿里云云主机ECS 一台。 软件要…...
1200/1500 PID 学习笔记
一 准备 1. 仿真库文件,下载链接放在最后 2.PID仿真,不支持1200.所以组CPU需要1500. 3.PID必须在循环中断里面调用。 二 试水 1. 拉一个PID指令 2. 库文件拉入 3 仿真试水,可以看到已经开始调节了。 、 三 组态设置 1. Input: 输入值&a…...
深度学习中--模型调试与可视化
第一部分:损失函数与准确率的监控(Loss / Accuracy Curve) 1. 为什么要监控 Loss 与 Accuracy? Loss 是模型优化的依据,但它可能下降了 Accuracy 反而没变(过拟合信号) Accuracy 才是评估效果的…...
tomcat项目重构踩坑易错点
是的,没错,弄了一个特别老的项目。重构真是头疼啊。其实好吧,还是用的太少。 前提条件:用idea工具非社区版。注意是非社区版。点击设置- project Structure 1.配置Modules 点击import module 添加好模块后。 重点来了࿰…...
如何安全擦除 SSD 上的可用空间
无论您是要处理旧 SSD 还是只是想确保敏感信息的私密性,擦除可用空间都是至关重要的一步。那么,您可以擦除 SSD 上的可用空间吗?是的,可以擦除 SSD 上的可用空间,我们在本指南中提供了两种有效的方法。是的,…...
增强 HTNN 服务网格功能:基于 Istio 的BasicAuth 与 ACL 插件开发实战
目录 1.引言 什么是HTNN? 为什么开发 BasicAuth 和 ACL 插件? 2.技术背景 技术栈概览 Istio 与服务网格简述 HTNN 框架与插件机制概览 3.插件开发详解:BasicAuth 与 ACL 3.1 BasicAuth插件 功能点 实现细节 3.2 ACL插件 功能点 …...
从概念到可工程化智能体的转变路径——以“知识奇点工程师”为例
产品部门定义了一个如下概念性的“知识奇点工程师”,他们构建的不仅仅是一个数据库或知识图谱,而是一个活的、能自我进化的知识生态系统,是整个“Neuralink for Education”宏伟蓝图的基石。他们的工作难度和重要性,不亚于为AI引擎…...
docker(四)使用篇一:docker 镜像仓库
前文我们已经介绍了 docker 并安装了 docker,下面我们将正式步入使用环节,本章是第一个使用教学:docker 镜像仓库。 一、什么是镜像仓库 所谓镜像仓库,其实就是负责存储、管理和分发镜像的仓库,并且建立了仓库的索引…...
S7-1500 与 IM60 进行 PROFINET 通信
S7-1500 与 IM60 进行 PROFINET 通信 本文档介绍使用 S7-1500 CPU 与 IM 60 进行 PROFINET 通信,实现对 IM60 及 AM03 的控制。 使用软件及硬件 软件:工控人加入PLC工业自动化精英社群 TIA Portal V19 ET 200 SMART IM60 GSD 文件下载链接ÿ…...
车载诊断架构 ---车载总线对于功能寻址的处理策略
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...
观QFramework框架底层逻辑有感
拿QFramework(以下简称QF)第一个案例简单理解框架底层代码逻辑。 使用QF框架重构后的代码,给我这种小白一种很抽象的感觉,但好的代码就是抽象的,这是不可否认的。于是想掌握一下这个框架的基础部分,至少能…...
ExecutorService详解:Java 17线程池管理从零到一
简介 在现代高并发应用中,线程池管理已成为提升系统性能与稳定性的关键核心技术。ExecutorService作为Java并发编程的核心接口,提供了对线程池的强大抽象与管理能力,相比直接管理线程,它能显著降低资源消耗、提高响应速度并增强系统可维护性。随着Java 17的发布,线程池管…...
Go 中闭包的常见使用场景
在 Go 中,闭包(Closure) 是一个函数值,它引用了其定义时所在作用域中的变量。也就是说,闭包可以访问并修改外部作用域中的变量。 Go 中闭包的常见使用场景 ✅ 1. 封装状态(无须结构体) 闭包可…...
养生:打造健康生活的四大支柱
饮食养生:吃对食物,滋养生命根基 饮食是健康的物质基础,需遵循 “均衡、天然、顺应时节” 原则: 三餐科学搭配: 早餐以高蛋白 膳食纤维为主,如燕麦粥配水煮蛋、蓝莓,快速激活代谢;…...
OpenCV 图像直方图:从原理剖析到实战应用
在数字图像处理领域,图像直方图是一种强大而基础的工具,它以直观的方式展示了图像中像素值的分布情况。OpenCV 作为广泛应用的计算机视觉库,提供了丰富的函数来处理图像直方图。本文将深入讲解图像直方图的原理、OpenCV 中的实现方法…...
springboot+vue实现在线书店(图书商城)系统
今天教大家如何设计一个图书商城 , 基于目前主流的技术:前端vue,后端springboot。 同时还带来的项目的部署教程。 视频演示 在线书城 图片演示 一. 系统概述 商城是一款比较庞大的系统,需要有商品中心,库存中心,订单…...
LLM Text2SQL NL2SQL 实战总结
目录 尽量全面的描述表的功能 尽量全面的描述字段的功能 适当放弃意义等价的字段 放弃业务上无用的字段 对于LLM来说,由于它没有什么行业经验,所以我们需要尽可能的给予它恰当的“背景信息”,才能使它更好的工作。所谓恰当,不是越多越好,因为太多的信息会消耗掉LLM的可…...
SQLPub:一个提供AI助手的免费MySQL数据库服务
给大家介绍一个免费的 MySQL 在线数据库环境:SQLPub。它提供了最新版本的 MySQL 服务器测试服务,可以方便开发者和测试人员验证数据库功能,也可以用于学习 MySQL。 免费申请 在浏览器中输入以下网址: https://sqlpub.com/ SQLP…...
EasyExcel集成使用总结与完整示例
EasyExcel集成使用总结与完整示例 一、EasyExcel简介 EasyExcel是阿里巴巴开源的Java库,专注于简化Excel文件的读写操作。它基于Apache POI进行了优化,采用流式处理,具有低内存占用和高性能的特点,非常适合处理大规模数据的导入…...
【hot100-动态规划-139.单词拆分】
力扣139.单词拆分 本题要求判断给定的字符串 s 是否可以被空格拆分为一个或多个在字典 wordDict 中出现的单词,且不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用,这是一个典型的动态规划问题。 动态规划思路 定义状态: 定义一个布尔类型的数组 dp,其中…...
人工神经网络(ANN)模型
一、概述 人工神经网络(Artificial Neural Network,ANN),是一种模拟生物神经网络结构和功能的计算模型,它通过大量的神经元相互连接,实现对复杂数据的处理和模式识别。从本质上讲,人工神经网络是…...
2025ICPC陕西省赛题解
L. easy 每行选能选的最小的两个,注意处理奇数的情况。 #include <bits/stdc.h> #define x first #define y second #define int long longusing namespace std; typedef unsigned long long ULL ; typedef pair<int,int> PII ; typedef pair<lon…...
不同进制的数据展示(十进制、十六进制、编码方式)
目录 1、十六进制的数值转为十进制(可能是补码) 2、十进制转为十六进制(负数要转为补码) 背景: (1) 接收到通讯的数据,把数据读取出来,并转成自己想要的格式。 &#x…...
贝叶斯优化Transformer融合支持向量机多变量回归预测,附相关性气泡图、散点密度图,Matlab实现
贝叶斯优化Transformer融合支持向量机多变量回归预测,附相关性气泡图、散点密度图,Matlab实现 目录 贝叶斯优化Transformer融合支持向量机多变量回归预测,附相关性气泡图、散点密度图,Matlab实现效果一览基本介绍程序设计参考资料…...
为什么doris是实时的?
Apache Doris 作为实时分析型数据库的核心竞争力源于其技术架构与功能设计的深度融合,以下从关键特性解析其实时能力的技术实现: 一、 MPP架构驱动分布式并行计算 基于 大规模并行处理(MPP)架构,Dori…...
ProceedingJoinPoint的认识
ProceedingJoinPoint 是 Spring AOP(面向切面编程) 中的核心接口,用于在 环绕通知(Around) 中拦截方法调用并控制其执行流程。以下是对其功能和用法的详细解释: 核心作用 拦截目标方法 在方法执行前后插…...
穿透工具如何保证信息安全?
引言 在当今数字化时代,网络穿透工具(如VPN、SSH隧道、内网穿透工具等)已成为企业远程办公和个人隐私保护的重要技术手段。然而,这些工具本身也可能成为信息安全的风险点。本文将探讨穿透工具如何在不牺牲便利性的前提下ÿ…...
卷积神经网络和深度神经网络的区别是什么?
近 6000 字长文梳理深度神经网络结构。 先来一个省流版回答:卷积神经网络(CNN)只是深度神经网络(DNN)家族中的一员,其处理数据(如图像)的核心方式是卷积操作,因此而得名…...
C#语言中 (元,组) 的发展史
C# 中的元组(Tuple)详解 元组(Tuple)是 C# 中的一种数据结构,用于将多个不同类型的值组合成一个复合值。元组在 C# 7.0 中得到了重大改进,提供了更简洁的语法和更好的性能。 1. 元组的基本概念 元组允许你将多个值组合成一个单…...
Apollo学习——planning模块(3)之planning_base
planning_component、planning_base、on_lane_planning 和 navi_planning 的关系 1. 模块关系总览 继承层次 PlanningComponent:Cyber RT 框架中的 入口组件,负责调度规划模块的输入输出和管理生命周期。PlanningBase:规划算法的 抽象基类&…...
【SPIN】PROMELA语言编程入门基础语法(SPIN学习系列--1)
PROMELA(Protocol Meta Language)是一种用于描述和验证并发系统的形式化建模语言,主要与SPIN(Simple Promela Interpreter)模型检查器配合使用。本教程将基于JSPIN(SPIN的Java图形化版本)&#…...
Linux --systemctl损坏
systemctlSegmentation fault (core dumped) 提示这个 Ubuntu/Debian sudo apt-get update sudo apt-get --reinstall install systemdCentOS/RHEL sudo yum reinstall systemd # 或 CentOS 8 / RHEL 8 sudo dnf reinstall systemd...
Vue3+ElementPlus 开箱即用后台管理系统,支持白天黑夜主题切换,通用管理组件,
Vue3ElementPlus后台管理系统,支持白天黑夜主题切换,专为教育管理场景设计。主要功能包括用户管理(管理员、教师、学生)、课件资源管理(课件列表、下载中心)和数据统计(使用情况、教学效率等&am…...
Seata源码—3.全局事务注解扫描器的初始化二
大纲 1.全局事务注解扫描器继承的父类与实现的接口 2.全局事务注解扫描器的核心变量 3.Spring容器初始化后初始化Seata客户端的源码 4.TM全局事务管理器客户端初始化的源码 5.TM组件的Netty网络通信客户端初始化源码 6.Seata框架的SPI动态扩展机制源码 7.向Seata客户端注…...
Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(七)
Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(七) 在 Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(六)-CSDN博客 的基础上改进,主要是…...
快速搭建一个electron-vite项目
1. 初始化项目 在命令行中运行以下命令 npm create quick-start/electronlatest也可以通过附加命令行选项直接指定项目名称和你想要使用的模版。例如,要构建一个 Electron Vue 项目,运行: # npm 7,需要添加额外的 --: npm cre…...
Python网络请求利器:urllib库深度解析
一、urllib库概述 urllib是Python内置的HTTP请求库,无需额外安装即可使用。它由四个核心模块构成: urllib.request:发起HTTP请求的核心模块urllib.error:处理请求异常(如404、超时等)…...