当前位置: 首页 > news >正文

BA是什么?

目录

1.EKF的步骤

一、问题定义与模型建立

二、线性化处理

三、应用卡尔曼滤波

四、迭代与收敛

五、结果评估与优化

注意事项

2.BA问题的步骤

一、问题定义与数据准备

二、构建优化模型

三、选择优化算法

四、执行优化过程

五、结果评估与优化

六、应用与验证

1.BA的定义

2.BA的基本原理

(1) 数学建模

(2) 误差函数构建

(3) 非线性优化

3.VSLAM中的优化


1.EKF的步骤

EKF,即扩展卡尔曼滤波(Extended Kalman Filter),是一种应用于非线性系统的状态估计方法。它通过泰勒级数展开将非线性系统线性化,然后使用标准的卡尔曼滤波算法进行状态估计。以下是EKF问题解决的一般步骤:

一、问题定义与模型建立
  1. 明确目标:确定要估计的状态变量,如位置、速度

  2. 建立模型

    • 状态方程:描述系统状态如何随时间变化的非线性方程。
    • 观测方程:描述系统状态与观测值之间的非线性关系。
二、线性化处理
  1. 泰勒级数展开:对状态方程和观测方程中的非线性函数进行泰勒级数展开,并忽略二阶及以上项,得到近似的线性化模型。
  2. 计算雅克比矩阵:线性化后的模型需要计算状态转移矩阵F和观测矩阵H的雅克比矩阵,这些矩阵描述了线性化后的状态变化率和观测变化率。
三、应用卡尔曼滤波
  1. 初始化:设置初始状态估计值、初始状态估计误差协方差矩阵等。

  2. 预测步骤

    • 状态预测:使用线性化后的状态方程预测当前时刻的状态。
    • 协方差预测:使用状态转移矩阵F和初始状态估计误差协方差矩阵预测当前时刻的协方差矩阵。
  3. 更新步骤

    • 计算卡尔曼增益:根据观测矩阵H、观测噪声协方差矩阵R和预测协方差矩阵计算卡尔曼增益。
    • 状态更新:使用观测值和卡尔曼增益更新状态估计值。
    • 协方差更新:使用卡尔曼增益和观测噪声协方差矩阵更新协方差矩阵。
四、迭代与收敛
  1. 迭代:重复预测和更新步骤,直到满足终止条件(如达到最大迭代次数或状态估计误差小于某个阈值)。
  2. 收敛性判断:检查状态估计值和协方差矩阵是否收敛,即是否在某个范围内稳定波动。
五、结果评估与优化
  1. 结果评估:通过对比实际观测值和估计值,评估EKF算法的性能。
  2. 优化:根据评估结果,调整模型参数、噪声协方差矩阵等,以提高EKF算法的准确性和稳定性。
注意事项
  1. 线性化假设:EKF依赖于局部线性化假设,当系统非线性较强时,线性化误差可能较大,导致算法性能下降。
  2. 噪声假设:EKF假设过程噪声和观测噪声都是高斯白噪声,且噪声统计特性已知。在实际应用中,这些假设可能不成立,需要进行适当的调整。
  3. 计算复杂度:EKF需要计算雅克比矩阵和进行矩阵运算,计算复杂度较高。在实际应用中,需要考虑计算资源的限制。

通过以上步骤,可以解决非线性系统中的状态估计问题,并应用EKF算法进行实时状态估计。

2.BA问题的步骤

BA问题,即束调整(Bundle Adjustment)问题,是计算机视觉和摄影测量中的一个关键问题。它本质上是一个优化问题,旨在通过最小化重投影误差来优化三维结构和相机参数。以下是BA问题解决的一般步骤:

一、问题定义与数据准备
  1. 明确目标:确定要优化的参数,包括三维点的位置、相机的姿态(旋转和平移)、内部校准参数(如焦距、主点等)以及可能的径向畸变参数。
  2. 收集数据:获取多张包含同一场景的照片以及对应的相机参数(如焦距、曝光时间等)和图像特征点(如角点、边缘等)的匹配信息。
二、构建优化模型
  1. 建立重投影误差模型:对于每个图像特征点,计算其在三维空间中的位置,并将其投影到对应的图像平面上,与实际观测到的位置进行比较,形成重投影误差。
  2. 构建非线性最小二乘问题:将重投影误差的平方和作为目标函数,形成一个非线性最小二乘问题。
三、选择优化算法
  1. Levenberg-Marquardt算法:BA问题通常使用Levenberg-Marquardt(LM)算法进行求解,因为它在处理非线性最小二乘问题时具有较好的收敛性和鲁棒性。
  2. 稀疏性利用:由于BA问题的线性系统具有稀疏块结构,可以利用稀疏性来减少计算量,提高求解效率。
四、执行优化过程
  1. 初始化参数:为待优化的参数设置初始值,这些初始值可以通过其他方法(如SFM、ICP等)获得或随机生成。
  2. 迭代优化:使用LM算法进行迭代优化,每次迭代都更新参数值,并计算新的重投影误差。
  3. 检查收敛性:在每次迭代后,检查目标函数的值是否满足收敛条件(如变化量小于某个阈值),如果满足,则停止迭代;否则,继续迭代。
五、结果评估与优化
  1. 评估结果:检查优化后的参数是否满足预期要求,如三维点的位置是否合理、相机的姿态是否准确等。
  2. 优化调整:如果评估结果不理想,可以调整优化算法的参数(如LM算法的阻尼因子、迭代次数等),或重新收集数据并重新执行优化过程。
六、应用与验证
  1. 应用优化结果:将优化后的参数应用于实际场景,如三维重建、相机定位等。
  2. 验证准确性:通过与其他方法(如激光扫描、GPS等)的结果进行比较,验证BA问题的优化结果的准确性。

通过以上步骤,可以解决BA问题,并优化三维结构和相机参数,为计算机视觉和摄影测量的应用提供准确的基础数据。

3.0滑窗

在视觉SLAM(Simultaneous Localization and Mapping)中,滑动窗口法是一种用于控制后端束调整(Bundle Adjustment,BA)规模的有效方法。以下是视觉SLAM中滑动窗口法的解决步骤:

一、滑动窗口法引入

在SLAM过程中,随着关键帧和路标点的增多,后端BA的计算效率会不断下降。为了避免这种情况,需要使用滑动窗口法将待优化的关键帧限制在一定的数量内,从而控制BA的规模。

二、滑动窗口法操作

滑动窗口法的核心在于如何有效地添加和删除关键帧,同时保持优化问题的稀疏性和一致性。

  1. 新增关键帧

    • 当新的关键帧被添加到窗口中时,需要将其及其观测到的路标点一起加入到BA优化问题中。
    • 这通常涉及构建新的误差项,并更新整体的Hessian矩阵和残差向量。
  2. 删除旧的关键帧

    • 为了保持窗口的大小固定,需要定期删除窗口中的旧关键帧。
    • 然而,直接删除关键帧会丢失信息,并破坏相邻关键帧之间的约束关系。因此,实际上采用的是边缘化的方法。
三、边缘化过程

边缘化是一种将某些变量从优化问题中移除,同时保留其信息的方法。在滑动窗口法中,边缘化通常用于处理被删除的关键帧及其观测到的路标点。

  1. 选择被边缘化的变量

    • 确定要删除的关键帧,并找出其观测到的所有路标点。
  2. 构建边缘化方程

    • 利用BA优化问题的Hessian矩阵和残差向量,构建与被边缘化变量相关的边缘化方程。
  3. 执行边缘化操作

    • 通过舒尔补(Schur complement)等方法,将被边缘化的变量从Hessian矩阵中消去,同时更新残差向量。
    • 这将导致与被边缘化变量相关的变量在新的线性化点上计算雅可比矩阵,从而引入先验信息。
  4. 保持稀疏性

    • 为了保持优化问题的稀疏性,需要采取一些策略来减少Fill-in现象。例如,在边缘化旧的关键帧时,可以同时边缘化其观测到的路标点,从而将路标点的信息转换成剩下关键帧之间的共视信息。
四、滑动窗口法的迭代优化

在滑动窗口法中,随着窗口的滑动,需要不断迭代地更新Hessian矩阵和残差向量,并重新进行BA优化。这通常涉及以下步骤:

  1. 更新窗口

    • 根据一定的策略(如时间、空间等)选择新的关键帧添加到窗口中,并删除最旧的关键帧。
  2. 构建新的优化问题

    • 根据更新后的窗口内容,构建新的BA优化问题。
  3. 执行BA优化

    • 利用现有的优化算法(如Gauss-Newton、Levenberg-Marquardt等)对新的优化问题进行求解。
  4. 更新状态估计

    • 根据优化结果更新相机位姿和路标点位置等状态变量。
五、注意事项
  1. 一致性问题

    • 在滑动窗口法中,由于边缘化操作会引入先验信息,并导致与被边缘化变量相关的变量在不同的线性化点上计算雅可比矩阵,因此可能会破坏系统的一致性。为了缓解这一问题,可以采取一些策略来减少Fill-in现象,并保持优化问题的稀疏性。
  2. 滑动窗口法适用性

    • 滑动窗口法比较适合视觉里程计(Visual Odometry,VO)系统,因为它能够实时地处理新的关键帧并丢弃旧的关键帧。然而,对于大规模建图的系统来说,滑动窗口法可能无法提供足够的全局一致性信息。在这种情况下,可以考虑使用其他方法(如位姿图优化)来补充全局信息。

综上所述,视觉SLAM中的滑动窗口法是一种有效的控制后端BA规模的方法。通过合理地添加和删除关键帧,并保持优化问题的稀疏性和一致性,可以实现实时的位姿估计和地图构建。

1.BA的定义

BA的中文译为“光束法平差”,也有翻译为“束调整”、“捆绑调整”等,是一种用于计算机视觉和机器人领域的优化技术,主要用于精确优化相机参数(包括内参数和外参数)和三维空间中特征点的位置。BA的目标是通过最小化重投影误差来提高三维重建的精度和一致性。重投影误差是指实际观测到的图像点和通过估计的三维点投影到图像平面上的点之间的距离。重投影误差的示意图如图3所示,其中p1 、p2 和p3 是通过特征匹配知道的同一个空间点P的投影,但是相机的位姿是未知的。初值中P的投影p'1 与实际的p1 之间有距离e,此时可以 调整相机的位姿使之变小。由于这个调整要考虑到很多 个点,而每个点的误差不会为0,因此最终的效果应是整体误差的缩小,这种把相机和三维点放在一起进行最小化的问题统称为BA

2.BA的基本原理

BA的基本原理可以概括为以下几个步骤:

(1) 数学建模

假设有n个三维点和m个相机位置,定义一个误差函 数,该函数计算所有图像观测值与重投影值之间的误差和。 考虑空间中的第i个3D路标点坐标为Pi =[Xi ,Yi ,Zi ]T, 其投影的2D像素坐标为pi ,希望计算的相机位姿的李代 数用ξ表述,每个匹配好的特征点相应的深度为s,相机的内参矩阵为K,包含fx 、fy 、Cx 、Cy 四个参数,Pi 变换到相机坐标系下的空间点坐标为P'i ,则3D路标点到2D 特征点的转换关系如下:

(2) 误差函数构建

由于未知的相机位姿和观测中的噪声,这个等式存在 误差,无法找到一个准确的解。因此,将误差求和构造一 个最小二乘问题,然后找到最佳相机位姿以及特征点的位 置进行最小化,方程如下:

(3) 非线性优化

常用的解非线性最小二乘问题的方法有最速下降法、 高斯牛顿(GaussianNewton,GN)法、列文伯格马尔夸特(LevenbergMarquardt,LM)法等。然而,最速下降法 在计算时容易走出锯齿路线,反而增加了迭代次数,GN 法采用的近似二阶泰勒展开只能在展开点附近有较好的近似效果。

LM法可以看作是GN法和最速下降法的结合。它 通过引入一个调整参数μ来平衡GN法和最速下降法,从 而提高算法的鲁棒性和收敛速度。LM法比GN法有更好的全局收敛性,对于不良条件化问题或远离最优解的初始估计,LM法表现更好。但是,LM方法的计算成本更高。通过增量求解方程,可以求解当前变量的一个改进, LM算法的增量方程如下:

在特征点优化的过程中,式(4)是一个三维线性方程组,在位姿估计过程中,式(4)是六维线性方程组。I为一 个单位矩阵,f(x)是在x处的目标函数值。当在FPGA上部署LM算法时,为了避免重复的λ更新操作,设置缩 放因子,并在每次迭代后,检查系统的误差情况,若误差减 小,则说明优化情况良好,λ除缩放因子,若误差增大,则λ乘缩放因子。

在进行矩阵求解时,针对矩阵的规模和类型,目前最 新的成果中有FSFICholesky、FIIterative和PCG等方 法。FSFICholesky是基于Cholesky分解的直接解法, 适用于稠密矩阵,通过将矩阵分解为下三角矩阵及其转置 来解矩阵。FSFICholesky优化了传统Cholesky分解中 的除法和平方根运算,因此在处理小规模矩阵时表现良 好,尤其在硬件实现中效率更高。FIIterative是基于迭 代法的求解方法,适合大规模矩阵,尤其是稀疏矩阵。它 通过迭代计算来逐步逼近线性方程组的解,计算复杂度较 低,适合高并行度的硬件实现。PCG也是一种迭代法,适 用于大规模稀疏对称正定矩阵。它通过引入预条件器来 加速收敛,特别适合解决复杂度较高的问题,在大规模矩 阵求解中常用。

3.VSLAM中的优化

VSLAM系统中的前端和后端均涉及BA优化,它 们各自承担不同的任务,并相互配合,最终完成机器人对 环境的建图和自我定位。前端优化主要处理图像数据,提 取视觉特征并建立初步的位姿估计;后端优化是全局优 化,主要对整个系统中的地图和位姿信息进行全局一致性 的调整和优化。

前端优化算法主要分为3类:对极几何法、迭代最近点算法(Iterative Closest Point, ICP)和透视n点算法(PerspectivenPoint, PnP)。对极几何法由于主要应用于单目相机,无法获取深度信息,因此具有一定的局限性。ICP算法通过旋转和平移操作来最小化两点集之间的距离,但其精度相对较低。PnP算法通过构建非线性优化问题, 采用最小二乘法进行求解,即通常所称的BA,它是最为关键的位姿估计方法之一。在机器人应用中,只有在获得物体的三维位置和方向后,机器人才能实现高效且精确的运动。在AR应用中,系统利用真实场景中的二维或三维对象作为标记,将虚拟信息与真实场景对齐,这一过程也与相机的姿态密切相关,从而为用户带来真实的体验。因此BA的应用范围更加广泛,合性能较为优异。

在后端优化中,BA是一种全局非线性优化方法,它优化的不仅是相机的位姿,还包括3D地图点的位置。BA是一个高度复杂的非线性最小二乘问题,涉及大量的计算资源。BA 的核心目标是最小化所有帧的重投影误差,从而实现整个系统的全局一致性

相关文章:

BA是什么?

目录 1.EKF的步骤 一、问题定义与模型建立 二、线性化处理 三、应用卡尔曼滤波 四、迭代与收敛 五、结果评估与优化 注意事项 2.BA问题的步骤 一、问题定义与数据准备 二、构建优化模型 三、选择优化算法 四、执行优化过程 五、结果评估与优化 六、应用与验证 1.…...

通过docker 搭建jenkins环境;

一、官网简介使用安装说明: How to use this image docker run -p 8080:8080 -p 50000:50000 jenkins This will store the workspace in /var/jenkins_home. All Jenkins data lives in there - including plugins and configuration. You will probably want to make that …...

10-高级主题

第10节 高级主题 在这一节中,我们将探讨一些 Python 中的高级主题,包括装饰器、生成器、上下文管理器、元类以及常用的设计模式。这些高级特性能够帮助你编写更强大、更灵活的代码。 10.1 装饰器 装饰器是一种特殊类型的函数,可以修改其他函数…...

harbor常见问题及解决方法分享

harbor常见问题及解决方法分享 参考自《harbor权威指南》。 1. harbor配置文件不生效 问题现象 无论是在生产环境下还是在测试环境下,都会有对配置文件进行修改的场景。很多用户在停掉Harbor容器后,都会修改配置文件然后启动Harbor,发现配…...

行列式与线性方程组解的关系

线性方程组是数学中一个重要的概念,它描述了多个变量之间的线性关系。行列式作为方阵的一个特殊值,对于判断线性方程组解的存在性和唯一性有着重要的作用。本文将探讨行列式与线性方程组解之间的关系,并区分齐次和非齐次方程组的情况。 齐次…...

四、自然语言处理_02RNN基础知识笔记

1、RNN的定义 RNN(Recurrent Neural Network,循环神经网络)是一种专门用于处理序列数据的神经网络架构,它与传统的前馈神经网络(Feedforward Neural Network)不同,主要区别在于它能够处理输入数…...

Spring 容器管理 Bean

Bean是什么 Bean 是指 Java 中的可重用软件组件,容器会根据提供的元数据来创建和管理这些 Bean,也包括它们之间的依赖关系。Spring 容器对 Bean 并没有太多的要求,无须实现特定接口或依赖特定库,只要是最普通的 Java 对象即可,这类对象也被称为 POJO(Plain Old Java Obj…...

SpringBoot开发——Spring Boot3.4 强大的结构化日志记录

文章目录 1. 简介2. 实战案例2.1 环境依赖2.2 快速入门2.3 输出到文件2.4 添加附加字段2.5 自定义日志格式总结1. 简介 日志记录是应用故障排除中早已确立的部分,也是可观测性的三大支柱之一,另外两个是指标和追踪。在生产环境中,没有人喜欢盲目行事,而当故障发生时,开发…...

信号和槽思维脑图+相关练习

将登录框中的取消按钮使用信号和槽的机制,关闭界面。 将登录按钮使用信号和槽连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin",密码是否为"123456",如果账号密码匹配成功,当前界面关…...

Unity Feel插件快速入门

What is Feel? Feel是一个即用型解决方案,让你的Unity项目提高游戏体验,增强玩家获得的反馈感,例如相机震动,屏幕闪烁,淡入淡出,等等几十种效果。这是一个模块化、用户友好、易于扩展的系统。 本文旨在让你快速入门,从全局快速了解这个插件,以及基本用…...

数据链路层(四)---PPP协议的工作状态

1 PPP链路的初始化 通过前面几章的学习,我们学了了PPP协议帧的格式以及组成,那么对于使用PPP协议的链路是怎么初始化的呢? 当用户拨号上网接入到ISP后,就建立起了一条个人用户到ISP的物理链路。这时,用户向ISP发送一…...

【C++】入门【六】

本节目标 一、继承的概念及定义 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 五、继承与友元 六、继承与静态成员 七、复杂的菱形继承及菱形虚拟继承 八、继承的总结和反思 九、笔试面试题 一、继承的概念及定义 1.继承的概念 继承是面向对象…...

UE5 C++ 不规则按钮识别,复选框不规则识别 UPIrregularWidgets

插件名称:UPIrregularWidgets 插件包含以下功能 你可以点击任何图片,而不仅限于矩形图片。 UPButton、UPCheckbox 基于原始的 Button、Checkbox 扩展。 复选框增加了不规则图像识别功能,复选框增加了悬停事件。 欢迎来到我的博客 记录学习过…...

Elasticsearch Serverless 现已正式发布

作者:来自 Elastic Yaru Lin 基于全新无状态(stateless)架构的 Elasticsearch Serverless 现已正式发布。它采用完全托管方式,因此你可以快速启动项目而无需操作或升级,并且可以使用最新的向量搜索和生成式 AI 功能。 …...

如何使用apache部署若依前后端分离项目

本章教程介绍,如何在apache上部署若依前后端分离项目 一、教程说明 本章教程,不介绍如何启动后端以及安装数据库等步骤,着重介绍apache的反向代理如何配置。 参考此教程,默认你已经完成了若依后端服务的启动步骤。 前端打包命令使用以下命令进行打包之后会生成一个dist目录…...

openEuler安装UKUI桌面

# 升级更新 sudo yum -y update # 安装UKUI界面 dnf install ukui # 设置图形启动 systemctl set-default graphical.target # 重启 # 查看当前系统启动模式 systemctl get-default # 修改默认启动模式为 命令行界面模式 systemctl set-default multi-user.target 在UK…...

深入理解Oracle DB的锁和闩

1. 引言 本文深入介绍Oracle DB的锁和闩。 2. Oracle DB 锁的基本概念 2.1 定义与作用 锁是 Oracle 数据库用于控制并发访问的一种机制。它用于防止多个事务同时对同一数据进行不一致的操作,确保数据的完整性和一致性。例如,当一个事务正在更新一行数…...

jenkins+github+springboot自动部署

背景: 最近看流水线有点意思,就说自己也搞一套。 预期效果: idea提交代码后,GitHub接收,jenkins自动部署。【后续加个自动部署时的代码检查、单元测试、安全测试、sonarqube】 思路分析: idea上的spring代码push到gi…...

HTML5系列(10)-- 地理位置服务指南

前端技术探索系列:HTML5 地理位置服务指南 🌍 致读者:探索位置服务的魅力 👋 前端开发者们, 今天我们将深入探讨 HTML5 的地理位置服务(Geolocation API),这项强大的功能让我们能…...

【MySQL 进阶之路】SQL 优化

6.SQL 性能分析笔记 在现代数据库的高并发环境下,SQL 查询优化成为提升系统性能和响应速度的关键。本文将总结常见的 SQL 优化策略,包括插入优化、主键设计、排序优化、GROUP BY 优化等,帮助你在面对大规模数据时,做到高效查询和…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...