|
|
function PlotPvt(gpsPvt,prFileName,llaTrueDegDegM,titleString) |
|
|
%PlotGpsPvt(gpsPvt,prFileName,[llaTrueDegDegM],[titleString]) |
|
|
%Plot the results of GpsLsPvt: |
|
|
% |
|
|
% gpsPvt.FctSeconds Nx1 time vector, same as gpsMeas.FctSeconds |
|
|
% .allLlaDegDegM Nx3 matrix, (i,:) = [lat (deg), lon (deg), alt (m)] |
|
|
% .sigmaLlaM Nx3 standard deviation of [lat,lon,alt] (m) |
|
|
% .allBcMeters Nx1 common bias computed with lla |
|
|
% .allVelMps Nx3 (i,:) = velocity in NED coords |
|
|
% .sigmaVelMps Nx3 standard deviation of velocity (m/s) |
|
|
% .allBcDotMps Nx1 common freq bias computed with velocity |
|
|
% .numSvs Nx1 number of satellites used in corresponding lla |
|
|
% .hdop Nx1 hdop of corresponding fix |
|
|
% |
|
|
% Optional inputs: [llaTrueDegDegM] = reference position, [ts] = title srtring |
|
|
|
|
|
%Author: Frank van Diggelen |
|
|
%Open Source code for processing Android GNSS Measurements |
|
|
|
|
|
gray = [.5 .5 .5]; |
|
|
ltgray = [.8 .8 .8]; |
|
|
|
|
|
%set reference lla for plots |
|
|
iFi = isfinite(gpsPvt.allLlaDegDegM(:,1));%index into finite results |
|
|
if ~any(iFi) |
|
|
return |
|
|
end |
|
|
llaMed = median(gpsPvt.allLlaDegDegM(iFi,:));%use median position as reference |
|
|
if nargin < 3, llaTrueDegDegM = []; end |
|
|
if nargin < 4. titleString = 'PVT solution'; end |
|
|
bGotLlaTrue = ~isempty(llaTrueDegDegM) && any(llaTrueDegDegM); |
|
|
%not empty and not all zeros |
|
|
if bGotLlaTrue |
|
|
llaRef = llaTrueDegDegM; |
|
|
else |
|
|
llaRef = llaMed; |
|
|
end |
|
|
|
|
|
%% plot ne errors vs llaTrueDegDegM -------------------------------------------- |
|
|
nedM = Lla2Ned(gpsPvt.allLlaDegDegM,llaRef); |
|
|
h123=subplot(4,1,1:2); |
|
|
h1 = plot(nedM(:,2),nedM(:,1)); |
|
|
set(h1,'LineStyle','-','LineWidth',0.1,'Color',ltgray) |
|
|
hold on, plot(nedM(:,2),nedM(:,1),'cx'); |
|
|
lls = sprintf(' [%.6f^o, %.6f^o]',llaMed(1:2)); |
|
|
nedMedM = Lla2Ned(llaMed,llaRef); |
|
|
h=plot(nedMedM(2),nedMedM(1),'+k','MarkerSize',18); |
|
|
ts = [' median ',lls]; |
|
|
ht1 = text(nedMedM(2),nedMedM(1),ts,'color','k'); |
|
|
lls = sprintf(' [%.6f^o, %.6f^o]',llaRef(1:2)); |
|
|
if bGotLlaTrue |
|
|
h=plot(0,0,'+r','MarkerSize',18); |
|
|
ts = [' true pos ',lls]; |
|
|
ht2 = text(0,0,ts,'color','r'); |
|
|
%adjust VerticalAlignment to avoid overwriting previous text |
|
|
if nedMedM(1)<0 |
|
|
set(ht1,'VerticalAlignment','top');%moves the 'median' label down |
|
|
set(ht2,'VerticalAlignment','bottom'); |
|
|
else |
|
|
set(ht1,'VerticalAlignment','bottom'); |
|
|
set(ht2,'VerticalAlignment','top'); |
|
|
end |
|
|
%print median position error |
|
|
ts = sprintf('|median - true pos| = %.1f m',norm(nedMedM(1:2))); |
|
|
xm = min(0,nedMedM(2)); %align label with median x value, or zero |
|
|
ym = min(nedM(:,1)); %align with smallest y |
|
|
ht3 = text(xm,ym,ts); |
|
|
set(ht3,'Color','k','VerticalAlignment','bottom'); |
|
|
end |
|
|
title(titleString); |
|
|
axis equal, grid on |
|
|
ylabel('North (m)'),xlabel('East (m)') |
|
|
% compute error distribution and plot circle |
|
|
distM = sqrt(sum(nedM(:,1:2).^2,2)); |
|
|
medM = median(distM); |
|
|
%plot a circle using 'rectangle' (yes really :) |
|
|
hr=rectangle('Position',[-1 -1 2 2]*medM,'Curvature',[1 1]); |
|
|
set(hr,'EdgeColor',gray) |
|
|
ts = sprintf('50%% distribution = %.1f m',medM); |
|
|
text(0,medM,ts,'VerticalAlignment','bottom','Color',gray) |
|
|
%% end of plot ne errors vs llaTrueDegDegM ------------------------------------- |
|
|
|
|
|
%time variable for plots |
|
|
tSeconds = gpsPvt.FctSeconds-gpsPvt.FctSeconds(1); |
|
|
|
|
|
%% plot speed |
|
|
h123(2)=subplot(4,1,3); |
|
|
N = length(gpsPvt.FctSeconds); |
|
|
iGood = isfinite(gpsPvt.allVelMps(:,1)); |
|
|
speedMps = zeros(1,N)+NaN; |
|
|
speedMps(iGood) = sqrt(sum(gpsPvt.allVelMps(iGood,1:2)'.^2)); %horizontal speed |
|
|
plot(tSeconds,speedMps);grid on |
|
|
ylabel('Horiz. speed (m/s)') |
|
|
|
|
|
%% plot hdop & # sats |
|
|
h123(3)=subplot(4,1,4); |
|
|
[hyy,h1]=plotyy(tSeconds,gpsPvt.hdop,tSeconds,gpsPvt.numSvs,'plot','stairs'); |
|
|
grid on |
|
|
set(h1,'LineWidth',1) |
|
|
ylabel(hyy(1),'HDOP'); ylabel(hyy(2),'# sats'); |
|
|
xs = sprintf('time(seconds)\n%s',prFileName); |
|
|
xlabel(xs,'Interpreter','none') |
|
|
|
|
|
set(hyy,'Box','off') |
|
|
|
|
|
linkaxes(h123(2:3),'x'); |
|
|
linkaxes(hyy,'x') |
|
|
|
|
|
|
|
|
end %end of function PlotPvt |
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
|
|
|
|
% Copyright 2016 Google Inc. |
|
|
% |
|
|
% Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
% you may not use this file except in compliance with the License. |
|
|
% You may obtain a copy of the License at |
|
|
% |
|
|
% http://www.apache.org/licenses/LICENSE-2.0 |
|
|
% |
|
|
% Unless required by applicable law or agreed to in writing, software |
|
|
% distributed under the License is distributed on an "AS IS" BASIS, |
|
|
% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
|
% See the License for the specific language governing permissions and |
|
|
% limitations under the License.
|
|
|
|