Matlab lee el valor de observación GNSS o un ejemplo de código de archivo

1. Trabajo de preparación La
lectura de datos de observación es un requisito previo para el procesamiento de datos. Por lo general, el formato de datos de los valores de observación es rtcm, ubx, rinex, y varios fabricantes tienen sus propios formatos personalizados. La lectura de datos es la tarea más sencilla. Dominar el formato de organización de datos significa dominar la estrategia de lectura de datos. En resumen, realizamos una serie de operaciones sobre cadenas. Creo que se deben hacer los siguientes preparativos para leer archivos o, que son:
(1) Instalar Matlab PC;
(2) Aprender rinex.pdf;
(3) Preparar archivos o;
(4) Escribir pseudocódigo y ordenar los datos flujo;
(5) pruebas de código
utilizamos un método de posicionamiento SPP / PPP / RTK, de acuerdo con las observaciones de época de lectura de los satélites (PR / CP), Doppler, información SNR , el procesamiento posterior es el número de todos los satélites Realizar un bucle atravesar y realizar diferentes operaciones.
En segundo lugar, el problema a resolver El problema
es: utilizar Matlab para dibujar el diagrama de secuencia de valores de observación de pseudodistancia de los satélites de diferentes sistemas de satélites en el arco de observación.
En el análisis de los problemas anteriores, el número PRN del satélite fácil de conocer es único y se puede utilizar como clave; mientras que el satélite corresponde al valor de observación (PC / CP / Doppler) y se puede utilizar como valor. En otras palabras, la clave y el valor pueden usar el mapeo de mapas como una estructura de datos, donde el valor se puede almacenar en una estructura. Se ha determinado la parte más importante, a saber, el uso de map y struct.
A continuación, tomemos como ejemplo el valor de pseudodistancia en el arco de observación de un satélite. Las situaciones posibles son las siguientes:
(1) En el arco de observación, el satélite ha sido capturado todo el tiempo, es decir, el 100% de la pseudodistancia. existen valores;
(2) En el arco de observación, el satélite no es capturado en la época inicial y luego capturado;
(3) En (2) todavía hay no capturados, capturados, no capturados, capturados, etc .;
El valor observado es 0 en el momento de la época no capturada. Al mismo tiempo, también debemos tener en cuenta que no hay portadora si hay una pseudodistancia, y definitivamente no hay pseudodistancia sin una portadora. Nuestro pseudocódigo es principalmente para juzgar las tres situaciones anteriores.
3. Implementación del código El
problema específico se analiza en detalle para solucionar los problemas antes mencionados. El código específico es el siguiente:

% 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

En cuarto lugar, los resultados del ejemplo
solo trato con los datos de la versión rinex encontrados en mi trabajo, sistema dual gps / bds, datos de frecuencia única, los resultados son los siguientes:
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

El código de muestra es relativamente simple y hay comentarios correspondientes.

Supongo que te gusta

Origin blog.csdn.net/weixin_43074576/article/details/112980535
Recomendado
Clasificación