腿足机器人之四- 卡尔曼滤波
腿足机器人之四卡尔曼滤波
- 概率学基础
- 贝叶斯准则
- 熵
- 卡尔曼滤波
- 扩展卡尔曼滤波
- 信息滤波器
在机器人(四足、人形)领域,感知和行动的不确定性可能由多种因素引起,如传感器噪声、外部环境的变化、非精确控制以及实时性算力限制等。
和人类类似,基于无机体的智能机器人需要四模块,认知推理模块、运动/行动模块、视觉和听觉模块,当前深度神经网络的发展已经使得机器在视觉(识别,理解)和听觉(语音识别、语音合成)一些方面已经超越人类平均水平(如识别的准确性),而多模态大语言模型的发展使得认知推理模块的发展也较为迅速,而运动/行动模块的发展相对滞后一些,当运动/行动模块发展好了之后,会应该模块之间的融合。
因此行动放在了这一系列博文的开端。
为了处理机器人感知和行动中不确定性,衍生出了如混合动力系统(Hybrid Systems)、概率机器人学(Probabilistic robotics)、深度学习(Deep Learning)、强化学习(Reinforcement Learning)等范式,每一种都提供了处理不确定性的独特方法,它们可以单独使用,也可以与其他方法结合起来,以优化四足和人形机器人在多变环境中的表现。
概率机器人学(Probabilistic robotics)的关键思想是使用概率论的微积分明确地表示不确定性,这和规划算法相比,需要的算力会高不少。
概率机器人专著
概率学基础
对于概率密度、高斯分布、混合高斯分布不清楚的,可以网上搜索关键词或者查找概率论相关的著作,这里展示概率论中两个比较核心的点,贝叶斯准则和熵。
贝叶斯准则
贝叶斯准则(Bayes’ Theorem),也称为贝叶斯法则或贝叶斯更新,是概率论中的一个核心概念,用于计算条件概率。也就是说,它描述了在已知某些信息的情况下如何更新事件发生的概率。贝叶斯准则是基于先前的知识或信念对未知概率的一种修正方式。
贝叶斯准则可以表示为:
P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ) P(A∣B)= \frac{P(B∣A)P(A)}{P(B)} P(A∣B)=P(B)P(B∣A)P(A)
其中:
P ( A ∣ B ) P(A | B) P(A∣B)是在事件 (B) 发生的条件下事件 (A) 发生的概率,称为后验概率。
P ( B ∣ A ) P(B | A) P(B∣A)是在事件 (A) 发生的条件下事件 (B) 发生的概率。
P ( A ) P(A) P(A) 和 P ( B ) P(B) P(B)分别是 (A) 和 (B) 发生的边缘概率。
概率的理解和计算
边缘概率 P ( A ) P(A) P(A) 和 P ( B ) P(B) P(B): 这是不考虑其他因素影响下单独某事件发生的概率。
条件概率 P ( B ∣ A ) P(B | A) P(B∣A): 表示在已知事件 (A) 发生的情况下,事件 (B) 发生的概率。
后验概率 P ( A ∣ B ) P(A | B) P(A∣B): 表示在已知事件 (B) 发生的情况下,事件 (A) 发生的概率。这是贝叶斯准则计算的主要目标,也是基于新证据对原有信念进行更新的过程。
概率密度用小写字母表示,如 p p p,概率用大写字母,如 P P P,这是因为概率是通过概率密度积分(连续情况,如观察火箭深空时尾焰温度)或者求和(离散情况,如抛硬币)。
还是以一个机器人行动的例子说明贝叶斯准则是如何使用的。
场景设定
假设一个机器人在一个已知环境中导航,但机器人的确切位置有不确定性。机器人可以通过传感器读取周围环境(如墙壁的距离)并移动,但这些传感器和移动的命令执行都有误差。
问题定义
机器人的任务是根据传感器读取和之前的移动历史估计自己的当前位置。这里的关键是如何根据新的传感器数据更新机器人对当前位置的估计。
几个贝叶斯准则涉及的概率
先验概率 P ( x ) P(x) P(x): 在获取新的传感器数据之前,机器人对自己可能位置的估计。这称为“先验概率”,基于以往的位置信息和移动命令。
似然概率 P ( z ∣ x ) P(z \mid x) P(z∣x) 在已知机器人位于特定位置 x x x 的情况下,得到当前传感器读数 z z z的概率。这反映了传感器的特性,如传感器误差等。
证据 P ( z ) P(z) P(z): 这通常是用全概率定理计算的,表示在所有可能位置下得到当前传感器读数 z z z的概率。
后验概率 P ( x ∣ z ) P(x \mid z) P(x∣z): 给定新的传感器读数 z z z 后,机器人位置为 x x x 的概率。这是我们希望计算的结果——在新证据的基础上更新的位置估计。
显然后验概率要比先验概率得到的位置更准,因为其使用了传感器的数据进行了“校准”,
通过贝叶斯准则,我们可以结合先验概率和新的传感器信息来得到后验概率:
P ( x ∣ z ) = P ( z ∣ x ) P ( x ) P ( z ) P(x|z)=\frac{P(z|x)P(x)}{P(z)} P(x∣z)=P(z)P(z∣x)P(x)
这里, P ( x ∣ z ) P(x \mid z) P(x∣z)告诉我们在观察到新数据后,各个位置的可能性。
在实践中,该过程会不断重复,每次机器人获取新的传感器信息或移动时,都会使用贝叶斯准则来更新位置的估计。这个过程使得机器人能够综合所有可用信息,并不断改进自身对于当前位置的估计。
另外 P ( z ) P(z) P(z)是不需要求的,因为上面不断重复的过程中,分母都是 P ( z ) P(z) P(z),其类似一个归一化因子的作用。
另外需要注意的是,机器人一般都是多传感器的,这里增加传感器 y y y,这样就涉及到两个传感器,其联合概率密度的贝叶斯公式,如下:
P ( x ∣ z , y ) = P ( y ∣ x , z ) P ( x ∣ z ) P ( y ∣ z ) P(x|z,y) = \frac{P(y|x,z)P(x|z)}{P(y|z)} P(x∣z,y)=P(y∣z)P(y∣x,z)P(x∣z)
熵
熵(Entropy)是信息论中的一个核心概念,用以量化随机变量的不确定性或者信息的随机性。对于离散随机变量,熵被定义为其概率分布的期望信息量,这可以被理解为如果你知道随机变量的实际取值,你将会获得多少信息。
熵的数学表达
对于一个离散随机变量,其熵 H ( P ) H(P) H(P) 可以通过下面的表达式给出:
H ( P ) = − ∑ x p ( x ) log 2 p ( x ) H(P)=− \sum \limits_x p(x)\log_{2}p(x) H(P)=−x∑p(x)log2p(x)
其中:
- p ( x ) p(x) p(x) 是随机变量取特定值 x x x 的概率。
- log 2 p ( x ) \log_2 p(x) log2p(x)是以 2 为底 p ( x ) p(x) p(x)的对数。
信息量通常定义为 − log 2 p ( x ) -\log_2 p(x) −log2p(x),这表示如果事件 x x x 发生,你将获得的信息量。这里的对数以 2 为底,因而结果的单位是比特(bits),即在二进制表述中表示信息的单位。前面加负号是因为 p ( x ) p(x) p(x) 是一个概率值,所以它位于 0 和 1 之间。对这种概率值取对数将会得到一个负值(因为对小于 1 的正数取对数结果为负),为了使信息量为正,我们在前面加上一个负号。
熵实际上是信息量 − log 2 p ( x ) -\log_2 p(x) −log2p(x)的期望值,即当随机变量随机地取各种可能值时,平均每次观测到的信息量。这个期望通过所有可能的 x x x 值的 p ( x ) log 2 p ( x ) p(x) \log_2 p(x) p(x)log2p(x) 的加权总和(权重即为概率 p ( x ) p(x) p(x))来计算。
熵度量了随机变量的不确定性。一个熵值高的随机变量其结果不可预料性更强,因而不确定性更高。反之,熵值低表示随机变量的结果可预料性更强,不确定性更低。
如果对于机器人行动状态求熵,如果其熵值等于0,那么意味着在某事件上的概率 ( p(x) = 1 )(即总是发生同一个结果),也即机器人永远只有一个状态。
在深度学习领域还有一个交叉熵,这个容易混淆,也做一个简单的介绍。
在深度学习中,交叉熵(Cross-Entropy)是一种常用的损失函数(Loss Function),用于评估模型的预测概率分布与真实标签的概率分布之间的差异。特别是在分类任务中,交叉熵损失非常流行,因为它可以有效地衡量预测结果的准确性。
交叉熵的定义
对于两个概率分布 ( p ) 和 ( q ),交叉熵定义为:
H ( p , q ) = − ∑ x p ( x ) log q ( x ) H(p,q)=-\sum \limits_x p(x)\log q(x) H(p,q)=−x∑p(x)logq(x)
其中:
- p ( x ) p(x) p(x) 是真实分布的概率,通常表示为标签的分布。
- q ( x ) q(x) q(x) 是模型预测的概率分布。
交叉熵提供了一个衡量两个概率分布之间差异的方法。在理想情况下,如果模型的预测 q ( x ) q(x) q(x)完全准确,那么它应该等于真实分布 p ( x ) p(x) p(x),这时交叉熵会达到最低值(理论上为0,当 q ( x ) = p ( x ) q(x) = p(x) q(x)=p(x) 时)。当预测值与实际值偏离越大,交叉熵值就越高。
卡尔曼滤波
状态转移和观测模型都是线性的,对于高斯状态的状态转移和测量的卡尔曼滤波算法如下:
一个高斯分布的概率密度可以由其均值和方差确定,这里 u t u_t ut表示的是控制器/驱动器均值向量(比如仰角、步速等), ∑ t − 1 \sum_{t-1} ∑t−1表示的是控制器协方差矩阵,之所以使用均值向量和协方差矩阵是因为机器人具有多个自由度。
z t z_t zt是传感器测量值,实际是一个向量,比如可以由多个距离、扭力、测力计等等构成。
首先我们可以根据驱动器信息 u t u_t ut和机器人的前一时刻状态 x t − 1 x_{t-1} xt−1(位置、或者姿势)来估算当前的时刻的姿势 x t x_{t} xt,然后再根据传感器的观测值 z t z_t zt来修正机器人在各个状态下概率值,最后以概率最高的状态作为机器人的状态。
第2行和3行就是获得当前状态的 x ‾ t \overline x_t xt(先验分布)的均值 μ ‾ t \overline \mu_t μt和方差 ∑ ‾ t \overline \sum_t ∑t信息(这是因为高斯分布可以由均值向量和协方差矩阵确定)。
第4行 K t K_t Kt是卡尔曼增益,该增益用于对不同的观测值加不同的权重,也即不同的传感器观测值对于最终的状态 x t x_t xt影响是不同的。
第5和6行是使用当前观测向量 z t z_t zt修正当前的状态 x t x_t xt(是由均值向量 μ t \mu_t μt和协方差矩阵 ∑ t \sum_t ∑t唯一表示,修正之后是后验分布,所以没有上划线了)。
卡尔曼滤波器是一种有效的线性估计工具,用于处理线性动态系统中的噪声测量数据,然而实际的机器人应用中可能不成立。例如,机器人在执行任务时可能会执行复杂的非线性运动(如圆周运动),这种情况下,其状态变化不能简单地用线性方程描述。此外,机器人的实际运动可能受多种因素影响,导致其状态分布是多峰的或非高斯的,这超出了普通卡尔曼滤波器的处理范围。
因此,对于复杂或高度非线性的机器人系统,更先进的滤波技术(如扩展卡尔曼滤波器(EKF)、无迹卡尔曼滤波器(UKF)或粒子滤波器)更加适合,因为这些方法能够更好地处理非线性问题和非高斯噪声。
扩展卡尔曼滤波
扩展卡尔曼滤波extended Kalman filter (EKF)将下一个状态的概率和观测概率使用非线性函数表示:
x t = g ( u t , x t − 1 ) + ϵ t x_t = g(u_t, x_{t-1})+\epsilon_t xt=g(ut,xt−1)+ϵt
z t = h ( x t ) + δ t z_t = h(x_t)+\delta_t zt=h(xt)+δt
其中 g g g和 h h h是非线性函数, x t x_t xt可以表示机器人的状态(空间中三维坐标叠加俯仰角姿势,即位置+姿势信息), U − t t U-tt U−tt是控制信息(比如各个驱动器,马达或者液压的驱动量), z t z_t zt是观测量(距离传感器、压力传感器,刚性力测量等),另外两个是扰动或者观测噪声。
当一个高斯分布通过这样的非线性函数处理时,输出通常不再是高斯分布,非线性函数 g g g将替换上面的 A t A_t At和 B t B_t Bt,而 h h h会取代 C t C_t Ct,这就导致状态的概率分布将不再是高斯分布,因而状态的概率分布精确解也无法求得。
EKF通过计算真实状态的概率分布的近似值来处理这一问题。它仍然使用高斯分布来表示这个近似的状态的概率分布,其中,任一时刻 (t) 的状态的概率分布 x t x_t xt由均值 μ t \mu_t μt和协方差 Σ t \Sigma_t Σt描述。具体方法是将非线性函数线性化。
线性化常用的技术包括泰勒展开(Taylor expansion)。泰勒展开是一种数学方法,用于在已知函数在某点的值及其导数的情况下,构建该函数在该点的线性近似。
对于EKF线性化做法是在高斯的均值处将函数 g g g近似为一条切线的方法,通过计算非线性函数 g g g 在高斯均值处的一阶导数(偏导数),可以构建一个与 g g g在该点切线相同的线性函数,通过这个线性近似函数而非原始的非线性函数来传播高斯分布,可以使后验分布仍然保持高斯形态。
对于感测非线性函数 h h h可以做类似的线性化,这意味着,尽管处理的是非线性系统,EKF通过近似线性化使得处理过程类似于线性系统的处理。由于线性化仅是近似方法,EKF可能在高度非线性的情况下表现不佳,特别是当系统偏离线性化点很远时,这是可能需要更高级的滤波技术,如无迹卡尔曼滤波器(UKF)或粒子滤波器。
EKF是一种计算效率非常高的状态估计工具。每次更新所需的时间复杂度为 ( O ( k 2.8 + n ) ) (O(k^{2.8} + n)) (O(k2.8+n)),其中 (k) 是测量向量 (z) 的维度,(n) 是状态向量 (x) 的维度。与可能需要指数级时间的其他算法(例如粒子滤波器)相比,EKF的效率优势尤为明显。
EKF保持了原始卡尔曼滤波器的简单性,使用多变量高斯分布来表示信念(即状态的概率分布)。因为高斯分布是单峰的,所以通常可以理解为对状态的单一估计,并附带一个不确定性椭圆来描述估计的可靠性。
EKF通常只能提供对状态的单一估计,无法处理多模态(multimodal)的情况,即可能存在多个不同的合理假设。例如,一个机器人可能在空间中有两个完全不同的位置假设,而这两个位置的算术平均值并不是一个可能的位置。
为了解决EKF在表示多模态信念方面的不足,一种常见的扩展是使用高斯混合模型(Gaussian Mixtures)来表示后验信念。一个高斯混合可以形式化为多个高斯分布的和,这允许表示和处理多个独立假设。
信息滤波器
信息滤波器和卡尔曼滤波器都是用来估计系统状态(比如机器人的位置,机器人的姿态等)的概率滤波器,且都假设信念(belief,即状态概率分布)是高斯分布的。
在KF及其非线性版本EKF中,状态更新和预测相对直观和计算效率高,但如果要计算协方差的逆等操作则相对复杂。
信息滤波器(IF, information filter)使用高斯分布的典范表示(canonical representation),这包括信息矩阵(information matrix) Ω = Σ − 1 \Omega = \Sigma^{-1} Ω=Σ−1和信息向量(information vector) ξ = Σ − 1 μ \xi = \Sigma^{-1} \mu ξ=Σ−1μ。信息矩阵是协方差矩阵的逆,信息向量是协方差矩阵的逆乘以均值向量。更新信息矩阵和信息向量(这涉及到矩阵的逆和乘法)可能更为直观和容易,尤其是在信息矩阵已知的情况下。但转换回常规的均值和协方差表示则相对复杂。
对于一个多元高斯分布,其概率密度函数如下:
p ( x ) = det ( 2 π Σ ) − 1 / 2 e − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) p(x)=\det (2\pi \Sigma)^{-1/2} e^{-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu)} p(x)=det(2πΣ)−1/2e−21(x−μ)TΣ−1(x−μ)
使用信息矩阵和信息向量替换之后,其概率密度可以表示为:
p ( x ) = η e − 1 2 x T Ω x + x T ξ p(x)=\eta e^{-\frac{1}{2}x^T\Omega x+x^T\xi} p(x)=ηe−21xTΩx+xTξ
在信息滤波器中,状态的全局不确定性的表示非常简单,只需将信息矩阵(Ω)设为0。而在卡尔曼滤波器中,这需要协方差矩阵有无限大的值。
信息滤波器天然适合处理多机器人集成的问题,尤其是需要集成多个机器人收集的分散感测数据的场景。信息滤波器通过简单地对信息进行加和来实现集成,这一过程是可交换的,可以在任意顺序、任意延迟及完全分散的方式下进行。但在高维状态空间的情况下,一般认为其计算效率低于卡尔曼滤波器。这也是为什么扩展卡尔曼滤波器(EKF)比扩展信息滤波器(EIF)更为流行的原因之一。
相关文章:
腿足机器人之四- 卡尔曼滤波
腿足机器人之四卡尔曼滤波 概率学基础贝叶斯准则熵 卡尔曼滤波扩展卡尔曼滤波信息滤波器 在机器人(四足、人形)领域,感知和行动的不确定性可能由多种因素引起,如传感器噪声、外部环境的变化、非精确控制以及实时性算力限制等。 和…...
nginx 部署前端vue项目
👨⚕ 主页: gis分享者 👨⚕ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕ 收录于专栏:前端工程师 文章目录 一、🍓什么是nginx?二、🍓nginx 部署…...
【第1章:深度学习概览——1.6 深度学习框架简介与选择建议】
嘿,各位老铁们,今天咱们来一场深度学习框架的深度探索之旅。在这个充满无限可能的深度学习时代,深度学习框架就像是连接理论与实践的桥梁,帮助我们从算法设计走向实际应用。随着技术的飞速发展,深度学习框架的选择变得越来越多样化,每一种框架都有其独特的优势和适用场景…...
NLLB 与 ChatGPT 双向优化:探索翻译模型与语言模型在小语种应用的融合策略
作者:来自 vivo 互联网算法团队- Huang Minghui 本文探讨了 NLLB 翻译模型与 ChatGPT 在小语种应用中的双向优化策略。首先介绍了 NLLB-200 的背景、数据、分词器和模型,以及其与 LLM(Large Language Model)的异同和协同关系。接着…...
C#的委托delegate与事件event
在C#中,delegate(委托)和 event(事件)是两个非常重要的概念,它们主要用于实现回调机制和事件驱动编程。下面详细介绍它们的原理和使用场景。 1. Delegate(委托) 1.1 委托的原理 委托…...
Spring Boot 集成MyBatis-Plus
文章目录 一、背景说明二、集成过程 2.1 引入 maven 依赖2.2 增加属性配置2.3 自动配置类 三、验证集成 3.1 控制器3.2 服务类3.3 Mapper接口类3.4 实体类3.4 不要忘记XML文件3.5 发起请求 四、技巧拓展 4.1 如何打印sql语句?4.2 如何对参数增加非空验证?…...
javacv将视频切分为m3u8视频并播放
学习链接 ffmpeg-demo 当前对应的 gitee代码 Spring boot视频播放(解决MP4大文件无法播放),整合ffmpeg,用m3u8切片播放。 springboot 通过javaCV 实现mp4转m3u8 上传oss 如何保护会员或付费视频?优酷是怎么做的? - HLS 流媒体加密 ffmpe…...
Docker 入门与实战:从安装到容器管理的完整指南
🚀 Docker 入门与实战:从安装到容器管理的完整指南 🌟 📖 简介 在现代软件开发中,容器化技术已经成为不可或缺的一部分。而 Docker 作为容器化领域的领头羊,以其轻量级、高效和跨平台的特性,深…...
计算机视觉:卷积神经网络(CNN)基本概念(二)
第一章:计算机视觉中图像的基础认知 第二章:计算机视觉:卷积神经网络(CNN)基本概念(一) 第三章:计算机视觉:卷积神经网络(CNN)基本概念(二) 第四章:搭建一个经典的LeNet5神经网络 接上一篇《计算机视觉&am…...
SQL SERVER的PARTITION BY应用场景
SQL SERVER的PARTITION BY关键字说明介绍 PARTITION BY关键字介绍具体使用场景排名计算累计求和分组求最值分组内百分比计算分组内移动平均计算分组内数据分布统计分组内数据偏移计算 总结 PARTITION BY关键字介绍 在SQL SERVER中,关键字PARTITION BY主要用于窗口函…...
【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十二节】
ISO 14229-1:2023 UDS诊断服务测试用例全解析(TesterPresent_0x3E服务) 作者:车端域控测试工程师 更新日期:2025年02月14日 关键词:UDS协议、0x3E服务、会话保持、ISO 14229-1:2023、ECU测试 一、服务功能概述 0x3E服…...
gsoap实现webservice服务
gsoap实现webservice服务 在实现Web服务时,使用gSOAP是一个很好的选择,因为它提供了强大的工具和库来创建SOAP和RESTful服务。gSOAP是一个C和C语言开发的库,它支持SOAP协议的各种版本,包括SOAP 1.1和SOAP 1.2。下面是如何使用gSO…...
达梦:dmserver占用io高排查
目录标题 1. 使用达梦数据库的性能视图查询当前活动会话查询执行时间较长的 SQL 2. 使用 DM 性能监视工具3. 使用操作系统工具监控 I/Oiostat 工具dstat 工具 4. 优化查询和索引审查 SQL 执行计划优化索引 5. 调整数据库参数6. 分析数据库日志7. 硬件和存储检查总结 针对达梦数…...
MoE架构中的专家选择门控机制:稀疏激活如何实现百倍效率突破?
技术原理(数学公式与核心逻辑) 核心公式 门控网络输出: G ( x ) Softmax ( W g ⋅ x b g ) G(x) \text{Softmax}(W_g \cdot x b_g) G(x)Softmax(Wg⋅xbg) 最终输出: y ∑ i 1 n G i ( x ) ⋅ E i ( x ) (仅保留Top-…...
用python写一个聊天室程序
下面是一个简单的基于Socket的Python聊天室程序示例,包括服务器端和客户端: 服务器端代码: import socket import threadingdef handle_client(client, address):print(f"New connection from {address}")while True:msg client…...
七星棋牌全开源修复版源码解析:6端兼容,200种玩法全面支持
本篇文章将详细讲解 七星棋牌修复版源码 的 技术架构、功能实现、二次开发思路、搭建教程 等内容,助您快速掌握该棋牌系统的开发技巧。 1. 七星棋牌源码概述 七星棋牌修复版源码是一款高度自由的 开源棋牌项目,该版本修复了原版中的多个 系统漏洞&#…...
Vulhub靶机 ActiveMQ任意 文件写入(CVE-2016-3088)(渗透测试详解)
一、开启vulhub环境 docker-compose up -d 启动 docker ps 查看开放的端口 漏洞版本:ActiveMQ在5.14.0之前的版本(不包括5.14.0) 二、访问靶机IP 8161端口 默认账户密码都是admin 1、利用bp抓包,修改为PUT方法并在fileserver…...
Cloud: aws:network: limit 含有pps这种限制
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/troubleshooting-ena.html#statistics-ena 这个是调查网络问题的一个网页; 在里面,竟然含有pps这种限制:ethtool -S;其实是比较苛刻的安全相关的策略? [ec2-user ~]$ ethtool -S ethN NIC statistics:tx_timeout: …...
28、深度学习-自学之路-NLP自然语言处理-做一个完形填空,让机器学习更多的内容程序展示
import sys,random,math from collections import Counter import numpy as npnp.random.seed(1) random.seed(1) f open(reviews.txt) raw_reviews f.readlines() f.close()tokens list(map(lambda x:(x.split(" ")),raw_reviews))#wordcnt Counter() 这行代码的…...
观察者模式说明(C语言版本)
观察者模式主要是为了实现一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。下面使用C语言实现了一个具体的应用示例,有需要的可以参考…...
LC-搜索二维矩阵II、相交链表、反转链表、回文链表、环形链表、环形链表ll
搜索二维矩阵II 方法:从右上角开始搜索 我们可以从矩阵的右上角开始进行搜索。如果当前元素 matrix[i][j] 等于 target,我们直接返回 true。如果 matrix[i][j] 大于 target,说明 target 只能出现在左边的列,所以我们将列指针向左…...
如何查看 Linux 服务器的 MAC 地址:深入解析与实践指南
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
国产FPGA开发板选择
FPGA开发板是学习和开发FPGA的重要工具,选择合适的开发板对学习效果和开发效率至关重要。随着国产FPGA的发展,淘宝上的许多FPGA开发板店铺也开始进行国产FPGA的设计和销售,本文将对国产FPGA和相关店铺做个简单梳理,帮助有需要使用…...
iOS 获取设备占用内存
获取应用占用内存 获取应用进程占用内存 - (NSUInteger)memoryUsage {task_vm_info_data_t vmInfo;mach_msg_type_number_t count TASK_VM_INFO_COUNT;kern_return_t result task_info(mach_task_self(), TASK_VM_INFO, (task_info_t)&vmInfo, &count);if (result …...
用自己的数据训练yolov11目标检测
文章目录 概要理论知识整体架构流程架构优化多任务支持多参数体量 操作实操环境配置数据准备数据标注数据放置路径 训练预测 概要 官网:https://github.com/ultralytics/ultralytics?tabreadme-ov-file 提示:以 停车场空位检测 公开数据集示例&#x…...
golang如何将结构体和函数进行绑定?
在Go语言中,结构体和函数的绑定通常通过方法(method)来实现。方法是一种特殊的函数,它与某个类型关联,特别是结构体类型。下面是如何将结构体和函数进行绑定的具体步骤: 定义结构体:首先需要定义…...
【苍穹外卖】学习
软件开发整体介绍 作为一名软件开发工程师,我们需要了解在软件开发过程中的开发流程, 以及软件开发过程中涉及到的岗位角色,角色的分工、职责, 并了解软件开发中涉及到的三种软件环境。那么这一小节,我们将从 软件开发流程、角色…...
架构——LVS负载均衡主要模式及其原理、服务水平、优缺点
LVS(Linux Virtual Server)是一款高性能的开源负载均衡软件,支持多种负载均衡模式。以下是其主要模式及其原理、服务水平、优缺点: 1. NAT 模式(Network Address Translation) 原理: 请求流程…...
DFS算法篇:理解递归,熟悉递归,成为递归
1.DFS原理 那么dfs就是大家熟知的一个深度优先搜索,那么听起来很高大尚的一个名字,但是实际上dfs的本质就是一个递归,而且是一个带路径的递归,那么递归大家一定很熟悉了,大学c语言课程里面就介绍过递归,我…...
让编程变成一种享受-明基RD320U显示器
引言 作为一名有着多年JAVA开发经验的从业者,在工作过程中,显示器的重要性不言而喻。它不仅是我们与代码交互的窗口,更是影响工作效率和体验的关键因素。在多年的编程生涯中,我遇到过各种各样的问题。比如,在进行代码…...
C语言简单练习题
文章目录 练习题一、计算n的阶乘bool类型 二、计算1!2!3!...10!三、计算数组arr中的元素个数二分法查找 四、动态打印字符Sleep()ms延时函数system("cls")清屏函数 五、模拟用户登录strcmp()函数 六、猜数字小游戏产生一个随机数randsrandRAND_MAX时间戳time() 示例 …...
基于Python的深度学习音乐推荐系统(有配套论文)
音乐推荐系统 提供实时音乐推荐功能,根据用户行为和偏好动态调整推荐内容 Python、Django、深度学习、卷积神经网络 、算法 数据库:MySQL 系统包含角色:管理员、用户 管理员功能:用户管理、系统设置、音乐管理、音乐推荐管理、系…...
Java:单例模式(Singleton Pattern)及实现方式
一、单例模式的概念 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点来访问该实例,是 Java 中最简单的设计模式之一。该模式常用于需要全局唯一实例的场景,例如日志记录器、配置管理、线程池、数据库…...
解锁养生秘籍,拥抱健康生活
在这个快节奏的时代,人们行色匆匆,常常在忙碌中忽略了健康。其实,养生并非遥不可及,它就藏在生活的细微之处,等待我们去发现和实践。 规律作息是健康的基础。日出而作,日落而息,顺应自然规律&am…...
数据结构之堆(Heap)
数据结构之堆(Heap) 数据结构之堆(Heap)一、堆的核心概念1. 定义与性质2. 存储方式 二、核心操作与算法1. 操作复杂度概览2. 关键操作详解(1) 向上调整(Sift Up)(2) 向下调整(Sift Down…...
人工智能 - 机器学习、深度学习、强化学习是人工智能领域的理论基础和方法论
机器学习、深度学习、强化学习是人工智能领域的三大核心方向,各自具有独特的理论基础和方法论。以下是它们的核心理论知识总结: 一、机器学习(Machine Learning, ML) 1. 基础概念 目标:通过数据驱动的方式,让机器从经验中学习规律,完成预测、分类或决策任务。 核心范式…...
github上文件过大无法推送问题
GitHub 对文件大小有限制,超过 100 MB 的文件无法直接推送到仓库中。 解决思路: 使用 Git Large File Storage (Git LFS) 来管理大文件不上传对应的大文件 使用Git LFS: 1. 安装 Git LFS 首先,你需要安装 Git LFS。可以按照以…...
Elasticsearch:将 Ollama 与推理 API 结合使用
作者:来自 Elastic Jeffrey Rengifo Ollama API 与 OpenAI API 兼容,因此将 Ollama 与 Elasticsearch 集成非常容易。 在本文中,我们将学习如何使用 Ollama 将本地模型连接到 Elasticsearch 推理模型,然后使用 Playground 向文档提…...
【Linux】详谈 进程控制
目录 一、进程是什么 二、task_struct 三、查看进程 四、创建进程 4.1 fork函数的认识 4.2 2. fork函数的返回值 五、进程终止 5.1. 进程退出的场景 5.2. 进程常见的退出方法 5.2.1 从main返回 5.2.1.1 错误码 5.2.2 exit函数 5.2.3 _exit函数 5.2.4 缓冲区问题补…...
构建高效智能对话前端:基于Ant Design X 的deepseek对话应用
文章目录 实现的效果前言Ant Design X添加欢迎组件创建对话气泡存储对话历史渲染对话气泡 输入组件WebSocket 连接总结 实现的效果 待机页面: 等待页面: 完成页面: 前言 随着人工智能技术的飞速发展,大模型对话系统已成为…...
WordPress“更新失败,响应不是有效的JSON响应”问题的修复
在使用WordPress搭建网站时,许多人在编辑或更新文章时,可能会遇到一个提示框,显示“更新失败,响应不是有效的JSON响应”。这个提示信息对于不了解技术细节的用户来说,太难懂。其实,这个问题并不复杂&#x…...
华为交换机trunk简介配置
目录 一、Trunk 口简介二、Trunk 口配置案例及命令(一)组网需求(二)配置步骤(三)验证配置 三、注意事项 一、Trunk 口简介 Trunk 口是交换机中一种重要的端口类型,主要用于连接交换机与交换机、…...
DeepSeek从入门到精通(清华大学)
DeepSeek是一款融合自然语言处理与深度学习技术的全能型AI助手,具备知识问答、数据分析、编程辅助、创意生成等多项核心能力。作为多模态智能系统,它不仅支持文本交互,还可处理文件、图像、代码等多种格式输入,其知识库更新至2…...
【SpringBoot3】面向切面 AspectJ AOP 使用详解
文章目录 一、AspectJ介绍二、简单使用步骤 1、引入依赖2、定义一个Aspect3、开启AOP支持 三、AOP 核心概念四、切点(Pointcut) 1. execution2. within3. this & target4. args & args5. within & target & annotation 五、通知…...
容器运行常见数据库
一.涉及镜像压缩包 均为amd架构版本:mysql:5.7.42、postgres:13.16、dm8:20250206_rev257733_x86_rh6_64、oceanbase-ce:v4.0、opengauss:5.0.2 通过网盘分享的文件:db.tgz 链接: https://pan.baidu.com/s/1EBbFPZj1FxCA4_GxjVunWg?pwd563s 提取码: 5…...
OpenGL ES学习大纲
如果您想从头学习 OpenGL ES,以下是一个详细的学习大纲,涵盖了从基础到高级的知识点,循序渐进地帮助您掌握 OpenGL ES 的核心概念、API 使用、渲染管线、着色器编程、性能优化等内容。 1. 学习前的准备 1.1 基础知识 在学习 OpenGL ES 之前,您需要掌握以下基础知识: 数学…...
Kotlin 优雅的接口实现
1. 日常遇到的冗余的接口方法实现 日常开发中,经常会要实现接口,但是很多场景中,只需要用到其中一两个方法,例如 ActivityLifecycleCallbacks,它有很多个接口需要实现,但是很多时候我们只需要用到其中的一…...
数据结构实现顺序表的尾插,尾删,按值查找/修改/删除,按下标查找/增加/删除
头文件:head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXSIZE 20enum num {success,false-1};typedef int datatype;typedef struct {int len;datatype data[MAXSIZE]; }S…...
qt实现文字跑马灯效果
实现跑马灯的方式多种多少样,可以通过定时器,或者animation等来实现。 本文通过定时器,将第一个文字,移动到最后一个这种方式来实现,还有其他方式哈。 直接上源码 h文件 #ifndef TEXTTICKER_H #define TEXTTICKER_…...
PyTorch Tensor 形状变化操作详解
PyTorch Tensor 形状变化操作详解 在深度学习中,Tensor 的形状变换是非常常见的操作。PyTorch 提供了丰富的 API 来帮助我们调整 Tensor 的形状,以满足模型输入、计算或数据处理的需求。本文将详细介绍 PyTorch 中常见的 Tensor 形状变换操作࿰…...