mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2024-11-15 22:34:58 +00:00
ADD: some matlab utils
This commit is contained in:
parent
c2e161efc2
commit
ee6b012ff5
87
src/utils/matlab/vtl/GnssSDR2struct.m
Normal file
87
src/utils/matlab/vtl/GnssSDR2struct.m
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
% GnssSDR2struct Convert GNSS-SDR output .mat file PVT.mat to a struct.
|
||||||
|
% refSolution = SpirentMotion2struct(path_to_motion_V1_csv) Convert PVT.mat to a struct navSolution
|
||||||
|
% refSolution has the following fields:
|
||||||
|
|
||||||
|
% navSolution.solution_status=solution_status;
|
||||||
|
% navSolution.solution_type=solution_type;
|
||||||
|
% navSolution.valid_sats=valid_sats;
|
||||||
|
%
|
||||||
|
% navSolution.RX_time=RX_time;
|
||||||
|
% navSolution.TOW_at_current_symbol_ms=TOW_at_current_symbol_ms;
|
||||||
|
%
|
||||||
|
% navSolution.X=pos_x;
|
||||||
|
% navSolution.Y=pos_y;
|
||||||
|
% navSolution.Z=pos_z;
|
||||||
|
%
|
||||||
|
% navSolution.latitude=latitude;
|
||||||
|
% navSolution.longitude=longitude;
|
||||||
|
% navSolution.height=height;
|
||||||
|
%
|
||||||
|
% navSolution.pdop=pdop;
|
||||||
|
% navSolution.gdop=gdop;
|
||||||
|
% navSolution.hdop=hdop;
|
||||||
|
%
|
||||||
|
% navSolution.vX=vel_x;
|
||||||
|
% navSolution.vY=vel_y;
|
||||||
|
% navSolution.vZ=vel_z;
|
||||||
|
%
|
||||||
|
% navSolution.vdop=vdop;
|
||||||
|
%
|
||||||
|
% navSolution.week=week;
|
||||||
|
%
|
||||||
|
% -------------------------------------------------------------------------
|
||||||
|
% USE EXAMPLE: navSolution = GnssSDR2struct('PVT_raw.mat')
|
||||||
|
% -------------------------------------------------------------------------
|
||||||
|
%
|
||||||
|
% GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
|
||||||
|
% This file is part of GNSS-SDR.
|
||||||
|
%
|
||||||
|
% Copyright (C) 2010-2019 (see AUTHORS file for a list of contributors)
|
||||||
|
% SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
%
|
||||||
|
% -------------------------------------------------------------------------
|
||||||
|
% SPDX-FileCopyrightText: 2022 gomezlma(at)inta.es
|
||||||
|
% SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function [navSolution] = GnssSDR2struct(PVT_file_Path)
|
||||||
|
|
||||||
|
load(PVT_file_Path, ...
|
||||||
|
'RX_time' ,'TOW_at_current_symbol_ms' ,'pos_x','pos_y' ,'pos_z',...
|
||||||
|
'latitude' ,'longitude','height' ,'pdop' ,'gdop' ,'hdop' ,'vel_x' ,...
|
||||||
|
'vel_y' ,'vel_z' ,'vdop' ,'week','solution_status','solution_type',...
|
||||||
|
'valid_sats')
|
||||||
|
|
||||||
|
%% GNSS SDR SOLUTION
|
||||||
|
|
||||||
|
navSolution.solution_status=solution_status;
|
||||||
|
navSolution.solution_type=solution_type;
|
||||||
|
navSolution.valid_sats=valid_sats;
|
||||||
|
|
||||||
|
navSolution.RX_time=RX_time;
|
||||||
|
navSolution.TOW_at_current_symbol_ms=TOW_at_current_symbol_ms;
|
||||||
|
|
||||||
|
navSolution.X=pos_x;
|
||||||
|
navSolution.Y=pos_y;
|
||||||
|
navSolution.Z=pos_z;
|
||||||
|
|
||||||
|
navSolution.latitude=latitude;
|
||||||
|
navSolution.longitude=longitude;
|
||||||
|
navSolution.height=height;
|
||||||
|
|
||||||
|
navSolution.pdop=pdop;
|
||||||
|
navSolution.gdop=gdop;
|
||||||
|
navSolution.hdop=hdop;
|
||||||
|
|
||||||
|
navSolution.vX=vel_x;
|
||||||
|
navSolution.vY=vel_y;
|
||||||
|
navSolution.vZ=vel_z;
|
||||||
|
|
||||||
|
navSolution.vdop=vdop;
|
||||||
|
|
||||||
|
navSolution.week=week;
|
||||||
|
|
||||||
|
%% clear tmp variables
|
||||||
|
clearvars -except navSolution
|
||||||
|
end
|
112
src/utils/matlab/vtl/SpirentMotion2struct.m
Normal file
112
src/utils/matlab/vtl/SpirentMotion2struct.m
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
% SpirentMotion2struct Convert CSV file motionV1.csv to a struct.
|
||||||
|
% refSolution = SpirentMotion2struct(path_to_motion_V1_csv) parse the CSV motionV1.CSV to a struct refSolution
|
||||||
|
% refSolution has the following fields:
|
||||||
|
%
|
||||||
|
% - refSolution.SIM_time: simulation time from 0 (in ms)
|
||||||
|
% - refSolution.X: UTM referenced position X (in m)
|
||||||
|
% - refSolution.Y: UTM referenced position Y (in m)
|
||||||
|
% - refSolution.Z: UTM referenced position Z (in m)
|
||||||
|
% - refSolution.vX: referenced Velocity X (in m/s)
|
||||||
|
% - refSolution.vY: referenced Velocity Y (in m/s)
|
||||||
|
% - refSolution.vZ: referenced Velocity Z (in m/s)
|
||||||
|
% - refSolution.aX: referenced Aceleration X (in m/s2)
|
||||||
|
% - refSolution.aY: referenced Aceleration Y (in m/s2)
|
||||||
|
% - refSolution.aZ: referenced Aceleration Z (in m/s2)
|
||||||
|
% - refSolution.jX: referenced Jerk X (in m/s3)
|
||||||
|
% - refSolution.jY: referenced Jerk Y (in m/s3)
|
||||||
|
% - refSolution.jZ: referenced Jerk Z (in m/s3)
|
||||||
|
% - refSolution.latitude:reference Latitude(in degrees),
|
||||||
|
% ellipsoid WGS84?
|
||||||
|
% - refSolution.longitude:reference Longitude(in degrees),
|
||||||
|
% ellipsoid WGS84?
|
||||||
|
% - refSolution.height: referenced Heigh (in m),
|
||||||
|
% ellipsoid WGS84?
|
||||||
|
% - refSolution.dop: referenced antenna DOP
|
||||||
|
%
|
||||||
|
% -------------------------------------------------------------------------
|
||||||
|
% USE EXAMPLE: refSolution = SpirentMotion2struct('..\log_spirent\motion_V1_SPF_LD_05.csv')
|
||||||
|
% -------------------------------------------------------------------------
|
||||||
|
%
|
||||||
|
% GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
|
||||||
|
% This file is part of GNSS-SDR.
|
||||||
|
%
|
||||||
|
% Copyright (C) 2010-2019 (see AUTHORS file for a list of contributors)
|
||||||
|
% SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
%
|
||||||
|
% -------------------------------------------------------------------------
|
||||||
|
% SPDX-FileCopyrightText: 2022 gomezlma(at)inta.es
|
||||||
|
% SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function [refSolution] = SpirentMotion2struct(path_to_motion_V1_csv)
|
||||||
|
|
||||||
|
% if ~exist('gps_l1_ca_read_pvt_raw_dump.m', 'file')
|
||||||
|
% addpath('./libs')
|
||||||
|
% end
|
||||||
|
%
|
||||||
|
% if ~exist('cat2geo.m', 'file')
|
||||||
|
% addpath('./libs/geoFunctions')
|
||||||
|
% end
|
||||||
|
|
||||||
|
|
||||||
|
%% ===== Import data from text file motion_V1.csv 2 ARRAY ============================
|
||||||
|
% Script for importing data from the following text file:
|
||||||
|
%
|
||||||
|
% filename: D:\virtualBOX_VM\ubuntu20\ubuntu20\shareFolder\myWork\results\log_spirent\motion_V1.csv
|
||||||
|
%
|
||||||
|
% Auto-generated by MATLAB on 20-Nov-2022 12:31:17
|
||||||
|
|
||||||
|
% Set up the Import Options and import the data
|
||||||
|
opts = delimitedTextImportOptions("NumVariables", 38);
|
||||||
|
|
||||||
|
% Specify range and delimiter
|
||||||
|
opts.DataLines = [3, Inf];
|
||||||
|
opts.Delimiter = ",";
|
||||||
|
|
||||||
|
% Specify column names and types
|
||||||
|
opts.VariableNames = ["Time_ms", "Pos_X", "Pos_Y", "Pos_Z", "Vel_X", "Vel_Y", "Vel_Z", "Acc_X", "Acc_Y", "Acc_Z", "Jerk_X", "Jerk_Y", "Jerk_Z", "Lat", "Long", "Height", "Heading", "Elevation", "Bank", "Angvel_X", "Angvel_Y", "Angvel_Z", "Angacc_X", "Angacc_Y", "Angacc_Z", "Ant1_Pos_X", "Ant1_Pos_Y", "Ant1_Pos_Z", "Ant1_Vel_X", "Ant1_Vel_Y", "Ant1_Vel_Z", "Ant1_Acc_X", "Ant1_Acc_Y", "Ant1_Acc_Z", "Ant1_Lat", "Ant1_Long", "Ant1_Height", "Ant1_DOP"];
|
||||||
|
opts.VariableTypes = ["double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double"];
|
||||||
|
|
||||||
|
% Specify file level properties
|
||||||
|
opts.ExtraColumnsRule = "ignore";
|
||||||
|
opts.EmptyLineRule = "read";
|
||||||
|
|
||||||
|
% Import the data
|
||||||
|
motionV1 = readtable(path_to_motion_V1_csv, opts);
|
||||||
|
|
||||||
|
% Convert to output type
|
||||||
|
motionV1 = table2array(motionV1);
|
||||||
|
|
||||||
|
% Clear temporary variables
|
||||||
|
clear opts
|
||||||
|
|
||||||
|
%% SPIRENT REFERENCE SOLUTION
|
||||||
|
|
||||||
|
refSolution.SIM_time=motionV1(:,1);
|
||||||
|
|
||||||
|
refSolution.X=motionV1(:,2);
|
||||||
|
refSolution.Y=motionV1(:,3);
|
||||||
|
refSolution.Z=motionV1(:,4);
|
||||||
|
|
||||||
|
refSolution.vX=motionV1(:,5);
|
||||||
|
refSolution.vY=motionV1(:,6);
|
||||||
|
refSolution.vZ=motionV1(:,7);
|
||||||
|
|
||||||
|
refSolution.aX=motionV1(:,8);
|
||||||
|
refSolution.aY=motionV1(:,9);
|
||||||
|
refSolution.aZ=motionV1(:,10);
|
||||||
|
|
||||||
|
refSolution.jX=motionV1(:,11);
|
||||||
|
refSolution.jY=motionV1(:,12);
|
||||||
|
refSolution.jZ=motionV1(:,13);
|
||||||
|
|
||||||
|
refSolution.latitude=rad2deg(motionV1(:,14));
|
||||||
|
refSolution.longitude=rad2deg(motionV1(:,15));
|
||||||
|
refSolution.height=motionV1(:,16);
|
||||||
|
|
||||||
|
refSolution.dop=motionV1(:,38);
|
||||||
|
|
||||||
|
% Clear temporary variables
|
||||||
|
clear motionV1
|
||||||
|
end
|
188
src/utils/matlab/vtl/SpirentSatData2struct.m
Normal file
188
src/utils/matlab/vtl/SpirentSatData2struct.m
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
% SpirentSatData2struct Convert CSV file sat_data_V1A1.csv to a struct.
|
||||||
|
% refSolution = SpirentSatData2struct(path_to_sat_V1_csv) parse the CSV sat_data_V1A1.CSV to a struct refSatData
|
||||||
|
% refSatData has the following fields:
|
||||||
|
%
|
||||||
|
% refSatData.GALILEO.series(i).Sat_ID(j) = GAL(k,3);
|
||||||
|
% refSatData.GALILEO.series(i).Sat_ID(j)
|
||||||
|
% refSatData.GALILEO.series(i).Sat_PRN(j)
|
||||||
|
% refSatData.GALILEO.series(i).sat_X(j)
|
||||||
|
% refSatData.GALILEO.series(i).sat_Y(j)
|
||||||
|
% refSatData.GALILEO.series(i).sat_Z(j)
|
||||||
|
% refSatData.GALILEO.series(i).sat_vX(j)
|
||||||
|
% refSatData.GALILEO.series(i).sat_vY(j)
|
||||||
|
% refSatData.GALILEO.series(i).sat_vZ(j)
|
||||||
|
% refSatData.GALILEO.series(i).azimuth(j)
|
||||||
|
% refSatData.GALILEO.series(i).elevation(j)
|
||||||
|
% refSatData.GALILEO.series(i).range(j)
|
||||||
|
% refSatData.GALILEO.series(i).pr_m(j)
|
||||||
|
% refSatData.GALILEO.series(i).pr_rate(j)
|
||||||
|
% refSatData.GALILEO.series(i).iono_delay(j)
|
||||||
|
% refSatData.GALILEO.series(i).tropo_delay(j)
|
||||||
|
% refSatData.GALILEO.series(i).pr_error(j)
|
||||||
|
% refSatData.GALILEO.series(i).signal_dB(j)
|
||||||
|
% refSatData.GALILEO.series(i).ant_azimuth(j)
|
||||||
|
% refSatData.GALILEO.series(i).ant_elevation(j)
|
||||||
|
% refSatData.GALILEO.series(i).range_rate(j)
|
||||||
|
% refSatData.GALILEO.series(i).pr_Error_rate(j)
|
||||||
|
% refSatData.GALILEO.series(i).doppler_shift(j)
|
||||||
|
% refSatData.GALILEO.series(i).delta_range(j)
|
||||||
|
% refSatData.GALILEO.series(i).sat_Acc_X(j)
|
||||||
|
% refSatData.GALILEO.series(i).sat_Acc_Y(j)
|
||||||
|
% refSatData.GALILEO.series(i).sat_Acc_Z(j)
|
||||||
|
% %
|
||||||
|
% -------------------------------------------------------------------------
|
||||||
|
% USE EXAMPLE: refSatData = SpirentSatData2struct('..\log_spirent\sat_data_V1A1_SPF_LD_05.csv')
|
||||||
|
% -------------------------------------------------------------------------
|
||||||
|
%
|
||||||
|
% GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
|
||||||
|
% This file is part of GNSS-SDR.
|
||||||
|
%
|
||||||
|
% Copyright (C) 2010-2019 (see AUTHORS file for a list of contributors)
|
||||||
|
% SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
%
|
||||||
|
% -------------------------------------------------------------------------
|
||||||
|
% SPDX-FileCopyrightText: 2022 gomezlma(at)inta.es
|
||||||
|
% SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function [refSatData] = SpirentSatData2struct(path_to_sat_V1_csv)
|
||||||
|
|
||||||
|
% if ~exist('gps_l1_ca_read_pvt_raw_dump.m', 'file')
|
||||||
|
% addpath('./libs')
|
||||||
|
% end
|
||||||
|
%
|
||||||
|
% if ~exist('cat2geo.m', 'file')
|
||||||
|
% addpath('./libs/geoFunctions')
|
||||||
|
% end
|
||||||
|
|
||||||
|
|
||||||
|
%% ===== Import data from text file motion_V1.csv 2 ARRAY ============================
|
||||||
|
|
||||||
|
% Set up the Import Options and import the data
|
||||||
|
opts = delimitedTextImportOptions("NumVariables", 50);
|
||||||
|
|
||||||
|
% Specify range and delimiter
|
||||||
|
opts.DataLines = [6, Inf];
|
||||||
|
opts.Delimiter = ",";
|
||||||
|
|
||||||
|
% Specify column names and types
|
||||||
|
opts.VariableNames = ["Time_ms", "Channel", "Sat_type", "Sat_ID", "Sat_PRN", "Echo_Num", "Sat_Pos_X", "Sat_Pos_Y", "Sat_Pos_Z", "Sat_Vel_X", "Sat_Vel_Y", "Sat_Vel_Z", "Azimuth", "Elevation", "Range", "PRangeGroupA", "PRangeGroupB", "PRangeGroupC", "PRangeGroupD", "PRangeGroupE", "PR_rate", "Iono_delayGroupA", "Iono_delayGroupB", "Iono_delayGroupC", "Iono_delayGroupD", "Iono_delayGroupE", "Tropo_delay", "PR_Error", "Signal_dBGroupA", "Signal_dBGroupB", "Signal_dBGroupC", "Signal_dBGroupD", "Signal_dBGroupE", "Ant_azimuth", "Ant_elevation", "Range_rate", "PR_Error_rate", "Doppler_shiftGroupA", "Doppler_shiftGroupB", "Doppler_shiftGroupC", "Doppler_shiftGroupD", "Doppler_shiftGroupE", "Delta_rangeGroupA", "Delta_rangeGroupB", "Delta_rangeGroupC", "Delta_rangeGroupD", "Delta_rangeGroupE", "Sat_Acc_X", "Sat_Acc_Y", "Sat_Acc_Z"];
|
||||||
|
opts.VariableTypes = ["double", "double", "char", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double"];
|
||||||
|
|
||||||
|
% Specify file level properties
|
||||||
|
opts.ExtraColumnsRule = "ignore";
|
||||||
|
opts.EmptyLineRule = "read";
|
||||||
|
|
||||||
|
% Specify variable properties
|
||||||
|
opts = setvaropts(opts, "Sat_type", "WhitespaceRule", "preserve");
|
||||||
|
opts = setvaropts(opts, "Sat_type", "EmptyFieldRule", "auto");
|
||||||
|
|
||||||
|
% Import the data
|
||||||
|
satdataV1A1SPFLD1 = readtable(path_to_sat_V1_csv, opts);
|
||||||
|
|
||||||
|
%% Convert to output type
|
||||||
|
satdataV1A1SPFLD1 = table2cell(satdataV1A1SPFLD1);
|
||||||
|
numIdx = cellfun(@(x) ~isnan(str2double(x)), satdataV1A1SPFLD1);
|
||||||
|
satdataV1A1SPFLD1(numIdx) = cellfun(@(x) {str2double(x)}, satdataV1A1SPFLD1(numIdx));
|
||||||
|
|
||||||
|
%% Clear temporary variables
|
||||||
|
clear opts
|
||||||
|
%% initialize
|
||||||
|
|
||||||
|
refSatData.GPS=[];
|
||||||
|
refSatData.GALILEO=[];
|
||||||
|
refSatData.GLONASS=[];
|
||||||
|
refSatData.BEIDOU=[];
|
||||||
|
|
||||||
|
%% split by constellations
|
||||||
|
[indGALILEO,~]= find(strcmp(satdataV1A1SPFLD1, 'GALILEO'));
|
||||||
|
[indGPS,~]= find(strcmp(satdataV1A1SPFLD1, 'GPS'));
|
||||||
|
|
||||||
|
GAL=satdataV1A1SPFLD1(indGALILEO,:);GAL(:,3)=[];
|
||||||
|
GPS=satdataV1A1SPFLD1(indGPS,:); GPS(:,3)=[];
|
||||||
|
GAL=cell2mat(GAL);
|
||||||
|
GPS=cell2mat(GPS);
|
||||||
|
%% SPIRENT SAT SOLUTION
|
||||||
|
|
||||||
|
refSatData.GALILEO.SIM_time=unique(GAL(:,1),'first');
|
||||||
|
refSatData.GPS.SIM_time=unique(GPS(:,1),'first');
|
||||||
|
%%
|
||||||
|
k=0;
|
||||||
|
for i=1:length(refSatData.GALILEO.SIM_time)
|
||||||
|
nsats=length(find(GAL(:,1)==refSatData.GALILEO.SIM_time(i)));
|
||||||
|
refSatData.GALILEO.series(i).nsats=nsats;
|
||||||
|
|
||||||
|
for j=1:nsats
|
||||||
|
k=k+1;
|
||||||
|
refSatData.GALILEO.series(i).Sat_ID(j) = GAL(k,3);
|
||||||
|
refSatData.GALILEO.series(i).Sat_ID(j) = GAL(i,3);
|
||||||
|
refSatData.GALILEO.series(i).Sat_PRN(j) = GAL(i,4);
|
||||||
|
refSatData.GALILEO.series(i).sat_X(j) = GAL(k,6);
|
||||||
|
refSatData.GALILEO.series(i).sat_Y(j) = GAL(k,7);
|
||||||
|
refSatData.GALILEO.series(i).sat_Z(j) = GAL(k,8);
|
||||||
|
refSatData.GALILEO.series(i).sat_vX(j) = GAL(k,9);
|
||||||
|
refSatData.GALILEO.series(i).sat_vY(j) = GAL(k,10);
|
||||||
|
refSatData.GALILEO.series(i).sat_vZ(j) = GAL(k,11);
|
||||||
|
refSatData.GALILEO.series(i).azimuth(j) = GAL(k,12);
|
||||||
|
refSatData.GALILEO.series(i).elevation(j) = GAL(k,13);
|
||||||
|
refSatData.GALILEO.series(i).range(j) = GAL(k,14);
|
||||||
|
refSatData.GALILEO.series(i).pr_m(j) = GAL(k,15);
|
||||||
|
refSatData.GALILEO.series(i).pr_rate(j) = GAL(k,20);
|
||||||
|
refSatData.GALILEO.series(i).iono_delay(j) = GAL(k,21);
|
||||||
|
refSatData.GALILEO.series(i).tropo_delay(j) = GAL(k,26);%
|
||||||
|
refSatData.GALILEO.series(i).pr_error(j) = GAL(k,27);
|
||||||
|
refSatData.GALILEO.series(i).signal_dB(j) = GAL(k,28);
|
||||||
|
refSatData.GALILEO.series(i).ant_azimuth(j) = GAL(k,33);
|
||||||
|
refSatData.GALILEO.series(i).ant_elevation(j) = GAL(k,34);
|
||||||
|
refSatData.GALILEO.series(i).range_rate(j) = GAL(k,35);
|
||||||
|
refSatData.GALILEO.series(i).pr_Error_rate(j) = GAL(k,36);
|
||||||
|
refSatData.GALILEO.series(i).doppler_shift(j) = GAL(k,37);
|
||||||
|
refSatData.GALILEO.series(i).delta_range(j) = GAL(k,42);
|
||||||
|
refSatData.GALILEO.series(i).sat_Acc_X(j) = GAL(k,47);
|
||||||
|
refSatData.GALILEO.series(i).sat_Acc_Y(j) = GAL(k,48);
|
||||||
|
refSatData.GALILEO.series(i).sat_Acc_Z(j) = GAL(k,49);
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
%% -------------------------------------
|
||||||
|
k=0;
|
||||||
|
for i=1:length(refSatData.GPS.SIM_time)
|
||||||
|
nsats=length(find(GPS(:,1)==refSatData.GPS.SIM_time(i)));
|
||||||
|
refSatData.GPS.series(i).nsats=nsats;
|
||||||
|
|
||||||
|
for j=1:nsats
|
||||||
|
|
||||||
|
k=k+1;
|
||||||
|
refSatData.GPS.series(i).Sat_ID(j) = GPS(k,3);
|
||||||
|
refSatData.GPS.series(i).Sat_PRN(j) = GPS(k,4);
|
||||||
|
refSatData.GPS.series(i).sat_X(j) = GPS(k,6);
|
||||||
|
refSatData.GPS.series(i).sat_Y(j) = GPS(k,7);
|
||||||
|
refSatData.GPS.series(i).sat_Z(j) = GPS(k,8);
|
||||||
|
refSatData.GPS.series(i).sat_vX(j) = GPS(k,9);
|
||||||
|
refSatData.GPS.series(i).sat_vY(j) = GPS(k,10);
|
||||||
|
refSatData.GPS.series(i).sat_vZ(j) = GPS(k,11);
|
||||||
|
refSatData.GPS.series(i).azimuth(j) = GPS(k,12);
|
||||||
|
refSatData.GPS.series(i).elevation(j) = GPS(k,13);
|
||||||
|
refSatData.GPS.series(i).range(j) = GPS(k,14);
|
||||||
|
refSatData.GPS.series(i).pr_m(j) = GPS(k,15);
|
||||||
|
refSatData.GPS.series(i).pr_rate(j) = GPS(k,20);
|
||||||
|
refSatData.GPS.series(i).iono_delay(j) = GPS(k,21);
|
||||||
|
refSatData.GPS.series(i).tropo_delay(j) = GPS(k,26);%
|
||||||
|
refSatData.GPS.series(i).pr_error(j) = GPS(k,27);
|
||||||
|
refSatData.GPS.series(i).signal_dB(j) = GPS(k,28);
|
||||||
|
refSatData.GPS.series(i).ant_azimuth(j) = GPS(k,33);
|
||||||
|
refSatData.GPS.series(i).ant_elevation(j) = GPS(k,34);
|
||||||
|
refSatData.GPS.series(i).range_rate(j) = GPS(k,35);
|
||||||
|
refSatData.GPS.series(i).pr_Error_rate(j) = GPS(k,36);
|
||||||
|
refSatData.GPS.series(i).doppler_shift(j) = GPS(k,37);
|
||||||
|
refSatData.GPS.series(i).delta_range(j) = GPS(k,42);
|
||||||
|
refSatData.GPS.series(i).sat_Acc_X(j) = GPS(k,47);
|
||||||
|
refSatData.GPS.series(i).sat_Acc_Y(j) = GPS(k,48);
|
||||||
|
refSatData.GPS.series(i).sat_Acc_Z(j) = GPS(k,49);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
% Clear temporary variables
|
||||||
|
clear satdataV1A1SPFLD05 GPS GAL
|
||||||
|
end
|
93
src/utils/matlab/vtl/Vtl2struct.m
Normal file
93
src/utils/matlab/vtl/Vtl2struct.m
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
%% Import data from text file
|
||||||
|
% Script for importing data from the following text file:
|
||||||
|
%
|
||||||
|
% filename: D:\virtualBOX_VM\ubuntu20\ubuntu20\shareFolder\myWork\results\spirent_usrp_airing\dump_vtl_file.csv
|
||||||
|
%
|
||||||
|
% %
|
||||||
|
% -------------------------------------------------------------------------
|
||||||
|
% USE EXAMPLE: vtlSolution = Vtl2struct('dump_vtl_file.csv')
|
||||||
|
% -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
% Auto-generated by MATLAB on 24-Nov-2022 17:34:27
|
||||||
|
function [vtlSolution] = Vtl2struct(path_to_vtl_csv)
|
||||||
|
%% Set up the Import Options and import the data
|
||||||
|
opts = delimitedTextImportOptions("NumVariables", 9);
|
||||||
|
|
||||||
|
% Specify range and delimiter
|
||||||
|
opts.DataLines = [1, Inf];
|
||||||
|
opts.Delimiter = ",";
|
||||||
|
|
||||||
|
% Specify column names and types
|
||||||
|
opts.VariableNames = ["kf_state", "e06", "VarName3", "e06_1", "VarName5", "VarName6", "VarName7", "VarName8", "VarName9"];
|
||||||
|
opts.VariableTypes = ["char", "double", "double", "double", "double", "double", "double", "double", "double"];
|
||||||
|
|
||||||
|
% Specify file level properties
|
||||||
|
opts.ExtraColumnsRule = "ignore";
|
||||||
|
opts.EmptyLineRule = "read";
|
||||||
|
|
||||||
|
% Specify variable properties
|
||||||
|
opts = setvaropts(opts, "kf_state", "WhitespaceRule", "preserve");
|
||||||
|
opts = setvaropts(opts, "kf_state", "EmptyFieldRule", "auto");
|
||||||
|
|
||||||
|
% Import the data
|
||||||
|
dumpvtlfile = readtable(path_to_vtl_csv, opts);
|
||||||
|
|
||||||
|
%% Convert to output type
|
||||||
|
dumpvtlfile = table2cell(dumpvtlfile);
|
||||||
|
numIdx = cellfun(@(x) ~isnan(str2double(x)), dumpvtlfile);
|
||||||
|
dumpvtlfile(numIdx) = cellfun(@(x) {str2double(x)}, dumpvtlfile(numIdx));
|
||||||
|
|
||||||
|
%% Clear temporary variables
|
||||||
|
clear opts
|
||||||
|
%%
|
||||||
|
|
||||||
|
vtlSolution.kfpvt=[];
|
||||||
|
vtlSolution.rtklibpvt=[];
|
||||||
|
|
||||||
|
%% split by solution type
|
||||||
|
[indKF,~]= find(strcmp(dumpvtlfile, 'kf_state'));
|
||||||
|
[indRTKlib,~]= find(strcmp(dumpvtlfile, 'rtklib_state'));
|
||||||
|
[indkf_err,~]= find(strcmp(dumpvtlfile, 'kf_xerr'));
|
||||||
|
[ind_LOS,~]= find(strcmp(dumpvtlfile, 'sat_first_LOS'));
|
||||||
|
|
||||||
|
kfpvt=dumpvtlfile(indKF,:);kfpvt(:,1)=[];
|
||||||
|
rtklibpvt=dumpvtlfile(indRTKlib,:); rtklibpvt(:,1)=[];
|
||||||
|
kferr=dumpvtlfile(indkf_err,:); kferr(:,1)=[];
|
||||||
|
LOS=dumpvtlfile(ind_LOS,:); LOS(:,1)=[];
|
||||||
|
|
||||||
|
kfpvt=cell2mat(kfpvt);
|
||||||
|
rtklibpvt=cell2mat(rtklibpvt);
|
||||||
|
kferr=cell2mat(kferr);
|
||||||
|
LOS=cell2mat(LOS);
|
||||||
|
|
||||||
|
vtlSolution.kfpvt.X=kfpvt(:,1);
|
||||||
|
vtlSolution.kfpvt.Y=kfpvt(:,2);
|
||||||
|
vtlSolution.kfpvt.Z=kfpvt(:,3);
|
||||||
|
vtlSolution.kfpvt.vX=kfpvt(:,4);
|
||||||
|
vtlSolution.kfpvt.vY=kfpvt(:,5);
|
||||||
|
vtlSolution.kfpvt.vZ=kfpvt(:,6);
|
||||||
|
vtlSolution.kfpvt.biasclock=kfpvt(:,7);
|
||||||
|
vtlSolution.kfpvt.rateblock=kfpvt(:,8);
|
||||||
|
|
||||||
|
vtlSolution.rtklibpvt.X=rtklibpvt(:,1);
|
||||||
|
vtlSolution.rtklibpvt.Y=rtklibpvt(:,2);
|
||||||
|
vtlSolution.rtklibpvt.Z=rtklibpvt(:,3);
|
||||||
|
vtlSolution.rtklibpvt.vX=rtklibpvt(:,4);
|
||||||
|
vtlSolution.rtklibpvt.vY=rtklibpvt(:,5);
|
||||||
|
vtlSolution.rtklibpvt.vZ=rtklibpvt(:,6);
|
||||||
|
vtlSolution.rtklibpvt.biasclock=rtklibpvt(:,7);
|
||||||
|
vtlSolution.rtklibpvt.rateblock=rtklibpvt(:,8);
|
||||||
|
|
||||||
|
vtlSolution.kferr.X=kferr(:,1);
|
||||||
|
vtlSolution.kferr.Y=kferr(:,2);
|
||||||
|
vtlSolution.kferr.Z=kferr(:,3);
|
||||||
|
vtlSolution.kferr.vX=kferr(:,4);
|
||||||
|
vtlSolution.kferr.vY=kferr(:,5);
|
||||||
|
vtlSolution.kferr.vZ=kferr(:,6);
|
||||||
|
vtlSolution.kferr.biasclock=kferr(:,7);
|
||||||
|
vtlSolution.kferr.rateblock=kferr(:,8);
|
||||||
|
|
||||||
|
vtlSolution.LOSx=LOS(:,1);
|
||||||
|
vtlSolution.LOSy=LOS(:,2);
|
||||||
|
vtlSolution.LOSz=LOS(:,3);
|
||||||
|
end
|
198
src/utils/matlab/vtl/general_raw_plot.m
Normal file
198
src/utils/matlab/vtl/general_raw_plot.m
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
%general_raw_plot.m
|
||||||
|
|
||||||
|
%% ====== FILTERING =======================================================
|
||||||
|
moving_avg_factor= 500;
|
||||||
|
LAT_FILT = movmean(navSolution.latitude,moving_avg_factor);
|
||||||
|
LON_FILT = movmean(navSolution.longitude,moving_avg_factor);
|
||||||
|
HEIGH_FILT = movmean(navSolution.height,moving_avg_factor);
|
||||||
|
|
||||||
|
X_FILT = movmean(navSolution.X,moving_avg_factor);
|
||||||
|
Y_FILT = movmean(navSolution.Y,moving_avg_factor);
|
||||||
|
Z_FILT = movmean(navSolution.Z,moving_avg_factor);
|
||||||
|
|
||||||
|
vX_FILT = movmean(navSolution.vX,moving_avg_factor);
|
||||||
|
vY_FILT = movmean(navSolution.vY,moving_avg_factor);
|
||||||
|
vZ_FILT = movmean(navSolution.vZ,moving_avg_factor);
|
||||||
|
|
||||||
|
% navSolution.X(navSolution.X==0) = [];
|
||||||
|
%% ====== GNSS-SDR Plot all figures =======================================================
|
||||||
|
close all
|
||||||
|
%--- LLH POSITION: GNSS SDR plot on map --------------------------------------
|
||||||
|
LLH=figure('Name','LLH system on map');
|
||||||
|
geoplot([navSolution.latitude],[navSolution.longitude],'.')
|
||||||
|
geobasemap satellite
|
||||||
|
hold on
|
||||||
|
geoplot(LAT_FILT,LON_FILT,'r.')
|
||||||
|
title('Position in LLH on map ')
|
||||||
|
legend ('raw',['moving avg:' num2str(moving_avg_factor)],'Location','southeast')
|
||||||
|
% geobasemap streets
|
||||||
|
% geobasemap topographic
|
||||||
|
% geobasemap streets-dark
|
||||||
|
|
||||||
|
%---VELOCITY: GNSS SDR plot --------------------------------------
|
||||||
|
VEL=figure('Name','velocities and heigh');
|
||||||
|
subplot(2,2,1);
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),navSolution.vX,'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),vX_FILT,'r.');
|
||||||
|
ylabel('vX (m/s)')
|
||||||
|
xlabel('time from First FIX in (seconds)')
|
||||||
|
title('Subplot 1: vX GOR')
|
||||||
|
legend ('raw',['moving avg:' num2str(moving_avg_factor)],'Location','southeast')
|
||||||
|
|
||||||
|
subplot(2,2,2);
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),navSolution.vY,'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),vY_FILT,'r.');
|
||||||
|
ylabel('vY (m/s)')
|
||||||
|
xlabel('time from First FIX in (seconds)')
|
||||||
|
title('Subplot 2: vY')
|
||||||
|
legend ('raw',['moving avg:' num2str(moving_avg_factor)],'Location','southeast')
|
||||||
|
|
||||||
|
subplot(2,2,3);
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),navSolution.vZ,'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),vZ_FILT,'r.');
|
||||||
|
ylabel('vZ (m/s)')
|
||||||
|
xlabel('time from First FIX in (seconds)')
|
||||||
|
title('Subplot 3: vZ')
|
||||||
|
legend ('raw',['moving avg:' num2str(moving_avg_factor)],'Location','southeast')
|
||||||
|
|
||||||
|
subplot(2,2,4);
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),navSolution.height,'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),HEIGH_FILT,'r.');
|
||||||
|
ylabel('HEIGH (m)')
|
||||||
|
xlabel('time from First FIX in (seconds)')
|
||||||
|
title('Subplot 4: HEIGH')
|
||||||
|
legend ('raw',['moving avg:' num2str(moving_avg_factor)],'Location','southeast')
|
||||||
|
|
||||||
|
sgtitle('velocities and heigh')
|
||||||
|
|
||||||
|
% --- UTM centered POSITION: GNSS SDR plot --------------------------------------
|
||||||
|
|
||||||
|
POS=figure('Name','UTM COORD CENTERED IN 1^{ST} POSITION');
|
||||||
|
subplot(2,2,1);
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),navSolution.X-refSolution.X(1),'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),X_FILT-refSolution.X(1),'r.');
|
||||||
|
ylabel('X (m)')
|
||||||
|
xlabel('time from First FIX in (seconds)')
|
||||||
|
% ylim([-55 100])
|
||||||
|
title('Subplot 1: X GOR')
|
||||||
|
legend ('raw',['moving avg:' num2str(moving_avg_factor)],'Location','east')
|
||||||
|
|
||||||
|
subplot(2,2,2);
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),navSolution.Y-refSolution.Y(1),'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),Y_FILT-refSolution.Y(1),'r.');
|
||||||
|
ylabel('Y (m)')
|
||||||
|
xlabel('time from First FIX in (seconds)')
|
||||||
|
% ylim([-140 -20])
|
||||||
|
title('Subplot 2: Y')
|
||||||
|
legend ('raw',['moving avg:' num2str(moving_avg_factor)],'Location','east')
|
||||||
|
|
||||||
|
subplot(2,2,3);
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),navSolution.Z-refSolution.Z(1),'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),Z_FILT-refSolution.Z(1),'r.');
|
||||||
|
ylabel('Z (m)')
|
||||||
|
xlabel('time from First FIX in (seconds)')
|
||||||
|
% ylim([-150 20])
|
||||||
|
title('Subplot 3: Z')
|
||||||
|
legend ('raw',['moving avg:' num2str(moving_avg_factor)],'Location','east')
|
||||||
|
|
||||||
|
sgtitle('UTM COORD CENTERED IN 1^{ST} POSITION')
|
||||||
|
|
||||||
|
% --- UTM full POSITION: GNSS SDR plot --------------------------------------
|
||||||
|
|
||||||
|
POS_utm=figure('Name','UTM COORD IN 1^{ST} POSITION');
|
||||||
|
subplot(2,2,1);
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),navSolution.X,'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),X_FILT,'r.');
|
||||||
|
ylabel('X (m)')
|
||||||
|
xlabel('time from First FIX in (seconds)')
|
||||||
|
% ylim([-55 100])
|
||||||
|
title('Subplot 1: X GOR')
|
||||||
|
legend ('raw',['moving avg:' num2str(moving_avg_factor)],'Location','east')
|
||||||
|
|
||||||
|
subplot(2,2,2);
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),navSolution.Y,'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),Y_FILT,'r.');
|
||||||
|
ylabel('Y (m)')
|
||||||
|
xlabel('time from First FIX in (seconds)')
|
||||||
|
% ylim([-140 -20])
|
||||||
|
title('Subplot 2: Y')
|
||||||
|
legend ('raw',['moving avg:' num2str(moving_avg_factor)],'Location','east')
|
||||||
|
|
||||||
|
subplot(2,2,3);
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),navSolution.Z,'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),Z_FILT,'r.');
|
||||||
|
ylabel('Z (m)')
|
||||||
|
xlabel('time from First FIX in (seconds)')
|
||||||
|
% ylim([-150 20])
|
||||||
|
title('Subplot 3: Z')
|
||||||
|
legend ('raw',['moving avg:' num2str(moving_avg_factor)],'Location','east')
|
||||||
|
|
||||||
|
sgtitle('UTM COORD FULL IN 1^{ST} POSITION')
|
||||||
|
|
||||||
|
%% ====== SPIRENT Plot all figures =======================================================
|
||||||
|
if(plot_reference)
|
||||||
|
%--- LLH POSITION: SPIRENT plot on map --------------------------------------
|
||||||
|
figure(LLH)
|
||||||
|
geoplot([refSolution.latitude],[refSolution.longitude],'.','DisplayName','reference')
|
||||||
|
geobasemap satellite
|
||||||
|
hold off
|
||||||
|
% geobasemap streets
|
||||||
|
% geobasemap topographic
|
||||||
|
% geobasemap streets-dark
|
||||||
|
|
||||||
|
%---VELOCITY: SPIRENT plot --------------------------------------
|
||||||
|
figure(VEL)
|
||||||
|
subplot(2,2,1);
|
||||||
|
plot(refSolution.SIM_time/1000-TTFF_sec,refSolution.vX,'.','DisplayName','reference');
|
||||||
|
hold off;grid on
|
||||||
|
|
||||||
|
subplot(2,2,2);
|
||||||
|
plot(refSolution.SIM_time/1000-TTFF_sec,refSolution.vY,'.','DisplayName','reference');
|
||||||
|
hold on;grid on
|
||||||
|
|
||||||
|
subplot(2,2,3);
|
||||||
|
plot(refSolution.SIM_time/1000-TTFF_sec,refSolution.vZ,'.','DisplayName','reference');
|
||||||
|
hold on;grid on
|
||||||
|
|
||||||
|
subplot(2,2,4);
|
||||||
|
plot(refSolution.SIM_time/1000-TTFF_sec,refSolution.height,'.','DisplayName','reference');
|
||||||
|
hold on;grid on
|
||||||
|
|
||||||
|
%---UTM centered POSITION: SPIRENT plot --------------------------------------
|
||||||
|
figure(POS)
|
||||||
|
subplot(2,2,1);
|
||||||
|
plot(refSolution.SIM_time/1000-TTFF_sec,refSolution.X-refSolution.X(1),'.','DisplayName','reference');
|
||||||
|
hold off;grid on
|
||||||
|
|
||||||
|
subplot(2,2,2);
|
||||||
|
plot(refSolution.SIM_time/1000-TTFF_sec,refSolution.Y-refSolution.Y(1),'.','DisplayName','reference');
|
||||||
|
hold on;grid on
|
||||||
|
|
||||||
|
subplot(2,2,3);
|
||||||
|
plot(refSolution.SIM_time/1000-TTFF_sec,refSolution.Z-refSolution.Z(1),'.','DisplayName','reference');
|
||||||
|
hold on;grid on
|
||||||
|
|
||||||
|
%---UTM POSITION: SPIRENT plot --------------------------------------
|
||||||
|
figure(POS_utm)
|
||||||
|
subplot(2,2,1);
|
||||||
|
plot(refSolution.SIM_time/1000-TTFF_sec,refSolution.X,'.','DisplayName','reference');
|
||||||
|
hold off;grid on
|
||||||
|
|
||||||
|
subplot(2,2,2);
|
||||||
|
plot(refSolution.SIM_time/1000-TTFF_sec,refSolution.Y,'.','DisplayName','reference');
|
||||||
|
hold on;grid on
|
||||||
|
|
||||||
|
subplot(2,2,3);
|
||||||
|
plot(refSolution.SIM_time/1000-TTFF_sec,refSolution.Z,'.','DisplayName','reference');
|
||||||
|
hold on;grid on
|
||||||
|
end
|
466
src/utils/matlab/vtl/gps_l1_ca_pvt_raw_from_MAT.m
Normal file
466
src/utils/matlab/vtl/gps_l1_ca_pvt_raw_from_MAT.m
Normal file
@ -0,0 +1,466 @@
|
|||||||
|
% Read PVG raw dump
|
||||||
|
% -------------------------------------------------------------------------
|
||||||
|
%
|
||||||
|
% GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
|
||||||
|
% This file is part of GNSS-SDR.
|
||||||
|
%
|
||||||
|
% Copyright (C) 2010-2019 (see AUTHORS file for a list of contributors)
|
||||||
|
% SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
%
|
||||||
|
% -------------------------------------------------------------------------
|
||||||
|
%
|
||||||
|
%%
|
||||||
|
clc
|
||||||
|
close all;
|
||||||
|
clear all;
|
||||||
|
|
||||||
|
% if ~exist('gps_l1_ca_read_pvt_raw_dump.m', 'file')
|
||||||
|
% addpath('./libs')
|
||||||
|
% end
|
||||||
|
%
|
||||||
|
% if ~exist('cat2geo.m', 'file')
|
||||||
|
% addpath('./libs/geoFunctions')
|
||||||
|
% end
|
||||||
|
|
||||||
|
%%
|
||||||
|
samplingFreq=25000000;
|
||||||
|
channels=6;
|
||||||
|
TTFF_sec=41.48;
|
||||||
|
path='';
|
||||||
|
pvt_raw_log_path=[path 'PVT_raw.dat'];
|
||||||
|
% GNSS_PVT_raw= gps_l1_ca_read_pvt_raw_dump(channels,pvt_raw_log_path);
|
||||||
|
GnssSDR2struct('PVT_raw.mat')
|
||||||
|
|
||||||
|
%% ===== Import data from text file motion_V1.csv 2 ARRAY ============================
|
||||||
|
% Script for importing data from the following text file:
|
||||||
|
%
|
||||||
|
% filename: D:\virtualBOX_VM\ubuntu20\ubuntu20\shareFolder\myWork\results\log_spirent\motion_V1.csv
|
||||||
|
%
|
||||||
|
% Auto-generated by MATLAB on 20-Nov-2022 12:31:17
|
||||||
|
|
||||||
|
% Set up the Import Options and import the data
|
||||||
|
opts = delimitedTextImportOptions("NumVariables", 38);
|
||||||
|
|
||||||
|
% Specify range and delimiter
|
||||||
|
opts.DataLines = [3, Inf];
|
||||||
|
opts.Delimiter = ",";
|
||||||
|
|
||||||
|
% Specify column names and types
|
||||||
|
opts.VariableNames = ["Time_ms", "Pos_X", "Pos_Y", "Pos_Z", "Vel_X", "Vel_Y", "Vel_Z", "Acc_X", "Acc_Y", "Acc_Z", "Jerk_X", "Jerk_Y", "Jerk_Z", "Lat", "Long", "Height", "Heading", "Elevation", "Bank", "Angvel_X", "Angvel_Y", "Angvel_Z", "Angacc_X", "Angacc_Y", "Angacc_Z", "Ant1_Pos_X", "Ant1_Pos_Y", "Ant1_Pos_Z", "Ant1_Vel_X", "Ant1_Vel_Y", "Ant1_Vel_Z", "Ant1_Acc_X", "Ant1_Acc_Y", "Ant1_Acc_Z", "Ant1_Lat", "Ant1_Long", "Ant1_Height", "Ant1_DOP"];
|
||||||
|
opts.VariableTypes = ["double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double"];
|
||||||
|
|
||||||
|
% Specify file level properties
|
||||||
|
opts.ExtraColumnsRule = "ignore";
|
||||||
|
opts.EmptyLineRule = "read";
|
||||||
|
|
||||||
|
% Import the data
|
||||||
|
motionV1 = readtable("..\log_spirent\motion_V1_SPF_LD_05.csv", opts);
|
||||||
|
|
||||||
|
% Convert to output type
|
||||||
|
motionV1 = table2array(motionV1);
|
||||||
|
|
||||||
|
% Clear temporary variables
|
||||||
|
clear opts
|
||||||
|
|
||||||
|
%% ============================ PARSER TO STRUCT ============================
|
||||||
|
plot_skyplot=1;
|
||||||
|
%% GNSS SDR SOLUTION
|
||||||
|
% navSolution.samplingFreq=25000000;
|
||||||
|
% navSolution.channels=6;
|
||||||
|
|
||||||
|
navSolution.solution_status=solution_status;
|
||||||
|
navSolution.solution_type=solution_type;
|
||||||
|
navSolution.valid_sats=valid_sats;
|
||||||
|
|
||||||
|
navSolution.RX_time=RX_time;
|
||||||
|
navSolution.TOW_at_current_symbol_ms=TOW_at_current_symbol_ms;
|
||||||
|
|
||||||
|
navSolution.X=pos_x;
|
||||||
|
navSolution.Y=pos_y;
|
||||||
|
navSolution.Z=pos_z;
|
||||||
|
|
||||||
|
navSolution.latitude=latitude;
|
||||||
|
navSolution.longitude=longitude;
|
||||||
|
navSolution.height=height;
|
||||||
|
|
||||||
|
navSolution.pdop=pdop;
|
||||||
|
navSolution.gdop=gdop;
|
||||||
|
navSolution.hdop=hdop;
|
||||||
|
|
||||||
|
navSolution.vX=vel_x;
|
||||||
|
navSolution.vY=vel_y;
|
||||||
|
navSolution.vZ=vel_z;
|
||||||
|
|
||||||
|
navSolution.vdop=vdop;
|
||||||
|
|
||||||
|
navSolution.week=week;
|
||||||
|
|
||||||
|
%% SPIRENT REFERENCE SOLUTION
|
||||||
|
|
||||||
|
refSolution.SIM_time=motionV1(:,1);
|
||||||
|
|
||||||
|
refSolution.X=motionV1(:,2);
|
||||||
|
refSolution.Y=motionV1(:,3);
|
||||||
|
refSolution.Z=motionV1(:,4);
|
||||||
|
|
||||||
|
refSolution.vX=motionV1(:,5);
|
||||||
|
refSolution.vY=motionV1(:,6);
|
||||||
|
refSolution.vZ=motionV1(:,7);
|
||||||
|
|
||||||
|
refSolution.aX=motionV1(:,8);
|
||||||
|
refSolution.aY=motionV1(:,9);
|
||||||
|
refSolution.aZ=motionV1(:,10);
|
||||||
|
|
||||||
|
refSolution.jX=motionV1(:,11);
|
||||||
|
refSolution.jY=motionV1(:,12);
|
||||||
|
refSolution.jZ=motionV1(:,13);
|
||||||
|
|
||||||
|
refSolution.latitude=rad2deg(motionV1(:,14));
|
||||||
|
refSolution.longitude=rad2deg(motionV1(:,15));
|
||||||
|
refSolution.height=motionV1(:,16);
|
||||||
|
|
||||||
|
refSolution.dop=motionV1(:,38);
|
||||||
|
|
||||||
|
% Clear temporary variables
|
||||||
|
clear motionV1
|
||||||
|
%% === Convert to UTM coordinate system =============================
|
||||||
|
|
||||||
|
% Scenario latitude is xx.xxxxxxx N37 49 9.98
|
||||||
|
% Scenario longitude is -xx.xxxxxxx W122 28 42.58
|
||||||
|
% Scenario elevation is 35 meters.
|
||||||
|
% lat=[37 49 9.98];
|
||||||
|
% long=[-122 -28 -42.58];
|
||||||
|
% lat_deg=dms2deg(lat);
|
||||||
|
% long_deg=dms2deg(long);
|
||||||
|
% h=35;
|
||||||
|
|
||||||
|
lat_deg=navSolution.latitude(1);
|
||||||
|
lon_deg=navSolution.longitude(1);
|
||||||
|
lat=degrees2dms(lat_deg);
|
||||||
|
lon=degrees2dms(lon_deg);
|
||||||
|
h=navSolution.height(1);
|
||||||
|
|
||||||
|
|
||||||
|
utmstruct = defaultm('utm');
|
||||||
|
utmstruct.zone = utmzone(lat_deg, lon_deg);
|
||||||
|
utmstruct = defaultm(utmstruct);
|
||||||
|
[utmstruct.latlim,utmstruct.lonlim] = utmzone(utmstruct.zone );
|
||||||
|
%Choices i of Reference Ellipsoid
|
||||||
|
% 1. International Ellipsoid 1924
|
||||||
|
% 2. International Ellipsoid 1967
|
||||||
|
% 3. World Geodetic System 1972
|
||||||
|
% 4. Geodetic Reference System 1980
|
||||||
|
% 5. World Geodetic System 1984
|
||||||
|
|
||||||
|
utmstruct.geoid = wgs84Ellipsoid;
|
||||||
|
|
||||||
|
% [X, Y] = projfwd(utmstruct,lat_deg,lon_deg);
|
||||||
|
% Z=h; % geographical to cartesian conversion
|
||||||
|
|
||||||
|
|
||||||
|
% for k=1:1:length(navSolution.X)
|
||||||
|
% [navSolution.E(k), ...
|
||||||
|
% navSolution.N(k), ...
|
||||||
|
% navSolution.U(k)]=cart2utm(navSolution.X(k), navSolution.Y(k), navSolution.Z(k), utmZone);
|
||||||
|
% end
|
||||||
|
|
||||||
|
%% ====== FILTERING =======================================================
|
||||||
|
moving_avg_factor= 500;
|
||||||
|
LAT_FILT = movmean(navSolution.latitude,moving_avg_factor);
|
||||||
|
LON_FILT = movmean(navSolution.longitude,moving_avg_factor);
|
||||||
|
HEIGH_FILT = movmean(navSolution.height,moving_avg_factor);
|
||||||
|
|
||||||
|
X_FILT = movmean(navSolution.X,moving_avg_factor);
|
||||||
|
Y_FILT = movmean(navSolution.Y,moving_avg_factor);
|
||||||
|
Z_FILT = movmean(navSolution.Z,moving_avg_factor);
|
||||||
|
|
||||||
|
vX_FILT = movmean(navSolution.vX,moving_avg_factor);
|
||||||
|
vY_FILT = movmean(navSolution.vY,moving_avg_factor);
|
||||||
|
vZ_FILT = movmean(navSolution.vZ,moving_avg_factor);
|
||||||
|
|
||||||
|
%% ====== GNSS-SDR Plot all figures =======================================================
|
||||||
|
close all
|
||||||
|
%--- LLH POSITION: GNSS SDR plot on map --------------------------------------
|
||||||
|
LLH=figure('Name','LLH system on map');
|
||||||
|
geoplot([navSolution.latitude],[navSolution.longitude],'.')
|
||||||
|
geobasemap satellite
|
||||||
|
hold on
|
||||||
|
geoplot([LAT_FILT],[LON_FILT],'r.')
|
||||||
|
title('Position in LLH on map ')
|
||||||
|
legend ('raw',['moving avg:' num2str(moving_avg_factor)],'Location','southeast')
|
||||||
|
% geobasemap streets
|
||||||
|
% geobasemap topographic
|
||||||
|
% geobasemap streets-dark
|
||||||
|
|
||||||
|
%---VELOCITY: GNSS SDR plot --------------------------------------
|
||||||
|
VEL=figure('Name','velocities and heigh');
|
||||||
|
subplot(2,2,1);
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),navSolution.vX,'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),vX_FILT,'r.');
|
||||||
|
ylabel('vX (m/s)')
|
||||||
|
xlabel('time from First FIX in (seconds)')
|
||||||
|
title('Subplot 1: vX GOR')
|
||||||
|
legend ('raw',['moving avg:' num2str(moving_avg_factor)],'Location','southeast')
|
||||||
|
|
||||||
|
subplot(2,2,2);
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),navSolution.vY,'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),vY_FILT,'r.');
|
||||||
|
ylabel('vY (m/s)')
|
||||||
|
xlabel('time from First FIX in (seconds)')
|
||||||
|
title('Subplot 2: vY')
|
||||||
|
legend ('raw',['moving avg:' num2str(moving_avg_factor)],'Location','southeast')
|
||||||
|
|
||||||
|
subplot(2,2,3);
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),navSolution.vZ,'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),vZ_FILT,'r.');
|
||||||
|
ylabel('vZ (m/s)')
|
||||||
|
xlabel('time from First FIX in (seconds)')
|
||||||
|
title('Subplot 3: vZ')
|
||||||
|
legend ('raw',['moving avg:' num2str(moving_avg_factor)],'Location','southeast')
|
||||||
|
|
||||||
|
subplot(2,2,4);
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),navSolution.height,'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),HEIGH_FILT,'r.');
|
||||||
|
ylabel('HEIGH (m)')
|
||||||
|
xlabel('time from First FIX in (seconds)')
|
||||||
|
title('Subplot 4: HEIGH')
|
||||||
|
legend ('raw',['moving avg:' num2str(moving_avg_factor)],'Location','southeast')
|
||||||
|
|
||||||
|
sgtitle('velocities and heigh')
|
||||||
|
|
||||||
|
% --- UTM centered POSITION: GNSS SDR plot --------------------------------------
|
||||||
|
|
||||||
|
POS=figure('Name','UTM COORD CENTERED IN 1^{ST} POSITION');
|
||||||
|
subplot(2,2,1);
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),navSolution.X-refSolution.X(1),'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),X_FILT-refSolution.X(1),'r.');
|
||||||
|
ylabel('X (m)')
|
||||||
|
xlabel('time from First FIX in (seconds)')
|
||||||
|
title('Subplot 1: X GOR')
|
||||||
|
legend ('raw',['moving avg:' num2str(moving_avg_factor)],'Location','east')
|
||||||
|
|
||||||
|
subplot(2,2,2);
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),navSolution.Y-refSolution.Y(1),'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),Y_FILT-refSolution.Y(1),'r.');
|
||||||
|
ylabel('Y (m)')
|
||||||
|
xlabel('time from First FIX in (seconds)')
|
||||||
|
title('Subplot 2: Y')
|
||||||
|
legend ('raw',['moving avg:' num2str(moving_avg_factor)],'Location','east')
|
||||||
|
|
||||||
|
subplot(2,2,3);
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),navSolution.Z-refSolution.Z(1),'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),Z_FILT-refSolution.Z(1),'r.');
|
||||||
|
ylabel('Z (m)')
|
||||||
|
xlabel('time from First FIX in (seconds)')
|
||||||
|
title('Subplot 3: Z')
|
||||||
|
legend ('raw',['moving avg:' num2str(moving_avg_factor)],'Location','east')
|
||||||
|
|
||||||
|
sgtitle('UTM COORD CENTERED IN 1^{ST} POSITION')
|
||||||
|
%% ====== SPIRENT Plot all figures =======================================================
|
||||||
|
|
||||||
|
%--- LLH POSITION: SPIRENT plot on map --------------------------------------
|
||||||
|
figure(LLH)
|
||||||
|
geoplot([refSolution.latitude],[refSolution.longitude],'.','DisplayName','reference')
|
||||||
|
geobasemap satellite
|
||||||
|
hold off
|
||||||
|
% geobasemap streets
|
||||||
|
% geobasemap topographic
|
||||||
|
% geobasemap streets-dark
|
||||||
|
|
||||||
|
%---VELOCITY: SPIRENT plot --------------------------------------
|
||||||
|
figure(VEL)
|
||||||
|
subplot(2,2,1);
|
||||||
|
plot(refSolution.SIM_time/1000-TTFF_sec,refSolution.vX,'.','DisplayName','reference');
|
||||||
|
hold off;grid on
|
||||||
|
|
||||||
|
subplot(2,2,2);
|
||||||
|
plot(refSolution.SIM_time/1000-TTFF_sec,refSolution.vY,'.','DisplayName','reference');
|
||||||
|
hold on;grid on
|
||||||
|
|
||||||
|
subplot(2,2,3);
|
||||||
|
plot(refSolution.SIM_time/1000-TTFF_sec,refSolution.vZ,'.','DisplayName','reference');
|
||||||
|
hold on;grid on
|
||||||
|
|
||||||
|
subplot(2,2,4);
|
||||||
|
plot(refSolution.SIM_time/1000-TTFF_sec,refSolution.height,'.','DisplayName','reference');
|
||||||
|
hold on;grid on
|
||||||
|
|
||||||
|
%---UTM centered POSITION: SPIRENT plot --------------------------------------
|
||||||
|
figure(POS)
|
||||||
|
subplot(2,2,1);
|
||||||
|
plot(refSolution.SIM_time/1000-TTFF_sec,refSolution.X-refSolution.X(1),'.','DisplayName','reference');
|
||||||
|
hold off;grid on
|
||||||
|
|
||||||
|
subplot(2,2,2);
|
||||||
|
plot(refSolution.SIM_time/1000-TTFF_sec,refSolution.Y-refSolution.Y(1),'.','DisplayName','reference');
|
||||||
|
hold on;grid on
|
||||||
|
|
||||||
|
subplot(2,2,3);
|
||||||
|
plot(refSolution.SIM_time/1000-TTFF_sec,refSolution.Z-refSolution.Z(1),'.','DisplayName','reference');
|
||||||
|
hold on;grid on
|
||||||
|
|
||||||
|
%% ==== ERRORS Plots Navigation errors =======================================================
|
||||||
|
|
||||||
|
% figureNumber = 300;
|
||||||
|
% % The 300 is chosen for more convenient handling of the open
|
||||||
|
% % figure windows, when many figures are closed and reopened. Figures
|
||||||
|
% % drawn or opened by the user, will not be "overwritten" by this
|
||||||
|
% % function if the auto numbering is not used.
|
||||||
|
%
|
||||||
|
% %=== Select (or create) and clear the figure ==========================
|
||||||
|
% figure(figureNumber);
|
||||||
|
% clf (figureNumber);
|
||||||
|
% set (figureNumber, 'Name', 'Navigation errors');
|
||||||
|
%
|
||||||
|
% %--- Draw axes --------------------------------------------------------
|
||||||
|
% handles(1, 1) = subplot(4, 2, 1 : 4);
|
||||||
|
% handles(3, 1) = subplot(4, 2, [5, 7]);
|
||||||
|
% handles(3, 2) = subplot(4, 2, [6, 8]);
|
||||||
|
%
|
||||||
|
%
|
||||||
|
% %
|
||||||
|
% idx_syn=max(find(TTFF_sec*1000>refSolution.SIM_time));
|
||||||
|
% %--- VELOCITY differences -----------------------------
|
||||||
|
% plot([(navSolution.vX - refSolution.vX(idx_syn:end))'; ...
|
||||||
|
% (navSolution.vY - refSolution.vY)';...
|
||||||
|
% (navSolution.vZ - refSolution.vZ)']);
|
||||||
|
%
|
||||||
|
% title (handles(1, 1), 'VELOCITY variations');
|
||||||
|
% legend(handles(1, 1), 'vX', 'vY', 'vZ');
|
||||||
|
% xlabel(handles(1, 1), ['Measurement period: ', ...
|
||||||
|
% num2str(424242), 'ms']);
|
||||||
|
% ylabel(handles(1, 1), 'Variations (m/s)');
|
||||||
|
% grid (handles(1, 1));
|
||||||
|
% axis (handles(1, 1), 'tight');
|
||||||
|
|
||||||
|
%%
|
||||||
|
% plotNavigation(navSolutions,settings,plot_skyplot);
|
||||||
|
%
|
||||||
|
% %% Plot results in the necessary data exists ==============================
|
||||||
|
% if (~isempty(navSolutions))
|
||||||
|
%
|
||||||
|
% %% If reference position is not provided, then set reference position
|
||||||
|
% %% to the average position
|
||||||
|
% if isnan(settings.truePosition.E) || isnan(settings.truePosition.N) ...
|
||||||
|
% || isnan(settings.truePosition.U)
|
||||||
|
%
|
||||||
|
% %=== Compute mean values ==========================================
|
||||||
|
% % Remove NaN-s or the output of the function MEAN will be NaN.
|
||||||
|
% refCoord.E = mean(navSolutions.E(~isnan(navSolutions.E)));
|
||||||
|
% refCoord.N = mean(navSolutions.N(~isnan(navSolutions.N)));
|
||||||
|
% refCoord.U = mean(navSolutions.U(~isnan(navSolutions.U)));
|
||||||
|
%
|
||||||
|
% %Also convert geodetic coordinates to deg:min:sec vector format
|
||||||
|
% meanLongitude = dms2mat(deg2dms(...
|
||||||
|
% mean(navSolutions.longitude(~isnan(navSolutions.longitude)))), -5);
|
||||||
|
% meanLatitude = dms2mat(deg2dms(...
|
||||||
|
% mean(navSolutions.latitude(~isnan(navSolutions.latitude)))), -5);
|
||||||
|
%
|
||||||
|
% LatLong_str=[num2str(meanLatitude(1)), '??', ...
|
||||||
|
% num2str(meanLatitude(2)), '''', ...
|
||||||
|
% num2str(meanLatitude(3)), '''''', ...
|
||||||
|
% ',', ...
|
||||||
|
% num2str(meanLongitude(1)), '??', ...
|
||||||
|
% num2str(meanLongitude(2)), '''', ...
|
||||||
|
% num2str(meanLongitude(3)), '''''']
|
||||||
|
%
|
||||||
|
%
|
||||||
|
%
|
||||||
|
% refPointLgText = ['Mean Position\newline Lat: ', ...
|
||||||
|
% num2str(meanLatitude(1)), '{\circ}', ...
|
||||||
|
% num2str(meanLatitude(2)), '{\prime}', ...
|
||||||
|
% num2str(meanLatitude(3)), '{\prime}{\prime}', ...
|
||||||
|
% '\newline Lng: ', ...
|
||||||
|
% num2str(meanLongitude(1)), '{\circ}', ...
|
||||||
|
% num2str(meanLongitude(2)), '{\prime}', ...
|
||||||
|
% num2str(meanLongitude(3)), '{\prime}{\prime}', ...
|
||||||
|
% '\newline Hgt: ', ...
|
||||||
|
% num2str(mean(navSolutions.height(~isnan(navSolutions.height))), '%+6.1f')];
|
||||||
|
%
|
||||||
|
% else
|
||||||
|
% % compute the mean error for static receiver
|
||||||
|
% mean_position.E = mean(navSolutions.E(~isnan(navSolutions.E)));
|
||||||
|
% mean_position.N = mean(navSolutions.N(~isnan(navSolutions.N)));
|
||||||
|
% mean_position.U = mean(navSolutions.U(~isnan(navSolutions.U)));
|
||||||
|
% refCoord.E = settings.truePosition.E;
|
||||||
|
% refCoord.N = settings.truePosition.N;
|
||||||
|
% refCoord.U = settings.truePosition.U;
|
||||||
|
%
|
||||||
|
% error_meters=sqrt((mean_position.E-refCoord.E)^2+(mean_position.N-refCoord.N)^2+(mean_position.U-refCoord.U)^2);
|
||||||
|
%
|
||||||
|
% refPointLgText = ['Reference Position, Mean 3D error = ' num2str(error_meters) ' [m]'];
|
||||||
|
% end
|
||||||
|
%
|
||||||
|
% figureNumber = 300;
|
||||||
|
% % The 300 is chosen for more convenient handling of the open
|
||||||
|
% % figure windows, when many figures are closed and reopened. Figures
|
||||||
|
% % drawn or opened by the user, will not be "overwritten" by this
|
||||||
|
% % function if the auto numbering is not used.
|
||||||
|
%
|
||||||
|
% %=== Select (or create) and clear the figure ==========================
|
||||||
|
% figure(figureNumber);
|
||||||
|
% clf (figureNumber);
|
||||||
|
% set (figureNumber, 'Name', 'Navigation solutions');
|
||||||
|
%
|
||||||
|
% %--- Draw axes --------------------------------------------------------
|
||||||
|
% handles(1, 1) = subplot(4, 2, 1 : 4);
|
||||||
|
% handles(3, 1) = subplot(4, 2, [5, 7]);
|
||||||
|
% handles(3, 2) = subplot(4, 2, [6, 8]);
|
||||||
|
|
||||||
|
%% Plot all figures =======================================================
|
||||||
|
%
|
||||||
|
% %--- Coordinate differences in UTM system -----------------------------
|
||||||
|
% plot(handles(1, 1), [(navSolutions.E - refCoord.E)', ...
|
||||||
|
% (navSolutions.N - refCoord.N)',...
|
||||||
|
% (navSolutions.U - refCoord.U)']);
|
||||||
|
%
|
||||||
|
% title (handles(1, 1), 'Coordinates variations in UTM system');
|
||||||
|
% legend(handles(1, 1), 'E', 'N', 'U');
|
||||||
|
% xlabel(handles(1, 1), ['Measurement period: ', ...
|
||||||
|
% num2str(settings.navSolPeriod), 'ms']);
|
||||||
|
% ylabel(handles(1, 1), 'Variations (m)');
|
||||||
|
% grid (handles(1, 1));
|
||||||
|
% axis (handles(1, 1), 'tight');
|
||||||
|
%
|
||||||
|
% %--- Position plot in UTM system --------------------------------------
|
||||||
|
% plot3 (handles(3, 1), navSolutions.E - refCoord.E, ...
|
||||||
|
% navSolutions.N - refCoord.N, ...
|
||||||
|
% navSolutions.U - refCoord.U, '+');
|
||||||
|
% hold (handles(3, 1), 'on');
|
||||||
|
%
|
||||||
|
% %Plot the reference point
|
||||||
|
% plot3 (handles(3, 1), 0, 0, 0, 'r+', 'LineWidth', 1.5, 'MarkerSize', 10);
|
||||||
|
% hold (handles(3, 1), 'off');
|
||||||
|
%
|
||||||
|
% view (handles(3, 1), 0, 90);
|
||||||
|
% axis (handles(3, 1), 'equal');
|
||||||
|
% grid (handles(3, 1), 'minor');
|
||||||
|
%
|
||||||
|
% legend(handles(3, 1), 'Measurements', refPointLgText);
|
||||||
|
%
|
||||||
|
% title (handles(3, 1), 'Positions in UTM system (3D plot)');
|
||||||
|
% xlabel(handles(3, 1), 'East (m)');
|
||||||
|
% ylabel(handles(3, 1), 'North (m)');
|
||||||
|
% zlabel(handles(3, 1), 'Upping (m)');
|
||||||
|
%
|
||||||
|
% if (plot_skyplot==1)
|
||||||
|
% %--- Satellite sky plot -----------------------------------------------
|
||||||
|
% skyPlot(handles(3, 2), ...
|
||||||
|
% navSolution.channel.az, ...
|
||||||
|
% navSolution.channel.el, ...
|
||||||
|
% navSolution.channel.PRN(:, 1));
|
||||||
|
%
|
||||||
|
% % title (handles(3, 2), ['Sky plot (mean PDOP: ', ...
|
||||||
|
% % num2str(mean(navSolution.DOP(2,:))), ')']);
|
||||||
|
% end
|
||||||
|
%
|
||||||
|
% else
|
||||||
|
% disp('plotNavigation: No navigation data to plot.');
|
||||||
|
% end % if (~isempty(navSolutions))
|
344
src/utils/matlab/vtl/pvt_raw_plotting_SPIRENT_GnssSDR.m
Normal file
344
src/utils/matlab/vtl/pvt_raw_plotting_SPIRENT_GnssSDR.m
Normal file
@ -0,0 +1,344 @@
|
|||||||
|
% Read PVG raw dump
|
||||||
|
% -------------------------------------------------------------------------
|
||||||
|
%
|
||||||
|
% GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
|
||||||
|
% This file is part of GNSS-SDR.
|
||||||
|
%
|
||||||
|
% Copyright (C) 2010-2019 (see AUTHORS file for a list of contributors)
|
||||||
|
% SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
%
|
||||||
|
% -------------------------------------------------------------------------
|
||||||
|
%
|
||||||
|
%%
|
||||||
|
clc
|
||||||
|
close all
|
||||||
|
clearvars
|
||||||
|
|
||||||
|
% if ~exist('gps_l1_ca_read_pvt_raw_dump.m', 'file')
|
||||||
|
% addpath('./libs')
|
||||||
|
% end
|
||||||
|
%
|
||||||
|
% if ~exist('cat2geo.m', 'file')
|
||||||
|
% addpath('./libs/geoFunctions')
|
||||||
|
% end
|
||||||
|
SPEED_OF_LIGHT_M_S=299792458.0;
|
||||||
|
Lambda_GPS_L1=0.1902937;
|
||||||
|
%%
|
||||||
|
samplingFreq=5000000;
|
||||||
|
channels=6;
|
||||||
|
TTFF_sec=41.48;
|
||||||
|
|
||||||
|
%% ============================ PARSER TO STRUCT ============================
|
||||||
|
plot_skyplot=0;
|
||||||
|
plot_reference=1;
|
||||||
|
load_observables=1;
|
||||||
|
advance_vtl_data_available=1;
|
||||||
|
load_vtl=1;
|
||||||
|
|
||||||
|
navSolution = GnssSDR2struct('PVT_raw.mat');
|
||||||
|
refSolution = SpirentMotion2struct('..\log_spirent\motion_V1_SPF_LD_05.csv');
|
||||||
|
%%
|
||||||
|
if(load_observables)
|
||||||
|
load observables\observable_raw.mat
|
||||||
|
refSatData = SpirentSatData2struct('..\log_spirent\sat_data_V1A1_SPF_LD_05.csv');
|
||||||
|
rx_PRN=[28 4 17 15 27 9]; % for SPF_LD_05.
|
||||||
|
end
|
||||||
|
|
||||||
|
if(advance_vtl_data_available)
|
||||||
|
load('PVT_raw.mat','sat_posX_m','sat_posY_m','sat_posZ_m','sat_velX','sat_velY'...
|
||||||
|
,'sat_velZ','sat_prg_m','clk_bias_s','sat_dopp_hz')
|
||||||
|
end
|
||||||
|
|
||||||
|
if(load_vtl)
|
||||||
|
vtlSolution = Vtl2struct('dump_vtl_file.csv');
|
||||||
|
end
|
||||||
|
%% calculate LOS Rx-sat if advance_vtl_data_available=1
|
||||||
|
|
||||||
|
if(advance_vtl_data_available)
|
||||||
|
for chan=1:5
|
||||||
|
for t=1:length(navSolution.RX_time)
|
||||||
|
d(chan)=(sat_posX_m(chan,t)-navSolution.X(t))^2;
|
||||||
|
d(chan)=d(chan)+(sat_posY_m(chan,t)-navSolution.Y(t))^2;
|
||||||
|
d(chan)=d(chan)+(sat_posZ_m(chan,t)-navSolution.Z(t))^2;
|
||||||
|
d(chan)=sqrt(d(chan));
|
||||||
|
|
||||||
|
pr_m(chan,t)=d(chan)+clk_bias_s(t)*SPEED_OF_LIGHT_M_S;
|
||||||
|
|
||||||
|
a_x(chan,t)=-(sat_posX_m(chan,t)-navSolution.X(t))/d(chan);
|
||||||
|
a_y(chan,t)=-(sat_posY_m(chan,t)-navSolution.Y(t))/d(chan);
|
||||||
|
a_z(chan,t)=-(sat_posZ_m(chan,t)-navSolution.Z(t))/d(chan);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
%%
|
||||||
|
% figure;plot([a_x(1,:);a_y(1,:);a_z(1,:)]');
|
||||||
|
% figure;plot([vtlSolution.LOSx vtlSolution.LOSy vtlSolution.LOSz])
|
||||||
|
%%
|
||||||
|
if(advance_vtl_data_available)
|
||||||
|
for chan=1:5
|
||||||
|
for t=1:length(navSolution.RX_time)
|
||||||
|
rhoDot_pri(chan,t)=(sat_velX(chan,t)-navSolution.vX(t))*a_x(chan,t)...
|
||||||
|
+(sat_velY(chan,t)-navSolution.vY(t))*a_y(chan,t)...
|
||||||
|
+(sat_velZ(chan,t)-navSolution.vZ(t))*a_z(chan,t);
|
||||||
|
|
||||||
|
kf_yerr(chan,t)=(sat_dopp_hz(chan,t)*Lambda_GPS_L1)-rhoDot_pri(chan,t);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
%%
|
||||||
|
figure;plot(kf_yerr')
|
||||||
|
%%
|
||||||
|
figure;plot(pr_m'-sat_prg_m');hold on
|
||||||
|
legend('PRN 28','PRN 4','PRN 17','PRN 15','PRN 27','PRN 9','Location','eastoutside')
|
||||||
|
%% === Convert to UTM coordinate system =============================
|
||||||
|
|
||||||
|
% Scenario latitude is xx.xxxxxxx N37 49 9.98
|
||||||
|
% Scenario longitude is -xx.xxxxxxx W122 28 42.58
|
||||||
|
% Scenario elevation is 35 meters.
|
||||||
|
% lat=[37 49 9.98];
|
||||||
|
% long=[-122 -28 -42.58];
|
||||||
|
% lat_deg=dms2deg(lat);
|
||||||
|
% long_deg=dms2deg(long);
|
||||||
|
% h=35;
|
||||||
|
|
||||||
|
lat_deg=navSolution.latitude(1);
|
||||||
|
lon_deg=navSolution.longitude(1);
|
||||||
|
lat=degrees2dms(lat_deg);
|
||||||
|
lon=degrees2dms(lon_deg);
|
||||||
|
h=navSolution.height(1);
|
||||||
|
|
||||||
|
|
||||||
|
utmstruct = defaultm('utm');
|
||||||
|
utmstruct.zone = utmzone(lat_deg, lon_deg);
|
||||||
|
utmstruct = defaultm(utmstruct);
|
||||||
|
[utmstruct.latlim,utmstruct.lonlim] = utmzone(utmstruct.zone );
|
||||||
|
%Choices i of Reference Ellipsoid
|
||||||
|
% 1. International Ellipsoid 1924
|
||||||
|
% 2. International Ellipsoid 1967
|
||||||
|
% 3. World Geodetic System 1972
|
||||||
|
% 4. Geodetic Reference System 1980
|
||||||
|
% 5. World Geodetic System 1984
|
||||||
|
|
||||||
|
utmstruct.geoid = wgs84Ellipsoid;
|
||||||
|
|
||||||
|
% [X, Y] = projfwd(utmstruct,lat_deg,lon_deg);
|
||||||
|
% Z=h; % geographical to cartesian conversion
|
||||||
|
|
||||||
|
|
||||||
|
% for k=1:1:length(navSolution.X)
|
||||||
|
% [navSolution.E(k), ...
|
||||||
|
% navSolution.N(k), ...
|
||||||
|
% navSolution.U(k)]=cart2utm(navSolution.X(k), navSolution.Y(k), navSolution.Z(k), utmZone);
|
||||||
|
% end
|
||||||
|
|
||||||
|
%%
|
||||||
|
general_raw_plot
|
||||||
|
%%
|
||||||
|
|
||||||
|
%---VTL VELOCITY: GNSS SDR plot --------------------------------------
|
||||||
|
VTL_VEL=figure('Name','velocities and heigh');
|
||||||
|
subplot(2,2,1);
|
||||||
|
plot(vtlSolution.rtklibpvt.vX,'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(vtlSolution.kfpvt.vX,'.');
|
||||||
|
plot(vtlSolution.kferr.vX,'.');
|
||||||
|
ylabel('vX (m/s)')
|
||||||
|
xlabel('time U.A.')
|
||||||
|
ylim([-5 5])
|
||||||
|
title('Subplot 1: vX ')
|
||||||
|
legend ('raw RTKlib','raw kf','kferr','Location','east')
|
||||||
|
|
||||||
|
subplot(2,2,2);
|
||||||
|
plot(vtlSolution.rtklibpvt.vY,'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(vtlSolution.kfpvt.vY,'.');
|
||||||
|
plot(vtlSolution.kferr.vY,'.');
|
||||||
|
ylabel('vY (m/s)')
|
||||||
|
xlabel('time U.A.')
|
||||||
|
ylim([-5 5])
|
||||||
|
title('Subplot 1: vY ')
|
||||||
|
legend ('raw RTKlib','raw kf','kferr','Location','east')
|
||||||
|
|
||||||
|
subplot(2,2,3);
|
||||||
|
plot(vtlSolution.rtklibpvt.vZ,'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(vtlSolution.kfpvt.vZ,'.');
|
||||||
|
plot(vtlSolution.kferr.vZ,'.');
|
||||||
|
ylabel('vZ (m/s)')
|
||||||
|
xlabel('time U.A.')
|
||||||
|
ylim([-5 5])
|
||||||
|
title('Subplot 1: vZ ')
|
||||||
|
legend ('raw RTKlib','raw kf','kferr','Location','east')
|
||||||
|
|
||||||
|
subplot(2,2,4);
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),navSolution.height,'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(navSolution.RX_time-navSolution.RX_time(1),HEIGH_FILT,'r.');
|
||||||
|
ylabel('HEIGH (m)')
|
||||||
|
xlabel('time from First FIX in (seconds)')
|
||||||
|
title('Subplot 4: HEIGH')
|
||||||
|
legend ('raw',['moving avg:' num2str(moving_avg_factor)],'Location','southeast')
|
||||||
|
|
||||||
|
sgtitle('velocities and heigh')
|
||||||
|
|
||||||
|
% --- VTL UTM centered POSITION: GNSS SDR plot --------------------------------------
|
||||||
|
|
||||||
|
VTL_POS=figure('Name','VTL UTM COORD CENTERED IN 1^{ST} POSITION');
|
||||||
|
subplot(2,2,1);
|
||||||
|
plot(vtlSolution.rtklibpvt.X-vtlSolution.rtklibpvt.X(1),'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(vtlSolution.kfpvt.X-vtlSolution.kfpvt.X(1),'.');
|
||||||
|
plot(vtlSolution.kferr.X,'.');
|
||||||
|
ylabel('X (m)')
|
||||||
|
xlabel('time U.A.')
|
||||||
|
ylim([-200 800])
|
||||||
|
title('Subplot 1: X ')
|
||||||
|
legend ('raw RTKlib','raw kf','kferr','Location','east')
|
||||||
|
|
||||||
|
subplot(2,2,2);
|
||||||
|
plot(vtlSolution.rtklibpvt.Y-vtlSolution.rtklibpvt.Y(1),'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(vtlSolution.kfpvt.Y-vtlSolution.kfpvt.Y(1),'.');
|
||||||
|
plot(vtlSolution.kferr.Y,'.');
|
||||||
|
ylabel('Y (m)')
|
||||||
|
xlabel('time U.A.')
|
||||||
|
ylim([-200 50])
|
||||||
|
title('Subplot 1: Y ')
|
||||||
|
legend ('raw RTKlib','raw kf','kferr','Location','east')
|
||||||
|
|
||||||
|
subplot(2,2,3);
|
||||||
|
plot(vtlSolution.rtklibpvt.Z-vtlSolution.rtklibpvt.Z(1),'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(vtlSolution.kfpvt.Z-vtlSolution.kfpvt.Z(1),'.');
|
||||||
|
plot(vtlSolution.kferr.Z,'.');
|
||||||
|
ylabel('Z (m)')
|
||||||
|
xlabel('time U.A.')
|
||||||
|
ylim([-350 50])
|
||||||
|
title('Subplot 1: Z ')
|
||||||
|
legend ('raw RTKlib','raw kf','kferr','Location','east')
|
||||||
|
|
||||||
|
sgtitle('VTL UTM COORD CENTERED IN 1^{ST} POSITION')
|
||||||
|
%%
|
||||||
|
close all
|
||||||
|
% --- 'VTL errPV correction --------------------------------------
|
||||||
|
|
||||||
|
VTL_errPV=figure('Name','VTL errPV correction');
|
||||||
|
subplot(2,3,1);
|
||||||
|
plot(vtlSolution.rtklibpvt.X-vtlSolution.rtklibpvt.X(1),'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(vtlSolution.kfpvt.X-vtlSolution.kfpvt.X(1),'.');
|
||||||
|
plot(vtlSolution.kferr.X,'.');
|
||||||
|
plot(vtlSolution.kfpvt.X-vtlSolution.rtklibpvt.X(1)+vtlSolution.kferr.X,'.');
|
||||||
|
ylabel('X (m)')
|
||||||
|
xlabel('time U.A.')
|
||||||
|
ylim([-200 800])
|
||||||
|
title('Subplot 1: X ')
|
||||||
|
legend ('raw RTKlib','raw kf','kferr','added err+raw','Location','eastoutside')
|
||||||
|
|
||||||
|
subplot(2,3,2);
|
||||||
|
plot(vtlSolution.rtklibpvt.Y-vtlSolution.rtklibpvt.Y(1),'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(vtlSolution.kfpvt.Y-vtlSolution.kfpvt.Y(1),'.');
|
||||||
|
plot(vtlSolution.kferr.Y,'.');
|
||||||
|
plot(vtlSolution.kfpvt.Y-vtlSolution.rtklibpvt.Y(1)+vtlSolution.kferr.Y,'.');
|
||||||
|
ylabel('Y (m)')
|
||||||
|
xlabel('time U.A.')
|
||||||
|
ylim([-200 50])
|
||||||
|
title('Subplot 1: Y ')
|
||||||
|
legend ('raw RTKlib','raw kf','kferr','added err+raw','Location','eastoutside')
|
||||||
|
|
||||||
|
subplot(2,3,3);
|
||||||
|
plot(vtlSolution.rtklibpvt.Z-vtlSolution.rtklibpvt.Z(1),'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(vtlSolution.kfpvt.Z-vtlSolution.kfpvt.Z(1),'.');
|
||||||
|
plot(vtlSolution.kferr.Z,'.');
|
||||||
|
plot(vtlSolution.kfpvt.Z-vtlSolution.rtklibpvt.Z(1)+vtlSolution.kferr.Z,'.');
|
||||||
|
ylabel('Z (m)')
|
||||||
|
xlabel('time U.A.')
|
||||||
|
ylim([-350 50])
|
||||||
|
title('Subplot 1: Z ')
|
||||||
|
legend ('raw RTKlib','raw kf','kferr','added err+raw','Location','eastoutside')
|
||||||
|
|
||||||
|
subplot(2,3,4);
|
||||||
|
plot(vtlSolution.rtklibpvt.vX,'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(vtlSolution.kfpvt.vX,'.');
|
||||||
|
plot(vtlSolution.kferr.vX,'.');
|
||||||
|
plot(vtlSolution.kfpvt.vX+vtlSolution.kferr.vX,'.');
|
||||||
|
ylabel('vX (m/s)')
|
||||||
|
xlabel('time U.A.')
|
||||||
|
ylim([-5 5])
|
||||||
|
title('Subplot 1: vX ')
|
||||||
|
legend ('raw RTKlib','raw kf','kferr','added err+raw','Location','eastoutside')
|
||||||
|
|
||||||
|
subplot(2,3,5);
|
||||||
|
plot(vtlSolution.rtklibpvt.vY,'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(vtlSolution.kfpvt.vY,'.');
|
||||||
|
plot(vtlSolution.kferr.vY,'.');
|
||||||
|
plot(vtlSolution.kfpvt.vY+vtlSolution.kferr.vY,'.');
|
||||||
|
ylabel('vY (m/s)')
|
||||||
|
xlabel('time U.A.')
|
||||||
|
ylim([-5 5])
|
||||||
|
title('Subplot 1: vY ')
|
||||||
|
legend ('raw RTKlib','raw kf','kferr','added err+raw','Location','eastoutside')
|
||||||
|
|
||||||
|
subplot(2,3,6);
|
||||||
|
plot(vtlSolution.rtklibpvt.vZ,'.');
|
||||||
|
hold on;grid on
|
||||||
|
plot(vtlSolution.kfpvt.vZ,'.');
|
||||||
|
plot(vtlSolution.kferr.vZ,'.');
|
||||||
|
plot(vtlSolution.kfpvt.vZ+vtlSolution.kferr.vZ,'.');
|
||||||
|
ylabel('vZ (m/s)')
|
||||||
|
xlabel('time U.A.')
|
||||||
|
ylim([-5 5])
|
||||||
|
title('Subplot 1: vZ ')
|
||||||
|
legend ('raw RTKlib','raw kf','kferr','added err+raw','Location','eastoutside')
|
||||||
|
|
||||||
|
|
||||||
|
sgtitle('VTL errPV correction')
|
||||||
|
%% ============================================== ==============================================
|
||||||
|
time_reference_spirent_obs=129780;%s
|
||||||
|
if(load_observables)
|
||||||
|
% figure;plot(Carrier_phase_cycles','.')
|
||||||
|
% figure;plot(Pseudorange_m','.')
|
||||||
|
%%%
|
||||||
|
Carrier_Doppler_hz_sim=zeros(length(refSatData.GPS.SIM_time),6);
|
||||||
|
|
||||||
|
for i=1:length(refSatData.GPS.SIM_time)
|
||||||
|
Carrier_Doppler_hz_sim(i,1)=refSatData.GPS.series(i).doppler_shift(4);%PRN 28
|
||||||
|
Carrier_Doppler_hz_sim(i,2)=refSatData.GPS.series(i).doppler_shift(1);%PRN 4
|
||||||
|
Carrier_Doppler_hz_sim(i,3)=refSatData.GPS.series(i).doppler_shift(6);%PRN 17
|
||||||
|
Carrier_Doppler_hz_sim(i,4)=refSatData.GPS.series(i).doppler_shift(7);%PRN 15
|
||||||
|
Carrier_Doppler_hz_sim(i,5)=refSatData.GPS.series(i).doppler_shift(8);%PRN 27
|
||||||
|
Carrier_Doppler_hz_sim(i,6)=refSatData.GPS.series(i).doppler_shift(9);%PRN 9
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
Rx_Dopp_all=figure('Name','RX_Carrier_Doppler_hz');plot(RX_time(1,:)-time_reference_spirent_obs, Carrier_Doppler_hz','.')
|
||||||
|
xlim([0,140]);
|
||||||
|
xlabel('')
|
||||||
|
ylabel('Doppler (Hz)')
|
||||||
|
xlabel('time from simulation init (seconds)')
|
||||||
|
grid on
|
||||||
|
hold on
|
||||||
|
legend('PRN 28','PRN 4','PRN 17','PRN 15','PRN 27','PRN 9','Location','eastoutside')
|
||||||
|
plot(refSatData.GPS.SIM_time/1000, Carrier_Doppler_hz_sim','.')
|
||||||
|
legend('PRN 28','PRN 4','PRN 17','PRN 15','PRN 27','PRN 9','Location','eastoutside')
|
||||||
|
hold off
|
||||||
|
grid on
|
||||||
|
|
||||||
|
Rx_Dopp_one=figure('Name','RX_Carrier_Doppler_hz');plot(RX_time(1,:)-time_reference_spirent_obs, Carrier_Doppler_hz(1,:)','.')
|
||||||
|
xlim([0,140]);
|
||||||
|
ylim([-2340,-2220]);
|
||||||
|
xlabel('')
|
||||||
|
ylabel('Doppler (Hz)')
|
||||||
|
xlabel('time from simulation init (seconds)')
|
||||||
|
grid on
|
||||||
|
hold on
|
||||||
|
legend('PRN 28 GNSS-SDR','Location','eastoutside')
|
||||||
|
plot(refSatData.GPS.SIM_time/1000, Carrier_Doppler_hz_sim(:,1)','.','DisplayName','reference')
|
||||||
|
hold off
|
||||||
|
grid on
|
||||||
|
end
|
Loading…
Reference in New Issue
Block a user