UWBIns/lib/gnss/ch_sat_pos.m

78 lines
1.9 KiB
Matlab
Raw Blame History

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 [XYZ, sv_dt]=ch_sat_pos(t, toc, f0, f1, f2, crs, deln, M0, cuc, e, cus, sqrtA, toe, cic, OMG0, cis, i0, crc, omg, OMGd, idot)
% 输入:
% toe: 星历参考时间: 一套星历的有效期为toe前后4小时
% a0 a1 a2 toc: 卫星时钟校正模型方程中3个参数 toc: 第一数据块参考时间, 被用作时钟校正模型中时间参考点
% 卫星星历参数(16个):
% sqrtA: 卫星轨道长半轴的平方根
% es: 轨道偏心率
% i0: toe时刻轨道倾角
% OMEGA0: 周内时等于0时刻的轨道升交点赤经
% omega: 轨道近地角距
% M0: toe时刻的平近点角
% Delta_n 平均运动角速度校正值
% iDOT 轨道倾角对时间的变化率
% OMEGA_DOT 轨道升交点赤经对时间的变化率
% Cuc: 升交点角距余弦和校正振幅
% Cus: 升交点角距正弦和校正振幅
% Cic: 轨道倾角余弦和校正振幅
% Cis: 轨道倾角正弦和校正振幅
%输出:
% X, Y, Z ECEF下卫星位置
% sv_dt 卫星时钟偏差
%变量:
%摄动改正后的升交距角uk、卫星矢径rk和轨道倾角ik
%卫星在轨道面坐标系中的坐标x,y
%发射时刻升交点的经度L
%以下为计算代码
%1.计算卫星运行的平均角速度
n0=sqrt(3.986005E+14)/(sqrtA.^3);
n=n0+deln;
%2.计算信号发射时卫星的平近点角
sv_dt = f0+f1*(t-toc)+f2*(t-toc).^2;%t为未做钟差改正的观测时刻
t = t - 0;%更新t为做钟差改正后的值
tk = t-toe;%归化时间
if tk>302400
tk=tk-604800;
elseif tk<-302400
tk=tk+604800;
else
tk=tk+0;
end
Mk=M0+n*tk;
%3.计算偏近点角(迭代)
%E=M+e*sin(E);
ed(1)=Mk;
for i=1:3
ed(i+1)=Mk+e*sin(ed(i));
end
Ek=ed(end);
%4.计算真近点角
Vk=atan2(sqrt(1-e.^2)*sin(Ek),(cos(Ek)-e));
%5.计算升交距角(未经改进时)
u=omg+Vk;
%6.计算摄动改正项
deltau=cuc*cos(2*u)+cus*sin(2*u);
deltar=crc*cos(2*u)+crs*sin(2*u);
deltai=cic*cos(2*u)+cis*sin(2*u);
%7.计算摄动改正后的升交距角uk、卫星矢径rk和轨道倾角ik
uk=u+deltau;
rk=(sqrtA.^2)*(1-e*cos(Ek))+deltar;
ik=i0+deltai+idot*tk;
%8.计算卫星在轨道面坐标系中的坐标
x=rk*cos(uk);
y=rk*sin(uk);
%9.计算发射时刻升交点的经度67
L=OMG0+(OMGd-7.2921151467e-5)*tk-7.2921151467e-5*toe;
%10.计算卫星在地固坐标系下坐标
XYZ(1)=x*cos(L)-y*cos(ik)*sin(L);
XYZ(2)=x*sin(L)+y*cos(ik)*cos(L);
XYZ(3)=y*sin(ik);
XYZ = XYZ';
end