运动模型非线性扩展卡尔曼跟踪融合滤波算法(Matlab仿真)

        卡尔曼滤波的原理和理论在CSDN已有很多文章,这里不再赘述,仅分享个人的理解和Matlab仿真代码。

1 单目标跟踪

        匀速转弯(CTRV)运动模型下,摄像头输出目标状态camera_state = [x, y, theta, v],雷达输出目标状态radar_state = [x, y, theta, v]。如果状态为[x, y, vx, vy],也可以转成[x, y, theta, v]。其中theta=atan(vy/vx),v=sqrt(vx*vx + vy*vy),测量噪声设置要相应改变。

        目标运动状态可以表示为:

        由于存在非线性,可以用一阶泰勒展开的雅可比矩阵做线性化,考虑到w的除0情况,区分w=0或w≠0的结果。

        w≠0时,

        w=0时,

        估计值和测量值为线性关系,状态观测矩阵可以用下面的矩阵表示。

        

        和线性卡尔曼滤波的对比如下:

        这里由于测量和估计是线性关系,因此后验估计和卡尔曼滤波一样,直接用H矩阵。将上述公式用matlab编程即可得到滤波结果。

% 匀速转弯运动模型的扩展卡尔曼滤波算法仿真
% 目标的测量值为x,y,theta,v
clc;clear;close all;% 匀速转弯运动的初始值
x0 = 0;                                     % 目标的初始横向位置
y0 = 0;                                     % 目标的初始纵向位置
theta = 0;                                  % 目标的偏航角(目标在当前坐标系下和x轴的夹角)
v = 3;                                      % 目标的速度
omga = 0.1;                                 % 目标的偏航角速度
N = 150;                                    % 数据量
dt = 0.2;                                   % 单帧时间
t = dt*(1:1:N);                             % 时间轴% 更新超参数
sigma_q_x = 0.2;
sigma_q_y = 0.2;
sigma_q_theta = 0.01;
sigma_q_v = 0.1;
sigma_q_omga = 0.01;
Q_mat_ctrv = diag([sigma_q_x^2, sigma_q_y^2, sigma_q_theta^2, sigma_q_v^2, sigma_q_omga^2]);
sigma_R_ctrv = 0.4;
R_ctrv = diag([sigma_R_ctrv^2, sigma_R_ctrv^2, sigma_R_ctrv^2, sigma_R_ctrv^2]);% 初始化参数
Xest_ekf = zeros(5, N);
P_ekf = zeros(5, 5, N);
P_ekf(:,:,1) = eye(5);
Z_ctrv = zeros(4, N);                               % 4维测量向量
H_ctrv = [1 0 0 0 0;0 1 0 0 0;0 0 1 0 0;0 0 0 1 0];
X_ctrv = zeros(5, N);
X_ctrv(:,1) = [1; 1; 0; 1; 0.1];                    % 初始状态,包括位置、偏航角、速度和偏航角速度
V_ctrv = mvnrnd(zeros(1,4), R_ctrv)';               % 观测误差矩阵
Z_ctrv(:,1) = H_ctrv * X_ctrv(:, 1) + V_ctrv;
Xest_ekf(1:4,1) = Z_ctrv(:,1);% 扩展卡尔曼滤波的核心算法
for i = 2:N% 状态更新X_ctrv(:,i) = ekf_predict(X_ctrv(:,i-1), dt);W_ctrv = mvnrnd(zeros(1,5), Q_mat_ctrv)';       % 过程噪声向量X_ctrv(:,i) = X_ctrv(:,i) + W_ctrv;             % 加过程噪声% 预测步骤Xest_ekf(:,i) = ekf_predict(Xest_ekf(:,i-1), dt);F = ekf_jacobian(Xest_ekf(:,i-1), dt);P_ekf(:,:,i) = F * P_ekf(:,:,i-1) * F' + Q_mat_ctrv;% 测量模型更新V_ctrv = mvnrnd(zeros(1,4), R_ctrv)';           % 观测误差矩阵Z_ctrv(:,i) = H_ctrv * X_ctrv(:, i) + V_ctrv;% 更新步骤H_ekf = H_ctrv;                                 % 测量模型的雅可比矩阵K_ekf = P_ekf(:,:,i) * H_ekf' / (H_ekf * P_ekf(:,:,i) * H_ekf' + R_ctrv);Xest_ekf(:,i) = Xest_ekf(:,i) + K_ekf * (Z_ctrv(:,i) - H_ekf * Xest_ekf(:,i));P_ekf(:,:,i) = (eye(5) - K_ekf * H_ekf) * P_ekf(:,:,i); 
end% 绘图部分保持不变
figure;
size = 10;
width = 2;
% 位置曲线图
subplot(2,2,1);
plot(Z_ctrv(1,:),'.g','MarkerSize',size); hold on;              % 画出测量值
plot(Xest_ekf(1,:),'b','LineWidth',width);hold on;              % 画出最优估计值
plot(X_ctrv(1,:),'r','LineWidth',width);                        % 画出实际状态值
title('X位置状态曲线');
legend('位置测量值', '位置最优估计值', '实际位置');% 位置曲线图
subplot(2,2,2);
plot(Z_ctrv(2,:),'.g','MarkerSize',size);hold on;               % 画出测量值
plot(Xest_ekf(2,:),'b','LineWidth',width);hold on;              % 画出最优估计值
plot(X_ctrv(2,:),'r','LineWidth',width);                        % 画出实际状态值
title('Y位置状态曲线');
legend('位置测量值', '位置最优估计值', '实际位置');% 偏航角曲线图
subplot(2,2,3);
plot(Z_ctrv(3,:),'.g','MarkerSize',size); hold on;              % 画出测量值
plot(Xest_ekf(3,:),'b','LineWidth',width); hold on;             % 画出最优估计值
plot(X_ctrv(3,:),'r','LineWidth',width);                        % 画出实际状态值
title('偏航角状态曲线');
legend('偏航角测量值', '偏航角最优估计值', '实际偏航角');% 速度曲线图
subplot(2,2,4);
plot(Z_ctrv(4,:),'.g','MarkerSize',size); hold on;              % 画出测量值
plot(Xest_ekf(4,:),'b','LineWidth',width); hold on;             % 画出最优估计值
plot(X_ctrv(4,:),'r','LineWidth',width);                        % 画出实际状态值
title('速度状态曲线');
legend('速度测量值', '速度最优估计值', '实际速度');% 位置平面图
% figure;
% plot(Z_ctrv(1,:),Z_ctrv(2,:));hold on;          % 画出测量值
% plot(Xest_ekf(1,:),Xest_ekf(2,:));              % 画出最优估计值
% plot(X_ctrv(1,:),X_ctrv(2,:));hold on;          % 画出实际值
% title('目标运动曲线');
% legend('位置测量值', '位置最优估计值', '实际位置');% 扩展卡尔曼滤波的预测模型
function x_pred = ekf_predict(x, dt)% CTRV模型的预测模型theta = x(3);v = x(4);omega = x(5);if omega == 0 % 避免除以0dx = v * cos(theta) * dt;dy = v * sin(theta) * dt;elsedx = v/omega * (sin(theta + omega * dt) - sin(theta));dy = v/omega * (-cos(theta + omega * dt) + cos(theta));enddtheta = omega * dt;x_pred = x + [dx; dy; dtheta; 0; 0];              % 速度和转向率的变化假设为0
end% 根据推导的公式计算状态转移雅可比矩阵
function F = ekf_jacobian(x, dt)theta = x(3);v = x(4);omega = x(5);F = eye(5);if omega == 0 % 避免除以0F(1, 3) = -v * sin(theta) * dt;F(1, 4) = cos(theta) * dt;F(2, 3) = v * cos(theta) * dt;F(2, 4) = sin(theta) * dt;elseF(1, 3) = v/omega * (cos(theta + omega * dt) - cos(theta));F(1, 4) = 1/omega * (sin(theta + omega * dt) - sin(theta));F(1, 5) = v/omega^2 * (sin(theta) - sin(theta + omega * dt)) + v * dt * cos(theta + omega * dt)/omega;F(2, 3) = v/omega * (sin(theta + omega * dt) - sin(theta));F(2, 4) = 1/omega * (-cos(theta + omega * dt) + cos(theta));F(2, 5) = v/omega^2 * (-cos(theta) + cos(theta + omega * dt)) + v * dt * sin(theta + omega * dt)/omega;endF(3, 5) = dt;
end

        下图仿真运行的结果,这个文件仿真了单个匀速转弯扩展卡尔曼滤波算法结果。

2 多传感器融合定位跟踪 

        如果是两个或多个目标,类似线性卡尔曼跟踪融合滤波算法(Matlab仿真)-CSDN博客中的融合仿真算法,分别交错仿真摄像头和雷达目标,代码如下。

% 匀速转弯运动模型的扩展卡尔曼滤波算法仿真
% 摄像头和雷达的测量值为x,y,theta,v
clc;clear;close all;% 匀速转弯运动的初始值
x0 = 0;                                     % 目标的初始横向位置
y0 = 0;                                     % 目标的初始纵向位置
theta = 0;                                  % 目标的偏航角(目标在当前坐标系下和x轴的夹角)
v = 3;                                      % 目标的速度
omga = 0.1;                                 % 目标的偏航角速度
N = 150;                                    % 数据量
dt = 0.2;                                   % 单帧时间
t = dt*(1:1:N);                             % 时间轴% 更新超参数
sigma_q_x = 0.2;
sigma_q_y = 0.2;
sigma_q_theta = 0.01;
sigma_q_v = 0.1;
sigma_q_omga = 0.01;
Q_matrix_ctrv = diag([sigma_q_x^2, sigma_q_y^2, sigma_q_theta^2, sigma_q_v^2, sigma_q_omga^2]);
% 设置测量噪声协方差矩阵R,噪声来自测量的误差
sigma_r_x = 1.0;
sigma_r_y = 0.2; 
sigma_r_theta = 0.01; 
sigma_r_v = 0.5;
R_matrix_ctrv_camera = diag([sigma_r_x^2, sigma_r_y^2, sigma_r_theta^2, sigma_r_v^2]);
% 上面是摄像头噪声协方差矩阵,下面是雷达噪声协方差矩阵
sigma_r_x = 0.4;
sigma_r_y = 0.4; 
sigma_r_theta = 0.01; 
sigma_r_v = 0.1;
R_matrix_ctrv_radar = diag([sigma_r_x^2, sigma_r_y^2, sigma_r_theta^2, sigma_r_v^2]);% 初始化参数
Xest_ekf = zeros(5, N);
P_ekf = zeros(5, 5, N);
P_ekf(:,:,1) = eye(5);
Z_ctrv = zeros(4, N);                               % 4维测量向量
H_ctrv = [1 0 0 0 0;0 1 0 0 0;0 0 1 0 0;0 0 0 1 0];
X_ctrv = zeros(5, N);
X_ctrv(:,1) = [1; 1; 0; 1; 0.1];                    % 初始状态,包括位置、偏航角、速度和偏航角速度
R_matrix_ctrv = R_matrix_ctrv_camera;               % 第1帧为摄像头
V_ctrv = mvnrnd(zeros(1,4), R_matrix_ctrv)';        % 观测误差矩阵
Z_ctrv(:,1) = H_ctrv * X_ctrv(:, 1) + V_ctrv;
Xest_ekf(1:4,1) = Z_ctrv(:,1);% 扩展卡尔曼滤波的核心算法
for i = 2:N% 选择摄像头或雷达,摄像头是奇数帧,雷达是偶数帧if mod(i,2) == 1R_matrix_ctrv = R_matrix_ctrv_camera;elseR_matrix_ctrv = R_matrix_ctrv_radar;end% 状态更新X_ctrv(:,i) = ekf_predict(X_ctrv(:,i-1), dt);W_ctrv = mvnrnd(zeros(1,5), Q_matrix_ctrv)';        % 过程噪声向量X_ctrv(:,i) = X_ctrv(:,i) + W_ctrv;                 % 加过程噪声% 预测步骤Xest_ekf(:,i) = ekf_predict(Xest_ekf(:,i-1), dt);F = ekf_jacobian(Xest_ekf(:,i-1), dt);P_ekf(:,:,i) = F * P_ekf(:,:,i-1) * F' + Q_matrix_ctrv;% 测量模型更新V_ctrv = mvnrnd(zeros(1,4), R_matrix_ctrv)';            % 观测误差矩阵Z_ctrv(:,i) = H_ctrv * X_ctrv(:, i) + V_ctrv;% 更新步骤H_ekf = H_ctrv;                                         % 测量模型的雅可比矩阵K_ekf = P_ekf(:,:,i) * H_ekf' / (H_ekf * P_ekf(:,:,i) * H_ekf' + R_matrix_ctrv);Xest_ekf(:,i) = Xest_ekf(:,i) + K_ekf * (Z_ctrv(:,i) - H_ekf * Xest_ekf(:,i));P_ekf(:,:,i) = (eye(5) - K_ekf * H_ekf) * P_ekf(:,:,i); 
end% 绘图部分保持不变
figure;
size = 10;
width = 2;
% 位置曲线图
subplot(2,2,1);
plot(Z_ctrv(1,:),'.g','MarkerSize',size); hold on;              % 画出测量值
plot(Xest_ekf(1,:),'b','LineWidth',width);hold on;              % 画出最优估计值
plot(X_ctrv(1,:),'r','LineWidth',width);                        % 画出实际状态值
title('X位置状态曲线');
legend('位置测量值', '位置最优估计值', '实际位置');% 位置曲线图
subplot(2,2,2);
plot(Z_ctrv(2,:),'.g','MarkerSize',size);hold on;               % 画出测量值
plot(Xest_ekf(2,:),'b','LineWidth',width);hold on;              % 画出最优估计值
plot(X_ctrv(2,:),'r','LineWidth',width);                        % 画出实际状态值
title('Y位置状态曲线');
legend('位置测量值', '位置最优估计值', '实际位置');% 偏航角曲线图
subplot(2,2,3);
plot(Z_ctrv(3,:),'.g','MarkerSize',size); hold on;              % 画出测量值
plot(Xest_ekf(3,:),'b','LineWidth',width); hold on;             % 画出最优估计值
plot(X_ctrv(3,:),'r','LineWidth',width);                        % 画出实际状态值
title('偏航角状态曲线');
legend('偏航角测量值', '偏航角最优估计值', '实际偏航角');% 速度曲线图
subplot(2,2,4);
plot(Z_ctrv(4,:),'.g','MarkerSize',size); hold on;              % 画出测量值
plot(Xest_ekf(4,:),'b','LineWidth',width); hold on;             % 画出最优估计值
plot(X_ctrv(4,:),'r','LineWidth',width);                        % 画出实际状态值
title('速度状态曲线');
legend('速度测量值', '速度最优估计值', '实际速度');% 分别提取摄像头和雷达目标
% 确定摄像头和雷达帧数
if mod(N,2) == 0N_camera = N/2;N_radar = N/2;
elseN_camera = floor(N/2) + 1;N_radar = floor(N/2);
end
Z_ctrv_camera = zeros(4,N_camera);
Z_ctrv_radar = zeros(4,N_radar);
camera_frame = zeros(1,N_camera);
radar_frame = zeros(1,N_radar);
camera_count = 0;
radar_count = 0;
% 提取摄像头和雷达帧的数据,摄像头在奇数帧,雷达在偶数帧
for i = 1:Nif mod(i,2) == 1                                        camera_count = camera_count + 1;camera_frame(camera_count) = i;Z_ctrv_camera(:,camera_count) = Z_ctrv(:,i);            % 摄像头数据elseradar_count = radar_count + 1;radar_frame(radar_count) = i;Z_ctrv_radar(:,radar_count) = Z_ctrv(:,i);              % 雷达数据end
end% 绘图部分保持不变
figure;size = 10;width = 2;
% X位置曲线图
subplot(2,2,1);
plot(camera_frame,Z_ctrv_camera(1,:),'.g','MarkerSize',size); hold on;                % 画出测量值
plot(radar_frame,Z_ctrv_radar(1,:),'.k','MarkerSize',size); hold on;                  % 画出测量值
plot(Xest_ekf(1,:),'b','LineWidth',width);hold on;                                    % 画出最优估计值
plot(X_ctrv(1,:),'r','LineWidth',width);                                              % 画出实际状态值
title('X位置状态曲线');
legend('摄像头位置测量值', '雷达位置测量值','位置最优估计值', '实际位置');% Y位置曲线图
subplot(2,2,2);
plot(camera_frame,Z_ctrv_camera(2,:),'.g','MarkerSize',size); hold on;                % 画出测量值
plot(radar_frame,Z_ctrv_radar(2,:),'.k','MarkerSize',size); hold on;                  % 画出测量值
plot(Xest_ekf(2,:),'b','LineWidth',width);hold on;                                    % 画出最优估计值
plot(X_ctrv(2,:),'r','LineWidth',width);                                              % 画出实际状态值
title('Y位置状态曲线');
legend('摄像头位置测量值', '雷达位置测量值','位置最优估计值', '实际位置');% 偏航角曲线图
subplot(2,2,3);
plot(camera_frame,Z_ctrv_camera(3,:),'.g','MarkerSize',size); hold on;                % 画出测量值
plot(radar_frame,Z_ctrv_radar(3,:),'.k','MarkerSize',size); hold on;                  % 画出测量值
plot(Xest_ekf(3,:),'b','LineWidth',width); hold on;                                   % 画出最优估计值
plot(X_ctrv(3,:),'r','LineWidth',width);                                              % 画出实际状态值
title('偏航角状态曲线');
legend('偏航角测量值', '偏航角测量值', '偏航角最优估计值', '实际偏航角');% 速度曲线图
subplot(2,2,4);
plot(camera_frame,Z_ctrv_camera(4,:),'.g','MarkerSize',size); hold on;                % 画出测量值
plot(radar_frame,Z_ctrv_radar(4,:),'.k','MarkerSize',size); hold on;                  % 画出测量值
plot(Xest_ekf(4,:),'b','LineWidth',width); hold on;                                   % 画出最优估计值
plot(X_ctrv(4,:),'r','LineWidth',width);                                              % 画出实际状态值
title('速度状态曲线');
legend('摄像头速度测量值', '雷达速度测量值', '速度最优估计值', '实际速度');% 位置平面图
% figure;
% plot(Z_ctrv(1,:),Z_ctrv(2,:));hold on;          % 画出测量值
% plot(Xest_ekf(1,:),Xest_ekf(2,:));              % 画出最优估计值
% plot(X_ctrv(1,:),X_ctrv(2,:));hold on;          % 画出实际值
% title('目标运动曲线');
% legend('位置测量值', '位置最优估计值', '实际位置');% 扩展卡尔曼滤波的预测模型
function x_pred = ekf_predict(x, dt)% CTRV模型的预测模型theta = x(3);v = x(4);omega = x(5);if omega == 0 % 避免除以0dx = v * cos(theta) * dt;dy = v * sin(theta) * dt;elsedx = v/omega * (sin(theta + omega * dt) - sin(theta));dy = v/omega * (-cos(theta + omega * dt) + cos(theta));enddtheta = omega * dt;x_pred = x + [dx; dy; dtheta; 0; 0]; % 速度和转向率的变化假设为0
endfunction F = ekf_jacobian(x, dt)theta = x(3);v = x(4);omega = x(5);F = eye(5);if omega == 0 % 避免除以0F(1, 3) = -v * sin(theta) * dt;F(1, 4) = cos(theta) * dt;F(2, 3) = v * cos(theta) * dt;F(2, 4) = sin(theta) * dt;elseF(1, 3) = v/omega * (cos(theta + omega * dt) - cos(theta));F(1, 4) = 1/omega * (sin(theta + omega * dt) - sin(theta));F(1, 5) = v/omega^2 * (sin(theta) - sin(theta + omega * dt)) + v * dt * cos(theta + omega * dt)/omega;F(2, 3) = v/omega * (sin(theta + omega * dt) - sin(theta));F(2, 4) = 1/omega * (-cos(theta + omega * dt) + cos(theta));F(2, 5) = v/omega^2 * (-cos(theta) + cos(theta + omega * dt)) + v * dt * sin(theta + omega * dt)/omega;endF(3, 5) = dt;
end

       仿真代码给出摄像头和雷达目标定位跟踪融合的结果,第一张图的测量值没有区分摄像头和雷达,第二张图做了区分。

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

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

相关文章

js逆向第19例:猿人学第17题天杀的Http2.0

文章目录 一、前言二、定位关键参数三、代码实现四、参考文献一、前言 任务十七:抓取这5页的数字,计算加和并提交结果 题目已经给出来标准答案,而且此题设置为“非常简单”其关键就是HTTP/2.0请求,打开控制台查看请求接口数据如下: 二、定位关键参数 可以看到控制台显示…

Linux系统——DNS解析详解

目录 一、DNS域名解析 1.DNS的作用 2.域名的组成 2.1域名层级结构关系特点 2.2域名空间构成 2.3域名的四种不同类型 2.3.1延伸 2.3.2总结 3.DNS域名解析过程 3.1递归查询 3.2迭代查询 3.3一次DNS解析的过程 4.DNS系统类型 4.1缓存域名服务器 4.2主域名服务器 4…

MES系统如何进行产品的质量管理

质量管理重点是对产品的检验,这里面包括:采购来料检验、工序检验、入库前检验等几个检验环节,并根据系统设定的检验标准进行检验,检验不通过的不能留到下个环节。质量管理也是万界星空科技云MES中的一个重要组成部分,旨…

Java接入Apache Spark(入门环境搭建、常见问题)

Java接入Apache Spark(环境搭建、常见问题) 背景介绍 Apache Spark 是一个快速的,通用的集群计算系统。它对 Java,Scala,Python 和 R 提供了的高层 API,并有一个经优化的支持通用执行图计算的引擎。它还支…

Unity 工具 之 Azure 微软连续语音识别ASR的简单整理

Unity 工具 之 Azure 微软连续语音识别ASR的简单整理 目录 Unity 工具 之 Azure 微软连续语音识别ASR的简单整理 一、简单介绍 二、实现原理 三、注意实现 四、实现步骤 五、关键脚本 一、简单介绍 Unity 工具类,自己整理的一些游戏开发可能用到的模块&#x…

Vue:将以往的JQ页面,重构成Vue组件页面的大致思路梳理(组件化编码大致流程)

一、实现静态组件 组件要按照功能点拆分,命名不要与HTML元素冲突。 1、根据UI提供的原型图,进行结构拆分,拆分的粒度以是否方便给组件起名字为依据。并梳理好对应组件的层级依赖关系。 2、拆分好结构后,开始对应的写组件&#x…

vue3-响应式基础之reactive

reactive() 还有另一种声明响应式状态的方式&#xff0c;即使用 reactive() API。与将内部值包装在特殊对象中的 ref 不同&#xff0c;reactive() 将使对象本身具有响应性&#xff1a; 「点击按钮1」 <script lang"ts" setup> import { reactive } from vuec…

ATECLOUD-POWER测试系统如何检测电源稳定性?

电源模块做为一种电源供应器为电子设备提供供电&#xff0c;广泛应用于汽车电子、航空航天、医疗、通信等各个领域&#xff0c;因此检测电源模块的稳定性是非常重要的&#xff0c;确保其为电子设备提供稳定的电压和电流&#xff0c;保证电子设备可以正常稳定工作。 电源模块的稳…

四川古力未来科技有限公司:抖音小店的崛起之路

随着互联网的飞速发展&#xff0c;电子商务已经成为人们日常生活中不可或缺的一部分。作为一家以科技为核心的公司&#xff0c;四川古力未来科技有限公司在电子商务领域中崭露头角&#xff0c;特别是其抖音小店的发展引人注目。 四川古力未来科技有限公司的抖音小店自开业以来&…

RT-Thread:STM32 PHY 调试,使用软件包 WIZNET 驱动 W5500

说明&#xff1a; 1. 本文记录使用 RT-Thread 软件包 WIZNET驱动 W5500 的调试笔记。 2. 采用 RT-Thread Studio 工程 STM32F407VET6 芯片&#xff0c;W5500 PHY芯片&#xff0c;两者之间使用SPI接口链接 。 注意&#xff1a; 1.在按流程建立工程&#xff0c;和移植完 wizn…

LeetCode---121双周赛---数位dp

题目列表 2996. 大于等于顺序前缀和的最小缺失整数 2997. 使数组异或和等于 K 的最少操作次数 2998. 使 X 和 Y 相等的最少操作次数 2999. 统计强大整数的数目 一、大于等于顺序前缀和的最小缺失整数 简单的模拟题&#xff0c;只要按照题目的要求去写代码即可&#xff0c;…

2-Linux-应用-部署icwp-Linux虚拟机【Django+Vue+Nginx+uwsgi+Linux】

本文概述 本文章讲述基于Linux CentOS 7系统&#xff08;虚拟机&#xff09;&#xff0c;部署DjangoVue开发的前后端分离项目。 项目源码不开放&#xff0c;但是操作步骤可以借鉴。 该文章将项目部署在Linux虚拟机上&#xff0c;暂不使用Docker 相关指令尽量展示执行路径&am…

通义灵码 - 免费的阿里云 VS code Jetbrains AI 编码辅助工具

系列文章目录 前言 通义灵码&#xff0c;是阿里云出品的一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力&#xff0c;并针对阿里云 SDK/OpenAPI 的使用…

最强联网Chat GPT 火爆全网高速 永久免费

&#x1f534;高速联网 秒响应支持语音通话&#x1f388; 首先介绍一下她的功能吧&#x1f601; 女友消息代回机&#x1f44c;&#x1f3fb; 朋友圈文案&#x1f44c;&#x1f3fb; 聊天话术&#x1f44c;&#x1f3fb; 高情商回复&#x1f44c;&#x1f3fb; 脱单助…

redis缓存雪崩、穿透和击穿

缓存雪崩 对于系统 A&#xff0c;假设每天高峰期每秒 5000 个请求&#xff0c;本来缓存在高峰期可以扛住每秒 4000 个请求&#xff0c;但是缓存机器意外发生了全盘宕机或者大量缓存集中在某一个时间段失效。缓存挂了&#xff0c;此时 1 秒 5000 个请求全部落数据库&#xff0c;…

Salesforce财务状况分析

纵观Salesforce发展史和十几年财报中的信息&#xff0c;Salesforce从中小企业CRM服务的蓝海市场切入&#xff0c;但受限于中小企业的生命周期价值和每用户平均收入小且获客成本和流失率不对等&#xff0c;蓝海同时也是死海。 Salesforce通过收购逐渐补足品牌和产品两块短板&am…

golang 记录一次协程和协程池的使用,利用ants协程池来处理定时器导致服务全部阻塞

前言 在实习的项目中有一个地方遇到了需要协程池的地方&#xff0c;在mt推荐下使用了ants库。因此在此篇记录一下自己学习使用此库的情况。 场景描述 此服务大致是一个kafka消息接收、发送相关。接收消息&#xff0c;根据参数设置定时器进行重发。 通过这里新建kafka服务&a…

阿尔泰科技——PXIe8912/8914/8916高速数据采集卡

阿尔泰科技PXIe8912/8914/8916高速数据采集卡是2通道同步采样数字化仪&#xff0c;专为输入信号高达 100M 的高频和高动态范围的信号而设计。 与Labview无缝连接&#xff0c;提供图形化API函数。模拟输入范围可以通过软件编程设置为1V 或者5V。配备了容量高达 2GB的板载内存。…

【抓包教程】BurpSuite联动雷电模拟器——安卓高版本抓包移动应用教程

前言 近期找到了最适合自己的高版本安卓版本移动应用抓HTTP协议数据包教程&#xff0c;解决了安卓低版本的问题&#xff0c;同时用最简单的办法抓到https的数据包&#xff0c;特此进行文字记录和视频记录。 前期准备 抓包工具&#xff1a;BurpSuite安卓模拟器&#xff1a;雷…

Redis重点总结补充

Redis重点总结 1.redis分布式锁 2.redission实现分布式锁 注意&#xff1a;加锁、设置过期时间等操作都是基于lua脚本完成. redisson分布式锁&#xff0c;实现可重入&#xff08;前提是同一个线程下 3.redis主从集群 实现主从复制 ( Master-slave Replication)的工作原理 : …