画图,matlab,

news2024/12/16 8:02:08

clear;close all;clc;tic;

dirOutput = dir('*.dat');             % 罗列所有后缀-1.dat的文件列表,罗列BDDATA的数据
filenames = string({dirOutput.name}');  % 提取文件名

%% 丢包统计
FILENAMES = [""];
LOSS_YTJ  = [  ];
LOSS_RAD  = [  ];
LOSS_ETH  = [  ];
LOSS_YK   = [  ];
j=1;

%% 批处理
for i = 1:length(filenames)
    %% 文件名
    filename = char(filenames(i)); 
    filename = string(filename([1:end-16])); %  例如:20090111-190130-2
    
    %% 加载数据文件
    TELEMETRY_fileID    = fopen(filename+'TELEMETRY-v1.dat');   % 获取 TELEMETRY 文件ID 
    DATA_TELEMETRY      = fread(TELEMETRY_fileID);                  % 读取 TELEMETRY 文件数据
    fclose(TELEMETRY_fileID); % 关闭文件
	
    %% 解析数据文件
    TELEMETRY_RAW   = reshape(DATA_TELEMETRY,[ 239 length(DATA_TELEMETRY)/239])';   % 帧格式转换
    
    cnt_yaoce_link  = TELEMETRY_RAW(:,17);                                          % 遥测链路cnt         (239字节的第17字节)
    time_yitiji     = (TELEMETRY_RAW(:,234)*2^8 + TELEMETRY_RAW(:,233)) ;           % 一体机时间           (239字节的第234233字节)
    cnt_gnd_eth     = TELEMETRY_RAW(:,13);                                          % 地面接口网口cnt      (239字节的第13字节)
    ip_config       = TELEMETRY_RAW(:,30);                                          % 电台反馈IP           (239字节的第30字节)
    cfk_ml          = TELEMETRY_RAW(:,31);                                          % 最近测发控指令       (239字节的第31字节)
    signal_power    = TELEMETRY_RAW(:,32);                                          % 遥控信号能量值单字节 (239字节的第32字节)
    zijian          = TELEMETRY_RAW(:,33);                                          % 自检完成             (239字节的第33字节)
    state_yaokong   = TELEMETRY_RAW(:,32);                                          % 遥控链路通断状态     (239字节的第32字节)
    control_yaokong = TELEMETRY_RAW(:,36)*2^8+TELEMETRY_RAW(:,35);                  % 地面遥控指令是否连续 (239字节的第3635字节)
    angle_cabrage   = (TELEMETRY_RAW(:,50)*2^8 + TELEMETRY_RAW(:,49)) * 0.01;       % 飞行姿态 俯仰       (239字节第5049)
    angle_roll      = (TELEMETRY_RAW(:,52)*2^8 + TELEMETRY_RAW(:,51)) * 0.01;       % 飞行姿态 滚动       (239字节第5251)
    angle_Heading   = (TELEMETRY_RAW(:,54)*2^8 + TELEMETRY_RAW(:,53)) * 0.01;       % 飞行姿态 航向       (239字节第5453)
    speed_bd        = TELEMETRY_RAW(:,149)*0.005;                                   % 靶弹飞行速度        (239字节第149字节)
    high_bd         = (TELEMETRY_RAW(:,88)*2^8+TELEMETRY_RAW(:,87))*0.2-500;        % 靶弹飞行高度        (239字节第8887字节)

	len_tele    = length(cnt_yaoce_link); % TELEMETRY 数据长度

    %% 数据处理
    % 遥测链路是否丢包,前后相减是否为1
    diubao_yaoce_link   = diff(cnt_yaoce_link);
    diubao_yaoce_link(diubao_yaoce_link <= 0) = diubao_yaoce_link(diubao_yaoce_link <= 0) + 256;    % 处理负数
    flag_diubao_yaoce_link = diubao_yaoce_link ~= 1;                                                % 遥测链路丢包时刻
    count_diubao_yaoce_link = sum(diubao_yaoce_link-1);                                             % 遥测链路丢包数

    % 遥测是否丢包,基于一体机,前后相减是否为1 
    diubao_yaoce_yitiji = diff(time_yitiji);
%     diubao_yaoce_yitiji(diubao_yaoce_yitiji == -65535) = 1;     % 处理负数
    diubao_yaoce_yitiji(diubao_yaoce_yitiji < 0) = diubao_yaoce_yitiji(diubao_yaoce_yitiji < 0) + 65536;     % 处理负数
    flag_diubao_yaoce_yitiji = diubao_yaoce_yitiji ~= 1;      % 遥测丢包时刻
    count_diubao_yaoce_yitiji = sum(diubao_yaoce_yitiji-1);       % 遥测总丢包数

    % 地面网口接口是否丢包,前后相减是否为1
    diubao_gnd_eth      = diff(cnt_gnd_eth);
    diubao_gnd_eth(diubao_gnd_eth <= 0) = diubao_gnd_eth(diubao_gnd_eth <= 0) + 256;    % 处理负数
    flag_diubao_gnd_eth = diubao_gnd_eth ~= 1;                                          % 地面网口丢包时刻
    count_diubao_gnd_eth = sum(diubao_gnd_eth-1);                                         % 地面网口丢包数
    % 链路能量情况,整个字节显示

    % 自检完成,加载成功,判断是否等于FF
    state_zijian = zijian == 0xff;

    % 遥控链路通断状态(大于0即可)
    state_yk_link = state_yaokong > 0;

    % 地面遥控指令是否连续(是否存在00)
    state_yk_zl = control_yaokong == 0;
    k=1;
    while state_yk_zl(k) == 1 && k < 500 % 清除错误的数值,容错前50个。
        state_yk_zl(k) = 0;
        k = k+1;  
    end
    count_state_yk_zl = sum(state_yk_zl); % 遥控总丢包数
    flag_state_yk_zl = state_yk_zl ~= 0;

    % 遥控指令切换状态,切换计数器

    % 角度负数处理
    angle_cabrage(angle_cabrage>327.67) = angle_cabrage(angle_cabrage>327.67) - 655.36; 
    angle_roll(angle_roll>327.67)       = angle_roll(angle_roll>327.67)       - 655.36; 
    angle_Heading(angle_Heading>327.67) = angle_Heading(angle_Heading>327.67) - 655.36; 

    % 统计丢包数(网络、链路、遥测、遥控)
    FILENAMES(j) = filename; % 文件名称
%     LOSS_YTJ(j)  = count_diubao_yaoce_yitiji - count_diubao_yaoce_link;     % 一体机丢包
%     LOSS_RAD(j)  = count_diubao_yaoce_link - count_diubao_gnd_eth;          % 遥测链路丢包
    LOSS_YTJ(j)  = count_diubao_yaoce_yitiji ;     % 一体机丢包
    LOSS_RAD(j)  = count_diubao_yaoce_link ;          % 遥测链路丢包
    LOSS_ETH(j)  = count_diubao_gnd_eth;                                    % 以太网丢包
    LOSS_YK(j)   = count_state_yk_zl;                                       % 遥控丢包

    disp('如上图所示,网络丢'+string(LOSS_ETH(j))+'包,遥测链路丢'+string(LOSS_RAD(j))+'包,一体机丢'+string(LOSS_YTJ(j))+'包。'); % 快速报告
    j=j+1;
    %% 创建对应文件名的文件夹
    mkdir(filename);

    %% 绘制第一类图 : 丢包 帧计数(网络、链路、遥测、指令)  ( BD 指令和指令切换时刻)
    img = gcf;
    clf(img);
    hold on;
    plot(flag_diubao_gnd_eth*150,'--');
    plot(flag_diubao_yaoce_link*140,'.');
    plot(flag_diubao_yaoce_yitiji*130,'s');
    plot(cfk_ml,'r');
    plot([0,len_tele],[97,97],'linestyle','--');
    plot([0,len_tele],[113,113],'linestyle','--');
    legend('网络丢包','链路丢包','一体机丢包','指令','0x61大小功率','0x71数据装订','Location','NorthEastOutside');
    title('丢包与帧计数(网络、链路、遥测、指令)');
    ylim([-0.3 155]);
    hold off;
    print(img,'-dpng','-r800',filename+'/1_1丢包帧计数与指令.png');
    savefig(img,filename+'/1_1丢包帧计数与指令.fig');

%     clf(img);
%     hold on;
%     plot(state_yk_qie(:,2),'r');
%     plot(yk_zl_qiehuan*150,'g--');
%     plot([0,len_bd],[97,97],'linestyle','--');
%     plot([0,len_bd],[113,113],'linestyle','--');
%     legend('指令','指令切换时刻','0x61大小功率','0x71数据装订','Location','NorthEastOutside');
%     ylim([-0.3 155]);
%     hold off;
%     print(img,'-dpng','-r800',filename+'/1_2靶弹指令和指令切换时刻.png');
%     savefig(img,filename+'/1_2靶弹指令和指令切换时刻.fig');

    %% 绘制第二类图  遥控信号能量 & 遥控丢包 & 自检完成
    clf(img);
    hold on;
    plot(signal_power,'r');
    
    % 通断、其余未断链
    plot([0,len_tele],[0,0],'linestyle','--'); 
    % 大信号
    plot([0,len_tele],[48,48],'linestyle','--');
    plot([0,len_tele],[95,95],'linestyle','--');
    % 中信号
    plot([0,len_tele],[96,96],'linestyle','--');
    plot([0,len_tele],[143,143],'linestyle','--');
    % 小信号
    plot([0,len_tele],[144,144],'linestyle','--');
    plot([0,len_tele],[191,191],'linestyle','--');
    % 遥控丢包
    plot(flag_state_yk_zl*150,'g');
    % 自检
    plot(state_zijian * 10);  % 自检
    title('遥控信号能量 & 遥控丢包 & 自检完成');
    
    legend('遥控信号能量','通断','大信号上限','大信号下限', ...
        '中信号下限','中信号上限','小信号下限','小信号上限',...
        '遥控丢包','自检完成','Location','NorthEastOutside');
    hold off;
    print(img,'-dpng','-r800',filename+'/2_遥控丢包_遥控能量.png');
    savefig(img,filename+'/2_遥控丢包_遥控能量.fig');
    
    %% 绘制第三类图 飞行 (俯仰、滚动、航向)
%     clf(img);
%     hold on;
%     plot(angle_cabrage);
%     plot(angle_roll);
%     plot(angle_Heading);
%     title('俯仰、滚动、航向');
%     ylim([-180 180]);
%     hold off;
%     print(img,'-dpng','-r800',filename+'/3_飞行角度.png');
%     savefig(img,filename+'/3_飞行角度.fig'); 

    %% 绘制第四类图 IP分析图
%     clf(img);
%     plot(ip_config);
%     title('IP反馈图');
%     print(img,'-dpng','-r800',filename+'/4_IP反馈图.png');
%     savefig(img,filename+'/4_IP反馈图.fig'); 

    %% 纯链路丢包
    clf(img);
    hold on;
    plot((flag_diubao_yaoce_link-flag_diubao_gnd_eth)*150,'--');
    plot(cfk_ml,'r');
    plot([0,len_tele],[97,97],'linestyle','--');
    plot([0,len_tele],[113,113],'linestyle','--');
    legend('链路丢包','指令','0x61大小功率','0x71数据装订','Location','NorthEastOutside');
    title('链路丢包与帧计数(链路、指令)');
    ylim([-0.3 155]);
    hold off;
    print(img,'-dpng','-r800',filename+'/5丢包帧计数与指令.png');
    savefig(img,filename+'/5纯链路丢包帧计数与指令.fig');
    
    %% 纯一体机丢包
    clf(img);
    hold on;
    plot((flag_diubao_yaoce_yitiji-flag_diubao_yaoce_link)*150,'--');
    plot(cfk_ml,'r');
    plot([0,len_tele],[97,97],'linestyle','--');
    plot([0,len_tele],[113,113],'linestyle','--');
    legend('一体机丢包','指令','0x61大小功率','0x71数据装订','Location','NorthEastOutside');
    title('一体机丢包与帧计数(链路、指令)');
    ylim([-0.3 155]);
    hold off;
    print(img,'-dpng','-r800',filename+'/6丢包帧计数与指令.png');
    savefig(img,filename+'/6纯一体丢包帧计数与指令.fig');

    %% 纯网络丢包
    clf(img);
    hold on;
    plot(flag_diubao_gnd_eth*150,'--');
    plot(cfk_ml,'r');
    plot([0,len_tele],[97,97],'linestyle','--');
    plot([0,len_tele],[113,113],'linestyle','--');
    legend('网络链路丢包','指令','0x61大小功率','0x71数据装订','Location','NorthEastOutside');
    title('网络丢包与帧计数(链路、指令)');
    ylim([-0.3 155]);
    hold off;
    print(img,'-dpng','-r800',filename+'/7丢包帧计数与指令.png');
    savefig(img,filename+'/7纯网络丢包帧计数与指令.fig');

    save(filename+'/8_data.mat', ...
        'cnt_yaoce_link','diubao_yaoce_link','flag_diubao_yaoce_link', ...
        'time_yitiji','diubao_yaoce_yitiji','flag_diubao_yaoce_yitiji', ...
        'cnt_gnd_eth','diubao_gnd_eth','flag_diubao_gnd_eth');
end

%% 数据统计与导出
FILENAMES=FILENAMES';
LOSS_YTJ = LOSS_YTJ';
LOSS_RAD=LOSS_RAD';
LOSS_ETH=LOSS_ETH';
LOSS_YK=LOSS_YK';

writetable(table(FILENAMES,LOSS_YTJ,LOSS_RAD,LOSS_ETH,LOSS_YK,'VariableNames',["FILENAMES","LOSS_YTJ","LOSS_RAD","LOSS_ETH","LOSS_YK"]),'丢包数据统计(一体机丢包-遥测链路丢包-地面网口丢包-遥控丢包).csv');

toc;
%% 清空
clear all;close all;clc;
tic; % 计时

dirOutput = dir('*-1.dat');             % 罗列所有后缀-1.dat的文件列表,罗列BDDATA的数据
filenames = string({dirOutput.name}');  % 提取文件名

%% 丢包统计
FILENAMES = [""];
LOSS_YTJ  = [  ];
LOSS_RAD  = [  ];
LOSS_ETH  = [  ];
LOSS_YK   = [  ];
j=1;

%% 批处理
for i = 1:length(filenames)
    %% 文件名
    filename = char(filenames(i)); 
    filename = string(filename([1:end-16])); %  例如:20090111-190130-2
    
    %% 加载数据文件
    BDDATA_fileID       = fopen(filename+'-A2-BDDATA-1.dat');       % 获取 BDDATA    文件ID  
    TELEMETRY_fileID    = fopen(filename+'-C2-TELEMETRY-v1.dat');   % 获取 TELEMETRY 文件ID 
	DATA_BDDATA         = fread(BDDATA_fileID);                     % 读取 BDDATA    文件数据
    DATA_TELEMETRY      = fread(TELEMETRY_fileID);                  % 读取 TELEMETRY 文件数据
    fclose(BDDATA_fileID); 
    fclose(TELEMETRY_fileID); % 关闭文件
	
    %% 解析数据文件
    TELEMETRY_RAW   = reshape(DATA_TELEMETRY,[ 239 length(DATA_TELEMETRY)/239])';   % 帧格式转换
    BDDATA_RAW      = reshape(DATA_BDDATA   ,[ 178 length(DATA_BDDATA   )/178])';   % 帧格式转换
    
    cnt_yaoce_link  = TELEMETRY_RAW(:,17);                                          % 遥测链路cnt         (239字节的第17字节)
    time_yitiji     = (TELEMETRY_RAW(:,234)*2^8 + TELEMETRY_RAW(:,233)) ;           % 一体机时间           (239字节的第234233字节)
    cnt_gnd_eth     = TELEMETRY_RAW(:,13);                                          % 地面接口网口cnt      (239字节的第13字节)
    ip_config       = TELEMETRY_RAW(:,30);                                          % 电台反馈IP           (239字节的第30字节)
    cfk_ml          = TELEMETRY_RAW(:,31);                                          % 最近测发控指令       (239字节的第31字节)
    signal_power    = TELEMETRY_RAW(:,32);                                          % 遥控信号能量值单字节 (239字节的第32字节)
    zijian          = TELEMETRY_RAW(:,33);                                          % 自检完成             (239字节的第33字节)
    state_yaokong   = TELEMETRY_RAW(:,32);                                          % 遥控链路通断状态     (239字节的第32字节)
    control_yaokong = TELEMETRY_RAW(:,36)*2^8+TELEMETRY_RAW(:,35);                  % 地面遥控指令是否连续 (239字节的第3635字节)
    angle_cabrage   = (TELEMETRY_RAW(:,50)*2^8 + TELEMETRY_RAW(:,49)) * 0.01;       % 飞行姿态 俯仰       (239字节第5049)
    angle_roll      = (TELEMETRY_RAW(:,52)*2^8 + TELEMETRY_RAW(:,51)) * 0.01;       % 飞行姿态 滚动       (239字节第5251)
    angle_Heading   = (TELEMETRY_RAW(:,54)*2^8 + TELEMETRY_RAW(:,53)) * 0.01;       % 飞行姿态 航向       (239字节第5453)
    speed_bd        = TELEMETRY_RAW(:,149)*0.005;                                   % 靶弹飞行速度        (239字节第149字节)
    high_bd         = (TELEMETRY_RAW(:,88)*2^8+TELEMETRY_RAW(:,87))*0.2-500;        % 靶弹飞行高度        (239字节第8887字节)

    state_yk_qie    = BDDATA_RAW(:,[11 10]);                                        % 遥控指令切换状态(阶梯状),BD_DATA里面第11(计数)、10(指令)字节。
    time_bd_yitiji  = (BDDATA_RAW(:,24)*2^24+BDDATA_RAW(:,23)*2^16+BDDATA_RAW(:,22)*2^8+BDDATA_RAW(:,21))*0.00001;

	len_tele    = length(cnt_yaoce_link); % TELEMETRY 数据长度
    len_bd      = length(state_yk_qie);   % BDDATA 数据长度

    %% 数据处理
    % 遥测链路是否丢包,前后相减是否为1
    diubao_yaoce_link   = diff(cnt_yaoce_link);
    diubao_yaoce_link(diubao_yaoce_link <= 0) = diubao_yaoce_link(diubao_yaoce_link <= 0) + 256;    % 处理负数
    flag_diubao_yaoce_link = diubao_yaoce_link ~= 1;                                                % 遥测链路丢包时刻
    count_diubao_yaoce_link = sum(diubao_yaoce_link-1);                                             % 遥测链路丢包数

    % 遥测是否丢包,基于一体机,前后相减是否为1 
    diubao_yaoce_yitiji = diff(time_yitiji);
    diubao_yaoce_yitiji(diubao_yaoce_yitiji < 0) = diubao_yaoce_yitiji(diubao_yaoce_yitiji < 0) + 65536;     % 处理负数
    flag_diubao_yaoce_yitiji = diubao_yaoce_yitiji ~= 1;      % 遥测丢包时刻
    count_diubao_yaoce_yitiji = sum(diubao_yaoce_yitiji-1);       % 遥测总丢包数

    % 地面网口接口是否丢包,前后相减是否为1
    diubao_gnd_eth      = diff(cnt_gnd_eth);
    diubao_gnd_eth(diubao_gnd_eth <= 0) = diubao_gnd_eth(diubao_gnd_eth <= 0) + 256;    % 处理负数
    flag_diubao_gnd_eth = diubao_gnd_eth ~= 1;                                          % 地面网口丢包时刻
    count_diubao_gnd_eth = sum(diubao_gnd_eth-1);                                         % 地面网口丢包数
    % 链路能量情况,整个字节显示

    % 自检完成,加载成功,判断是否等于FF
    state_zijian = zijian == 0xff;

    % 遥控链路通断状态(大于0即可)
    state_yk_link = state_yaokong > 0;

    % 地面遥控指令是否连续(是否存在00)
    state_yk_zl = control_yaokong == 0;
    k=1;
    while state_yk_zl(k) == 1 && k < 500 % 清除错误的数值,容错前50个。
        state_yk_zl(k) = 0;
        k = k+1;  
    end
    count_state_yk_zl = sum(state_yk_zl); % 遥控总丢包数
    flag_state_yk_zl = state_yk_zl ~= 0;

    % 遥控指令切换状态,切换计数器
    yk_zl_qiehuan = diff(state_yk_qie(:,1));

    % 角度负数处理
    angle_cabrage(angle_cabrage>327.67) = angle_cabrage(angle_cabrage>327.67) - 655.36; 
    angle_roll(angle_roll>327.67)       = angle_roll(angle_roll>327.67)       - 655.36; 
    angle_Heading(angle_Heading>327.67) = angle_Heading(angle_Heading>327.67) - 655.36; 

    % 统计丢包数(网络、链路、遥测、遥控)
    FILENAMES(j) = filename; % 文件名称
%     LOSS_YTJ(j)  = count_diubao_yaoce_yitiji - count_diubao_yaoce_link;     % 一体机丢包
%     LOSS_RAD(j)  = count_diubao_yaoce_link - count_diubao_gnd_eth;          % 遥测链路丢包
    LOSS_YTJ(j)  = count_diubao_yaoce_yitiji ;     % 一体机丢包
    LOSS_RAD(j)  = count_diubao_yaoce_link ;          % 遥测链路丢包
    LOSS_ETH(j)  = count_diubao_gnd_eth;                                    % 以太网丢包
    LOSS_YK(j)   = count_state_yk_zl;                                       % 遥控丢包

    disp('如上图所示,网络丢'+string(LOSS_ETH(j))+'包,遥测链路丢'+string(LOSS_RAD(j))+'包,一体机丢'+string(LOSS_YTJ(j))+'包。'); % 快速报告
    j=j+1;
    %% 创建对应文件名的文件夹
    mkdir(filename);

    %% 绘制第一类图 : 丢包 帧计数(网络、链路、遥测、指令)  ( BD 指令和指令切换时刻)
    img = gcf;
    clf(img);
    hold on;
    plot(flag_diubao_gnd_eth*150,'--');
    plot(flag_diubao_yaoce_link*140,'.');
    plot(flag_diubao_yaoce_yitiji*130,'s');
    plot(cfk_ml,'r');
    plot([0,len_tele],[97,97],'linestyle','--');
    plot([0,len_tele],[113,113],'linestyle','--');
    legend('网络丢包','链路丢包','一体机丢包','指令','0x61大小功率','0x71数据装订','Location','NorthEastOutside');
    title('丢包与帧计数(网络、链路、遥测、指令)');
    ylim([-0.3 155]);
    hold off;
    print(img,'-dpng','-r800',filename+'/1_1丢包帧计数与指令.png');
    savefig(img,filename+'/1_1丢包帧计数与指令.fig');

    clf(img);
    hold on;
    plot(state_yk_qie(:,2),'r');
    plot(yk_zl_qiehuan*150,'g--');
    plot([0,len_bd],[97,97],'linestyle','--');
    plot([0,len_bd],[113,113],'linestyle','--');
    legend('指令','指令切换时刻','0x61大小功率','0x71数据装订','Location','NorthEastOutside');
    ylim([-0.3 155]);
    hold off;
    print(img,'-dpng','-r800',filename+'/1_2靶弹指令和指令切换时刻.png');
    savefig(img,filename+'/1_2靶弹指令和指令切换时刻.fig');

    %% 绘制第二类图  遥控信号能量 & 遥控丢包 & 自检完成
    clf(img);
    hold on;
    plot(signal_power,'r');
    
    % 通断、其余未断链
    plot([0,len_tele],[0,0],'linestyle','--'); 
    % 大信号
    plot([0,len_tele],[48,48],'linestyle','--');
    plot([0,len_tele],[95,95],'linestyle','--');
    % 中信号
    plot([0,len_tele],[96,96],'linestyle','--');
    plot([0,len_tele],[143,143],'linestyle','--');
    % 小信号
    plot([0,len_tele],[144,144],'linestyle','--');
    plot([0,len_tele],[191,191],'linestyle','--');
    % 遥控丢包
    plot(flag_state_yk_zl*150,'g');
    % 自检
    plot(state_zijian * 10);  % 自检
    title('遥控信号能量 & 遥控丢包 & 自检完成');
    
    legend('遥控信号能量','通断','大信号上限','大信号下限', ...
        '中信号下限','中信号上限','小信号下限','小信号上限',...
        '遥控丢包','自检完成','Location','NorthEastOutside');
    hold off;
    print(img,'-dpng','-r800',filename+'/2_遥控丢包_遥控能量.png');
    savefig(img,filename+'/2_遥控丢包_遥控能量.fig');
    
    %% 绘制第三类图 飞行 (俯仰、滚动、航向)
%     clf(img);
%     hold on;  
%     plot(angle_cabrage);
%     plot(angle_roll);
%     plot(angle_Heading);
%     title('俯仰、滚动、航向');
%     ylim([-180 180]);
%     hold off;
%     print(img,'-dpng','-r800',filename+'/3_飞行角度.png');
%     savefig(img,filename+'/3_飞行角度.fig'); 

    %% 绘制第四类图 IP分析图
    clf(img);
    plot(ip_config);
    title('IP反馈图');
    print(img,'-dpng','-r800',filename+'/4_IP反馈图.png');
    savefig(img,filename+'/4_IP反馈图.fig'); 

    %% 纯链路丢包
    clf(img);
    hold on;
    plot((flag_diubao_yaoce_link-flag_diubao_gnd_eth)*150,'--');
    plot(cfk_ml,'r');
    plot([0,len_tele],[97,97],'linestyle','--');
    plot([0,len_tele],[113,113],'linestyle','--');
    legend('链路丢包','指令','0x61大小功率','0x71数据装订','Location','NorthEastOutside');
    title('链路丢包与帧计数(链路、指令)');
    ylim([-0.3 155]);
    hold off;
    print(img,'-dpng','-r800',filename+'/5丢包帧计数与指令.png');
    savefig(img,filename+'/5纯链路丢包帧计数与指令.fig');
    
    %% 纯一体机丢包
    clf(img);
    hold on;
    plot((flag_diubao_yaoce_yitiji-flag_diubao_yaoce_link)*150,'--');
    plot(cfk_ml,'r');
    plot([0,len_tele],[97,97],'linestyle','--');
    plot([0,len_tele],[113,113],'linestyle','--');
    legend('一体机丢包','指令','0x61大小功率','0x71数据装订','Location','NorthEastOutside');
    title('一体机丢包与帧计数(链路、指令)');
    ylim([-0.3 155]);
    hold off;
    print(img,'-dpng','-r800',filename+'/6丢包帧计数与指令.png');
    savefig(img,filename+'/6纯一体丢包帧计数与指令.fig');

    %% 纯网络丢包
    clf(img);
    hold on;
    plot(flag_diubao_gnd_eth*150,'--');
    plot(cfk_ml,'r');
    plot([0,len_tele],[97,97],'linestyle','--');
    plot([0,len_tele],[113,113],'linestyle','--');
    legend('网络链路丢包','指令','0x61大小功率','0x71数据装订','Location','NorthEastOutside');
    title('网络丢包与帧计数(链路、指令)');
    ylim([-0.3 155]);
    hold off;
    print(img,'-dpng','-r800',filename+'/7丢包帧计数与指令.png');
    savefig(img,filename+'/7纯网络丢包帧计数与指令.fig');

    save(filename+'/8_data.mat', ...
        'cnt_yaoce_link','diubao_yaoce_link','flag_diubao_yaoce_link', ...
        'time_yitiji','diubao_yaoce_yitiji','flag_diubao_yaoce_yitiji', ...
        'cnt_gnd_eth','diubao_gnd_eth','flag_diubao_gnd_eth');
end

%% 数据统计与导出
FILENAMES=FILENAMES';
LOSS_YTJ = LOSS_YTJ';
LOSS_RAD=LOSS_RAD';
LOSS_ETH=LOSS_ETH';
LOSS_YK=LOSS_YK';

writetable(table(FILENAMES,LOSS_YTJ,LOSS_RAD,LOSS_ETH,LOSS_YK,'VariableNames',["FILENAMES","LOSS_YTJ","LOSS_RAD","LOSS_ETH","LOSS_YK"]),'丢包数据统计(一体机丢包-遥测链路丢包-地面网口丢包-遥控丢包).csv');

toc;

ALL

% 计时
tic; 

%% 丢包统计
FILENAMES = [""];
LOSS_YTJ  = [  ];
LOSS_RAD  = [  ];
LOSS_ETH  = [  ];
LOSS_YK   = [  ];

%% 加载数据文件
BD_fileID       = fopen('bd.dat');                                          % 获取 靶弹 文件ID  
ZHU_fileID      = fopen('zhu.dat');                                         % 获取 主站 文件ID 
FU_fileID       = fopen('fu.dat');                                          % 获取 副站 文件ID 

DATA_BD         = fread(BD_fileID);                                         % 读取 靶弹 文件数据
DATA_ZHU        = fread(ZHU_fileID);                                        % 读取 主站 文件数据
DATA_FU         = fread(FU_fileID);                                         % 读取 副站 文件数据

fclose(BD_fileID); fclose(ZHU_fileID); fclose(FU_fileID);                   % 关闭文件

%% 解析数据文件
ZHU_RAW     = reshape(DATA_ZHU,[239 length(DATA_ZHU)/239])';                % 主站帧格式转换
FU_RAW      = reshape(DATA_FU,[ 239 length(DATA_FU )/239])';                % 副站帧格式转换
BDDATA_RAW  = reshape(DATA_BD,[ 178 length(DATA_BD )/178])';                % 靶弹帧格式转换

%% 靶弹数据解析
state_yk_qie    = BDDATA_RAW(:,[11 10]);                                    % 遥控指令切换状态(阶梯状),BD_DATA里面第11(计数)、10(指令)字节。
time_bd_yitiji  = (BDDATA_RAW(:,24)*2^24 + BDDATA_RAW(:,23)*2^16 + ...
                    BDDATA_RAW(:,22)*2^8 + BDDATA_RAW(:,21))*0.00001;
BD_UTC_raw      = BDDATA_RAW(:,28)*2^24 + BDDATA_RAW(:,27)*2^16 + ...
                    BDDATA_RAW(:,26)*2^8 + BDDATA_RAW(:,25);                % UTC 时间原码 (BD_DATA里面第25262728字节)
BD_UTC          = ConvertNum2UTC(BD_UTC_raw);                               % BD 的 UTC 时间
len_bd          = length(state_yk_qie);                                     % BDDATA 数据长度

%% 主站数据解析
zhu_cnt_yaoce_link  = ZHU_RAW(:,17);                                        % 遥测链路cnt         (239字节的第17字节)
zhu_time_yitiji     = (ZHU_RAW(:,234)*2^8 + ZHU_RAW(:,233)) ;               % 一体机时间           (239字节的第234233字节)
zhu_sky_control_time= (ZHU_RAW(:,110)*2^24 + ZHU_RAW(:,109)*2^16 + ...
                        ZHU_RAW(:,108)*2^8 + ZHU_RAW(:,107));               % 飞控时间            (239字节第110109108107)
zhu_cnt_gnd_eth     = ZHU_RAW(:,13);                                        % 地面接口网口cnt      (239字节的第13字节)
zhu_ip_config       = ZHU_RAW(:,30);                                        % 电台反馈IP           (239字节的第30字节)
zhu_cfk_ml          = ZHU_RAW(:,31);                                        % 最近测发控指令       (239字节的第31字节)
zhu_signal_power    = ZHU_RAW(:,32);                                        % 遥控信号能量值单字节 (239字节的第32字节)
zhu_zijian          = ZHU_RAW(:,33);                                        % 自检完成             (239字节的第33字节)
zhu_state_yaokong   = ZHU_RAW(:,32);                                        % 遥控链路通断状态     (239字节的第32字节)
zhu_control_yaokong = ZHU_RAW(:,36)*2^8 + ZHU_RAW(:,35);                    % 地面遥控指令是否连续 (239字节的第3635字节)
zhu_angle_cabrage   = (ZHU_RAW(:,50)*2^8 + ZHU_RAW(:,49)) * 0.01;           % 飞行姿态 俯仰       (239字节第5049)
zhu_angle_roll      = (ZHU_RAW(:,52)*2^8 + ZHU_RAW(:,51)) * 0.01;           % 飞行姿态 滚动       (239字节第5251)
zhu_angle_Heading   = (ZHU_RAW(:,54)*2^8 + ZHU_RAW(:,53)) * 0.01;           % 飞行姿态 航向       (239字节第5453)
zhu_longitude       = (ZHU_RAW(:,83)*2^16 + ZHU_RAW(:,82)*2^8 + ...
                        ZHU_RAW(:,81));                                     % 经度                (239字节第838281)原始数据
zhu_latitude        = (ZHU_RAW(:,86)*2^16 + ZHU_RAW(:,85)*2^8 + ...
                        ZHU_RAW(:,84));                                     % 纬度                (239字节第868584)原始数据
zhu_positiong_high  = (ZHU_RAW(:,88)*2^8 + ZHU_RAW(:,87)) * 0.2 - 500;      % 高度                 (239字节的第8887字节)
zhu_speed_bd        = ZHU_RAW(:,149)*0.005;                                 % 靶弹飞行速度        (239字节第149字节)
zhu_high_bd         = (ZHU_RAW(:,88)*2^8 + ZHU_RAW(:,87))*0.2 - 500;        % 靶弹飞行高度        (239字节第8887字节)
zhu_UTC_raw         =(ZHU_RAW(:,104)*2^24 + ZHU_RAW(:,103)*2^16 + ...
                        ZHU_RAW(:,102)*2^8 + ZHU_RAW(:,101));               % UTC 时间原码        (239字节第104103102101)
zhu_UTC             = ConvertNum2UTC(zhu_UTC_raw);                          % UTC 时间

zhu_len_tele        = length(zhu_cnt_yaoce_link);                           % 主站数据包长度
%% 副站数据解析
fu_cnt_yaoce_link  = FU_RAW(:,17);                                          % 遥测链路cnt         (239字节的第17字节)
fu_time_yitiji     = (FU_RAW(:,234)*2^8 + FU_RAW(:,233)) ;                  % 一体机时间           (239字节的第234233字节)
fu_sky_control_time= (FU_RAW(:,110)*2^24 + FU_RAW(:,109)*2^16 + ...
                        FU_RAW(:,108)*2^8 + FU_RAW(:,107));                 % 飞控时间            (239字节第110109108107)
fu_cnt_gnd_eth     = FU_RAW(:,13);                                          % 地面接口网口cnt      (239字节的第13字节)
fu_ip_config       = FU_RAW(:,30);                                          % 电台反馈IP           (239字节的第30字节)
fu_cfk_ml          = FU_RAW(:,31);                                          % 最近测发控指令       (239字节的第31字节)
fu_signal_power    = FU_RAW(:,32);                                          % 遥控信号能量值单字节 (239字节的第32字节)
fu_zijian          = FU_RAW(:,33);                                          % 自检完成             (239字节的第33字节)
fu_state_yaokong   = FU_RAW(:,32);                                          % 遥控链路通断状态     (239字节的第32字节)
fu_control_yaokong = FU_RAW(:,36)*2^8 + FU_RAW(:,35);                       % 地面遥控指令是否连续 (239字节的第3635字节)
fu_angle_cabrage   = (FU_RAW(:,50)*2^8 + FU_RAW(:,49)) * 0.01;              % 飞行姿态 俯仰       (239字节第5049)
fu_angle_roll      = (FU_RAW(:,52)*2^8 + FU_RAW(:,51)) * 0.01;              % 飞行姿态 滚动       (239字节第5251)
fu_angle_Heading   = (FU_RAW(:,54)*2^8 + FU_RAW(:,53)) * 0.01;              % 飞行姿态 航向       (239字节第5453)
fu_longitude       = (FU_RAW(:,83)*2^16 + FU_RAW(:,82)*2^8 + ...
                        FU_RAW(:,81));                                      % 经度                (239字节第838281)原始数据
fu_latitude        = (FU_RAW(:,86)*2^16 + FU_RAW(:,85)*2^8 + ...
                        FU_RAW(:,84));                                      % 纬度                (239字节第868584)原始数据
fu_positiong_high  = (FU_RAW(:,88)*2^8 + FU_RAW(:,87)) * 0.2 - 500;         % 高度                 (239字节的第8887字节)
fu_speed_bd        = FU_RAW(:,149)*0.005;                                   % 靶弹飞行速度        (239字节第149字节)
fu_high_bd         = (FU_RAW(:,88)*2^8 + FU_RAW(:,87))*0.2-500;             % 靶弹飞行高度        (239字节第8887字节)
fu_UTC_raw         =(FU_RAW(:,104)*2^24 + FU_RAW(:,103)*2^16 + ...
                        FU_RAW(:,102)*2^8 + FU_RAW(:,101));                 % UTC 时间原码        (239字节第104103102101)
fu_UTC             = ConvertNum2UTC(fu_UTC_raw);                            % UTC 时间
fu_len_tele        = length(fu_cnt_yaoce_link);                             % 副站数据包长度
%% 主站数据处理
    % 遥测链路是否丢包,前后相减是否为1
    zhu_diubao_yaoce_link   = diff(zhu_cnt_yaoce_link);
    zhu_diubao_yaoce_link(zhu_diubao_yaoce_link <= 0) = zhu_diubao_yaoce_link(zhu_diubao_yaoce_link <= 0) + 256;    % 处理负数
    zhu_flag_diubao_yaoce_link = zhu_diubao_yaoce_link ~= 1;                                                % 遥测链路丢包时刻
    zhu_count_diubao_yaoce_link = sum(zhu_diubao_yaoce_link-1);                                             % 遥测链路丢包数

    % 遥测是否丢包,基于一体机,前后相减是否为1 
    zhu_diubao_yaoce_yitiji = diff(zhu_time_yitiji);
    zhu_diubao_yaoce_yitiji(zhu_diubao_yaoce_yitiji < 0) = zhu_diubao_yaoce_yitiji(zhu_diubao_yaoce_yitiji < 0) + 65536;     % 处理负数
    zhu_flag_diubao_yaoce_yitiji = zhu_diubao_yaoce_yitiji ~= 1;      % 遥测丢包时刻
    zhu_count_diubao_yaoce_yitiji = sum(zhu_diubao_yaoce_yitiji-1);       % 遥测总丢包数

    % 地面网口接口是否丢包,前后相减是否为1
    zhu_diubao_gnd_eth      = diff(zhu_cnt_gnd_eth);
    zhu_diubao_gnd_eth(zhu_diubao_gnd_eth <= 0) = zhu_diubao_gnd_eth(zhu_diubao_gnd_eth <= 0) + 256;    % 处理负数
    zhu_flag_diubao_gnd_eth = zhu_diubao_gnd_eth ~= 1;                                          % 地面网口丢包时刻
    zhu_count_diubao_gnd_eth = sum(zhu_diubao_gnd_eth-1);                                         % 地面网口丢包数
    
    % 遥控链路通断状态(大于0即可)
    zhu_state_yk_link = zhu_state_yaokong > 0;

    % 地面遥控指令是否连续(是否存在00)
    zhu_state_yk_zl = zhu_control_yaokong == 0;
    k=1;
    while zhu_state_yk_zl(k) == 1 && k < 500 % 清除错误的数值,容错前50个。
        zhu_state_yk_zl(k) = 0;
        k = k+1;  
    end
    zhu_count_state_yk_zl = sum(zhu_state_yk_zl); % 遥控总丢包数
    zhu_flag_state_yk_zl = zhu_state_yk_zl ~= 0;

    % 遥控指令切换状态,切换计数器
    yk_zl_qiehuan = diff(state_yk_qie(:,1));

    % 角度负数处理
    zhu_angle_cabrage(zhu_angle_cabrage>327.67) = zhu_angle_cabrage(zhu_angle_cabrage>327.67) - 655.36; 
    zhu_angle_roll(zhu_angle_roll>327.67)       = zhu_angle_roll(zhu_angle_roll>327.67)       - 655.36; 
    zhu_angle_Heading(zhu_angle_Heading>327.67) = zhu_angle_Heading(zhu_angle_Heading>327.67) - 655.36; 

    % 经纬度负数处理 比例尺换算
    zhu_longitude(zhu_longitude>8388607)    = zhu_longitude(zhu_longitude>8388607) - 16777216;
    zhu_latitude(zhu_latitude>8388607)      = zhu_latitude(zhu_latitude>8388607) - 16777216;
    zhu_longitude                           = zhu_longitude * 0.00005;
    zhu_latitude                            = zhu_latitude * 0.00005;

    % 轨迹与丢包图
    zhu_remove_eth = zhu_flag_diubao_yaoce_link-zhu_flag_diubao_gnd_eth;
    
    zhu_longitude_err = zhu_longitude(zhu_remove_eth==1);
    zhu_latitude_err = zhu_latitude(zhu_remove_eth==1);
    zhu_high_err = zhu_positiong_high(zhu_remove_eth==1);
    
    zhu_longitude_right = zhu_longitude(zhu_remove_eth==0);
    zhu_latitude_right = zhu_latitude(zhu_remove_eth==0);
    zhu_high_right = zhu_positiong_high(zhu_remove_eth==0);

    % 统计丢包数(网络、链路、遥测、遥控)
    FILENAMES(1) = 'main';                                                  % 文件名称
    LOSS_YTJ(1)  = zhu_count_diubao_yaoce_yitiji ;                          % 一体机丢包
    LOSS_RAD(1)  = zhu_count_diubao_yaoce_link ;                            % 遥测链路丢包
    LOSS_ETH(1)  = zhu_count_diubao_gnd_eth;                                % 以太网丢包
    LOSS_YK(1)   = zhu_count_state_yk_zl;                                   % 遥控丢包

    disp('如上图所示,网络丢'+string(LOSS_ETH(1))+'包,遥测链路丢'+ ...
        string(LOSS_RAD(1))+'包,一体机丢'+string(LOSS_YTJ(1))+ ...
        '包,遥控丢'+string(LOSS_YK(1))+'包。');                              % 快速报告

%% 副站数据处理
    % 遥测链路是否丢包,前后相减是否为1
    fu_diubao_yaoce_link   = diff(fu_cnt_yaoce_link);
    fu_diubao_yaoce_link(fu_diubao_yaoce_link <= 0) = fu_diubao_yaoce_link(fu_diubao_yaoce_link <= 0) + 256;    % 处理负数
    fu_flag_diubao_yaoce_link = fu_diubao_yaoce_link ~= 1;                                                % 遥测链路丢包时刻
    fu_count_diubao_yaoce_link = sum(fu_diubao_yaoce_link-1);                                             % 遥测链路丢包数

    % 遥测是否丢包,基于一体机,前后相减是否为1 
    fu_diubao_yaoce_yitiji = diff(fu_time_yitiji);
    fu_diubao_yaoce_yitiji(fu_diubao_yaoce_yitiji < 0) = fu_diubao_yaoce_yitiji(fu_diubao_yaoce_yitiji < 0) + 65536;     % 处理负数
    fu_flag_diubao_yaoce_yitiji = fu_diubao_yaoce_yitiji ~= 1;      % 遥测丢包时刻
    fu_count_diubao_yaoce_yitiji = sum(fu_diubao_yaoce_yitiji-1);       % 遥测总丢包数

    % 地面网口接口是否丢包,前后相减是否为1
    fu_diubao_gnd_eth      = diff(fu_cnt_gnd_eth);
    fu_diubao_gnd_eth(fu_diubao_gnd_eth <= 0) = fu_diubao_gnd_eth(fu_diubao_gnd_eth <= 0) + 256;    % 处理负数
    fu_flag_diubao_gnd_eth = fu_diubao_gnd_eth ~= 1;                                          % 地面网口丢包时刻
    fu_count_diubao_gnd_eth = sum(fu_diubao_gnd_eth-1);                                         % 地面网口丢包数

    % 遥控链路通断状态(大于0即可)
    fu_state_yk_link = fu_state_yaokong > 0;

    % 地面遥控指令是否连续(是否存在00)
    fu_state_yk_zl = fu_control_yaokong == 0;
    k=1;
    while fu_state_yk_zl(k) == 1 && k < 500 % 清除错误的数值,容错前50个。
        fu_state_yk_zl(k) = 0;
        k = k+1;  
    end
    fu_count_state_yk_zl = sum(fu_state_yk_zl); % 遥控总丢包数
    fu_flag_state_yk_zl = fu_state_yk_zl ~= 0;

    % 角度负数处理
    fu_angle_cabrage(fu_angle_cabrage>327.67) = fu_angle_cabrage(fu_angle_cabrage>327.67) - 655.36; 
    fu_angle_roll(fu_angle_roll>327.67)       = fu_angle_roll(fu_angle_roll>327.67)       - 655.36; 
    fu_angle_Heading(fu_angle_Heading>327.67) = fu_angle_Heading(fu_angle_Heading>327.67) - 655.36; 

    % 经纬度负数处理 比例尺换算
    fu_longitude(fu_longitude>8388607)    = fu_longitude(fu_longitude>8388607) - 16777216;
    fu_latitude(fu_latitude>8388607)      = fu_latitude(fu_latitude>8388607) - 16777216;
    fu_longitude                       = fu_longitude * 0.00005;
    fu_latitude                        = fu_latitude * 0.00005;

    % 轨迹与丢包图
    fu_remove_eth = fu_flag_diubao_yaoce_link-fu_flag_diubao_gnd_eth;
    
    fu_longitude_err = fu_longitude(fu_remove_eth==1);
    fu_latitude_err = fu_latitude(fu_remove_eth==1);
    fu_high_err = fu_positiong_high(fu_remove_eth==1);
    
    fu_longitude_right = fu_longitude(fu_remove_eth==0);
    fu_latitude_right = fu_latitude(fu_remove_eth==0);
    fu_high_right = fu_positiong_high(fu_remove_eth==0);

    % 统计丢包数(网络、链路、遥测、遥控)
    FILENAMES(2) = 'slave';                                                    % 文件名称
    LOSS_YTJ(2)  = fu_count_diubao_yaoce_yitiji ;                              % 一体机丢包
    LOSS_RAD(2)  = fu_count_diubao_yaoce_link ;                                % 遥测链路丢包
    LOSS_ETH(2)  = fu_count_diubao_gnd_eth;                                    % 以太网丢包
    LOSS_YK(2)   = fu_count_state_yk_zl;                                       % 遥控丢包

    disp('如上图所示,网络丢'+string(LOSS_ETH(2))+'包,遥测链路丢'+ ...
        string(LOSS_RAD(2))+'包,一体机丢'+string(LOSS_YTJ(2))+ ...
        '包,遥控丢'+string(LOSS_YK(2))+'包。');                                % 快速报告

    [Angle_Antenna,Length,fuyang_test] = ...
        Antenna_direction(109.621197,40.847384,fu_longitude,fu_latitude,...
        fu_positiong_high,fu_angle_Heading);                                % 副站 仰角,距离,
    
    [Angle_Antenna_zhu,Length_zhu,fuyang_test_zhu] = ...
        Antenna_direction(109.621197,40.847384,zhu_longitude,zhu_latitude,...
        zhu_positiong_high,zhu_angle_Heading);                              % 主站 仰角,距离
%% 联合数据分析
% 遥控信号能量 & 主站遥控丢包
img = gcf;
clf(img);
hold on;
plot(zhu_signal_power,'r');

plot([0,zhu_len_tele],[48,48],'linestyle','--');        % 大信号
plot([0,zhu_len_tele],[95,95],'linestyle','--');        % 大信号
plot([0,zhu_len_tele],[96,96],'linestyle','--');        % 中信号
plot([0,zhu_len_tele],[143,143],'linestyle','--');      % 中信号
plot([0,zhu_len_tele],[144,144],'linestyle','--');      % 小信号
plot([0,zhu_len_tele],[191,191],'linestyle','--');      % 小信号    
plot(zhu_flag_state_yk_zl*150,'g');                     % 遥控丢包

title('遥控信号能量 & 主站遥控丢包');   
legend('遥控信号能量','大信号上限','大信号下限', ...
    '中信号下限','中信号上限','小信号下限','小信号上限',...
    '遥控丢包','Location','NorthEastOutside');
hold off;
savefig(img,'1_遥控丢包_遥控能量zhu.fig');

% 遥控信号能量 & 副站遥控丢包
img = gcf;
clf(img);
hold on;
plot(fu_signal_power,'r');

plot([0,fu_len_tele],[48,48],'linestyle','--');        % 大信号
plot([0,fu_len_tele],[95,95],'linestyle','--');        % 大信号
plot([0,fu_len_tele],[96,96],'linestyle','--');        % 中信号
plot([0,fu_len_tele],[143,143],'linestyle','--');      % 中信号
plot([0,fu_len_tele],[144,144],'linestyle','--');      % 小信号
plot([0,fu_len_tele],[191,191],'linestyle','--');      % 小信号    
plot(fu_flag_state_yk_zl*150,'g');                     % 遥控丢包

title('遥控信号能量 & 副站遥控丢包');   
legend('遥控信号能量','大信号上限','大信号下限', ...
    '中信号下限','中信号上限','小信号下限','小信号上限',...
    '遥控丢包','Location','NorthEastOutside');
hold off;
savefig(img,'1_遥控丢包_遥控能量fu.fig');

% 主站遥控丢包与飞行轨迹
clf(img);
subplot(1,2,1);
scatter3(zhu_longitude,zhu_latitude,zhu_positiong_high,10,"blue");
hold on;
scatter3(   zhu_longitude(zhu_flag_state_yk_zl==1), ...
            zhu_latitude(zhu_flag_state_yk_zl==1), ...
            zhu_positiong_high(zhu_flag_state_yk_zl==1),100,"red");
ylim([40.75 40.95]);
xlim([109 109.7]);
zlim([1200 2000]);
xlabel("longitude");ylabel("latitude");zlabel("high");
title('靶弹飞行轨迹图 & 主站遥控丢包');   
legend('飞行轨迹','遥控丢包','Location','NorthEastOutside');
% savefig(img,'1_2_轨迹与遥控丢包主站.fig'); 
% hold off;

% 副站遥控丢包 与 飞行轨迹
% clf(img);
subplot(1,2,2);
scatter3(fu_longitude,fu_latitude,fu_positiong_high,10,"blue");
hold on;
scatter3(   fu_longitude(fu_flag_state_yk_zl==1), ...
            fu_latitude(fu_flag_state_yk_zl==1), ...
            fu_positiong_high(fu_flag_state_yk_zl==1),100,"red");
ylim([40.75 40.95]);
xlim([109 109.7]);
zlim([1200 2000]);
xlabel("longitude");ylabel("latitude");zlabel("high");
title('靶弹飞行轨迹图 & 副站遥控丢包');   
legend('飞行轨迹','遥控丢包','Location','NorthEastOutside');
savefig(img,'1_2_轨迹与遥控丢包主副站比较图.fig'); 
hold off;

% 飞行(俯仰、滚动、航向)& 丢包时刻
% 飞行(经纬度、高度)& 丢包时刻
clf(img);
hold on;  
plot(zhu_angle_cabrage);
plot(zhu_angle_roll);
plot(zhu_angle_Heading);
plot(zhu_flag_diubao_yaoce_link*150,'g--');
legend('俯仰角','滚动角','航向角','遥测丢包','Location','NorthEastOutside');
xlabel('时刻');ylabel("角度值");
title('主站:俯仰、滚动、航向 & 丢包图');
ylim([-180 180]);
hold off;
% print(img,'-dpng','-r800','2_1_飞行角度zhu.png');
savefig(img,'2_1_飞行角度zhu.fig'); 

clf(img);
hold off;
scatter3(zhu_longitude_right,zhu_latitude_right,zhu_high_right,10,"blue");
hold on;
scatter3(zhu_longitude_err,zhu_latitude_err,zhu_high_err,50,"red");
xlabel("longitude");ylabel("latitude");zlabel("high");
ylim([40.75 40.95]);
xlim([109 109.7]);
zlim([1200 2000]);
title('主站:飞行轨迹 & 丢包图');
hold off;
savefig(img,'2_2_轨迹与丢包zhu.fig'); 

clf(img);
hold on;  
plot(fu_angle_cabrage);
plot(fu_angle_roll);
plot(fu_angle_Heading);
plot(fu_flag_diubao_yaoce_link*150,'g--');
legend('俯仰角','滚动角','航向角','遥测丢包','Location','NorthEastOutside');
title('副站:俯仰、滚动、航向 & 丢包图');
ylim([-180 180]);
hold off;
% print(img,'-dpng','-r800','2_1_飞行角度fu.png');
savefig(img,'2_1_飞行角度fu.fig'); 

clf(img);
hold off;
scatter3(fu_longitude_right,fu_latitude_right,fu_high_right,10,"blue");
hold on;
scatter3(fu_longitude_err,fu_latitude_err,fu_high_err,50,"red");
ylim([40.75 40.95]);
xlim([109 109.7]);
zlim([1200 2000]);
xlabel("longitude");ylabel("latitude");zlabel("high");
title('副站:飞行轨迹 & 丢包图');
hold off;
savefig(img,'2_2_轨迹与丢包fu.fig'); 

clf(img);
hold off;
scatter3(fu_longitude_right,fu_latitude_right,fu_high_right,1,"black");
hold on;
scatter3(fu_longitude_err,fu_latitude_err,fu_high_err,200,"red");
scatter3(zhu_longitude_err,zhu_latitude_err,zhu_high_err,50,"blue");
ylim([40.75 40.95]);
xlim([109 109.7]);
zlim([1200 2000]);
xlabel("longitude");ylabel("latitude");zlabel("high");
title('主副站:俯仰、滚动、航向 & 丢包图');
legend('轨迹图','副站丢包','主站丢包','Location','NorthEastOutside');
hold off;
savefig(img,'2_3_主副站轨迹与丢包.fig'); 

% 副站 丢包时刻的三个角度信息
fu_diubao_index = find(fu_remove_eth==1);
fu_diubao_pitch = [];
fu_diubao_yaw   = [];
fu_diubao_roll  = [];
fu_diubao_angle = [];
fu_diubao_jin = [];
fu_diubao_wei = [];
fu_diubao_gao = [];
j=1;
for i = fu_diubao_index'
    fu_diubao_pitch(j) = fu_angle_cabrage(i);
    fu_diubao_yaw(j)   = fu_angle_Heading(i);
    fu_diubao_roll(j)  = fu_angle_roll(i);
    fu_diubao_angle(j) = Angle_Antenna(i); 

    fu_diubao_jin(j) = fu_longitude(i);
    fu_diubao_wei(j) = fu_latitude(i);
    fu_diubao_gao(j) = fu_positiong_high(i);
    j=j+1;
end

% 主站 丢包时刻的三个角度信息
zhu_diubao_index = find(zhu_remove_eth==1);
zhu_diubao_pitch = [];
zhu_diubao_yaw   = [];
zhu_diubao_roll  = [];
zhu_diubao_angle = [];
j=1;
for i = zhu_diubao_index'
    zhu_diubao_pitch(j) = zhu_angle_cabrage(i);
    zhu_diubao_yaw(j)   = zhu_angle_Heading(i);
    zhu_diubao_roll(j)  = zhu_angle_roll(i);
    zhu_diubao_angle(j) = Angle_Antenna_zhu(i); 
    j=j+1;
end

% 副站 全数据点分析(包含起飞和降落阶段)
fu_all_analysis_pitch = fu_angle_cabrage(fu_remove_eth==1);
fu_all_analysis_yaw = fu_angle_Heading(fu_remove_eth==1);
fu_all_analysis_roll = fu_angle_roll(fu_remove_eth==1);
scatter3(fu_all_analysis_pitch,fu_all_analysis_yaw,fu_all_analysis_roll,100,"red");
xlabel("俯仰角 Pitch");ylabel("航向角 Yaw");zlabel("滚动角 Roll");
title('副站:全过程的俯仰、滚动、航向 & 丢包图');
savefig(img,'3_1_全数据姿态与丢包.fig'); 

% 副站 飞行数据点分析
fu_fly_pitch = fu_angle_cabrage(32727:148411);
fu_fly_yaw   = fu_angle_Heading(32727:148411);
fu_fly_roll  = fu_angle_roll(32727:148411);
fu_fly_remove= fu_remove_eth(32727:148411);
fu_fly_analysis_pitch = fu_fly_pitch(fu_fly_remove==1);
fu_fly_analysis_yaw   = fu_fly_yaw(fu_fly_remove==1);
fu_fly_analysis_roll  = fu_fly_roll(fu_fly_remove==1);
scatter3(fu_fly_analysis_pitch,fu_fly_analysis_yaw,fu_fly_analysis_roll,200,"blue");
xlabel("俯仰角 Pitch");ylabel("航向角 Yaw");zlabel("滚动角 Roll");
title('副站:飞行过程的俯仰、滚动、航向 & 丢包图');
savefig(img,'3_2_飞行数据与丢包.fig'); 

% 主站 全数据点分析(包含起飞和降落阶段)
zhu_all_analysis_pitch = zhu_angle_cabrage(zhu_remove_eth==1);
zhu_all_analysis_yaw = zhu_angle_Heading(zhu_remove_eth==1);
zhu_all_analysis_roll = zhu_angle_roll(zhu_remove_eth==1);
scatter3(zhu_all_analysis_pitch,zhu_all_analysis_yaw,zhu_all_analysis_roll,100,"red");
xlabel("俯仰角 Pitch");ylabel("航向角 Yaw");zlabel("滚动角 Roll");
title('主站:全过程的俯仰、滚动、航向 & 丢包图');
savefig(img,'3_3_全数据姿态与丢包.fig'); 

% 主站 飞行数据点分析
zhu_fly_pitch = zhu_angle_cabrage(32727:148411);
zhu_fly_yaw   = zhu_angle_Heading(32727:148411);
zhu_fly_roll  = zhu_angle_roll(32727:148411);
zhu_fly_remove= zhu_remove_eth(32727:148411);
zhu_fly_analysis_pitch = zhu_fly_pitch(zhu_fly_remove==1);
zhu_fly_analysis_yaw   = zhu_fly_yaw(zhu_fly_remove==1);
zhu_fly_analysis_roll  = zhu_fly_roll(zhu_fly_remove==1);
scatter3(zhu_fly_analysis_pitch,zhu_fly_analysis_yaw,zhu_fly_analysis_roll,200,"blue");
xlabel("俯仰角 Pitch");ylabel("航向角 Yaw");zlabel("滚动角 Roll");
title('主站:飞行过程的俯仰、滚动、航向 & 丢包图');
savefig(img,'3_4_飞行数据与丢包.fig'); 

% 主副站 全数据点分析(包含起飞和降落阶段)
scatter3(fu_all_analysis_pitch,fu_all_analysis_yaw,fu_all_analysis_roll,300,"red");
hold on;
scatter3(zhu_all_analysis_pitch,zhu_all_analysis_yaw,zhu_all_analysis_roll,100,"blue");
xlabel("俯仰角 Pitch");ylabel("航向角 Yaw");zlabel("滚动角 Roll");
legend('副站丢包','主站丢包','Location','NorthEastOutside');
title('主副站:全过程的俯仰、滚动、航向 & 丢包图');
savefig(img,'3_5_全数据姿态与丢包.fig'); 
hold off;

% 主副站 飞行数据点分析
scatter3(fu_fly_analysis_pitch,fu_fly_analysis_yaw,fu_fly_analysis_roll,300,"red");
hold on;
scatter3(zhu_fly_analysis_pitch,zhu_fly_analysis_yaw,zhu_fly_analysis_roll,100,"blue");
xlabel("俯仰角 Pitch");ylabel("航向角 Yaw");zlabel("滚动角 Roll");
legend('副站丢包','主站丢包','Location','NorthEastOutside');
title('主副站:飞行过程的俯仰、滚动、航向 & 丢包图');
savefig(img,'3_6_飞行数据与丢包.fig'); 
hold off;

% 副站 天线方向图
plot(fu_diubao_roll,fu_diubao_angle,'.');
xlabel("滚动角 Roll");ylabel("天线方向图角");
title('副站 天线方向图');
savefig(img,'4_1_副站天线方向图.fig'); 

% 副站 天线仰角与丢包 || 副站天线 俯仰角20度,10clf(img);
hold on;
plot(find(fu_remove_eth==1),fuyang_test(fu_remove_eth==1),'rs','LineWidth',2,'MarkerSize',5);
plot(find(fu_remove_eth==0),fuyang_test(fu_remove_eth==0),'b');
plot([0,length(fu_remove_eth)],[10,10],'linestyle','--','LineWidth',2);        % 天线波束范围
legend('丢包','不丢包','天线范围','Location','NorthEastOutside');
xlabel("飞行过程");ylabel("角度");
title('副站:地面与靶弹的俯仰角 丢包示意图');
savefig(img,'4_2_靶弹与副站天线仰角丢包示意图.fig'); 
hold off;

% 主站 天线方向图
plot(zhu_diubao_roll,zhu_diubao_angle,'.');
xlabel("滚动角 Roll");ylabel("天线方向图角");
title('主站 天线方向图');
savefig(img,'4_3_主站天线方向图.fig'); 
hold off;

% 主站 天线仰角与丢包 || 主站天线 H波束宽度33度,一半有16.5, 上翘9度,和起来有 25.5度 相对副站好
clf(img);
hold on;
plot(find(zhu_remove_eth==1),fuyang_test_zhu(zhu_remove_eth==1),'rs','LineWidth',2,'MarkerSize',5);
plot(find(zhu_remove_eth==0),fuyang_test_zhu(zhu_remove_eth==0),'b');
plot([0,length(zhu_remove_eth)],[25.5,25.5],'linestyle','--','LineWidth',2);        % 天线波束范围
legend('丢包','不丢包','天线范围','Location','NorthEastOutside');
xlabel("飞行过程");ylabel("角度");
title('主站:地面与靶弹的俯仰角 丢包示意图');
savefig(img,'4_4_靶弹与主站天线仰角丢包示意图.fig'); 

%% 数据统计与导出
FILENAMES = FILENAMES';
LOSS_YTJ  = LOSS_YTJ';
LOSS_RAD  = LOSS_RAD';
LOSS_ETH  = LOSS_ETH';
LOSS_YK   = LOSS_YK';

writetable(table(FILENAMES,LOSS_YTJ,LOSS_RAD,LOSS_ETH,LOSS_YK, ...
    'VariableNames',["FILENAMES","LOSS_YTJ","LOSS_RAD","LOSS_ETH", ...
    "LOSS_YK"]),'丢包数据统计(一体机丢包-遥测链路丢包-地面网口丢包-遥控丢包).csv');

fu_diubao_pitch = fu_diubao_pitch';
fu_diubao_yaw = fu_diubao_yaw';
fu_diubao_roll = fu_diubao_roll';
fu_diubao_angle = fu_diubao_angle';
fu_diubao_jin = fu_diubao_jin';
fu_diubao_wei = fu_diubao_wei';
fu_diubao_gao = fu_diubao_gao';

writetable(table(fu_diubao_index,fu_diubao_pitch,fu_diubao_yaw,fu_diubao_roll, ...
    fu_diubao_angle, fu_diubao_jin,fu_diubao_wei, fu_diubao_gao, ...
    'VariableNames',["index","pitch","yaw","roll","angle","jin","wei","gao" ...
    ]),'副站飞行过程中丢包与角度分析.csv');

toc;

%% 计算所需的函数
function UTC = ConvertNum2UTC(x)
    len = length(x);
    for i = 1:len
        h =  fix(x(i)/1000/3600);
        m =  fix((x(i)/1000-h*3600)/60);
        s =  fix(x(i)/1000-h*3600-m*60);
        UTC(i) = string(h)+"h"+string(m)+"m"+string(s)+"s";
    end
    UTC=UTC';
end

function Write_UTC_control(control,change,UTC,filename)
    len = length(change);
    j=1;
    LIST_CONTROL    = [""];
    LIST_UTC        = [""];
    LIST_INDEX      = [];
    for i=1:len
        if(change(i)) == 1
        LIST_CONTROL(j) = dec2hex(control(i+1));
        LIST_UTC(j)     = UTC(i+1);
        LIST_INDEX(j)   = i;
        j=j+1;
        end
    end
    LIST_CONTROL = LIST_CONTROL';
    LIST_UTC = LIST_UTC';
    LIST_INDEX = LIST_INDEX';

    writetable(table(LIST_INDEX,LIST_CONTROL,LIST_UTC,'VariableNames',["index","control","utc"]),filename+'/指令切换与UTC时间.csv');
end

function [Angle_Antenna,Length,fuyang_test] = Antenna_direction(local_j,local_w,aim_j,aim_w,high,yaw)
    %Angle_Antenna = Antenna_direction(109.621197,40.847384,fu_longitude,fu_latitude,fu_positiong_high,fu_angle_Heading)
    earthR      = 6371000000       ;%单位厘米

    local_j_hudu= local_j*pi/180;%角度与弧度
    local_w_hudu= local_w*pi/180;%角度与弧度
    aim_j_hudu  = aim_j.*pi/180  ;%角度与弧度
    aim_w_hudu  = aim_w.*pi/180  ;%角度与弧度

    V1=sin(aim_j_hudu-local_j_hudu).*cos(aim_w_hudu);
    V2=cos(local_w_hudu).*sin(aim_w_hudu) -sin(local_w_hudu).*cos(aim_w_hudu).*cos(aim_j_hudu-local_j_hudu);
    AB2=sin((local_w_hudu-aim_w_hudu)/2).*sin((local_w_hudu-aim_w_hudu)/2) + cos(local_w_hudu).*cos(aim_w_hudu).*sin((local_j_hudu-aim_j_hudu)/2).*sin((local_j_hudu-aim_j_hudu)/2);
    
    Length=2*earthR.*asin(sqrt(AB2))/1000;   %单位厘米 直线距离 
    Angle=atan2(V1,V2).*180./pi;        %该单位是-pi至pi,正值不变,需要将负值加上360°。而UB482是0360°与真北的夹角
    fuyang_test     =asin( abs((high - 1284))./sqrt((high - 1284).^2 + (Length).^2))./pi.*180;%假设地面天线架设5% 改变航向角的真北角定义 原始定义:顺时针为负。   
    % 计算天线方向图
    Angles        = - yaw - Angle;
    % 转化为0360
    Angles_360 = Angles;
    for i = 1:length(Angles_360)
        if(Angles_360(i) < 0)
            Angles_360(i) = Angles_360(i) + 360;
        elseif(Angles_360(i) > 360)
            Angles_360(i) = Angles_360(i) - 360;
        else
            Angles_360(i) = Angles_360(i);
        end
    end
    % 转化为 -180+180
    Angles_zf_180 = Angles_360;
    for i = 1:length(Angles_zf_180)
        if(Angles_zf_180(i) > 180)
            Angles_zf_180(i) = Angles_zf_180(i) - 360;
        else
            Angles_zf_180(i) = Angles_zf_180(i);
        end
    end
    % 转化为天线方向图
    Angle_Antenna = Angles_zf_180;
    
    for i = 1:length(Angle_Antenna)
        if(Angle_Antenna(i) >= 0)
            Angle_Antenna(i) = Angle_Antenna(i) - 180;
        else
            Angle_Antenna(i) = Angle_Antenna(i) + 180;
        end
    end
end
function plot_k_means(pitch,yaw,roll,n)
    [idx,C] = kmeans([pitch;yaw;roll],n);
    disp(size(idx))
    for i = 1:n
        scatter3(pitch(idx==i),yaw(idx==i),roll(idx==i),".");
        hold on;
    end
    hold off;
end

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

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

相关文章

Python机器学习笔记(七、深度学习-神经网络)

深度学习算法经过精确调整&#xff0c;只适用于特定的使用场景。先学习较为简单的深度学习算法&#xff0c;用于分类和回归的多层感知机&#xff08;multilayer perceptron&#xff0c;MLP&#xff09;&#xff0c;它可以作为研究更复杂的深度学习方法的起点。MLP 也被称为&…

Kylin麒麟操作系统 | Nginx服务部署

目录 一、理论储备1. Nginx概述2. Nginx与Apache的区别3. Nginx的服务配置 二、任务实施任务1 Nginx的编译安装1. Server配置2. 客户端测试 任务2 Nginx反向代理1. Server1配置2. Server2配置3. 客户端测试 一、理论储备 1. Nginx概述 Nginx是一个轻量级的web服务器&#xff…

【html网页页面012】html+css制作品牌主题宏宝莱网页含视频、留言表单(7页面附效果及源码)

品牌主题宏宝莱网页制作 &#x1f964;1、写在前面&#x1f367;2、涉及知识&#x1f333;3、网页效果完整效果(7页)&#xff1a;代码目录结构&#xff1a;page1、首页page2、衍生品page3、包装设计page4、视频介绍page5、留言板page6、联系我们page7、详情页&#xff08;三层页…

机器学习之交叉熵

交叉熵&#xff08;Cross-Entropy&#xff09;是机器学习中用于衡量预测分布与真实分布之间差异的一种损失函数&#xff0c;特别是在分类任务中非常常见。它源于信息论&#xff0c;反映了两个概率分布之间的距离。 交叉熵的数学定义 对于分类任务&#xff0c;假设我们有&#…

0001.基于springmvc简易酒店管理系统后台

一.系统架构 springmvcjsplayuimysql 二.功能特性 简单易学习&#xff0c;虽然版本比较老但是部署方便&#xff0c;tomcat环境即可启用&#xff1b;代码简洁&#xff0c;前后端代码提供可统一学习&#xff1b;祝愿您能成尽快为一位合格的程序员&#xff0c;愿世界没有BUG; …

无限次使用 cursor pro

github地址 cursor-vip 使用方式 在 MacOS/Linux 中&#xff0c;请打开终端&#xff1b; 在 Windows 中&#xff0c;请打开 Git Bash。 然后执行以下命令来安装&#xff1a; 部分电脑可能会误报毒&#xff0c;需要关闭杀毒软件/电脑管家/安全防护再进行 方式1&#xff1a;通过…

AI 语言模型产业的投资困境与发展困境分析

https://benn.substack.com/p/do-ai-companies-work 巨额投资与成本困境 大型语言模型&#xff08;LLM&#xff09;的开发成本惊人。根据报道&#xff0c;OpenAI 正在筹集 65 亿美元资金&#xff0c;每年约消耗 70 亿美元用于研究、开发新的 AI 服务和扩充团队。Anthropic 预计…

tryhackme——Pre Security(安检前)-Offensive Security(进攻性安全)

这里我用的edge的插件闪击翻译。这里我英语不好&#xff0c;所以用这个可以顺便学习下英语。 任务一&#xff1a;What is Offensive Security?&#xff08;什么是进攻性安全?&#xff09; 很简单啊&#xff0c;通过阅读&#xff0c;知道以下哪个选项更能代表您模拟黑客操作…

[论文阅读] |智能体长期记忆与反思

写在前面&#xff1a;10月份的时候&#xff0c;联发科天玑9400发布&#xff0c;搭载这款旗舰 5G 智能体 AI 芯片的荣耀MagicOS9.0实现了一句话让手机自动操作美团点咖啡。很快商场实体店里便能看到很多品牌手机已经升级为智能体语音助手。下一步&#xff0c;这些智能体或许便能…

CQRS Design Pattern in Microservices - CQRS模式

原文链接 CQRS Design Pattern in Microservices - GeeksforGeeks 【文章看起来像是AI写的。。。 &#x1f602;&#x1f602;&#x1f602;】 简介 实现步骤 1&#xff0c;识别有界上下文&#xff1a;&#xff08;Identify Bounded Contexts:&#xff09; 2&#xff0c;命…

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(二)

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(二) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…

RPC远程服务调用详解和gRPC简介

RPC (Remote Procedure Call)是远程过程调用&#xff0c;比如说现在有两台服务器A, B&#xff0c;一个在A服务器上的应用想要调用B服务器上的应用提供的某个&#xff0c;由于不在两个方法不在一个内存空间&#xff0c;不能直接调用&#xff0c;需要通过网络表达调用的语义和传达…

计算机网络知识点全梳理(三.TCP知识点总结)

目录 TCP基本概念 为什么需要TCP 什么是TCP 什么是TCP链接 如何唯一确定一个 TCP 连接 TCP三次握手 握手流程 为什么是三次握手&#xff0c;而不是两次、四次 为什么客户端和服务端的初始序列号 ISN 不同 既然 IP 层会分片&#xff0c;为什么 TCP 层还需要 MSS TCP四…

PDFMathTranslate,PDF多语言翻译,批量处理,学术论文,双语对照(WIN/MAC)

分享一个非常实用的PDF文档翻译项目——PDFMathTranslate。作为一个经常逛GitHub的开发者&#xff0c;我总喜欢翻看各种项目附带的论文&#xff0c;虽然大多时候是瞎研究&#xff0c;但却乐在其中。该项目能够完美保留公式、图表、目录和注释&#xff0c;对于需要阅读外文文献的…

前端成长之路:CSS元素显示模式

元素显示模式 网页中的标签非常的多&#xff0c;在不同的地方会使用到不同类型的标签&#xff0c;了解这些标签的特点可以更好的布局我们的网页。 元素显示模式就是元素&#xff08;标签&#xff09;按照什么方式进行显示&#xff0c;比如&#xff1a;div标签会自己独占一行&a…

如何在 Ubuntu 22.04 上使用 vnStat 监控网络流量

简介 vnStat是一个免费的、开源的、基于控制台的Linux操作系统网络流量监控工具。通过vnStat&#xff0c;你可以在不同的时间段监控网络统计数据。它简单、轻量级&#xff0c;并且消耗的系统资源很小。vnStat允许你按小时、日、月、周和日生成网络流量数据。本教程将向你展示如…

解决pip下载慢

使用pip下载大量安装包&#xff0c;下载速度太慢了 1、问题现象 pip安装包速度太慢 2、解决方案 配置国内源 vi /root/.config/pip/pip.conf[global] timeout 6000 index-url https://mirrors.aliyun.com/pypi/simple/ trusted-host mirrors.aliyun.com

RabbitMQ中的Publish-Subscribe模式

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信和解耦系统的关键组件。RabbitMQ 是一个功能强大且广泛使用的开源消息代理&#xff0c;支持多种消息传递模式。其中&#xff0c;Publish/Subscribe&#xff08;发布/订阅&#xff0…

专业140+总分410+浙江大学842信号系统与数字电路考研经验浙大电子信息与通信工程,真题,大纲,参考书。

考研落幕&#xff0c;本人本中游211&#xff0c;如愿以偿考入浙江大学&#xff0c;专业课842信号系统与数字电路140&#xff0c;总分410&#xff0c;和考前多次模考预期差距不大&#xff08;建议大家平时做好定期模考测试&#xff0c;直接从实战分数中&#xff0c;找到复习的脉…

Unity类银河战士恶魔城学习总结(P178 Archer s arrow 弓箭手的箭)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节制作了一个弓箭手的箭 Arrow_Controller.cs 1.OnTriggerEnter2D方法 功能&#xff1a;检测箭矢与其他对象的碰撞。逻辑&#xff1…