You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
184 lines
7.1 KiB
184 lines
7.1 KiB
9 years ago
|
function [allGpsEph,allGloEph] = GetNasaHourlyEphemeris(utcTime,dirName)
|
||
|
%[allGpsEph,allGloEph] = GetNasaHourlyEphemeris(utcTime,dirName)
|
||
|
%Get hourly ephemeris files,
|
||
|
% If a GPS ephemeris file is in dirName, with valid ephemeris for at
|
||
|
% least 24 svs, then read it; else download from NASA's archive of
|
||
|
% Space Geodesy Data
|
||
|
%
|
||
|
%Output allGpsEph structure of ephemerides in format defined in ReadRinexNav.m
|
||
|
% TBD: allGloEph, and any other supported by the NSA ftp site
|
||
|
%
|
||
|
%examples of how to call GetNasaHourlyEphemeris:
|
||
|
%1) with /demoFiles and utcTime where ephemeris has already been downloaded:
|
||
|
% replace '~/...' with actual path:
|
||
|
% dirName = '~/Documents/MATLAB/gpstools/opensource/demoFiles';
|
||
|
% utcTime = [2016,8,22,22,50,00];
|
||
|
% [allGpsEph,allGloEph] = GetNasaHourlyEphemeris(utcTime,dirName)
|
||
|
%
|
||
|
%2) with utcTime for which ephemeris has not been downloaded,
|
||
|
% this exercises the automatic ftp download.
|
||
|
% Replace '~' with actual path:
|
||
|
% dirName = '~/Documents/MATLAB/gpstools/opensource/demoFiles';
|
||
|
% utcTime = [2016,5,ceil(rand(1,2).*[30,24]),0,0],%a random Hour and Day in May
|
||
|
% [allGpsEph,allGloEph] = GetNasaHourlyEphemeris(utcTime,dirName)
|
||
|
%
|
||
|
% More details:
|
||
|
% The Nasa ephemeris Unix-compressed.
|
||
|
% GetNasaHourlyEphemeris will automatically uncompress it, if you have the right
|
||
|
% uncompress function on you computer. If you need to install an unzip utility,
|
||
|
% see http://cddis.nasa.gov/ and http://www.gpzip.org
|
||
|
% Search for 'uncompress' in the GetNasaHourlyEphemeris function to find and
|
||
|
% edit the name of the unzip utility.
|
||
|
|
||
|
%Author: Frank van Diggelen
|
||
|
%Open Source code for processing Android GNSS Measurements
|
||
|
|
||
|
allGpsEph=[];allGloEph=[];
|
||
|
if nargin<2
|
||
|
dirName = [];
|
||
|
end
|
||
|
[bOk,dirName] = CheckInputs(utcTime,dirName);
|
||
|
if ~bOk, return, end
|
||
|
|
||
|
%Description of file names, see:
|
||
|
%http://cddis.gsfc.nasa.gov/Data_and_Derived_Products/GNSS/...
|
||
|
% broadcast_ephemeris_data.html#GPShourly
|
||
|
yearNumber4Digit = utcTime(1);
|
||
|
yearNumber2Digit = rem(utcTime(1),100);
|
||
|
dayNumber = DayOfYear(utcTime);
|
||
|
|
||
|
hourlyZFile = sprintf('hour%03d0.%02dn.Z',dayNumber,yearNumber2Digit);
|
||
|
ephFilename = hourlyZFile(1:end-2);
|
||
|
fullEphFilename = [dirName,ephFilename]; %full name (with directory specified)
|
||
|
|
||
|
%check if ephemeris file already exists (e.g. you downloaded it 'by hand')
|
||
|
%and if there are fresh ephemeris for lotsa sats within 2 hours of fctSeconds
|
||
|
bGotGpsEph = false;
|
||
|
if exist(fullEphFilename,'file')==2
|
||
|
%% file exists locally, so read it
|
||
|
fprintf('Reading GPS ephemeris from ''%s'' file in local directory\n',...
|
||
|
ephFilename);
|
||
|
fprintf('%s\n',dirName);
|
||
|
allGpsEph = ReadRinexNav(fullEphFilename);
|
||
|
[~,fctSeconds] = Utc2Gps(utcTime);
|
||
|
ephAge = [allGpsEph.GPS_Week]*GpsConstants.WEEKSEC + [allGpsEph.Toe] - ...
|
||
|
fctSeconds;
|
||
|
%get index into fresh and healthy ephemeris (health bit set => unhealthy)
|
||
|
iFreshAndHealthy = abs(ephAge)<GpsConstants.EPHVALIDSECONDS & ...
|
||
|
~[allGpsEph.health];
|
||
|
%TBD look at allEph.Fit_interval, and deal with values > 0
|
||
|
goodEphSvs = unique([allGpsEph(iFreshAndHealthy).PRN]);
|
||
|
if length(goodEphSvs)>=GnssThresholds.MINNUMGPSEPH
|
||
|
bGotGpsEph = true;
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if ~bGotGpsEph
|
||
|
%% get ephemeris from Nasa site
|
||
|
ftpSiteName = 'cddis.gsfc.nasa.gov';
|
||
|
hourlyDir=sprintf('/gnss/data/hourly/%4d/%03d/',yearNumber4Digit,dayNumber);
|
||
|
fprintf('\nGetting GPS ephemeris ''%s'' from NASA ftp site ...',hourlyZFile)
|
||
|
fprintf('\nftp://%s%s\n',ftpSiteName,hourlyDir);
|
||
|
|
||
|
%check that the dirName has been properly specified
|
||
|
if strfind(dirName,'~')
|
||
|
fprintf('\nYou set: dirName = ''%s''\n',dirName)
|
||
|
fprintf('To download ephemeris from ftp,')
|
||
|
fprintf(' specify ''dirName'' with full path, and no tilde ''~''\n')
|
||
|
fprintf('Change ''dirName'' or download ephemeris file ''%s'' by hand\n',...
|
||
|
hourlyZFile);
|
||
|
fprintf('To unzip the *.Z file, see http://www.gzip.org/\n')
|
||
|
return
|
||
|
end
|
||
|
|
||
|
try
|
||
|
nasaFtp=ftp(ftpSiteName); %connect to ftp server and create ftp object
|
||
|
cd(nasaFtp,hourlyDir);
|
||
|
zF = mget(nasaFtp,hourlyZFile,dirName); %get compressed (.Z) file
|
||
|
catch
|
||
|
%failed automatic ftp, ask user to do this by hand
|
||
|
fprintf('\nAutomatic ftp download failed.\n')
|
||
|
fprintf('Please go to this ftp, ftp://cddis.gsfc.nasa.gov/ \n')
|
||
|
fprintf('and get this file:%s%s \n',hourlyDir,hourlyZFile);
|
||
|
fprintf('Extract contents to the directory with your pseudorange log file:\n')
|
||
|
fprintf('%s\n',dirName)
|
||
|
fprintf('To unzip the *.Z file, see http://www.gzip.org/\n')
|
||
|
fprintf('Then run this function again, it will read from that directory\n')
|
||
|
return
|
||
|
end
|
||
|
|
||
|
%Now we have the zipped file from nasa. Unzip it:
|
||
|
unzipCommand='uncompress';%edit if your platform uses something different
|
||
|
if any(strfind(computer,'PCWIN'))
|
||
|
unzipCommand='gunzip';
|
||
|
end
|
||
|
s = sprintf('%s "%s"',unzipCommand,zF{1}); %string for system command
|
||
|
[sysFlag,result] = system(s);
|
||
|
if any(sysFlag)
|
||
|
fprintf('\nError in GetNasaHourlyEphemeris.m\n')
|
||
|
fprintf('%s',result);
|
||
|
fprintf('System command ''%s'' failed\n',unzipCommand)
|
||
|
fprintf('Unzip contents of %s by hand. See http://www.gzip.org/\n',zF{1})
|
||
|
fprintf('Then run this function again, it will read the uncompressed file\n')
|
||
|
return
|
||
|
end
|
||
|
|
||
|
bOk = bOk && ~sysFlag;
|
||
|
if bOk
|
||
|
fprintf('\nSuccessfully downloaded ephemeris file ''%s''\n',ephFilename)
|
||
|
if ~isempty(dirName)
|
||
|
fprintf('to: %s\n',dirName);
|
||
|
end
|
||
|
else
|
||
|
end
|
||
|
end
|
||
|
allGpsEph = ReadRinexNav(fullEphFilename);
|
||
|
|
||
|
end %end of function GetNasaHourlyEphemeris
|
||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||
|
|
||
|
function [bOk,dirName] = CheckInputs(utcTime,dirName)
|
||
|
%% check we have the utcTime and right kind of dirName
|
||
|
if any(size(utcTime)~=[1,6])
|
||
|
error('utcTime must be a (1x6) vector')
|
||
|
end
|
||
|
if isempty(dirName), return, end
|
||
|
|
||
|
bOk = true;
|
||
|
if ~exist(dirName,'dir')
|
||
|
bOk = false;
|
||
|
fprintf('Error: directory ''%s'' not found\n',dirName);
|
||
|
if any(strfind(computer,'PCWIN')) && any(strfind(dirName,'/'))
|
||
|
fprintf('Looks like you''re using a PC, be sure your directory is specified with back-slashes ''\\''\n');
|
||
|
end
|
||
|
else
|
||
|
% check if there is a slash at the end of dirName
|
||
|
%decide what type of slash to use:
|
||
|
slashChar = '/'; %default
|
||
|
if any(strfind(dirName,'\'))
|
||
|
slashChar = '\';
|
||
|
end
|
||
|
if dirName(end)~=slashChar
|
||
|
dirName = [dirName,slashChar]; %add slash
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
end %end of function CheckInputs
|
||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||
|
|
||
|
% 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.
|
||
|
|