|
|
function PlotPvtStates(gnssPvt,prFileName) |
|
|
%PlotPvtStates(gnssPvt,prFileName); |
|
|
%Plot the Position, Velocity and Time/clock states in gnssPvt |
|
|
% |
|
|
% gnssPvt.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 |
|
|
|
|
|
%Author: Frank van Diggelen |
|
|
%Open Source code for processing Android GNSS Measurements |
|
|
|
|
|
%find median values |
|
|
iFi = isfinite(gnssPvt.allLlaDegDegM(:,1));%index into finite results |
|
|
if ~any(iFi) |
|
|
return |
|
|
end |
|
|
llaMed = median(gnssPvt.allLlaDegDegM(iFi,:));%use medians as reference |
|
|
|
|
|
%time variable for plots |
|
|
tSeconds = gnssPvt.FctSeconds-gnssPvt.FctSeconds(1); |
|
|
|
|
|
h1234 = zeros(1,4); %handles for subplots |
|
|
%plot ned errors vs medians ---------------------------------------------------- |
|
|
ned = Lla2Ned(gnssPvt.allLlaDegDegM,llaMed); |
|
|
h1234(1)=subplot(4,1,1); |
|
|
plot(tSeconds,ned(:,1),'r');hold on |
|
|
plot(tSeconds,ned(:,2),'g'); |
|
|
plot(tSeconds,ned(:,3),'b'); |
|
|
title('WLS: Position states offset from medians [Lat,Lon,Alt]'); |
|
|
grid on, ylabel('(meters)'), |
|
|
|
|
|
%label Latitude, Longitude and Altitude |
|
|
iFi = isfinite(ned(:,1));%index into finite results |
|
|
h=zeros(1,3); %handles for Lat, Lon, Alt |
|
|
h(1)=text(tSeconds(end),ned(iFi(end),1),'Lat'); |
|
|
set(h(1),'Color','r') |
|
|
h(2)=text(tSeconds(end),ned(iFi(end),2),'Lon'); |
|
|
set(h(2),'Color','g') |
|
|
h(3)=text(tSeconds(end),ned(iFi(end),3),'Alt'); |
|
|
set(h(3),'Color','b') |
|
|
%shift the highest a little higher, so it doesnt overwrite the others |
|
|
[~,iMax] = max(ned(iFi(end),:)); |
|
|
set(h(iMax),'VerticalAlignment','bottom'); |
|
|
%shift the lowest a little lower |
|
|
[~,iMin] = min(ned(iFi(end),:)); |
|
|
set(h(iMin),'VerticalAlignment','top'); |
|
|
|
|
|
%plot common bias, in microseconds and meters --------------------------------- |
|
|
h1234(2)=subplot(4,1,2); |
|
|
iFi = isfinite(gnssPvt.allBcMeters);%index into finite results |
|
|
if any(iFi) |
|
|
plot(tSeconds,gnssPvt.allBcMeters - gnssPvt.allBcMeters(iFi(1))) |
|
|
grid on |
|
|
bc0Microseconds = gnssPvt.allBcMeters(iFi(1))/GpsConstants.LIGHTSPEED*1e6; |
|
|
bc0Text = sprintf('%.1f',bc0Microseconds); |
|
|
title(['Common bias ''clock'' offset from initial value of ',... |
|
|
bc0Text,' {\mu}s']) |
|
|
ylabel(('meters')) |
|
|
end |
|
|
|
|
|
%add microseconds label on right |
|
|
ax=axis; |
|
|
axMeters = ax(3:4); |
|
|
set(gca,'YLim',axMeters); %fix this, else rescaling fig breaks axis proportion |
|
|
axMicroseconds = axMeters/GpsConstants.LIGHTSPEED*1e6; |
|
|
set(gca,'Box','off'); %# Turn off the box surrounding the whole axes |
|
|
axesPosition = get(gca,'Position'); %# Get the current axes position |
|
|
hNewAxes = axes('Position',axesPosition,... %# Place a new axes on top... |
|
|
'Color','none',... %# ... with no background color |
|
|
'YLim',axMicroseconds,... %# ... and a different scale |
|
|
'YAxisLocation','right',... %# ... located on the right |
|
|
'XTick',[],... %# ... with no x tick marks |
|
|
'Box','off'); %# ... and no surrounding box |
|
|
ylabel(hNewAxes,'(microseconds)'); %# Add label to right |
|
|
%you must link the axes, else proportion will change when you scale figure: |
|
|
linkaxes([hNewAxes, h1234(2)],'x'); |
|
|
|
|
|
%plot three components of speed ------------------------------------------------ |
|
|
h1234(3)=subplot(4,1,3); |
|
|
vel = gnssPvt.allVelMps; |
|
|
plot(tSeconds,vel(:,1),'r');hold on |
|
|
plot(tSeconds,vel(:,2),'g'); |
|
|
plot(tSeconds,vel(:,3),'b'); |
|
|
title('Velocity states [North,East,Down]'); |
|
|
grid on, ylabel('(m/s)'), |
|
|
|
|
|
%label North, East, Down |
|
|
iFi = isfinite(vel(:,1));%index into finite results |
|
|
h=zeros(1,3); %handles for Lat, Lon, Alt |
|
|
h(1)=text(tSeconds(end),vel(iFi(end),1),'North'); |
|
|
set(h(1),'Color','r') |
|
|
h(2)=text(tSeconds(end),vel(iFi(end),2),'East'); |
|
|
set(h(2),'Color','g') |
|
|
h(3)=text(tSeconds(end),vel(iFi(end),3),'Down'); |
|
|
set(h(3),'Color','b') |
|
|
%shift the highest a little higher, so it doesnt overwrite the others |
|
|
[~,iMax] = max(vel(iFi(end),:)); |
|
|
set(h(iMax),'VerticalAlignment','bottom'); |
|
|
%shift the lowest a little lower |
|
|
[~,iMin] = min(vel(iFi(end),:)); |
|
|
set(h(iMin),'VerticalAlignment','top'); |
|
|
|
|
|
%plot common frequency offset ------------------------------------------------- |
|
|
h1234(4)=subplot(4,1,4); |
|
|
plot(tSeconds,gnssPvt.allBcDotMps) |
|
|
grid on |
|
|
title('Common frequency offset'); ylabel(('m/s')) |
|
|
|
|
|
%add microseconds label on right |
|
|
ax=axis; |
|
|
axMps = ax(3:4); |
|
|
set(gca,'YLim',axMps);%fix this, else rescaling fig breaks axis proportion |
|
|
PPMPERMPS = 1/GpsConstants.LIGHTSPEED*1E6; %true for any frequency |
|
|
axPpm = axMps*PPMPERMPS; |
|
|
set(gca,'Box','off'); %# Turn off the box surrounding the whole axes |
|
|
axesPosition = get(gca,'Position'); %# Get the current axes position |
|
|
hNewAxes = axes('Position',axesPosition,... %# Place a new axes on top... |
|
|
'Color','none',... %# ... with no background color |
|
|
'YLim',axPpm,... %# ... and a different scale |
|
|
'YAxisLocation','right',... %# ... located on the right |
|
|
'XTick',[],... %# ... with no x tick marks |
|
|
'Box','off'); %# ... and no surrounding box |
|
|
ylabel(hNewAxes,'(ppm)'); %# Add label to right |
|
|
linkaxes([hNewAxes, h1234(4)],'x') |
|
|
|
|
|
xs = sprintf('\ntime(seconds)\n%s',prFileName); |
|
|
xlabel(xs,'Interpreter','none') |
|
|
|
|
|
linkaxes(h1234,'x'); %link all x axes |
|
|
|
|
|
end %end of function PlotPvtStates |
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
|
|
|
|
% 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.
|
|
|
|