1.準備作業
観測データの読み取りはデータ処理の前提条件です。通常、観測値のデータ形式はrtcm、ubx、rinexであり、さまざまなメーカーが独自のカスタム形式を持っています。データの読み取りは最も簡単なタスクです。データ編成形式を習得することは、データの読み取り戦略を習得することを意味します。つまり、文字列に対して一連の操作を実行します。oファイルを読み取るには、次の準備が必要だと思います。
(1)Matlab PCのインストール、
(2)rinex.pdfの学習、
(3)oファイルの準備、
(4)擬似コードの記述、データの整理ストリーム;
(5)
衛星の読み取りエポック観測(PR / CP)、ドップラー、 SNR情報に従って、測位方法SPP / PPP / RTKを使用するコードテスト、後続の処理はすべての衛星の数ですループを実行しますトラバーサルとさまざまな操作を実行します。
第二に、解決すべき問題問題
は、Matlabを使用して、観測アーク内のさまざまな衛星システムの衛星の疑似距離観測値シーケンス図を描画することです。
上記の問題の分析では、わかりやすい衛星PRN番号が一意であり、キーとして使用できます。一方、衛星は観測値(PC / CP /ドップラー)に対応し、値として使用できます。言い換えると、キーと値はマップマッピングをデータ構造として使用でき、値は構造に格納できます。最も重要な部分、つまりマップと構造体の使用が決定されました。
次に、衛星の観測アークの疑似距離値を例にとってみましょう。考えられる状況は次のとおりです。
(1)観測アークでは、衛星は常にキャプチャされています。つまり、疑似距離の100%です。値が存在します;
(2)観測アークでは、衛星は最初のエポックでキャプチャされてからキャプチャされません;
(3)(2)では、まだキャプチャされていない、キャプチャされている、キャプチャされていない、キャプチャされているなどがあります;
捕捉されていないエポックの時点での観測値は0ですが、同時に、疑似距離がある場合はキャリアがなく、キャリアがない場合は確実に疑似距離がないことに注意する必要があります。私たちの擬似コードは、主に上記の3つの状況を判断するためのものです。
3.コードの実装上記の
問題を解決するために、特定の問題を詳細に分析します。特定のコードは次のとおりです。
% function: read the body of rinex obs file
clear all
close all
clc
fid=fopen(' example.obs');
if fid==-1
disp('fail to open obs file!');
end
% 创建结构体obs,使用Map进行映射,prn为键(char),sv为值(table)
obs=containers.Map;
record_counter=0;
% 读取body记录
while feof(fid)==0
line=fgets(fid);
if strcmp(line(1),'>')
sv_sum=str2double(line(34:35));
time=line(3:29);
if sv_sum>0
for i=1:sv_sum
line=fgets(fid);
% 键 -> prn
key=line(1:3);
% 值 -> sv(pr cp dop)
sv.pr=str2double(line(6:17));
cp=line(21:33);
if isnan(cp)
sv.cp=0;
else
sv.cp=str2double(line(21:33));
end
sv.dop=str2double(line(41:49));
% 值逻辑判断
if isKey(obs,key)
jump_sec=record_counter-length(obs(key));
if jump_sec~=0 % 解决掉星后重新锁定的问题
temp.pr=0;
temp.cp=0;
temp.dop=0;
tmp_strcut=repmat(temp,1,jump_sec);
value=[obs(key) tmp_strcut sv];
else % 卫星一直锁定,直接追加
if strcmp(key,'C18')==1
if length(obs(key))>5713
disp(time);
end
end
value=[repmat(obs(key),1) repmat(sv,1)]; % mark
end
else % 卫星首次锁定
if record_counter~=0 % 第一秒未锁定
temp.pr=0;
temp.cp=0;
temp.dop=0;
tmp_strcut=repmat(temp,1,record_counter);
value=[tmp_strcut sv];
else % 第一秒锁定
value=sv;
end
end
obs(key)=value;
end
end
record_counter=record_counter+1;
end
end
disp('create struct obs(body) successfully!');
% 绘图
sv_sum=obs.Count; % 可视卫星数量
keySet=keys(obs); % 可视卫星名称
disp(keySet);
v=299792458.0;
bf1=1.561098E9; % bds L1 频率
gf1=1.57542E9; % gps L1 频率
gps_sum=0;bds_sum=0;
for i=1:sv_sum
prn=char(keySet(i));
if strcmp(prn(1),'G')==1 % GPS
gps_sum=gps_sum+1;
else if strcmp(prn(1),'C')==1 % BDS
bds_sum=bds_sum+1;
end
end
end
subfig1=ceil(sqrt(bds_sum));
subfig2=ceil(sqrt(gps_sum));
x=1:record_counter;
for i=1:sv_sum
prn=char(keySet(i));
info=obs(prn);
pr=zeros(1,record_counter);cp=pr;
for j=1:length(info)
pr(j)=info(j).pr;
cp(j)=info(j).cp;
end
if i==1 || i==bds_sum+1
figure;
end
subplot(n,n,pos);
plot(x,pr,'r',x,cp*f,'g');
title(char(prn));
end
第4に、
私の仕事で遭遇したrinexバージョンのデータ、gps / bdsデュアルシステム、単一周波数データのみを扱った結果の例では、結果は次のとおりです。
サンプルコードは比較的単純で、対応するコメントがあります。