Спутниковые системы навигации. Учебное пособие. Учебное пособие ( Лабораторный практикум на компьютере ) Київ 2008 1
Скачать 4.49 Mb.
|
РАЗДЕЛ 5 Преобразование данных навигационных спутников 5.1 Преобразование данных альманаха приемника СН 4701 в формат YUMA 5.1.1 Краткие сведения из теории В спутниковых радионавигационных системах ГЛОНАСС и GPS эфемериды рассчи- тываются по принципиально разным формулам. В то же время весьма целесообразным является применение в задачах прогнозирования навигационных сеансов использовать одинаковый формат данных альманаха. Отсюда вытекает задача преобразования (конвер- тирования) альманаха системы ГЛОНАСС в широко распространенный формат YUMA без потери данных об альманахе спутников ГЛОНАСС. Программы представленные в данном подразделе выполняют преобразование аль- манаха спутников GPS и ГЛОНАСС в формат YUMA, который воспринимается програм- мой PLANNING и обеспечивает возможность планирования сеансов навигационных оп- ределения при применении спутниковых систем GPS и ГЛОНАСС. Программный ком- плекс подготовлен в точном соответствии с интерфейсными контрольными документами [ ]. Рис. 5.1. Блок- схема программы преобразования альманаха ГЛОНАСС/GPS в формат YUMA convers_АLM_GLN_YUMA_GPS.m Входные данные 'In_dat\002.txt' Функция «Чтение альманаха» Read_GL_Alm Функция преобразования дня при- вязки данных альманаха Gln_data_from_NA Функция read_Alm(Dat) Функция write_GPS_alm Функция GLN_satfind_YUMA Функция JD_epohi Функция Gln_data_from_NA Функция JD_from_epohi Функция s0_Nut Функция JD_data Функция week_GLONAS_gps Функция gln_a Функция semi_axis Выходные данные: AlmGG.yum Для системы ГЛОНАСС Программы, записанные на CD-диск, находятся в папке ALM_CH4701_V3. Схема построения программного комплекса изображена на рис. 5.1. Основные комментарии и пояснения к программам приведены в листингах. Цель лабораторной работы преобразование (конвертирование) данных альманаха навигационных спутников в формат YUMA. 5.1.2 Лабораторная работа 5. 1 «Конвертирование данных альманаха GPS и ГЛО- НАСС в формат » YUMA Пакет программ для выполнения лабораторной работы расположен в папке ALM_CH4701_V3. Для выполнения работы в качестве входных данных потребуется аль- манах спутников GPS и ГЛОНАСС, который можно получить с нескольких сайтов или с навигационного приемника, если приемник имеется в лаборатории. Рекомендуется следующий порядок выполнения лабораторной работы. 1. Запишите альманах, с приемника CH4701 в папку In_dat. Если не имеется возможно- сти получить данные альманаха с приемника, то можно воспользоваться альманахом с именем 002.txt из приложения к данной книге. 2. Создайте папку ALM_CH4701_V3_My и скопируйтев ее все программы из папки ALM_CH4701_V3 и папку In_dat. 3. Запустите MatLab. 4. Обратитесь к папке ALM_CH4701_V3_My , откройте ее, изучите функции, файлы и программные процедуры по комментариям и выполните задания 1 и 2. 5. Задание 1. Откройте файл convers_ALM_GLN_YUMA_GPS.m в папке ALM_CH4701_V3_My и присвойте переменной Dat имя альманаха из папки In_dat. Выполните файл. Результат выполнения запишется в файл AlmGG.yum. Это и будет преобразованный в формат YUMA альманах спутников GPS и ГЛОНАСС. 6. Задание 2. Загрузите альманах AlmGG.yum в программу прогнозирования PLANNING и убедитесь в его работоспособности. 5.1.3 Задание для самоподготовки Ознакомтесь и освойте работу с программой PLANNING 5.1.4 Функции и файлы из папки ALM_CH4701_V3 Файл convers_АLM_GLN_YUMA_GPS.m 142 %Имя файла:convers_АLM_GLN_YUMA_GPS.m %от conversion- преобразование; программа преобразует данные альманаха GPS и ГЛОНАСС, полученные %с приемника "СН 4701" (производитель ГП "ОРИЗОН-НАВИГАЦИЯ" в формат YUMA %Входные данные: альманах- записан в папке с именем In_dat, например, %Dat = 'In_dat\GLN_all_23_10_06_17_45.alm'; %Выходные данные:записываются в файл с именем 'AlmGG.yum' %Dat = 'In_dat\GLN_all8_11_06.alm'; %Dat = 'In_dat\GLN06_11_06.alm'; %Dat = 'In_dat\GG_24_03_03.alm';% GG24 Dat = 'In_dat\002.txt';% CN %Имя файла для записи Name = 'AlmGG.yum'; %Открытие файла для записи fid =fopen(Name,'wt'); % Чтение альманаха [alm_GPS,max_kol_GPS,alm_gln,max_kol_GLN] = read_Alm(Dat); %Запись в файл альманаха GPS write_GPS_alm(fid, alm_GPS); %Полуоси земного эллипсоида A_WGS84_M = 6378137.0 ; % WGS-84 ellipsoid parameters A_PZ90_M = 6378136.0; %6 378 136 м - Equatorial radius of the Earth - ,большая полуось эллипсоида A_PZ90_M = A_WGS84_M; %Смещение времени GPS от UTC в секундах %dt_lsf = 13; leap_year = 2004;% Високосный год timeUTC_leap.year = leap_year; timeUTC_leap.mon = 0; timeUTC_leap.day = 0; GLN_satfind_YUMA( A_PZ90_M, timeUTC_leap, alm_gln, fid); Функция read_Alm function [alm,max_kol_GPS,alm_gln,max_kol_GLN] = read_Alm(Dat) %Имя функции:read_Alm %Функция читает данные альманаха GPS и ГЛОНАСС, полученные %с приемника "СН 4701" (производитель ГП "ОРИЗОН-НАВИГАЦИЯ" %Dat = '001.txt'; i=0; for i=1:61 alm(i).ID = 0; alm(i).Health=63; 143 alm_gln(i).ID=0; alm_gln(i).Health=255; end; fid =fopen(Dat,'rt'); max_kol_GLN = 0; max_kol_GPS = 0; while not(feof(fid)) str1=fscanf(fid,'%s',1); % GPS | GLN len1 = length(str1); if len1 == 4 % GPS if str1 == 'GPS:' max_kol_GPS = max_kol_GPS + 1; str1=fscanf(fid,'%c',4); ID=fscanf(fid,'%d',1); alm(ID).ID = ID; str2=fscanf(fid,'%c',13); Health=fscanf(fid,'%d',1); alm(ID).Health=Health; str3=fscanf(fid,'%c',19); eccentricity=fscanf(fid,'%g',1); alm(ID).ecc =eccentricity; str4=fscanf(fid,'%c',27); deltai=fscanf(fid,'%g',1) ; %i0 alm(ID).deltai= deltai ; %i0 str5=fscanf(fid,'%c',30); OMEGADOT=fscanf(fid,'%g',1)*1000; alm(ID).OMEGADOT=OMEGADOT; str6=fscanf(fid,'%c',37); A05=fscanf(fid,'%g',1); alm(ID).A05=A05; str7=fscanf(fid,'%c',32); omega0 =fscanf(fid,'%g',1); alm(ID).omega0 =omega0; str8=fscanf(fid,'%c',26); omega =fscanf(fid,'%g',1); alm(ID).omega=omega; 144 str9=fscanf(fid,'%c',19); M0=fscanf(fid,'%g',1); alm(ID).M0=M0; str10=fscanf(fid,'%c',11); Af0m=fscanf(fid,'%g',1)/1000; alm(ID).Af0m=Af0m; str11=fscanf(fid,'%c',10); Af01=fscanf(fid,'%g',1); alm(ID).Af01=Af01; str12=fscanf(fid,'%c',11); Af0=fscanf(fid,'%g',1); alm(ID).Af0=Af0; str13=fscanf(fid,'%c',19); Week=fscanf(fid,'%g',1)+1024; alm(ID).Week=Week; str14=fscanf(fid,'%c',27); TOA=fscanf(fid,'%d')/1000; alm(ID).TOA =TOA; end;% if str1 == 'GPS' else % GLONASS len1 = length(str1); if len1 == 8 max_kol_GLN = max_kol_GLN+1; str2=fscanf(fid,'%c',4); ID=fscanf(fid,'%d',1); alm_gln(ID).ID = ID; str3=fscanf(fid,'%c',15); Health=fscanf(fid,'%d',1); alm_gln(ID).Health=Health; str4=fscanf(fid,'%c',19); Hn=fscanf(fid,'%d',1); alm_gln(ID).Hn=Hn; 145 str5=fscanf(fid,'%c',34); TaUGL=fscanf(fid,'%g',1); alm_gln(ID).tau_n=TaUGL/1000; str6=fscanf(fid,'%c',52); LambdaN=fscanf(fid,'%g',1); alm_gln(ID). LambdaN=LambdaN; str7=fscanf(fid,'%c',24); deltai=fscanf(fid,'%g',1); alm_gln(ID).deltai=deltai; str8=fscanf(fid,'%c',21); eccentricity=fscanf(fid,'%g',1); alm_gln(ID).ecc =eccentricity; str9=fscanf(fid,'%c',39); omegan=fscanf(fid,'%g',1); alm_gln(ID).omegan =omegan; str10=fscanf(fid,'%c',48); TLambdaN=fscanf(fid,'%g',1); alm_gln(ID).TLambdaN =TLambdaN/1000-10800; str11=fscanf(fid,'%c',27); Tdr=fscanf(fid,'%g',1); alm_gln(ID).Tdr =Tdr/1000; str12=fscanf(fid,'%c',48); dTdr=fscanf(fid,'%g',1); alm_gln(ID).dTdr =dTdr;%?единицы измерения str13=fscanf(fid,'%c',16); Na=fscanf(fid,'%g',1); alm_gln(ID).Na =Na; end % if len1 == 4 % GPS end % while end fclose(fid); 146 Функция Gln_data_from_NA function [time_UTC] = Gln_data_from_NA(leap_year, day_from_leap); %Имя функции:Gln_data_from_NA %function [time_UTC] = Gln_data_from_NA(leap_year, day_from_leap); % преобразует NA - день привязки альманаха % от ближайшего високосного года - leap_year % в текущую дату: timeUTC (год, месяц, день) DnMon = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; %количество дней в месяцах n4 = mod(leap_year, 4); n100 = mod(leap_year, 100); n400 = mod(leap_year, 400); if (n4 == 0) n_leap = 1; else n_leap = 0; end if ((n100 == 0) & (n400 > 0)) n_leap = 0; end if (day_from_leap > (365 + n_leap)) day = day_from_leap - (365 + n_leap); k =fix (day / 365); day = mod(day, 365); else day = day_from_leap; k = -1; end; god = leap_year + k + 1; if (god > leap_year) n_leap = 0; end; mon = 1; mon_day = 31; while (day > mon_day) day = day - mon_day; mon = mon + 1; % LK mon_day = DnMon(mon); % mon = mon+1; if (mon == 2) mon_day = mon_day + n_leap; 147 end end time_UTC.year = god; time_UTC.mon = mon; time_UTC.day = day; Функция :read_Alm function [alm,max_kol_GPS,alm_gln,max_kol_GLN] = read_Alm(Dat) %Имя функции:read_Alm %Функция читает данные альманаха GPS и ГЛОНАСС, полученные %с приемника "СН 4701" (производитель ГП "ОРИЗОН-НАВИГАЦИЯ" %Dat = '001.txt'; i=0; for i=1:61 alm(i).ID = 0; alm(i).Health=63; alm_gln(i).ID=0; alm_gln(i).Health=255; end; fid =fopen(Dat,'rt'); max_kol_GLN = 0; max_kol_GPS = 0; while not(feof(fid)) str1=fscanf(fid,'%s',1); % GPS | GLN len1 = length(str1); if len1 == 4 % GPS if str1 == 'GPS:' max_kol_GPS = max_kol_GPS + 1; str1=fscanf(fid,'%c',4); ID=fscanf(fid,'%d',1); alm(ID).ID = ID; str2=fscanf(fid,'%c',13); Health=fscanf(fid,'%d',1); alm(ID).Health=Health; str3=fscanf(fid,'%c',19); eccentricity=fscanf(fid,'%g',1); alm(ID).ecc =eccentricity; str4=fscanf(fid,'%c',27); deltai=fscanf(fid,'%g',1) ; %i0 alm(ID).deltai= deltai ; %i0 148 str5=fscanf(fid,'%c',30); OMEGADOT=fscanf(fid,'%g',1)*1000; alm(ID).OMEGADOT=OMEGADOT; str6=fscanf(fid,'%c',37); A05=fscanf(fid,'%g',1); alm(ID).A05=A05; str7=fscanf(fid,'%c',32); omega0 =fscanf(fid,'%g',1); alm(ID).omega0 =omega0; str8=fscanf(fid,'%c',26); omega =fscanf(fid,'%g',1); alm(ID).omega=omega; str9=fscanf(fid,'%c',19); M0=fscanf(fid,'%g',1); alm(ID).M0=M0; str10=fscanf(fid,'%c',11); Af0m=fscanf(fid,'%g',1)/1000; alm(ID).Af0m=Af0m; str11=fscanf(fid,'%c',10); Af01=fscanf(fid,'%g',1); alm(ID).Af01=Af01; str12=fscanf(fid,'%c',11); Af0=fscanf(fid,'%g',1); alm(ID).Af0=Af0; str13=fscanf(fid,'%c',19); Week=fscanf(fid,'%g',1)+1024; alm(ID).Week=Week; str14=fscanf(fid,'%c',27); TOA=fscanf(fid,'%d')/1000; alm(ID).TOA =TOA; end;% if str1 == 'GPS' else % GLONASS 149 len1 = length(str1); if len1 == 8 max_kol_GLN = max_kol_GLN+1; str2=fscanf(fid,'%c',4); ID=fscanf(fid,'%d',1); alm_gln(ID).ID = ID; str3=fscanf(fid,'%c',15); Health=fscanf(fid,'%d',1); alm_gln(ID).Health=Health; str4=fscanf(fid,'%c',19); Hn=fscanf(fid,'%d',1); alm_gln(ID).Hn=Hn; str5=fscanf(fid,'%c',34); TaUGL=fscanf(fid,'%g',1); alm_gln(ID).tau_n=TaUGL/1000; str6=fscanf(fid,'%c',52); LambdaN=fscanf(fid,'%g',1); alm_gln(ID). LambdaN=LambdaN; str7=fscanf(fid,'%c',24); deltai=fscanf(fid,'%g',1); alm_gln(ID).deltai=deltai; str8=fscanf(fid,'%c',21); eccentricity=fscanf(fid,'%g',1); alm_gln(ID).ecc =eccentricity; str9=fscanf(fid,'%c',39); omegan=fscanf(fid,'%g',1); alm_gln(ID).omegan =omegan; str10=fscanf(fid,'%c',48); TLambdaN=fscanf(fid,'%g',1); alm_gln(ID).TLambdaN =TLambdaN/1000-10800; str11=fscanf(fid,'%c',27); Tdr=fscanf(fid,'%g',1); 150 alm_gln(ID).Tdr =Tdr/1000; str12=fscanf(fid,'%c',48); dTdr=fscanf(fid,'%g',1); alm_gln(ID).dTdr =dTdr;%?единицы измерения str13=fscanf(fid,'%c',16); Na=fscanf(fid,'%g',1); alm_gln(ID).Na =Na; end % if len1 == 4 % GPS end % while end fclose(fid); Функция write_GPS_alm function [] = write_GPS_alm(fw, alm) %Имя функции:write_GPS_alm %Функция записывает альманах GPS в совместный альманах спутников GPS и ГЛОНАСС в формате YUMA i=0; format long e; for i=1:31 if alm(i).ID > 0 %Заголовок альманаха fprintf(fw,'**** Week %i almaNAU for PRN-0%i **********\n',alm(i).Week, alm(i).ID); %Номер спутника GPS fprintf(fw,'ID: %i\n',alm(i).ID); %Здоровье спутника GPS fprintf(fw,'Health: %i\n', alm(i).Health); %Эксцентриситет орбиты спутника GPS strdop = e_norm(alm(i).ecc, 9); fprintf(fw,'Eccentricity: %s\n', strdop); %Время от начала недели GPS, на которое заданы параметры альманаха fprintf(fw,'Time of Applicability(s): %6.4f\n',alm(i).TOA); %Наклонение орбиты спутника GPS 151 fprintf(fw,'Orbital Incluation(rad): %0.10f \n', alm(i).deltai); %Скорость изменения восходящего узла орбиты спутника GPS strdop = e_norm(alm(i).OMEGADOT, 9); fprintf(fw,'Rate of Right Ascen(r/s): %s\n', strdop); %Корень квадратный из большой полуоси орбиты спутника GPS fprintf(fw,'SQRT(A) (m^1/2): %4.7f \n',alm(i).A05); %Долгота восходящего узла орбиты спутника GPS strdop = e_norm(alm(i).omega0, 9); fprintf(fw,'Right Ascen at Week(rad): %s\n', strdop ); %Аргумент перигея орбиты спутника GPS strdop = e_norm(alm(i).omega, 9); fprintf(fw,'Argument of Perigee(rad): %s\n',strdop); %Средняя аномалия спутника GPS strdop = e_norm(alm(i).M0, 9); fprintf(fw,'Mean Anom(rad): %s\n', strdop); %Коэффициенты полинома для учета поправок времени strdop = e_norm(alm(i).Af0m, 9); fprintf(fw,'Af0(s): %s\n', strdop); strdop = e_norm(alm(i).Af01, 9); fprintf(fw,'Af1(s/s): %s\n', strdop); %Номер недели fprintf(fw,'week: %i \n',alm(i).Week); %Запись альманаха GPS в файл fprintf(fw,' \n'); end; %if alm(i).ID > 0 end; %i Функция GLN_satfind_YUMA function [ ] = GLN_satfind_YUMA(a, timeUTC_leap, alm_gln, fid); %Имя функции:GLN_satfind_YUMA %функция обрабатывае входные данные KOL_GLN = 24; A_PZ90_KM = a / 1000; for ( i = 1 :KOL_GLN) %alm_gln.Na -(сек) время привязки альманаха от начала предшествующего високосного года day_from_leap = alm_gln(i).Na; timeUTC = Gln_data_from_NA(timeUTC_leap.year, day_from_leap); timeUTC.ti = 0.0; nut = 0; S0 = s0_Nut( timeUTC, nut); 152 time_s0 = S0.s0_m_mod ; %time_s0 - истинное звездное время в текущий момент обсервации year = timeUTC.year; % leap_year = fix( year / 4) * 4; % ближайший к текущему (предыдущий) високосный год leap_year = timeUTC_leap.year; % ближайший к текущему (предыдущий) високосный год %------------ % ti = timeUTC.ti; % текущее время обсервации от начала дня % n00 = fix(ti / 86400); % n0 - номер текущих суток внутри 4-х летнего периода (от ближайшего високосного года) % n0 = JD_from_epohi(leap_year, timeUTC) + n00 + 1; % [eci_current_loc, eci_rec_pos_xyz] = llh_to_eci(a, b, ti, time_s0, current_loc_pz90); % satpos_eci = init_satpos_gln(); ti = alm_gln (i).TLambdaN; % текущее время обсервации от начала дня n00 = fix(ti / 86400); % n0 - номер текущих суток внутри 4-х летнего периода (от ближайшего високосного года) n0 = JD_from_epohi(leap_year, timeUTC) + n00 + 1; prn = alm_gln (i).ID; health = alm_gln (i).Health; Hn = alm_gln (i).Hn; if ((prn > 0) & (Hn > 0)) gln_a(A_PZ90_KM, i, n0, ti, time_s0, alm_gln, timeUTC_leap, fid); end; % f ( (prn > 0) & (health == 1)) end; % for ( i = 1 : KOL_GLN) fclose(fid); Функция Gln_data_from_NA function [time_UTC] = Gln_data_from_NA(leap_year, day_from_leap); %Имя функции:Gln_data_from_NA %function [time_UTC] = Gln_data_from_NA(leap_year, day_from_leap); % преобразует NA - день привязки альманаха % от ближайшего високосного года - leap_year % в текущую дату: timeUTC (год, месяц, день) DnMon = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; %количество дней в месяцах n4 = mod(leap_year, 4); n100 = mod(leap_year, 100); n400 = mod(leap_year, 400); 153 if (n4 == 0) n_leap = 1; else n_leap = 0; end if ((n100 == 0) & (n400 > 0)) n_leap = 0; end if (day_from_leap > (365 + n_leap)) day = day_from_leap - (365 + n_leap); k =fix (day / 365); day = mod(day, 365); else day = day_from_leap; k = -1; end; god = leap_year + k + 1; if (god > leap_year) n_leap = 0; end; mon = 1; mon_day = 31; while (day > mon_day) day = day - mon_day; mon = mon + 1; % LK mon_day = DnMon(mon); % mon = mon+1; if (mon == 2) mon_day = mon_day + n_leap; end end time_UTC.year = god; time_UTC.mon = mon; time_UTC.day = day; Функция s0_Nut function [S0] = s0_Nut( timeUTC, nut) %Имя функции: s0_Nut %функция рассчитывает истинное и среднее звездное время по формулам ( ) % среднее звездное время s0 на 0ч UTC %year = 1993; mon = 1; day = 0; %fprintf('function s0_m - start \n'); 154 jd2000 = 2451545; % 12h UTC 1 января % Применить функцию JD_data [jd, day_year] = JD_data( timeUTC); if (jd == NaN) s0_mod = NaN; h = NaN; min = NaN; sec = NaN; fprintf('function s0_m - end0 \n'); return; end; jd = jd - 0.5; d = jd - jd2000; t = d / 36525.0; % 36525 - юлианский период 100 лет t2 = t * t; h1 = 24110.54841; %h1=6.0*3600.0+41.0*60.0+50.54841; % h2 = 236.555367908 * d; h2 = 8640184.812866 * t ; h3 = 0.093104 * t2; h4 = t2 * t * 6.2E-6; if ( nut == 0) na = 0; else na = utc_nut(t); end; s0_m = h1 + h2 + h3 - h4; S0.s0_nut = s0_m + na; S0.s0_m_mod = mod(s0_m, 86400); s0_day = floor(s0_m / 86400); S0.s0_m_hour = S0.s0_m_mod / 3600.0; S0.s0_m_hour = floor(S0.s0_m_mod / 3600); sec_min = S0.s0_m_mod - S0.s0_m_hour * 3600; S0.s0_m_min = floor(sec_min / 60); S0.s0_m_sec = sec_min - S0.s0_m_min * 60; S0.s0_nut_mod = mod(S0.s0_nut, 86400); s0_day = floor(S0.s0_nut / 86400); S0.s0_nut_hour = S0.s0_nut_mod / 3600.0; S0.s0_nut_hour = floor(S0.s0_nut_mod / 3600); sec_min = S0.s0_nut_mod - S0.s0_nut_hour * 3600; S0.s0_nut_min = floor(sec_min / 60); S0.s0_nut_sec = sec_min - S0.s0_nut_min * 60; 155 Функция :JD_from_epohi function [jd] =JD_from_epohi( epoha, timeUTC); %Имя функции:JD_from_epohi %Функция вычисляет jd - количество дней от указанного года (epoha) % до текущей даты, указанной в структуре timeUTC представленной в виде % (timeUTC.year, timeUTC.mon, timeUTC.day) jd0 = JD_epohi(epoha) + 1; % 12h, 1 den January [day, day_year] = JD_data(timeUTC); jd = day - jd0; |