position定位 响应式_GPS定位笔记4 (轨道理论和星历和历书)

一些专业名词

  • Perigee: 近地点
  • Apogee: 远地点
  • True anomaly: 真近点角(anomlay是古希腊语,就是角度的意思)
  • Vernal equinox: 春分点(March 21)
  • Autumnal equinox 秋分点(Sept 23)
  • Perihelion: 近日点(Dec,22)
  • Aphelion:远日点(July,1)
  • Heliocentric Reference Frame: 日心坐标系
  • GMST -Greenwich Mean Sidereal Time: 格林尼治恒星时间(格林尼治与ECI 的X轴(指向恒星,不随地球转动而转动)之间的夹角)

28933bcf50e57041b94d4be73e91de94.png

开普勒三大定律

  • 开普勒第一定律: 所有行星绕太阳运行的轨道都呈椭圆,太阳位于椭圆的一焦点上。
  • 开普勒第二定律: 连接行星和太阳的直线在相等的时间内扫过的面积相等
  • 开普勒第三定律: 不同行星绕太阳运行的公转周期的平方分别于他们的轨道长半径的立方成正比

9c5386de556b142c926b08a7fff5138b.png

开普勒参数:

开普勒轨道参数一共有6个:

  1. 轨道升交点赤经
  2. 轨道倾角
  3. 近地点角距
  4. 长半径
  5. 偏心率
  6. 卫星真近点角

5fdd594b4f1b558aca9e94e27622a50d.png

对于一颗在无摄状态下运行的卫星,它的6个开普勒轨道参数在地心惯性坐标系统中只有真近点角

是一个关于时间的函数,而其他5个参数均为常数。考虑到
与时间的函数关系比较复杂,GPS卫星星历实际上并不直接给出真近点角
, 而是引入了两个辅助量来替代并推导出真近点角,这两个辅助量是偏近点角E和平近点角M。

偏近点角E和平近点角M的关系由以下的开普勒方程给出:

b762062169b2f443b7fceafc07285e7d.png

求出M后,

由以下公式得到:

297720a7ab6d0a0a23a2e73d4136c8e4.png

卫星星历和历书参数

以上两小节讨论了卫星在理想状态下的无摄动轨道以及6个开普勒轨道参数,然而在实际中,卫星除了主要受到来自地球的引力外,还会受到来自其他天体(太阳,月球)的引力、太阳光辐射压力以及地球的不规则形状,不均匀质地等多种因素的影响。在这些复杂因素的综合作用下,各个开普勒轨道参数将不再是常数,卫星的实际运行轨道也将偏离无摄运行轨道,而这种卫星轨道偏差在GPS中是绝对不容忽视的。

bcfc7190d235dc9a7c989882cb0403bb.png
星历参数

1396da494418c1ec8bf43f3717bc3e4d.png
历书参数
  • 星历是详细的卫星轨道参数,有效期4小时
  • 历书是简略的卫星轨道参数,只能大概估算位置,不能用于定位,有效期半年,一般只能用于接收机对卫星信号的搜索和捕获。

卫星空间位置计算

利用星历参数计算出GPS卫星在某一时刻的空间位置是GPS接收机为实现定位而必须完成的重要一步么,而本节将通过一个例子来详细解释这一计算方法和步骤。这一计算通常需要双精度浮点运算。π值一般取:3.141 592 653 589 8

f95fcfe8c1353fec90fafd94dd6736d9.png
实战开始

SETP1 计算规化时间

卫星星历给出的轨道参数是以星历参考时间

作为基准的。为了得到各个轨道参数在
时刻的值,我们必须先给出t时刻与参考时间
的差异,即

776bd8a9fd424ac5f2e1cb479c173527.png

上式得到的

称为相对于
的规化时间。

SETP2 计算卫星的平均角速度n

将卫星星历给出的

值带入3。36,可得那颗在圆周轨道上运行的假象卫星的平均角速度
。 校正后的卫星平均角速度n为

77d9126d09a54c7742d27369b6c691c7.png

4094b30cac2f9ef3a320626eb52ef304.png

而将星历提供的

代入上式,得

SETP3 计算型号发射时刻的平近点角

将星历给出的

代入以下的线性模型公式:

bd0ec44cbe2dae4938391b9140b1ad13.png

可得

时的平近点角
。由于此
值不在
之间,故可将
值加上
后变成
.

STEP4 计算信号发射时刻的偏近点角

给出了平近点角

和星历参数
,我们通常可以运用迭代法将偏近点角
从开普勒方程3.38中求解出来。
的迭代初始值
可置为
,从而根据式(3.39)说计算出的两次迭代结果依次为4.374269和4.374280. 在这一步,我们解得

STEP5 计算信号发射时刻的真近点角

带入(3.44),(3.45),(3.46)得到真近点角:

SETP6 计算信号发射时刻的升交点角距

7013bd6f7eeac1bb692b6bb41b1b7bc6.png

可得到:

。如图3.8所示,升交点角距
是卫星当前位置点
与升交点相对于地心
的夹角。

STEP7 计算信号发射时刻的摄动校正项

将星历参数

和由上一步得到的升交点角距
代入如下各式:

9d627ac101fdbe9300fbb5f7e6d5b1bf.png

可得二次谐波摄动校正量:

STEP8 计算摄动校正后的升交点角距

、卫星矢径长度
和轨道倾角

da0259e38915f6b2ffb9244bc87f0427.png

7344f041578acff9205d1c66e6b06f83.png

可得:

STEP9 计算信号发射时刻卫星在轨道平面位置

通过以下公式将极坐标

转换成在轨道平面直角坐标系
中的坐标

0da1355f6db5f7a7b0f4711a24a84a64.png

。同时
。如图3.8所示,这里的直角坐标系的
轴是由地心指向卫星升交点,而不是指向近地点。这正是(3.48)和(3.61)不同之处。

STEP10 计算信号发射时刻的升交点赤经

升交点赤经的线性模型如下:

80859f8ce1280d669f5d3b0651cd0437.png

由此可得

。这等价于值在
之间的
。在式(3.62)中,

由卫星星历给出。注意,式(3.62)已经考虑了地球自转对卫星升交点与格林尼治子午面之间的相对位置关系的影响,也就是说,由上式得到的
值直接是t时刻的卫星升交点的WGS-84大地坐标系中的经度,这便于下一步将卫星位置从轨道平面直角坐标系转换到WGS-84地心地固坐标系。

STEP11 计算卫星在WGS-84地心地固直角坐标系

中的坐标

如图3.8所示,轨道平面直角坐标系

先绕
轴旋转(
),再绕旋转后的

旋转(

),由此转变成WGS-84地心地固直角坐标系
.公式为:

98034c81c40cd45d0d9980e7082870d8.png

代入数值后,最终得到卫星在ECEF中的表示:

matlab 代码如下:

clear;
clc;
clear all;

%%

% 星历 参考GPS原理及接收机设计 3.4
eph.rcvr_tow = 100;
eph.sqrtA = 5153.65531;
eph.toe = 244800;
eph.dn = 4.249105564E-9;
eph.m0 = -1.064739758;
eph.e = 0.005912038265;
eph.w = -1.717457876;
eph.i0 = 0.9848407943;
eph.idot = 7.422851197E-51;
eph.omg0 = 1.038062244;
eph.odot = -8.151768125E-9;
eph.cus = 2.237036824E-6;
eph.cuc = 3.054738045E-7;
eph.crs = 2.53125;
eph.crc = 350.53125;
eph.cis = 8.940696716E-8;
eph.cic = -8.381903172E-8;



[x y z] = get_satellite_position(eph, 239050.7223, 1);
pos = [x y z]


function [x y z] = get_satellite_position(eph, t, compute_harmonic_correction)
% get_satellite_position: computes the position of a satellite at time (t) given the
% ephemeris parameters.
% Usage: [x y z] =  get_satellite_position(eph, t, compute_harmonic_correction)
% Input Args: eph: ephemeris data
%             t: time
%             compute_harmonic_correction (optional): 1 if harmonic
%             correction should be applied, 0 if not.
% Output Args: [x y z] in ECEF in meters
% ephmeris data must have the following fields:
% rcvr_tow (receiver tow)
% svid (satellite id)
% toc (reference time of clock parameters)
% toe (referece time of ephemeris parameters)
% af0, af1, af2: clock correction coefficients
% ura (user range accuracy)
% e (eccentricity)
% sqrtA (sqrt of semi-major axis)
% dn (mean motion correction)
% m0 (mean anomaly at reference time)
% w (argument of perigee)
% omg0 (lontitude of ascending node)
% i0 (inclination angle at reference time)
% odot (rate of right ascension)
% idot (rate of inclination angle)
% cus (argument of latitude correction, sine)
% cuc (argument of latitude correction, cosine)
% cis (inclination correction, sine)
% cic (inclination correction, cosine)
% crs (radius correction, sine)
% crc (radius correction, cosine)
% iod (issue of data number)


% set default value for harmonic correction
switch nargin
    case 2
        compute_harmonic_correction=1;
end
mu = 3.986005e14;
omega_dot_earth = 7.2921151467e-5; %(rad/sec)

% Now follow table 20-IV
A = eph.sqrtA^2;
cmm = sqrt(mu/A^3); % computed mean motion
tk = t - eph.toe;
% account for beginning of end of week crossover
if (tk > 302400)
    tk = tk-604800;
end
if (tk < -302400)
    tk = tk+604800;
end
% apply mean motion correction
n = cmm + eph.dn;

% Mean anomaly
mk = eph.m0 + n*tk;

% solve for eccentric anomaly
% 迭代3次
Ek = mk;
Ek = mk + eph.e*sin(Ek);
Ek = mk + eph.e*sin(Ek);
Ek = mk + eph.e*sin(Ek);

% syms E;
% eqn = E - eph.e*sin(E) == mk;
% solx = vpasolve(eqn, E);
% Ek = double(solx);

% True anomaly:
nu = atan2((sqrt(1-eph.e^2))*sin(Ek)/(1-eph.e*cos(Ek)), (cos(Ek)-eph.e)/(1-eph.e*cos(Ek)));
%Ek = acos((e  + cos(nu))/(1+e*cos(nu)));

%升交点角距
Phi = nu + eph.w;
du = 0;
dr = 0;
di = 0;

% 摄动校正量
if (compute_harmonic_correction == 1)
    % compute harmonic corrections
    du = eph.cus*sin(2*Phi) + eph.cuc*cos(2*Phi);
    dr = eph.crs*sin(2*Phi) + eph.crc*cos(2*Phi);
    di = eph.cis*sin(2*Phi) + eph.cic*cos(2*Phi);
end

u = Phi + du;
r = A*(1-eph.e*cos(Ek)) + dr;

% inclination angle at reference time
i = eph.i0 + eph.idot*tk + di;
x_prime = r*cos(u);
y_prime = r*sin(u);
omega = eph.omg0 + (eph.odot - omega_dot_earth)*tk - omega_dot_earth*eph.toe;

x = x_prime*cos(omega) - y_prime*cos(i)*sin(omega);
y = x_prime*sin(omega) + y_prime*cos(i)*cos(omega);
z = y_prime*sin(i);

end

参考

  • GPS原理及接收机设计
  • http://www.telesens.co/2017/07/17/calculating-position-from-raw-gps-data/#1b_Code_for_Calculating_Satellite_Position
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个利用星历计算接收机位置和速度的matlab程序代码,基于伪距单点定位算法。 ```matlab % 常数定义 c = 299792458; % 光速 f1 = 1575.42e6; % GPS L1 频率 f2 = 1227.60e6; % GPS L2 频率 lambda1 = c / f1; % GPS L1 波长 lambda2 = c / f2; % GPS L2 波长 mu = 3.986005e14; % 地球引力常数 w = 7.2921151467e-5; % 地球自转角速度 % 读入卫星数据,包括星历和观测数据 load('eph.dat'); % 星历数据 load('obs.dat'); % 观测数据 % 定义变量 n = size(obs, 1); % 观测数据点数 X = zeros(4, 1); % 初始接收机位置、速度 P = eye(4); % 初始误差协方差矩阵 R = 100; % 观测误差方差 H = zeros(n, 4); % 观测矩阵 I = eye(4); % 单位矩阵 % 迭代求解接收机位置、速度 for i = 1:10 for j = 1:n % 获取当前卫星的星历数据 satid = obs(j, 1); % 卫星编号 t_obs = obs(j, 2); % 观测时刻 satpos = eph(satid, 2:4); % 卫星位置 % 计算接收机和卫星之间的距离 t_tx = t_obs - obs(j, 3) / c; % 发射时刻 dt = (X(1:3) - satpos') / norm(X(1:3) - satpos') * X(4); % 信号传播时间偏差 t_rx = t_tx - dt / c; % 接收时刻 rho = norm(X(1:3) - satpos') + c * (t_rx - t_tx); % 伪距观测值 % 构建观测矩阵和观测残差 H(j, 1:3) = (X(1:3) - satpos')' / rho; H(j, 4) = 1; z(j, 1) = rho - obs(j, 4); % 计算卫星钟差和接收机钟差 a0 = eph(satid, 18); a1 = eph(satid, 19); a2 = eph(satid, 20); t_oc = eph(satid, 21); dt = a0 + a1 * (t_tx - t_oc) + a2 * (t_tx - t_oc)^2; tr = t_rx - dt; % 计算卫星位置和速度 M0 = eph(satid, 10); e = eph(satid, 8); delta_n = eph(satid, 11); sqrtA = eph(satid, 9); t = tr - eph(satid, 22); n0 = sqrt(mu / (sqrtA^6)); n = n0 + delta_n; M = M0 + n * t; E = M; for k = 1:10 E_old = E; E = M + e * sin(E); if abs(E - E_old) < 1e-12 break end end v = atan2(sqrt(1 - e^2) * sin(E), cos(E) - e); phi = v + eph(satid, 7); r = sqrtA^2 * (1 - e * cos(E)); Xs = [r * cos(phi), r * sin(phi), 0]'; phi_dot = sqrt(mu / (sqrtA^5)) / (1 - e * cos(E)); v_dot = sqrt(mu / (sqrtA^3)) / (1 - e * cos(E)) * e * sin(E); xs_dot = [-(phi_dot * r * sin(phi) + v_dot * cos(phi)), phi_dot * r * cos(phi) + v_dot * sin(phi), 0]'; end % 计算接收机位置和速度的改正量 K = P * H' / (H * P * H' + R); X_delta = K * z; P = (I - K * H) * P; % 更新接收机位置和速度 X = X + X_delta; end % 输出结果 fprintf('接收机位置: %.4f, %.4f, %.4f\n', X(1), X(2), X(3)); fprintf('接收机速度: %.4f, %.4f, %.4f\n', X(2), X(5), X(6)); ``` 需要注意的是,该程序代码只是一个简单的示例,仅供参考。在实际应用中,需要考虑更多的因素,如钟差、大气延迟、多路径等,以提高定位精度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值