You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
3.9 KiB
Matlab

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

function [Lon,Lat]=SightPoint(AOC_t0,AOC_fai,AOC_thita,AOC_pusai,AOC_a0,AOC_e0,AOC_i0,AOC_OMG0,AOC_os0,AOC_u0,Rp_b)
% AOC_t0当前时刻相对于J2000.0的秒计数)
% AOC_fai,AOC_thita,AOC_pusai当前卫星三轴姿态角3-1-2转序
% AOC_a0,AOC_e0,AOC_i0,AOC_OMG0,AOC_os0,AOC_u0当前时刻卫星轨道六根数
% Rp_b本体下的视线指向矢量单位矢量
% Lon,Lat视线指向星下点
%% 惯性系下的视线指向矢量计算
Aoi=GetAoi(AOC_i0,AOC_OMG0,AOC_u0);
Abo=GetAbo(AOC_fai,AOC_thita,AOC_pusai);
Abi=Abo*Aoi;
Aib=Abi.';
Rp_i=Aib*Rp_b; %惯性系下的视线指向矢量
%% 惯性系下的卫星矢量计算
Rs_i=Kepler2XYZ(AOC_a0,AOC_e0,AOC_i0,AOC_OMG0,AOC_os0,AOC_u0);
%% 地球扁率系数计算
eE=0.00335281066474748;
Ke=(1-eE)^2;
%% 视线指向与星下点矢量夹角
Thita=acos(dot(Rp_i,-Rs_i)/norm(Rs_i)/norm(Rp_i));
CT=cos(Thita);
%% 建立关于视线指向长度的方程
Rp3=Rp_i(3);
Rs3=Rs_i(3);
RE=6378.14;
Norm_Rs=norm(Rs_i);
Ka=Ke+(1-Ke)*Rp3^2;
Kb=2*(1-Ke)*Rp3*Rs3-2*Ke*Norm_Rs*CT;
Kc=Ke*Norm_Rs^2+(1-Ke)*Rs3^2-Ke*RE^2;
%% 视线指向矢量长度计算
Norm_Rp=(-Kb-(abs(Kb^2-4*Ka*Kc))^0.5)/2/Ka;
Rp_i=Norm_Rp*Rp_i;
%% 计算视线指向对应的经纬度信息
Rn_i=Rp_i+Rs_i; %地心到视线指向矢量与地面交点的矢量
Rn_i=Rn_i/norm(Rn_i);
[Lon,Lat]=Orbit2LLA(AOC_t0,Rn_i(1),Rn_i(2),Rn_i(3));
%% 轨道六根数转速度位置
function R_sat_i=Kepler2XYZ(AOC_a0,AOC_e0,AOC_i0,AOC_OMG0,AOC_os0,AOC_u0)
% 轨道倾角的正余弦值:
OBT_Si0=sin(AOC_i0);
OBT_Ci0=cos(AOC_i0);
% 升交点赤经的正余弦值:
OBT_SG0=sin(AOC_OMG0);
OBT_CG0=cos(AOC_OMG0);
% t0时刻真近点角
OBT_f0=AOC_u0-AOC_os0;
% t0时刻偏近点角
OBT_E0=atan2((1-AOC_e0^2)*sin(OBT_f0),AOC_e0+cos(OBT_f0));
% t0时刻平近点角
OBT_M0=OBT_E0-AOC_e0*sin(OBT_E0);
% 当前时刻平近点角:
OBT_M=OBT_M0;
% OBT_M=OBT_M0+(Time-AOC_t0)*w0;
% 当前时刻真近点角:
AOC_f=OBT_M+(2*AOC_e0-AOC_e0^3/4)*sin(OBT_M)+5/4*AOC_e0^2*sin(2*OBT_M)+13/12*AOC_e0^3*sin(3*OBT_M);
% 卫星到地心距离:
OBT_rw=AOC_a0*(1-AOC_e0^2)/( 1+AOC_e0*cos(AOC_f));% ע<><D7A2><EFBFBD><EFBFBD>λkm
% 当前时刻轨道幅角:
u=AOC_f+AOC_os0;
Su=sin(u);
Cu=cos(u);
% 3计算当前时刻惯性系下的太阳矢量
% 卫星方向单位矢量:
xw1=OBT_CG0*Cu-OBT_SG0*OBT_Ci0*Su;
yw1= OBT_SG0*Cu+OBT_CG0*OBT_Ci0*Su;
zw1=OBT_Si0*Su;
% 惯性坐标系下的卫星实际位置矢量SUN_R1_i单位km
R_sat_i=[xw1,yw1,zw1].'*OBT_rw;
%% 求解惯性系到轨道系转换矩阵
function Aoi=GetAoi(AOC_i0,AOC_OMG0,AOC_u0)
OBT_Si0=sin(AOC_i0);
OBT_Ci0=cos(AOC_i0);
OBT_SG0=sin(AOC_OMG0);
OBT_CG0=cos(AOC_OMG0);
OBT_Su0=sin(AOC_u0);
OBT_Cu0=cos(AOC_u0);
Aoi=[ -OBT_Su0*OBT_CG0-OBT_Cu0*OBT_Ci0*OBT_SG0, -OBT_Su0*OBT_SG0+OBT_Cu0*OBT_Ci0*OBT_CG0, OBT_Cu0*OBT_Si0;
-OBT_Si0*OBT_SG0, OBT_Si0*OBT_CG0, -OBT_Ci0;
-OBT_Cu0*OBT_CG0+OBT_Su0*OBT_Ci0*OBT_SG0, -OBT_Cu0*OBT_SG0-OBT_Su0*OBT_Ci0*OBT_CG0, -OBT_Su0*OBT_Si0];
%% 求解轨道系到本体系转换矩阵
function Abo=GetAbo(AOC_fai,AOC_thita,AOC_pusai)
OBT_Sf=sin(AOC_fai);
OBT_Cf=cos(AOC_fai);
OBT_St=sin(AOC_thita);
OBT_Ct=cos(AOC_thita);
OBT_Sp=sin(AOC_pusai);
OBT_Cp=cos(AOC_pusai);
Abo=[OBT_Ct*OBT_Cp-OBT_St*OBT_Sf*OBT_Sp, OBT_Ct*OBT_Sp+OBT_St*OBT_Sf*OBT_Cp, -OBT_St*OBT_Cf;
-OBT_Cf* OBT_Sp, OBT_Cf* OBT_Cp, OBT_Sf;
OBT_St*OBT_Cp+OBT_Ct*OBT_Sf*OBT_Sp, OBT_St*OBT_Sp-OBT_Ct*OBT_Sf*OBT_Cp, OBT_Ct* OBT_Cf];
function [Lon,Lat]=Orbit2LLA(AOC_t0,AOC_xw1,AOC_yw1,AOC_zw1)
w0=7.29211585530487e-5;%地球自转角速度
% 惯性坐标系下的卫星实际位置矢量SUN_R1_i单位km
Tmp_Lat=asin(AOC_zw1)*180/pi;
Tmp_Lon=atan2(AOC_yw1,AOC_xw1)*180/pi;
% 格林威治恒星时角
Lon0 = rem(4.89496122373137+AOC_t0*w0,2*pi)*180/pi;% 格林威治恒星时角
Lon=Tmp_Lon-Lon0;% 星下点经度
if Lon<-180
Lon=Lon+360;
elseif Lon>180
Lon=Lon-360;
end
Lat=Tmp_Lat;% 星下点纬度