Kalman滤波、扩展Kalman滤波、无迹Kalman滤波和异步滤波的原理及其Matlab代码

目录

  • 引言
  • Kalman滤波
    • 代码及其结果展示
  • 扩展Kalman滤波
    • 代码及其结果展示
  • 无迹Kalman滤波
    • 无迹变换
    • 无迹Kalman滤波
    • 代码及其结果展示
  • 异步无迹Kalman滤波
    • 原理
    • 代码及其结果展示

引言

本文给出了Kalman Filter(卡尔曼滤波)、Extended Kalman Filter(扩展卡尔曼滤波)、Unscented Kalman Filter(无迹卡尔曼滤波)和Asynchronous Filter(异步滤波)的原理及其Matlab代码。不同的滤波算法以函数形式在不同的m文件,调用即可使用。

Kalman滤波

该部分展示了kalman滤波的代码及其仿真结果。
状态转移模型
x ( t + 1 ) = A x ( t ) + Γ w ( t ) x(t+1)=Ax(t)+Γw(t) x(t+1)=Ax(t)+Γw(t)
其中 x ( t ) ∈ R n ∗ 1 x(t)∈R^{n*1} x(t)Rn1表示t时刻的状态向量, A ∈ R m ∗ m A∈R^{m*m} ARmm是状态转移矩阵,Γ是噪声系数矩阵,w(t)是t时刻的过程噪声向量, 其为零均值高斯白噪声,协方差阵为Q>0。
量测模型
y i ( t ) = H i x ( t ) + v i ( t ) yi(t)=Hi x(t)+vi(t) yi(t)=Hix(t)+vi(t)
,其中 y i ( t ) yi(t) yi(t)表示t时刻传感器网络中的传感器i的量测向量, H i ∈ R l ∗ m Hi∈R^{l*m} HiRlm是观测矩阵,vi(t)是t时刻的量测噪声向量,其为零均值高斯白噪声,协方差阵为Ri>0。
初始化:
在这里插入图片描述
在这里插入图片描述
状态更新:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码及其结果展示

核心代码:(完整代码见文末)

function [estimate, cov_error_estimate] = kalman_filter(measure, x_last,...P_last,flag)
%kalman_filter 基本kalman滤波算法
%   输入:量测值,上一时刻估计,上一时刻估计误差协方差,是否预测的标志
%   输出:当前时刻估计,当前时刻估计误差协方差
% 当flag为1,则跳过预测步骤
%%
% 状态转移矩阵
global A;
% 系统噪声系数矩阵
global gama;
% 系统噪声协方差
global Q;
% 量测矩阵
global H;
% 量测噪声协方差
global R;
%%
% 如果全零,即无初始化
if ~any(x_last)if measure==0estimate = x_last;cov_error_estimate = P_last;else%   如果是0时刻,则取量测值对应的状态为当前时刻估计,9倍的量测误%差协方差阵为当前时刻估计误差协方差。estimate = H\measure;cov_error_estimate = H\(2*(R))/H';end
elseif flag==1forecast=x_last;P_forecast=P_last;elseforecast = A * x_last;P_forecast = (A*P_last *A'+ gama*Q* gama');endif measure==0estimate=forecast;cov_error_estimate = P_forecast;elsekalman_gain = P_forecast*H'/(H*P_forecast*H'+R);estimate = forecast + kalman_gain*(measure - H*forecast);cov_error_estimate = P_forecast - kalman_gain*H*P_forecast;end
end
end

结果展示:
在这里插入图片描述
在这里插入图片描述

扩展Kalman滤波

扩展卡尔曼滤波是标准卡尔曼滤波在非线性情形下的一种扩展形式,EKF算法是将非线性函数进行泰勒展开,省略高阶项,保留展开项的一阶项,以此来实现非线性函数线性化,最后通过卡尔曼滤波算法近似计算系统的状态估计值和方差估计值,对信号进行滤波。
状态转移方程与量测方程
在这里插入图片描述
泰勒线性化
在这里插入图片描述
在这里插入图片描述
预测步骤
在这里插入图片描述
估计步骤
在这里插入图片描述

代码及其结果展示

核心代码:(完整代码见文末)

function [estimate, cov_error_estimate] = extend_kf(measure, x_last, P_last,...flag,radar)
%kalman_filter 扩展kalman滤波算法
%   输入:量测值,上一时刻估计,上一时刻估计误差协方差,是否预测的标志,
%雷达的状态信息
%   输出:当前时刻估计,当前时刻估计误差协方差
% 当flag为1,则跳过预测步骤
%%
% 状态转移矩阵
global A;
% 系统噪声系数矩阵
global gama;
% 系统噪声协方差
global Q;
% 量测噪声协方差
global R;
%%
% 如果全零,即无初始化
if ~any(x_last)if measure==0estimate = x_last;cov_error_estimate = P_last;else%   如果是0时刻,则取量测值对应的状态为当前时刻估计,9倍的量测误%差协方差阵为当前时刻估计误差协方差。%   此处为9的原因是3倍的标准差为百分之95的可能的误差值,可以认为%包含了最大误差的情况。estimate=[radar(1,1)+measure(1,1)*cos(measure(3,1))*cos(measure(2,1));radar(2,1)+measure(1,1)*sin(measure(3,1));radar(3,1)-measure(1,1)*cos(measure(3,1))*sin(measure(2,1));0;0;0];cov_error_estimate = 99*[1,0,0,1,0,0;0,1,0,0,1,0;0,0,1,0,0,1;1,0,0,1,0,0;0,1,0,0,1,0;0,0,1,0,0,1];end
elseif flag==1forecast=x_last;P_forecast=P_last;elseforecast = A * x_last;P_forecast = (A*P_last *A'+ gama*Q* gama');endx=forecast(1,1)-radar(1,1);y=forecast(2,1)-radar(2,1);z=forecast(3,1)-radar(3,1);dist = norm([x;y;z]);dist_horiz = norm([x;z]);H=[x/dist,y/dist,z/dist,0,0,0;z/dist_horiz^2,0,-x/dist_horiz^2,0,0,0;-x*y/(dist^2*dist_horiz),dist_horiz/dist^2,-y*z/(dist_horiz*dist^2),0,0,0];z_est = measure_func([x;y;z]);if measure==0estimate=forecast;cov_error_estimate = P_forecast;elsekalman_gain = P_forecast*H'/(H*P_forecast*H'+R);estimate = forecast + kalman_gain*(measure - z_est);cov_error_estimate = P_forecast - kalman_gain*H*P_forecast;end
end
end

结果展示:
在这里插入图片描述
在这里插入图片描述

无迹Kalman滤波

无迹变换

设存在一个m维随机向量在这里插入图片描述和n维随机向量z,其中z与x为非线性关系
在这里插入图片描述
x的均值为在这里插入图片描述,方差为P;x通过非线性映射得到z。无迹变换就是根据x的统计特性,得到一族点集,该点集称为为σ点;将σ点进行非线性映射可以得的新的点集;通过新的点集得到z的统计特性。一般情况下σ点的数目为2n+1。
无迹变换的具体过程可描述如下:
(1)计算2n+1个点及其权系数
在这里插入图片描述
在这里插入图片描述
其中,在这里插入图片描述决定点的散布程度,通常取正数,在这里插入图片描述通常取为0,β用来代表x的分布情况(正态分布的情况下,最佳值为2),在这里插入图片描述表示矩阵的平方根的第i列,在这里插入图片描述为用于计算均值的权重,在这里插入图片描述为用于计算方差时的权重。
(2)计算σ点通过非线性函数的传播结果
在这里插入图片描述
从而可得
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时,我们得到了无迹变换的结果。

无迹Kalman滤波

针对量测为非线性、状态转移为线性的系统模型,无迹Kalman滤波是用无迹变换进行经典卡尔曼滤波中量测方程的映射。
每个递推无迹Kalman滤波的具体步骤如下:
(1)针对线性目标状态转移模型,对于给定的估计和估计误差协方差,基于经典Kalman滤波求状态预测以及预报误差的协方差阵。
在这里插入图片描述
在这里插入图片描述

(2)针对非线性传感器量测模型,用无迹变换求σ点,并通过量测方程的传播。
计算σ点,即
在这里插入图片描述
计算输出的一步提前预测,即
在这里插入图片描述
在获得新的量测后,进行滤波更新,
在这里插入图片描述

代码及其结果展示

核心代码:(完整代码见文末)

function [estimate, cov_error_estimate] = unscented_kf(measure, x_last, P_last,...flag,radar)
%kalman_filter 扩展kalman滤波算法
%   输入:量测值,上一时刻估计,上一时刻估计误差协方差,是否预测的标志,
%雷达的状态信息
%   输出:当前时刻估计,当前时刻估计误差协方差
% 当flag为1,则跳过预测步骤
%%
% 状态转移矩阵
global A;
% 系统噪声系数矩阵
global gama;
% 系统噪声协方差
global Q;
% 量测噪声协方差
global R;
%%
% 如果全零,即无初始化
if ~any(x_last)if measure==0estimate = x_last;cov_error_estimate = P_last;else%   如果是0时刻,则取量测值对应的状态为当前时刻估计,9倍的量测误%差协方差阵为当前时刻估计误差协方差。%   此处为9的原因是3倍的标准差为百分之95的可能的误差值,可以认为%包含了最大误差的情况。% TODO 应该设置为根据实际对象进行变化,这里强制设置为6个状态,%后续对无迹滤波和此处进行改变,让其可以根据实际情况进行随动estimate=[radar(1,1)+measure(1,1)*cos(measure(3,1))*cos(measure(2,1));radar(2,1)+measure(1,1)*sin(measure(3,1));radar(3,1)-measure(1,1)*cos(measure(3,1))*sin(measure(2,1));0;0;0];cov_error_estimate = 1*[1,0,0,1,0,0;0,1,0,0,1,0;0,0,1,0,0,1;1,0,0,1,0,0;0,1,0,0,1,0;0,0,1,0,0,1];end
elseif flag==1forecast=x_last;P_forecast=P_last;elseforecast = A * x_last;P_forecast = (A*P_last *A'+ gama*Q* gama');endif measure==0estimate=forecast;cov_error_estimate = P_forecast;else[forecast_point,forecast_weight]=get_point(forecast,P_forecast,size(forecast,1));measure_point = zeros(size(measure,1),size(forecast_point,2));for cou_point = 1:size(forecast_point,2)measure_point(:,cou_point)=measure_func(forecast_point(1:3,cou_point)-radar(1:3,1));endmeasure_expect = sum(forecast_weight(1,:).*measure_point,2);P_z = forecast_weight(2,:).*(measure_point-measure_expect)*...(measure_point-measure_expect)'+R;P_xz = forecast_weight(2,:).*(forecast_point-forecast)*...(measure_point-measure_expect)';kalman_gain = P_xz/P_z;estimate = forecast + kalman_gain*(measure - measure_expect);cov_error_estimate = P_forecast - kalman_gain*P_z*kalman_gain';end
end
end

结果展示:
在这里插入图片描述

异步无迹Kalman滤波

在目标状态估计过程中,量测通常以离散化采样给出,同时带有一个探测时间标志。分布式传感器网络是对多个量测进行处理。由于传感器网络传输存在随机的时间延迟,且各个节点对于量测的预处理时间存在随机性,很可能出现源于某个目标的较晚的量测到达某一节点后较早的量测才到达该节点,这种情况就称为非顺序量测。在目标状态估计过程中,传感器节点通常仅保存航迹的充分统计量。这样,当接收到一个延迟的量测时,假定该量测的时戳为t,为了实时性,估计结果被更新到tz>t时刻,此时需要使用来自时刻t的量测更新tz时刻的估计。这就是在实际的多传感器系统中常见的负时间量测更新问题,原因是t-tz为负,而在标准的滤波问题中总假定为非负。通常情况下的滤波算法不适用于这种情况,因此,就需要对适用于异步滤波的算法进行研究。

原理

首先,我们需要对非线性目标运动模型以不同的时间间隔进行重新的离散化定义。对于任意时间间隔的状态转移矩阵为在这里插入图片描述;任意时间间隔的噪声系数矩阵为在这里插入图片描述;任意时间间隔的系统噪声为
在这里插入图片描述
本文仅研究高斯白噪声随机过程,则根据随机积分的性质可知,离散化后的系统噪声仍为均值为0的高斯白噪声,其协方差矩阵为
在这里插入图片描述
为了便于描述,假定当前时刻为t,而最新的量测时刻为td,且td的量测为t时刻的延迟量测,也就是说
在这里插入图片描述

此时,
在这里插入图片描述
其中,d为td时刻的简化标记。可以得到
在这里插入图片描述
其中在这里插入图片描述在这里插入图片描述的逆矩阵,表示后向状态转矩矩阵。
我们要解决的问题为:在t时刻,已知目标的状态估计和估计误差协方差。同时,我们得到了td时刻的量测。此时,需要用td时刻的量测来更新t时刻状态估计和估计误差协方差,即计算
在这里插入图片描述
其中在这里插入图片描述
在最小均方误差准则下,对于非顺序量测问题的最优更新算法为
在这里插入图片描述
在这里插入图片描述

其中,
在这里插入图片描述

为了求出在这里插入图片描述,我们需要得到Kd和的值。首先
在这里插入图片描述
其中
在这里插入图片描述

由传感器探测模型及最小均方误差准则得
在这里插入图片描述
可知,
在这里插入图片描述
其中
在这里插入图片描述
在这里插入图片描述的σ点为
在这里插入图片描述

根据传感器探测模型,得
在这里插入图片描述
求得计算在这里插入图片描述的σ点为
在这里插入图片描述
同理,根据已知的在这里插入图片描述,求得计算在这里插入图片描述的σ点为
在这里插入图片描述
计算量测的一步提前预测,即
在这里插入图片描述
可知
在这里插入图片描述
此时,因为在这里插入图片描述等于0,可得在这里插入图片描述。由最小均方误差准则可得
在这里插入图片描述
带入式子可求在这里插入图片描述。根据式子可得在这里插入图片描述
在这里插入图片描述
可得在这里插入图片描述的σ点为
在这里插入图片描述
根据非线性变换,可得在这里插入图片描述的σ点为
在这里插入图片描述
在这里插入图片描述的σ点可求
在这里插入图片描述
可得Kd;将Kd和在这里插入图片描述的带入可得在这里插入图片描述。接下来,将在这里插入图片描述在这里插入图片描述带入即可求出在这里插入图片描述。至此,完成了用td时刻的量测来更新t时刻状态估计和估计误差协方差。

代码及其结果展示

核心代码:(完整代码见文末)

function [estimate, cov_error_estimate] = unscented_aysn(measure_aysn,t_asyn,...x_last, P_last,flag,radar,last_est_last,last_P_last,measure)
%kalman_filter 扩展kalman滤波算法
%   输入:量测值,上一时刻估计,上一时刻估计误差协方差,是否预测的标志,
%雷达的状态信息
%   输出:当前时刻估计,当前时刻估计误差协方差
% 当flag为1,则跳过预测步骤
%%
global t_step;
% 状态转移矩阵
global A;
% 系统噪声系数矩阵
global gama;
% 系统噪声协方差
global Q;
% 量测噪声协方差
global R;
%%
last_est_last = A * last_est_last;
last_P_last = (A*last_P_last *A'+ gama*Q* gama');
% 如果全零,即无初始化
if ~any(x_last)if measure_aysn==0estimate = x_last;cov_error_estimate = P_last;else%   如果是0时刻,则取量测值对应的状态为当前时刻估计,9倍的量测误%差协方差阵为当前时刻估计误差协方差。%   此处为9的原因是3倍的标准差为百分之95的可能的误差值,可以认为%包含了最大误差的情况。estimate=[radar(1,1)+measure_aysn(1,1)*cos(measure_aysn(3,1))*cos(measure_aysn(2,1));radar(2,1)+measure_aysn(1,1)*sin(measure_aysn(3,1));radar(3,1)-measure_aysn(1,1)*cos(measure_aysn(3,1))*sin(measure_aysn(2,1));0;0;0];cov_error_estimate = 1*[1,0,0,1,0,0;0,1,0,0,1,0;0,0,1,0,0,1;1,0,0,1,0,0;0,1,0,0,1,0;0,0,1,0,0,1];end
elseif flag==1forecast=x_last;P_forecast=P_last;elseforecast = A * x_last;P_forecast = (A*P_last *A'+ gama*Q* gama');endif measure_aysn==0estimate=forecast;cov_error_estimate = P_forecast;elsenum_state = size(forecast,1);Q_td_t =  Q_t1_t2(t_asyn,t_step);[w_td2t_t_1_point,~] = ...get_point(zeros(num_state,1), Q_td_t,3);[last_est_point,last_est_weight] = ...get_point(last_est_last, last_P_last, 3);measure_t_1_point = zeros(size(measure,1),size(last_est_point,2));for cou_point = 1:size(last_est_point,2)measure_t_1_point(:,cou_point)=measure_func(...last_est_point(1:3,cou_point)-radar(1:3,1));endmeasure_expect_t_1 = sum(last_est_weight(1,:).*measure_t_1_point,2);cov_zt_t_1 = last_est_weight(2,:).*(measure_t_1_point-...measure_expect_t_1)*(measure_t_1_point-measure_expect_t_1)'+R;% TODO 应该修正R后的pointcov_w_td2t_zt_t_1= last_est_weight(2,:).*(w_td2t_t_1_point)*...(measure_t_1_point-measure_expect_t_1)';w_td2t = cov_w_td2t_zt_t_1/cov_zt_t_1*(measure-...measure_expect_t_1);cov_w_td2t_t = Q_td_t-cov_w_td2t_zt_t_1/cov_zt_t_1*...cov_w_td2t_zt_t_1';[forecast_point,forecast_weight]=get_point(forecast,P_forecast,3);% (3-25)backcast = A_t1_t2(t_step,t_asyn)*(forecast-w_td2t);P_backcast = A_t1_t2(t_step,t_asyn)*P_forecast*...(A_t1_t2(t_step,t_asyn))'-A_t1_t2(t_step,t_asyn)*...(cov_w_td2t_t)*(A_t1_t2(t_step,t_asyn))';[backcast_point,backcast_weight]=get_point(backcast,P_backcast,3);measure_expect_t_point = zeros(size(measure,1),size(backcast_point,2));for cou_point = 1:size(backcast_point,2)measure_expect_t_point(:,cou_point)=measure_func(...backcast_point(1:3,cou_point)-radar(1:3,1));endmeasure_expect_t = sum(backcast_weight(1,:).*measure_expect_t_point,2);% (3-36)P_z = backcast_weight(2,:).*(measure_expect_t_point-...measure_expect_t)*(measure_expect_t_point-measure_expect_t)'+R;% (3-37)         % TODO 应该修正R后的pointP_xz = forecast_weight(2,:).*(forecast_point-forecast)*...(measure_expect_t_point-measure_expect_t)';kalman_gain = P_xz/P_z;estimate = forecast + kalman_gain*(measure_aysn - measure_expect_t);cov_error_estimate = P_forecast - P_xz/P_z*P_xz';end
end
end

结果展示:
在这里插入图片描述
在这里插入图片描述
完整代码分为多个文件,数量较多,无法放在文章中。完整代码在公众号(沸腾的火锅资源号)中自取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/214483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 98. 验证二叉搜索树

leetcode 98. 验证二叉搜索树 题目 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是…

Softmax回归

一、Softmax回归关键思想 1、回归问题和分类问题的区别 Softmax回归虽然叫“回归”,但是它本质是一个分类问题。回归是估计一个连续值,而分类是预测一个离散类别。 2、Softmax回归模型 Softmax回归跟线性回归一样将输入特征与权重做线性叠加。与线性回归…

Linux安装Nginx并部署Vue项目

今天部署了一个Vue项目到阿里云的云服务器上,现记录该过程。 1. 修改Vue项目配置 我们去项目中发送axios请求的文件里更改一下后端的接口路由: 2. 执行命令打包 npm run build ### 或者 yarn build 打包成功之后,我们会看到一个dist包&a…

[MySQL]SQL优化之索引的使用规则

🌈键盘敲烂,年薪30万🌈 目录 一、索引失效 📕最左前缀法则 📕范围查询> 📕索引列运算,索引失效 📕前模糊匹配 📕or连接的条件 📕字符串类型不加 …

110. 平衡二叉树(Java)

给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:t…

如何通过SPI控制Peregrine的数控衰减器

概要 Peregrine的数控衰减器PE4312是6位射频数字步进衰减器(DSA,Digital Step Attenuator)工作频率覆盖1MHz~4GHz,插入损耗2dB左右,衰减步进0.5dB,最大衰减量为31.5dB,高达59dBm的IIP3提供了良好的动态性能,切换时间0.5微秒,供电电源2.3V~5.5V,逻辑控制兼容1.8V,20…

​如何使用https://www.krea.ai/来实现文生图,图生图,

网址:https://www.krea.ai/apps/image/realtime Krea.ai 是一个强大的人工智能艺术生成器,可用于创建各种创意内容。它可以用来生成文本描述的图像、将图像转换为其他图像,甚至写博客文章。 文本描述生成图像 要使用 Krea.ai 生成文本描述…

【conda】利用Conda创建虚拟环境,Pytorch各版本安装教程(Ubuntu)

TOC conda 系列: 1. conda指令教程 2. 利用Conda创建虚拟环境,安装Pytorch各版本教程(Ubuntu) 1. 利用Conda创建虚拟环境 nolonolo:~/sun/SplaTAM$ conda create -n splatam python3.10查看结果: (splatam) nolonolo:~/sun/SplaTAM$ cond…

Linux系统编程(一):基本概念

参考引用 Unix和Linux操作系统有什么区别?一文带你彻底搞懂posix Linux系统编程(文章链接汇总) 1. Unix 和 Linux 1.1 Unix Unix 操作系统诞生于 1969 年,贝尔实验室发布了一个用 C 语言编写的名为「Unix」的操作系统&#xff0…

【基于LSTM的电商评论情感分析:Flask与Sklearn的完美结合】

基于LSTM的电商评论情感分析:Flask与Sklearn的完美结合 引言数据集与爬取数据处理与可视化情感分析模型构建Flask应用搭建词云展示创新点结论 引言 在当今数字化时代,电商平台上涌现出大量的用户评论数据。了解和分析这些评论对于企业改进产品、服务以及…

以太坊:前世今生与未来

一、引言 以太坊,这个在区块链领域大放异彩的名字,似乎已经成为了去中心化应用(DApps)的代名词。从初期的萌芽到如今的繁荣发展,以太坊经历了一段曲折而精彩的旅程。让我们一起回顾一下以太坊的前世今生,以…

树实验代码

哈夫曼树 #include <stdio.h> #include <stdlib.h> #define MAXLEN 100typedef struct {int weight;int lchild, rchild, parent; } HTNode;typedef HTNode HT[MAXLEN]; int n;void CreatHFMT(HT T); void InitHFMT(HT T); void InputWeight(HT T); void SelectMi…

【Qt开发流程】之UI风格、预览及QPalette使用

概述 一个优秀的应用程序不仅要有实用的功能&#xff0c;还要有一个漂亮美腻的外观&#xff0c;这样才能使应用程序更加友善、操作性良好&#xff0c;更加符合人体工程学。作为一个跨平台的UI开发框架&#xff0c;Qt提供了强大而且灵活的界面外观设计机制&#xff0c;能够帮助…

利用Rclone将阿里云对象存储迁移至雨云对象存储的教程,对象存储数据迁移教程

使用Rclone将阿里云对象存储(OSS)的文件全部迁移至雨云对象存储(ROS)的教程&#xff0c;其他的对象存储也可以参照本教程。 Rclone简介 Rclone 是一个用于和同步云平台同步文件和目录命令行工具。采用 Go 语言开发。 它允许在文件系统和云存储服务之间或在多个云存储服务之间…

STM32-EXTI外部中断

目录 一、中断系统 二、STM32中断 三、NVIC&#xff08;嵌套中断向量控制器&#xff09;基本结构 四、NVIC优先级分组 五、EXTI外部中断 5.1 外部中断基本知识 5.2 外部中断&#xff08;EXTI&#xff09;基本结构 ​编辑 5.2.1开发步骤&#xff1a; 5.3 AFIO复用IO口…

ADAudit Plus:强大的网络安全卫士

随着数字化时代的不断发展&#xff0c;企业面临着越来越复杂和多样化的网络安全威胁。在这个信息爆炸的时代&#xff0c;保护组织的敏感信息和确保网络安全已经成为企业发展不可或缺的一环。为了更好地管理和监控网络安全&#xff0c;ADAudit Plus应运而生&#xff0c;成为网络…

Redis分布式锁有什么缺陷?

Redis分布式锁有什么缺陷&#xff1f; Redis 分布式锁不能解决超时的问题&#xff0c;分布式锁有一个超时时间&#xff0c;程序的执行如果超出了锁的超时时间就会出现问题。 1.Redis容易产生的几个问题&#xff1a; 2.锁未被释放 3.B锁被A锁释放了 4.数据库事务超时 5.锁过期了…

centos 7 卸载图形化界面步骤记录

centos7 服务器操作系统&#xff0c;挺小一配置&#xff0c;装了图形化界面&#xff0c;现在运行程序的时候跑不动了&#xff0c;我想这图形界面也没啥用&#xff0c;卸载了算了&#xff01; 卸载步骤 yum grouplist 查询已经安装的组件 可以看到 图形化界面 等是以分组存在的…

TCP数据粘包的处理

TCP数据粘包的处理 背锅侠TCP解决方案2.1 发送端2.2 接收端 背锅侠TCP 在前面介绍套接字通信的时候说到了TCP是传输层协议&#xff0c;它是一个面向连接的、安全的、流式传输协议。因为数据的传输是基于流的所以发送端和接收端每次处理的数据的量&#xff0c;处理数据的频率可…

Qt练习题

1.使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否…