基于导航观测的GPS接收机位置计算(Matlab代码实现)

 👨‍🎓个人主页:研学社的博客    

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现


💥1 概述

文献来源:

全球定位系统(GPS)是第一个也是唯一一个提供全球覆盖的自主地理空间定位的全功能卫星导航系统。

为了计算用户在地球上的位置,必须确定精确的GPS卫星轨道。

一种适用的方法是利用广播星历计算卫星轨道,其优点是可以在任何给定时间确定轨道信息。然而,这种广播的星历表只能提供大约1.6米的有限精度。另一种方法是直接从国际GNSS服务(IGS)获取卫星轨道信息,也称为精确轨道或精确星历,其精度可达到毫米级。然而,精确的轨道每隔15分钟报告一次,因此需要在定位时间内插入。

本文介绍了GPS卫星轨道确定和插值的两种方法。

分析了广播星历和精密星历的优缺点。最后,利用各方法获得的卫星轨道信息,对GPS定位的性能进行了比较。

GPS接收机位置的初步猜测是从观测文件中获得的,并使用广播轨道,伪距和载波相位测量进行更新。这里从导航文件中计算广播轨道,然后计算用户和卫星之间的粗略距离。通过减去计算的距离和观察到的距离,为最小二乘技术构建残差矩阵。

📚2 运行结果

部分代码:

clc
clear
format long g

% read observation file to get orbit elements
[obs,rec_xyz] = read_rinex_obs('madr2000.06o');

% read navigation file to get orbit elements
ephemeris = read_rinex_nav('brdc2000.06n');

epochs = unique(obs.data(:, obs.col.TOW));
TimeSpan=epochs(1:2880);

% Broadcast Orbit
satOrbits.XS=zeros(1,length(TimeSpan));
satOrbits.YS=zeros(1,length(TimeSpan));
satOrbits.ZS=zeros(1,length(TimeSpan));
satOrbits.VXS=zeros(1,length(TimeSpan));
satOrbits.VYS=zeros(1,length(TimeSpan));
satOrbits.VZS=zeros(1,length(TimeSpan));
satOrbits.clk=zeros(1,length(TimeSpan));
satOrbits.Rel=zeros(1,length(TimeSpan));

% GPS Satellite Measurements
c = 2.99792458e8 ; % speed of light (m/s)
fL1 = 1575.42e6;   % L1 frequency (Hz)
fL2 = 1227.6e6;    % L2 frequency (Hz)
B=fL2^2/(fL2^2-fL1^2);
A=-B+1;
satOrbits.C1=zeros(1,length(TimeSpan));
satOrbits.L1=zeros(1,length(TimeSpan));
satOrbits.P2=zeros(1,length(TimeSpan));
satOrbits.L2=zeros(1,length(TimeSpan));
satOrbits.P3=zeros(1,length(TimeSpan)); % Iono free pseudorange
satOrbits.CorrP1=zeros(1,length(TimeSpan)); % Corrected Pseudorange from broadcast orbit
satOrbits.CorrP2=zeros(1,length(TimeSpan)); % Corrected Pseudorange from precise orbit
satOrbits.TOW=TimeSpan';
satOrbits.PRN=0;

satOrbits = repmat(satOrbits,1,32);
for ii=1:32
    satOrbits(ii).PRN=ii;
end

% Initialize User Position
userPos=zeros(length(TimeSpan),4);

for ii=1:length(TimeSpan)    
    this_TOW = TimeSpan(ii);
    index = find(obs.data(:,obs.col.TOW) == this_TOW);
    curr_obs.data = obs.data(index, :);
    curr_obs.col = obs.col;
    
    for jj=1:size(curr_obs.data,1)        
        PRN_obs.data = curr_obs.data(jj,:);
        PRN_obs.col = curr_obs.col;
        
        % Record Measurements
        satOrbits(PRN_obs.data(PRN_obs.col.PRN)).C1(ii)=PRN_obs.data(PRN_obs.col.C1);
        satOrbits(PRN_obs.data(PRN_obs.col.PRN)).L1(ii)=PRN_obs.data(PRN_obs.col.L1);
        satOrbits(PRN_obs.data(PRN_obs.col.PRN)).P2(ii)=PRN_obs.data(PRN_obs.col.P2);
        satOrbits(PRN_obs.data(PRN_obs.col.PRN)).L2(ii)=PRN_obs.data(PRN_obs.col.L2);
        
        % Calculate Iono Free Measurement
        P1 = satOrbits(PRN_obs.data(PRN_obs.col.PRN)).C1(ii);
        P2 = satOrbits(PRN_obs.data(PRN_obs.col.PRN)).P2(ii);
        P3=A*P1+B*P2;
        satOrbits(PRN_obs.data(PRN_obs.col.PRN)).P3(ii)=P3;
    end
    
    stop = 10;
    while stop ~= 1
        for jj=1:size(curr_obs.data,1)
            PRN_obs.data = curr_obs.data(jj,:);
            PRN_obs.col = curr_obs.col;
            
            % Obtain the broadcast orbits
            PRN_obs = get_broadcast_orbits(PRN_obs,ephemeris,rec_xyz');
            satOrbits(PRN_obs.data(PRN_obs.col.PRN)).XS(ii)=PRN_obs.data(PRN_obs.col.XS);
            satOrbits(PRN_obs.data(PRN_obs.col.PRN)).YS(ii)=PRN_obs.data(PRN_obs.col.YS);
            satOrbits(PRN_obs.data(PRN_obs.col.PRN)).ZS(ii)=PRN_obs.data(PRN_obs.col.ZS);
            satOrbits(PRN_obs.data(PRN_obs.col.PRN)).VXS(ii)=PRN_obs.data(PRN_obs.col.VXS);
            satOrbits(PRN_obs.data(PRN_obs.col.PRN)).VYS(ii)=PRN_obs.data(PRN_obs.col.VYS);
            satOrbits(PRN_obs.data(PRN_obs.col.PRN)).VZS(ii)=PRN_obs.data(PRN_obs.col.VZS);
            satOrbits(PRN_obs.data(PRN_obs.col.PRN)).clk(ii)=PRN_obs.data(PRN_obs.col.satClkCorr);
            satOrbits(PRN_obs.data(PRN_obs.col.PRN)).Rel(ii)=PRN_obs.data(PRN_obs.col.Rel);            
            
            % Calculate corrected pseudorange based on broadcast orbit
            satOrbits(PRN_obs.data(PRN_obs.col.PRN)).CorrP1(ii)=...
                satOrbits(PRN_obs.data(PRN_obs.col.PRN)).P3(ii)+...
                satOrbits(PRN_obs.data(PRN_obs.col.PRN)).clk(ii)+satOrbits(PRN_obs.data(PRN_obs.col.PRN)).Rel(ii);            
        end
        
        % Calculate User Position
        [broadcast_obs,~]=createObs(this_TOW,satOrbits);
        delta_xyz = comp_pos(broadcast_obs,rec_xyz');
        rec_xyz = rec_xyz + delta_xyz(1:3);
        
        stop=stop-1;
    end
    userPos(ii,1:4) = [rec_xyz; delta_xyz(4)]';
    [lon1(ii),lat1(ii),alt1(ii)] = Geodetic(rec_xyz);
end

fprintf('mean of user position:');
fprintf('%16f%16f%16f\n',mean(userPos(:,1)),mean(userPos(:,2)),mean(userPos(:,3)));
fprintf('delta_xyz:');
fprintf('%16f\n',mean(userPos(:,4)));

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

🌈4 Matlab代码实现

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
GPS单点定位算法主要分为以下几个步骤: 1. 接收卫星信号,并解码获取伪距观测值; 2. 通过广播星历数据计算卫星位置; 3. 计算接收机与卫星之间的距离(伪距); 4. 根据伪距与卫星位置,利用最小二乘法求解接收机位置; 下面是一个在MATLAB实现GPS单点定位算法的示例代码: ```matlab clc;clear all;close all; % 初始化常数 c = 299792458; % 光速,m/s f1 = 1575.42e6; % L1载波频率,Hz lambda1 = c/f1; % L1载波波长,m L = 10; % 伪距观测值数量 % 卫星位置和伪距 satellite_pos = [15600.67, 7542.96, 20198.40; 20138.63, 14245.35, 19994.93; 18728.54, 10562.85, 21687.12; 17813.50, 20915.11, 14784.85]; pseudorange = [26584973.71; 26584853.43; 26584823.86; 26585064.27]; % 计算接收机位置 x0 = [0, 0, 0]; % 初始位置 x = lsqnonlin(@(x) satellite_position_error(x, satellite_pos, pseudorange, lambda1), x0); disp(['接收机位置:', num2str(x), ' m']); % 计算误差 error = satellite_position_error(x, satellite_pos, pseudorange, lambda1); disp(['误差:', num2str(error), ' m']); % 画图 figure; scatter3(satellite_pos(:,1), satellite_pos(:,2), satellite_pos(:,3), 'filled'); hold on; scatter3(x(1), x(2), x(3), 'filled', 'r'); xlabel('X'); ylabel('Y'); zlabel('Z'); legend('卫星位置', '接收机位置'); function error = satellite_position_error(x, satellite_pos, pseudorange, lambda1) % 计算距离误差 error = zeros(size(pseudorange)); for i = 1:length(pseudorange) distance = norm(satellite_pos(i,:) - x); error(i) = distance + x(4) - pseudorange(i); end end ``` 在这个示例中,我们假设已经接收到了4颗卫星的信号,并且已经解码获取了它们的伪距观测值和位置。我们使用MATLAB内置的最小二乘法函数 `lsqnonlin` 来求解接收机位置。求解过程中,我们需要定义一个误差函数,它计算接收机位置和卫星位置之间的距离误差。最后,我们将卫星位置接收机位置可视化出来。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

荔枝科研社

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

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

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

打赏作者

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

抵扣说明:

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

余额充值