利用北斗BDS广播星历,进行卫星位置计算

目录

一、北斗星历数据获取

1.1 计算卫星位置需要用到的星历数据:

1.2 计算卫星位置需要用到的常数

二、toc时刻计算

三、根据卫星发射时刻Tsv,计算卫星轨道参数

3.1 修正Tsv的卫星钟偏

3.2 计算规划时间

3.3 计算平近点角

3.4 迭代求解偏近点角

3.5 求解真近点角和升交点角距

3.6 轨道参数计算,并考虑摄动改正项

四、计算Tsv时刻的卫星位置

4.1 MEO/IGSO卫星位置计算

4.2 GEO卫星位置计算

五、计算Tsv时刻的卫星速度

六、计算卫星钟偏

七、MATLAB代码&运行示例


一、北斗星历数据获取

北斗广播星历获取途径:RINEX格式文件、导航电文解码。

下面以RINEX格式文件为例:

这里给出的北斗卫星分别是:C05  GEO卫星、C16  MEO/IGSO卫星。这是两种不同轨道的北斗卫星:GEO地球静止轨道卫星MEO中圆地球轨道卫星IGSO倾斜地球同步轨道卫星。其GEO卫星位置的计算方法与MEO/IGSO卫星不同,下面过程注意区分。

     3.05           N: GNSS NAV DATA    C: BDS              RINEX VERSION / TYPE
BNC 2.13.0          BKG Frankfurt       20231102 101016 UTC PGM / RUN BY / DATE
Concatenated RINEX files (8)                                COMMENT
                                                            END OF HEADER
C05 23 11 02 08 00 00.0 1.385881332680e-04-6.030731469760e-11 0.000000000000e+00
     1.000000000000e+00-2.278125000000e+02-5.663093033410e-09-6.708219322780e-01
    -7.327646017070e-06 7.320673903450e-04-1.202011480930e-05 6.493444162370e+03
     3.744000000000e+05-5.634501576420e-08-6.255581541050e-01 3.259629011150e-08
     9.409420036110e-02 3.626718750000e+02-1.792511645600e+00 6.869929017260e-09
     2.378670509750e-10                    9.300000000000e+02                   
     2.000000000000e+00 0.000000000000e+00 2.999999970670e-10-9.100000000000e-09
     3.779100000000e+05 0.000000000000e+00                                      
C16 23 11 02 08 00 00.0-1.551879104230e-04-1.854782993860e-11 0.000000000000e+00
     1.000000000000e+00-3.535937500000e+01 1.561493613910e-09-2.192800555490e+00
    -1.096632331610e-06 6.275521009230e-03 8.363742381330e-06 6.493531814580e+03
     3.744000000000e+05-2.700835466380e-08 2.343958791130e+00 5.215406417850e-08
     9.618269834520e-01-8.421875000000e+00-2.286522345190e+00-1.925437345050e-09
    -7.286017777600e-11                    9.300000000000e+02                   
     2.000000000000e+00 0.000000000000e+00-2.499999984810e-09 4.800000000000e-09
     3.744000000000e+05 0.000000000000e+00                                      

1.1 计算卫星位置需要用到的星历数据:

1、星历参考时刻 toc:第一行第一个数据   23 11 02 08 00 00.0

2、卫星钟差 af0:第一行第二个数据   1.385881332680e-04

3、卫星钟偏 af1:第一行第三个数据   -6.030731469760e-11

4、卫星钟偏移 af2:第一行第四个数据   0.000000000000e+00

5、轨道半径改正项 Crs:第二行第二个数据   -2.278125000000e+02

6、角速度改正项 deltan:第二行第三个数据   -5.663093033410e-09

7、平近点角 M0:第二行第四个数据   -6.708219322780e-01

8、升交点角距改正 Cuc:第三行第一个数据   -7.327646017070e-06

9、偏心率 e:第三行第二个数据   7.320673903450e-04

10、升交点角距改正 Cus:第三行第三个数据   -1.202011480930e-05

11、轨道长半轴 sqrtA:第三行第四个数据   6.493444162370e+03

12、周内秒 toe:第四行第一个数据   3.744000000000e+05

13、轨道倾角改正项 Cic:第四行第二个数据   -5.634501576420e-08

14、升交点赤经 omega0:第四行第三个数据   -6.255581541050e-01

15、轨道倾角改正项 Cis:第四行第四个数据   3.259629011150e-08

16、轨道倾角 i0:第五行第一个数据   9.409420036110e-02

17、轨道半径改正项 Crc:第五行第二个数据   3.626718750000e+02

18、近地点角距 omega:第五行第三个数据   -1.792511645600e+00

19、赤经变化 omegaDot:第五行第四个数据   6.869929017260e-09

20、轨道倾角变率 IDOT:第六行第一个数据   2.378670509750e-10

21、卫星设备时延 TGD1:第七行第三个数据   2.999999970670e-10

1.2 计算卫星位置需要用到的常数

1、圆周率 pi:3.1415926535898

2、地球自转角速度 radv:7.2921151467e-5

3、地球标准引力常数 GM:3.986005e14

4、地球引力常数 F:-4.442807633e-10

二、toc时刻计算

从RINEX文件中获取到的toc时刻是年月日时分秒的形式,toc时刻要将其化成周内秒的形式。比如:23 11 02 08 00 00.0代表的是2023年11月2日即周四的 8:00,其周内秒 toc = 4*24*3600+8*3600,toc = 374400s。我们发现 toc = toe,toc时刻与toe时刻是同步的。

三、根据卫星发射时刻Tsv,计算卫星轨道参数

3.1 修正Tsv的卫星钟偏

卫星的真实发射时刻Tsv由初始Tsv修正卫星钟偏和卫星设备时延后得到,并且这里的Tsv也是周内秒的形式:

其中sat_Clk_error表示卫星钟偏。

3.2 计算规划时间

星历中的toe时刻,表示星历中的所有卫星数据是toe时刻瞬间的。发射时间Tsv的卫星数据,需要通过 Tsv-toe 的差值进行计算,这个差就叫规划时间tk。

3.3 计算平近点角

轨道长半轴:

平均角速度:

平近点角:

3.4 迭代求解偏近点角

偏近点角的计算公式:

为了偏近点角的准确性,采用迭代的过程求解。

3.5 求解真近点角和升交点角距

真近点角:

升交点角距:

3.6 轨道参数计算,并考虑摄动改正项

升交点角距改正项:

轨道半径改正项:

轨道倾角改正项:

升交点角距:

轨道半径:

轨道倾角:

升交点赤经:

如果是GEO卫星升交点赤经计算公式如下:

如果是MEO/IGSO卫星升交点赤经计算公式如下:

四、计算Tsv时刻的卫星位置

根据上面的计算,已经得到了Tsv时刻的卫星轨道参数:升交点角距、轨道半径、轨道倾角、升交点赤经。

4.1 MEO/IGSO卫星位置计算

MEO/IGSO卫星位置的ECEF坐标,可由下面公式计算得到:

4.2 GEO卫星位置计算

GEO卫星位置的ECEF坐标,可由下面公式计算得到:

五、计算Tsv时刻的卫星速度

根据上面的计算,已经得到了Tsv时刻的卫星轨道速度参数:平均角速度 n、偏近点角 E、偏心率 e、升交点角距 phi 等。

卫星 (X,Y,Z) 三个方向上的速度,可根据下面公式得到:

六、计算卫星钟偏

七、MATLAB代码&运行示例

主程序 main.m:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 计算BD卫星的位置和速度
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear;
clc;

% 卫星发射时刻
tsv = 3.744000000000e+05 + 20;

% MEO卫星的星历参数
MEO_eph.toc = 3.744000000000e+05;
MEO_eph.af2 = 0.000000000000e+00;
MEO_eph.af1 = -1.854782993860e-11;
MEO_eph.af0 = -1.551879104230e-04;
MEO_eph.TGD1 = -2.499999984810e-09;
MEO_eph.sqrtA = 6.493531814580e+03;
MEO_eph.toe = 3.744000000000e+05;
MEO_eph.deltan = 1.561493613910e-09;
MEO_eph.M0 = -2.192800555490e+00;
MEO_eph.e = 6.275521009230e-03;
MEO_eph.i0 = 9.618269834520e-01;
MEO_eph.IDOT = -7.286017777600e-11;
MEO_eph.omega = -2.286522345190e+00;
MEO_eph.Cuc = -1.096632331610e-06;
MEO_eph.Cus = 8.363742381330e-06;
MEO_eph.Crc = -8.421875000000e+00;
MEO_eph.Crs = -3.535937500000e+01;
MEO_eph.Cic = -2.700835466380e-08;
MEO_eph.Cis = 5.215406417850e-08;
MEO_eph.omega0 = 2.343958791130e+00;
MEO_eph.omegaDot = -1.925437345050e-09;


% GEO卫星的星历参数
GEO_eph.toc = 3.744000000000e+05;
GEO_eph.af2 = 0.000000000000e+00;
GEO_eph.af1 = -6.030731469760e-11;
GEO_eph.af0 = 1.385881332680e-04;
GEO_eph.TGD1 = 2.999999970670e-10;
GEO_eph.sqrtA = 6.493444162370e+03;
GEO_eph.toe = 3.744000000000e+05;
GEO_eph.deltan = -5.663093033410e-09;
GEO_eph.M0 = -6.708219322780e-01;
GEO_eph.e = 7.320673903450e-04;
GEO_eph.i0 = 9.409420036110e-02;
GEO_eph.IDOT = 2.378670509750e-10;
GEO_eph.omega = -1.792511645600e+00;
GEO_eph.Cuc = -7.327646017070e-06;
GEO_eph.Cus = -1.202011480930e-05;
GEO_eph.Crc = 3.626718750000e+02;
GEO_eph.Crs = -2.278125000000e+02;
GEO_eph.Cic = -5.634501576420e-08;
GEO_eph.Cis = 3.259629011150e-08;
GEO_eph.omega0 = -6.255581541050e-01;
GEO_eph.omegaDot = 6.869929017260e-09;

% 分别计算GEO、MEO卫星位置
[MEO_positionX, MEO_positionY, MEO_positionZ, MEO_Vx, MEO_Vy, MEO_Vz, MEO_sat_Clk_error] = MEO_state_tsv(tsv,MEO_eph);
[GEO_positionX, GEO_positionY, GEO_positionZ, GEO_sat_Clk_error] = GEO_state_tsv(tsv,GEO_eph);

% 打印输出
fprintf('GEO卫星位置:[%f, %f, %f]\n',GEO_positionX,GEO_positionY,GEO_positionZ);
fprintf('GEO卫星钟偏:%f\n',GEO_sat_Clk_error);
fprintf('\n');
fprintf('MEO卫星位置:[%f, %f, %f]\n',MEO_positionX,MEO_positionY,MEO_positionZ);
fprintf('MEO卫星速度:[%f, %f, %f]\n',MEO_Vx,MEO_Vy,MEO_Vz);
fprintf('MEO卫星钟偏:%f\n',MEO_sat_Clk_error);

函数 MEO_state_tsv.m:

function [positionX,positionY,positionZ,Vx,Vy,Vz,sat_Clk_error] = MEO_state_tsv(tsv,EPH)
%计算MEO卫星的位置

%%%%%%%%%%%%%%%%
%数据准备
%%%%%%%%%%%%%%%%
radv = 7.2921151467e-5;
GM = 3.986005e14;
F = -4.442807633e-10;
toc = EPH.toc;
Tsv = tsv;
af0 = EPH.af0;
af1 = EPH.af1;
af2 = EPH.af2;
TGD1 = EPH.TGD1;
sqrtA = EPH.sqrtA;
toe = EPH.toe;
deltan = EPH.deltan;
M0 = EPH.M0;
e = EPH.e;
i0 = EPH.i0;
IDOT = EPH.IDOT;
omega = EPH.omega;
Cuc = EPH.Cuc;
Cus = EPH.Cus;
Crc = EPH.Crc;
Crs = EPH.Crs;
Cic = EPH.Cic;
Cis = EPH.Cis;
omega0 = EPH.omega0;
omegaDot = EPH.omegaDot;

%计算卫星信号发射时间
delt = Tsv - toc;
sat_Clk_error = af2*delt^2 + af1*delt + af0 - TGD1*1e-9;
Tsv = Tsv - sat_Clk_error;

%计算规划时间
tk = Tsv - toe;

%计算平近点角
a = sqrtA^2;
n = sqrt(GM/(a^3)) + deltan;
M = M0 + n*tk;
M = mod(M,2*pi);

%迭代求解偏近点角
E0 = M;
while 1
    Ei = M + e*sin(E0);
    delt_E = Ei - E0;
    delt_E = rem(delt_E,2*pi);
    if abs(delt_E) < 1e-12
        E = Ei;
        break;
    else
        E0 = Ei;
    end
end

%求解真近点角和升交点角距
nu = atan2(sqrt(1-e^2)*sin(E),cos(E)-e);
phi = nu + omega;
phi = rem(phi,2*pi);

%考虑摄动改正项
delt_u = Cuc*cos(2*phi) + Cus*sin(2*phi);
delt_r = Crc*cos(2*phi) + Crs*sin(2*phi);
delt_i = Cic*cos(2*phi) + Cis*sin(2*phi);
u = phi + delt_u;
r = a*(1-e*cos(E))+delt_r;
i = i0+IDOT*tk+delt_i;

%计算升交点赤经
OMEGA = omega0+(omegaDot-radv)*tk-radv*toe;
OMEGA = mod(OMEGA,2*pi);

%卫星坐标WGS-84
positionX = cos(u)*r*cos(OMEGA) - sin(u)*r*cos(i)*sin(OMEGA);
positionY = cos(u)*r*sin(OMEGA) + sin(u)*r*cos(i)*cos(OMEGA);
positionZ = sin(u)*r*sin(i);


%计算卫星速度
E_dot = n/(1-e*cos(E));
Vk_dot = (sqrt(1-e^2)*E_dot)/(1-e*cos(E));

Uk_dot = 2*Vk_dot*(Cus*cos(2*phi)-Cuc*sin(2*phi));
Rk_dot = 2*Vk_dot*(Crs*cos(2*phi)-Crc*sin(2*phi));
Ik_dot = 2*Vk_dot*(Cis*cos(2*phi)-Cic*sin(2*phi));

U_dot = Vk_dot + Uk_dot;
R_dot = a*e*E_dot*sin(E) + Rk_dot;
I_dot = IDOT + Ik_dot;

OMEGA_dot = omegaDot - radv;

x = R_dot*cos(u) - r*U_dot*sin(u);
y = R_dot*sin(u) + r*U_dot*cos(u);

Vx = -positionY*OMEGA_dot - (y*cos(i)-positionZ*I_dot)*sin(OMEGA) + x*cos(OMEGA);
Vy = positionX*OMEGA_dot + (y*cos(i)-positionZ*I_dot)*cos(OMEGA) + x*sin(OMEGA);
Vz = y*sin(i) + y*I_dot*cos(i);




%更新卫星钟偏
dtr = F*e*sqrtA*sin(E);
sat_Clk_error = af2*delt^2 + af1*delt + af0 - TGD1*1e-9 + dtr;


end

函数 GEO_state_tsv.m:

function [positionX,positionY,positionZ,sat_Clk_error] = GEO_state_tsv(tsv,EPH)
%计算GEO卫星的位置

%%%%%%%%%%%%%%%%
%数据准备
%%%%%%%%%%%%%%%%
radv = 7.2921151467e-5;
GM = 3.986005e14;
F = -4.442807633e-10;
toc = EPH.toc;
Tsv = tsv;
af0 = EPH.af0;
af1 = EPH.af1;
af2 = EPH.af2;
TGD1 = EPH.TGD1;
sqrtA = EPH.sqrtA;
toe = EPH.toe;
deltan = EPH.deltan;
M0 = EPH.M0;
e = EPH.e;
i0 = EPH.i0;
IDOT = EPH.IDOT;
omega = EPH.omega;
Cuc = EPH.Cuc;
Cus = EPH.Cus;
Crc = EPH.Crc;
Crs = EPH.Crs;
Cic = EPH.Cic;
Cis = EPH.Cis;
omega0 = EPH.omega0;
omegaDot = EPH.omegaDot;

%计算卫星信号发射时间
delt = Tsv - toc;
sat_Clk_error = af2*delt^2 + af1*delt + af0 - TGD1*1e-9;
Tsv = Tsv - sat_Clk_error;

%计算规划时间
tk = Tsv - toe;

%计算平近点角
a = sqrtA^2;
n = sqrt(GM/(a^3)) + deltan;
M = M0 + n*tk;
M = mod(M,2*pi);

%迭代求解偏近点角
E0 = M;
while 1
    Ei = M + e*sin(E0);
    delt_E = Ei - E0;
    delt_E = rem(delt_E,2*pi);
    if abs(delt_E) < 1e-12
        E = Ei;
        break;
    else
        E0 = Ei;
    end
end

%求解真近点角和升交点角距
nu = atan2(sqrt(1-e^2)*sin(E),cos(E)-e);
phi = nu + omega;
phi = rem(phi,2*pi);

%考虑摄动改正项
delt_u = Cuc*cos(2*phi) + Cus*sin(2*phi);
delt_r = Crc*cos(2*phi) + Crs*sin(2*phi);
delt_i = Cic*cos(2*phi) + Cis*sin(2*phi);
u = phi + delt_u;
r = a*(1-e*cos(E))+delt_r;
i = i0+IDOT*tk+delt_i;

%计算升交点赤经
OMEGA = omega0+omegaDot*tk-radv*toe;
OMEGA = mod(OMEGA,2*pi);

%卫星坐标WGS-84
X = cos(u)*r*cos(OMEGA) - sin(u)*r*cos(i)*sin(OMEGA);
Y = cos(u)*r*sin(OMEGA) + sin(u)*r*cos(i)*cos(OMEGA);
Z = sin(u)*r*sin(i);

%GEO卫星的位置
f = -5/180*pi;
p = radv*tk;
Rx = [1 0 0; 0 cos(f) sin(f); 0 -sin(f) cos(f)];
Rz = [cos(p) sin(p) 0; -sin(p) cos(p) 0; 0 0 1];
position = Rz*Rx*[X;Y;Z];
positionX = position(1);
positionY = position(2);
positionZ = position(3);

%更新卫星钟偏
dtr = F*e*sqrtA*sin(E);
sat_Clk_error = af2*delt^2 + af1*delt + af0 - TGD1*1e-9 + dtr;

end

运行结果:

  • 33
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
### 回答1: 利用广播星历计算BDS卫星位置C可以通过以下步骤实现: 首先,需要收集到BDS卫星广播星历数据。广播星历是由BDS卫星发射的无线电信号中携带的星历数据,包括BDS卫星卫星编号、位置、速度、钟差等信息。 然后,将收集到的广播星历数据进行解码和处理。解码可以通过专门的软件、设备或程序实现,将无线电信号转化为可读取的星历数据。 接下来,根据解码的星历数据,进行星历计算星历计算利用数学模型和算法,将星历数据转化为BDS卫星位置和速度。这些数学模型和算法包括卫星运动模型、时钟差校正模型等。 最后,根据星历计算的结果,确定BDS卫星位置C。位置C是指BDS卫星在某一时刻的空间坐标,可以用三维直角坐标系或地心地固坐标系表示。通常会给出卫星的地理经纬度、高度等信息。 需要注意的是,广播星历是由卫星发射的信号所提供的,因此在使用广播星历计算BDS卫星位置C时,需要确保接收到的星历数据准确无误,并进行合适的数据处理和校正,以提高计算结果的精度和可靠性。同时,星历计算还涉及到复杂的数学和物理模型,需要专业的技术和算法支持。 ### 回答2: 利用广播星历计算BDS卫星位置C,首先需要理解广播星历的含义。广播星历是由卫星发射的信号中携带的一组参数,包括卫星的时钟校准、轨道参数和健康状态等信息。 要计算BDS卫星位置C,可以按照以下步骤进行: 1. 收集广播星历数据:需要接收到BDS卫星发射的广播信号,并提取出其中包含的星历数据。广播星历数据经过解调和解码后,可以获得各个卫星的时钟校准参数和轨道参数。 2. 解码星历数据:解码接收到的星历数据,并将其转换为可用的信息。这些数据包括卫星卫星编号、时间戳、卫星的轨道参数、时钟值等。 3. 计算定位参数:利用接收到的星历数据,结合接收机的定位算法,可以计算卫星位置C。这个过程通常需要采用差分定位等技术来提高精度。 4. 误差修正:得到初始位置估计后,还需要对其进行误差修正。例如,可以使用差分定位技术来校正卫星钟差、电离层延迟等误差,提高定位的精度。 通过以上步骤,就可以利用广播星历计算BDS卫星位置C。计算得到的位置C可以用于导航、定位等应用中,为用户提供准确的卫星定位信息。 ### 回答3: 利用广播星历进行BDS卫星位置计算c的过程如下: 1. 获取广播星历数据:从卫星导航系统的控制中心接收到BDS系统广播星历数据。 2. 解码星历数据:对接收到的广播星历数据进行解码,提取出所需的卫星位置信息。 3. 计算卫星钟差:根据广播星历数据中的卫星钟差参数,计算得到卫星的精确时钟差。 4. 计算卫星轨道参数:利用广播星历数据中的卫星轨道参数,结合卫星钟差,计算得到卫星的精确位置和速度。 5. 钟差订正:将计算得到的卫星位置和速度与观测信号进行比对,对卫星钟差进行订正。 6. 误差校正:考虑到误差来源,对计算结果进行误差校正,确保得到更准确的卫星位置信息。 7. 输出计算结果:将计算得到的BDS卫星位置c输出,可用于导航定位、时间同步等应用。 需要注意的是,由于广播星历数据是按周期广播的,接收机需要及时更新星历数据,以获取最新的卫星位置信息。此外,由于星历数据的精度有限,可能存在一定的误差,因此在实际应用中需要结合其他校正方法来提高定位的准确度。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KD学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值