PosCalibrate/CordConvert20251005.m
2025-10-15 14:50:31 +08:00

200 lines
7.2 KiB
Matlab
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 该程序用于获取A机位姿信息和B机位置信息并计算A机对B机指向
% By ZXJ2025.10.02
clear all;
close all;
clc;
Re=6378.14; %% 地球半径km
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 双机位置(地心球面坐标系)
% A机位置
Lon_A=dms2degrees([86 4 51.16]); %% A机经度deg
Lat_A=dms2degrees([41 45 20.24]); %% A机纬度deg
Hei_A=4.5; %% A机高度km
% Lon_A=120.2994; %% A机经度deg
% Lat_A=30.250212; %% A机纬度deg
% Hei_A=375.29/1000; %% A机高度km
% B机位置
Lon_B=dms2degrees([86 4 51.161]); %% B机经度deg
Lat_B=dms2degrees([41 45 20.24]); %% B机纬度deg
Hei_B=4.5; %% B机高度km
% Lon_B=dms2degrees([76 12 51.16]); %% B机经度deg
% Lat_B=dms2degrees([41 45 20.24]); %% B机纬度deg
% Hei_B=5.1; %% B机高度km
% Lon_B=120.29950478; %% B机经度deg
% Lat_B=30.250028015; %% B机纬度deg
% Hei_B=375.29/1000; %% B机高度km
% 将角度由度转化为弧度
Lon_A_Rad=deg2rad(Lon_A); %% A机经度rad
Lat_A_Rad=deg2rad(Lat_A); %% A机纬度rad
Lon_B_Rad=deg2rad(Lon_B); %% B机经度rad
Lat_B_Rad=deg2rad(Lat_B); %% B机纬度rad
% 双机位置地心直角坐标系及双机距离km
X_A=(Re+Hei_A)*cos(Lat_A_Rad)*cos(Lon_A_Rad);
Y_A=(Re+Hei_A)*cos(Lat_A_Rad)*sin(Lon_A_Rad);
Z_A=(Re+Hei_A)*sin(Lat_A_Rad);
X_B=(Re+Hei_B)*cos(Lat_B_Rad)*cos(Lon_B_Rad);
Y_B=(Re+Hei_B)*cos(Lat_B_Rad)*sin(Lon_B_Rad);
Z_B=(Re+Hei_B)*sin(Lat_B_Rad);
% B机相对于A机的直角坐标km
XYZ_BA=[X_B-X_A; Y_B-Y_A; Z_B-Z_A];
% 双机距离km
D_BA=sqrt(sum(XYZ_BA.^2));
% D_BA=sqrt((X_B-X_A)^2+(Y_B-Y_A)^2+(Z_B-Z_A)^2);
% % 根据坐标转换矩阵计算B机相对于A机的方位角、俯仰角
% % 坐标转换矩阵
% Matrix_UEN2XYZ=[cos(Lat_A_Rad)*cos(Lon_A_Rad) cos(Lat_A_Rad)*sin(Lon_A_Rad) sin(Lat_A_Rad); ...
% -sin(Lon_A_Rad) cos(Lon_A_Rad) 0;...
% -sin(Lat_A_Rad)*cos(Lon_A_Rad) -sin(Lat_A_Rad)*sin(Lon_A_Rad) cos(Lat_A_Rad)];
%
% % B机相对于A机的直角坐标转换为天东北坐标
% UEN_BA = Matrix_UEN2XYZ * XYZ_BA;
% U_BA=UEN_BA(1);
% E_BA=UEN_BA(2);
% N_BA=UEN_BA(3);
%
% % B机相对于A机的方位角和俯仰角
% Az_BA=mod(rad2deg(atan2(E_BA,N_BA)),360);
% Alt_BA=rad2deg(atan2(U_BA,sqrt(E_BA^2+N_BA^2)));
% 根据三轴坐标旋转矩阵计算B机相对于A机的方位角、俯仰角
Lon_A_Rad1=Lon_A_Rad;
Lat_A_Rad1=-Lat_A_Rad;
MR_X=[1 0 0;...
0 1 0;...
0 0 1];
MR_Y=[cos(Lat_A_Rad1) 0 -sin(Lat_A_Rad1);...
0 1 0;...
sin(Lat_A_Rad1) 0 cos(Lat_A_Rad1)];
MR_Z=[cos(Lon_A_Rad1) sin(Lon_A_Rad1) 0;...
-sin(Lon_A_Rad1) cos(Lon_A_Rad1) 0;...
0 0 1];
% 天东北坐标
UEN_BA0=MR_X*MR_Y*MR_Z*XYZ_BA;
U_BA0=UEN_BA0(1);
E_BA0=UEN_BA0(2);
N_BA0=UEN_BA0(3);
% B机相对于A机在大地坐标系中的方位角和俯仰角
Az_BA0=mod(rad2deg(atan2(E_BA0,N_BA0)),360);
Alt_BA0=rad2deg(atan2(U_BA0,sqrt(E_BA0^2+N_BA0^2)));
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 根据POS设备实时姿态角解算B机在A机载体坐标系中的位置
% POS设备测量到的实时姿态角
% HeadingReal=63.802;
% PitchReal=-0.109;
% RollReal=-0.135;
HeadingReal=65.516;
PitchReal=-0.112;
RollReal=1.648;
% 角度换算为弧度
HeadingReal_Rad=deg2rad(HeadingReal);
PitchReal_Rad=deg2rad(PitchReal);
RollReal_Rad=deg2rad(RollReal);
% 由实时姿态计算位置的坐标旋转矩阵
MR_E_Real=[1 0 0;...
0 cos(PitchReal_Rad) -sin(PitchReal_Rad);...
0 sin(PitchReal_Rad) cos(PitchReal_Rad)];
MR_N_Real=[cos(RollReal_Rad) 0 -sin(RollReal_Rad);...
0 1 0;...
sin(RollReal_Rad) 0 cos(RollReal_Rad)];
MR_U_Real=[cos(HeadingReal_Rad) -sin(HeadingReal_Rad) 0;...
sin(HeadingReal_Rad) cos(HeadingReal_Rad) 0;...
0 0 1];
% B机在A机载体坐标系中的位置
ENU_BA_Real=MR_N_Real*MR_E_Real*MR_U_Real*[E_BA0;N_BA0;U_BA0];
E_BA_Real=ENU_BA_Real(1);
N_BA_Real=ENU_BA_Real(2);
U_BA_Real=ENU_BA_Real(3);
% B机在A机载体坐标系中的方位角和俯仰角
Az_BA_Real=mod(rad2deg(atan2(E_BA_Real,N_BA_Real)),360);
Alt_BA_Real=rad2deg(atan2(U_BA_Real,sqrt(E_BA_Real^2+N_BA_Real^2)));
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 静止状态下POS设备安装面的姿态角计算零点指向
% 静止状态下POS设备在自身安装面上测到的姿态角
Heading_IMUBase=63.888;
Pitch_IMUBase=-0.121;
Roll_IMUBase=-0.082;
% POS设备在自身安装面上姿态角换算为弧度
Heading_IMUBase_Rad=-deg2rad(Heading_IMUBase);
Pitch_IMUBase_Rad=-deg2rad(Pitch_IMUBase);
Roll_IMUBase_Rad=-deg2rad(Roll_IMUBase);
% 由静止姿态计算零点位置的坐标旋转矩阵
MR_E_IMUBase=[1 0 0;...
0 cos(-Pitch_IMUBase_Rad) -sin(-Pitch_IMUBase_Rad);...
0 sin(-Pitch_IMUBase_Rad) cos(-Pitch_IMUBase_Rad)];
MR_N_IMUBase=[cos(-Roll_IMUBase_Rad) 0 -sin(-Roll_IMUBase_Rad);...
0 1 0;...
sin(-Roll_IMUBase_Rad) 0 cos(-Roll_IMUBase_Rad)];
MR_U_IMUBase=[cos(Heading_IMUBase_Rad) -sin(Heading_IMUBase_Rad) 0;...
sin(Heading_IMUBase_Rad) cos(Heading_IMUBase_Rad) 0;...
0 0 1];
% B机在A机载体坐标系中的位置
ENU_BA_IMUBase=MR_N_IMUBase*MR_E_IMUBase*MR_U_IMUBase*ENU_BA_Real;
E_BA_IMUBase=ENU_BA_IMUBase(1);
N_BA_IMUBase=ENU_BA_IMUBase(2);
U_BA_IMUBase=ENU_BA_IMUBase(3);
% B机在A机载体坐标系中的方位角和俯仰角
Az_BA_IMUBase=mod(rad2deg(atan2(E_BA_IMUBase,N_BA_IMUBase)),360);
Alt_BA_IMUBase=rad2deg(atan2(U_BA_IMUBase,sqrt(E_BA_IMUBase^2+N_BA_IMUBase^2)));
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 静止状态下样机安装面的姿态角计算零点指向
% POS设备在样机安装面上测到的姿态角
Heading_OPABase=64.062;
Pitch_OPABase=-0.332;
Roll_OPABase=89.812;
% 静止状态下,样机安装面法线方向对应的姿态角
Heading_OPABaseNormal=Heading_OPABase+90; %% 样机安装在前进方向右侧加90°安装在左侧则减90°
Pitch_OPABaseNormal=Pitch_OPABase-90;
Roll_OPABaseNormal=Roll_OPABase;
% 法线方向对应的姿态角换算为弧度
Heading_OPABaseNormal_Rad=deg2rad(Heading_OPABaseNormal);
PitchRad_OPABaseNormal_Rad=deg2rad(Pitch_OPABaseNormal);
RollRad_OPABaseNormal_Rad=deg2rad(Roll_OPABaseNormal);
% 由静止姿态计算零点位置的坐标旋转矩阵
MR_E_OPABaseNormal=[1 0 0;...
0 cos(PitchRad_OPABaseNormal_Rad) -sin(PitchRad_OPABaseNormal_Rad);...
0 sin(PitchRad_OPABaseNormal_Rad) cos(PitchRad_OPABaseNormal_Rad)];
MR_N_OPABaseNormal=[cos(RollRad_OPABaseNormal_Rad) 0 -sin(RollRad_OPABaseNormal_Rad);...
0 1 0;...
sin(RollRad_OPABaseNormal_Rad) 0 cos(RollRad_OPABaseNormal_Rad)];
MR_U_OPABaseNormal=[cos(Heading_OPABaseNormal_Rad) -sin(Heading_OPABaseNormal_Rad) 0;...
sin(Heading_OPABaseNormal_Rad) cos(Heading_OPABaseNormal_Rad) 0;...
0 0 1];
% B机在A机载体坐标系中的位置由东北天转换
ENU_BA_OPABaseNormal=MR_N_OPABaseNormal*MR_E_OPABaseNormal*MR_U_OPABaseNormal*ENU_BA_IMUBase;
E_BA_OPABaseNormal=ENU_BA_OPABaseNormal(1);
N_BA_OPABaseNormal=ENU_BA_OPABaseNormal(2);
U_BA_OPABaseNormal=ENU_BA_OPABaseNormal(3);
% B机在A机载体坐标系中的方位角和俯仰角
Az_BA_OPABaseNormal=mod(rad2deg(atan2(E_BA_OPABaseNormal,N_BA_OPABaseNormal)),360);
Alt_BA_OPABaseNormal=rad2deg(atan2(U_BA_OPABaseNormal,sqrt(E_BA_OPABaseNormal^2+N_BA_OPABaseNormal^2)));