Файл: Учебное пособие ( Лабораторный практикум на компьютере ) Київ 2008 1.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.01.2024
Просмотров: 346
Скачиваний: 5
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
%Функция вычисляет позицию приемника в абсолютной геоцентрической системе координат (ECI)
%Входные данные:
%a, b-большая и малая полуоси земного эллипсоида (метр);
%ti- текущее время (секунды) ,
%time_s0- истинное звездное время,
%Структура llh_loc - координаты приемника; {
%llh_loc.lon-долгота (радиан);
%llh_loc.lat-широта (радиан);
%llh_loc.h-высота (метр);
%Выходные данные:
%Структура eci_llh - географические координаты приемника в абсолютной геоцентрической системе координат (ECI)
%eci_llh.lon - долгота (радиан);
%eci_llh.lat - широта (радиан);
%eci_llh.h - высота (метр);
%Структура eci_xyz- координаты приемника в абсолютной прямоугольной геоцентрической системе координат (ECI)
% eci_xyz.x - координата x;
% eci_xyz.y - координата y;
% eci_xyz.z - координата z;
OMEGA_Z = 0.7292115e-4; % угловая скорость вращения Земли, (рад/cek)
SEC_IN_RAD = 7.2722052166430e-005; % (PI / 43200.0 ) // Number radian eci_llh.lon = llh_loc.lon + ti * OMEGA_Z + SEC_IN_RAD * time_s0; eci_llh.lat = llh_loc.lat; eci_llh.h = llh_loc.h; eci_xyz = llh_to_ecef( a, b, eci_llh);
Файл :Pr_ecef_eci.m
%Имя файла:Pr_ecef_eci.m
%Назначение- пример преобразования координат
%Входные данные: a=6378137.0;% (м)- большая полуось эллипсоида для WGS-84; b=6356752.314;% (м)- малая полуось эллипсоида для WGS-84; ti= 700;% текущее время (секунды) , time_s0= 100;% истинное звездное время,
%координаты приемника: llh_loc.lon = 30*pi/180; %долгота (радиан); llh_loc.lat= 55*pi/180;%широта (радиан); llh_loc.h= 184; %высота (метр);
%Выходные данные
47
[eci_llh, eci_xyz] = llh_to_eci(a, b, ti, time_s0, llh_loc)
Функция llh_to_ecef
function [XYZ] = llh_to_ecef( a, b, llh)
%Имя функции:LLH_to_ECEF.m
%Функция преобразования географических координат в прямоугольную геоцентрическую систему координат (ECEF)
%Входные данные:
%Структура llh
%llh.lon-долгота (радиан),
%llh.lat-широта (радиан),
%llh.h-высота (метр);
%a, b-большая и малая полуоси земного эллипсоида в WGS-84 (метр);
%Выходные данные:
%Структура XYZ
%XYZ.x - координата x в ECEF;
%XYZ.y - координата y в ECEF;
%XYZ.z - координата z в ECEF; a2=a * a; b2=b * b; r = a2 / sqrt(a2 * cos(llh.lat) * cos(llh.lat) + b2 * sin(llh.lat) * sin(llh.lat));
XYZ.x = (r + llh.h) * cos(llh.lat) * cos(llh.lon);
XYZ.y = (r + llh.h) * cos(llh.lat) * sin(llh.lon);
XYZ.z = (b2 / a2 * r + llh.h) * sin(llh.lat);
2.4.3 Функции и файлы из папки TEST
Функция ECEF_to_LLH_Dg_Zu
function [llh_D] = ECEF_to_LLH_Dg_Zu(a, b, XYZ)
%Имя функции: ECEF_to_LLH_Dg_Zu
%Назначение функции преобразование координат из прямоугольной системы в географическую
% по точным формулам
%Входные данные:
%XYZ.x- координата x, (м) в системе ECEF;
%XYZ.y- координата y, (м) в системе ECEF;
%XYZ.z- координата z, (м) в системе ECEF;
%a=6378137.0 (м)- большая полуось эллипсоида для WGS-84;
%b=6356752.314 (м)- малая полуось эллипсоида для WGS-84;
%A_PZ90_M =6 378 136 (м)- большая полуось эллипсоида для ПЗ 90;
%B_PZ90_M = 6356751.36174 (м)- малая полуось эллипсоида для ПЗ 90;
%Выходные данные:
48
%llh_D.lambda-долгота;
%llh_D.Fi-широта;
%llh_D.h-высота; e2=0.00669437999; %квадрат эксцентриситета эллипсоида a=6378137;% экваториальный радиус эллипсоида b=a*sqrt(1-e2);% полярный радиус эллипсоида
%{
XYZ.x= 1.449310528799138e+007;
XYZ.y= 8.513116350113131e+006;
XYZ.z= 2.031312580583197e+007;
%} w=sqrt(XYZ.x*XYZ.x+XYZ.y*XYZ.y); l=e2/2; m=(w/a)*(w/a); n= ((1-e2)*XYZ.z/b)^2; i=-(2*l*l+m+n)/2; k= l*l*(l*l-m-n); q=(m+n-4*l*l)^3/216 +m*n*l*l;
D=sqrt((2*q-m*n*l*l)*m*n*l*l); bet=i/3-(q+D)^(1/3) - (q-D)^(1/3); t=sqrt(sqrt(bet*bet-k)-(bet+i)/2)-sign(m-n)*sqrt((bet-i)/2); w1=w/(t+l); z1=(1-e2)*XYZ.z/(t-l); llh_D.Fi= atan(z1/((1-e2)*w1)); llh_D.lambda= 2*atan((w-XYZ.x)/XYZ.y); llh_D.h= sign(t-1+l)*sqrt((w-w1)^2 +(XYZ.z-z1)^2);
Функция ECEF_to_LLH_Itera
function [llh] = ECEF_to_LLH_Itera(a, b, XYZ)
%Имя функции: ECEF_to_LLH_Itera
%Назначение функции преобразование координат из прямоугольной системы в географическую
% по итерационным формулам
%Входные данные:
%XYZ.x- координата x, (м) в системе ECEF;
%XYZ.y- координата y, (м) в системе ECEF;
%XYZ.z- координата z, (м) в системе ECEF;
%a=6378137.0 (м)- большая полуось эллипсоида для WGS-84;
%b=6356752.314 (м)- малая полуось эллипсоида для WGS-84;
%A_PZ90_M =6 378 136 (м)- большая полуось эллипсоида для ПЗ 90;
%B_PZ90_M = 6356751.36174 (м)- малая полуось эллипсоида для ПЗ 90;
%Выходные данные:
%llh.lon - долгота;
49
% llh.lat - широта;
%llh.h- высота; a2 = a * a; b2 = b * b; sqrt_xy = sqrt(XYZ.x * XYZ.x + XYZ.y*XYZ.y); e2 = 1.0 - b2 / a2; % ' e =Эксцентриситет, e2 = e^2 eps = 0.001; delta_h = 100; n = 0; v = a;% радиус кривизны в главном вертикале h = 0; while (abs(delta_h) > eps) n = n + 1; fi = atan(XYZ.z / (sqrt_xy * (1 - e2 * v / (v + h)))); % lat llh.lat = fi; sin_fi = sin(fi); cos_fi = cos(fi); v = a / sqrt(1 - e2 * sin_fi * sin_fi); llh.lon = atan2(XYZ.y,XYZ.x); llh.h = sqrt_xy / cos_fi - v; delta_h = llh.h - h;
% fprintf('n=%i h=%f lat=%f lon=%f h=%f delta_h= %f \n',n, h, llh.lat, llh.lon, llh.h, delta_h); h = llh.h; end; end
Функция ECEF_to_LLH_Kelly
function [llh] = ECEF_to_LLH_Kelly(a, b, XYZ)
%Имя функции: ECEF_to_LLH_Kelly
%Назначение функции преобразование координат из прямоугольной системы в географическую
% по итерационным формулам
%Входные данные:
%XYZ.x- координата x, (м) в системе ECEF;
%XYZ.y- координата y, (м) в системе ECEF;
%XYZ.z- координата z, (м) в системе ECEF;
%a=6378137.0 (м)- большая полуось эллипсоида для WGS-84;
%b=6356752.314 (м)- малая полуось эллипсоида для WGS-84;
%A_PZ90_M =6 378 136 (м)- большая полуось эллипсоида для ПЗ 90;
%B_PZ90_M = 6356751.36174 (м)- малая полуось эллипсоида для ПЗ 90;
%Выходные данные:
%llh.lon - долгота;
% llh.lat - широта;
50
%llh.h- высота; a2 = a * a; b2 = b * b; xy = sqrt(XYZ.x * XYZ.x + XYZ.y*XYZ.y); thet = atan(XYZ.z * a / (xy * b)); esq = 1.0 - b2/a2; % ' e =Эксцентриситет, esq = e^2 epsq = a2/b2 - 1.0; llh.lat = atan((XYZ.z + epsq * b * (sin(thet)^3)) / (xy - esq * a * (cos(thet)^3))); llh.lon = atan2(XYZ.y,XYZ.x); if llh.lon < 0 llh.lon = 2*pi + llh.lon; end ; r = a2 / sqrt(a2 * cos(llh.lat) * cos(llh.lat) + b2 * sin(llh.lat) * sin(llh.lat)); llh.h = xy/cos(llh.lat) - r; end
Функция ECEFLLH
function [R] = ECEFLLH(a, b, llh)
%Имя функции: ECEFLLH
%Назначение- вариант функции ECEFLLH_N a2 = a * a; b2 = b * b; n = a2 / sqrt(a2 * cos(llh.lat)*cos(llh.lat) + b2 * sin(llh.lat) * sin(llh.lat));
R.x = (n + llh.h) * cos(llh.lat) * cos(llh.lon);
R.y = (n + llh.h) * cos(llh.lat) * sin(llh.lon);
R.z = (b2 / a2 * n + llh.h) * sin(llh.lat);
Файл Test_Coord.m
%Имя m-файла:Test_Coord.m
%Назначение: пример тестирования программ преобразования координат
%llh.lat = 0.88032730015257; %50 град; 26 мин.; 20.54 с
%ввод входных данных llh.lat =55*pi/180; llh.lon = 0.53109641675259;%30 град; 25 мин.; 46.4995 с a=6378137.0; b=6356752.314;
% ввод высоты и шага изменения высоты llh0.h=0;%184;%высота в метрах step_h= 1000; kol=40000;
%nn=0;
51
for nn=1:kol
% nn=nn+1; llh.h= llh0.h+step_h*(nn-1);
%применение функции вычисления прямоугольных координат при переменной высоте
[R] = ECEFLLH(a, b, llh);
%преобразование прямоугольных координат в географические по точной формуле
[llh_D] = ECEF_to_LLH_Dg_Zu(a, b, R);
%преобразование прямоугольных координат в географические поприближенной формуле
%указание снять блокировку строки и переписать вывод в графике
% [llh] = ECEF_to_LLH_Kelly(a, b,R);
%[llh_K] =Kelly(a, b, R);
%преобразование прямоугольных координат в географические по итерационной формуле
[llh1] = ECEF_to_LLH_Itera(a, b, R);
%{ delta.lat(nn)=llh_D.Fi- llh.lat; delta.lon(nn)=llh_D.lambda- llh.lon; delta.h(nn)= llh_D.h- llh.h;
%} h1(nn)= llh.h; %llh0.h+step_h*(nn-1); delta.lat(nn) = llh1.lat - llh.lat;
%delta.lon(nn)=llh_D.lambda- llh_K.lon;
%delta.h(nn) = llh.h - llh_K.h; delta.h(nn) = llh.h - llh1.h; end
%Графика subplot (1,2,1), plot(h1(2:kol)/1000,delta.h(2:kol)*1000), grid on xlabel('a','FontSize',14,'FontName','TimesNewRoman') set(get(gcf,'CurrentAxes'),'FontSize',14,'FontName','TimesNewRoman'); subplot (1,2,2),,plot(h1(2:kol)/1000,delta.lat(2:kol)*180*3600/pi), grid on xlabel('б','FontSize',14,'FontName','TimesNewRoman') set(get(gcf,'CurrentAxes'),'FontSize',14,'FontName','TimesNewRoman');
%plot(h1,delta.lat*180/pi)
%plot(h1*10^(-3),delta.h)
%plot(1:kol+1, h1)
52
% nn=nn+1; llh.h= llh0.h+step_h*(nn-1);
%применение функции вычисления прямоугольных координат при переменной высоте
[R] = ECEFLLH(a, b, llh);
%преобразование прямоугольных координат в географические по точной формуле
[llh_D] = ECEF_to_LLH_Dg_Zu(a, b, R);
%преобразование прямоугольных координат в географические поприближенной формуле
%указание снять блокировку строки и переписать вывод в графике
% [llh] = ECEF_to_LLH_Kelly(a, b,R);
%[llh_K] =Kelly(a, b, R);
%преобразование прямоугольных координат в географические по итерационной формуле
[llh1] = ECEF_to_LLH_Itera(a, b, R);
%{ delta.lat(nn)=llh_D.Fi- llh.lat; delta.lon(nn)=llh_D.lambda- llh.lon; delta.h(nn)= llh_D.h- llh.h;
%} h1(nn)= llh.h; %llh0.h+step_h*(nn-1); delta.lat(nn) = llh1.lat - llh.lat;
%delta.lon(nn)=llh_D.lambda- llh_K.lon;
%delta.h(nn) = llh.h - llh_K.h; delta.h(nn) = llh.h - llh1.h; end
%Графика subplot (1,2,1), plot(h1(2:kol)/1000,delta.h(2:kol)*1000), grid on xlabel('a','FontSize',14,'FontName','TimesNewRoman') set(get(gcf,'CurrentAxes'),'FontSize',14,'FontName','TimesNewRoman'); subplot (1,2,2),,plot(h1(2:kol)/1000,delta.lat(2:kol)*180*3600/pi), grid on xlabel('б','FontSize',14,'FontName','TimesNewRoman') set(get(gcf,'CurrentAxes'),'FontSize',14,'FontName','TimesNewRoman');
%plot(h1,delta.lat*180/pi)
%plot(h1*10^(-3),delta.h)
%plot(1:kol+1, h1)
52
РАЗДЕЛ 3 Время
3.1 Краткие сведения из теории
В спутниковой радионавигации время имеет большое значение, поскольку основные навигационные определения производятся по формулам, в которых параметр времени присутствует многократно. Прежде всего, это время распространения электромагнитного сигнала от навигационного спутника до потребителя, время «включения» часов спутника, время синхронизации данных передаваемых со спутника, время прохождения электромаг- нитного сигнала через атмосферу, влияние на время релятивистских эффектов, совмеще- ние шкал времени спутника и потребителя, системное время СРНС, опорные моменты от- счета времени (эпохи), единицы счета времени (год, неделя, день, час, минута, секунда, миллисекунда) и многое другое.
Алгоритмы расчета времени, запрограммированные в прилагаемом пакете программ, изложены в книге [1] (раздел 1. 3, стр.40 -50), а также в источниках, приведенных в биб- лиографии к книге [1]. Пакет программ в среде MatLab дается в папке TIME и в прила- гаемых листингах программ.
Цель лабораторной работы: Изучение основных временных составляющих, при- меняемых в алгоритмах и программах спутниковой аппаратуры потребителя для решений навигационных задач.
3.2 Лабораторная работа 3. 1 «Время в спутниковых радионавигационных сис-
1 2 3 4 5 6 7 8 9 ... 14
темах»
Рекомендуется следующий порядок действий для выполнения лабораторной работы.
1. Создайте папку TIME_My и скопируйтев ее все программы из папки TIME.
2. Запустите MatLab [7, 8].
3. Обратитесь к папке TIME _My и откройте ее.
4. Откройте функцию JD_epohi, внимательно изучите ее по комментариям и программ- ным процедурам, описывающим алгоритм расчета (раздел 1. 3 книги [1]).
5. Откройте пример расчета PR_JD_epohi.m и выполните m- файл.
6. Основываясь на m- файле PR_JD_epohi.m выполните задание 1.
7. Задание 1. Используя в качестве основы m- файл PR_JD_epohi.m , сформируйте m- файл и рассчитайте юлианского день для опорного года, в котором Вы родились. Рас- считайте юлианский день эпохи 2000 (2000 год) и объясните причину разницы в 1 день. Результат выполнения из командного окна MatLab перенесите в отчет.
8. Откройте функцию JD_data, внимательно изучите ее по комментариям и программным процедурам, описывающим алгоритм расчета (раздел 1. 3 книги [1]).
53
9. Откройте пример расчета PR_JD_data.m и выполните m- файл.
10. Основываясь на m- файле PR_JD_data.m выполните задание 2.
11. Задание 2. Используя в качестве основы m- файл PR_JD_data.m , сформируйте m- файл и рассчитайте юлианского день для опорного года и номер дня года, в котором
Вы родились. Рассчитайте юлианский день эпохи 2000 (2000 год) и объясните причину разницы в 1 день. Результат выполнения из командного окна MatLab перенесите в от- чет.
12. Откройте функцию time_gps, внимательно изучите ее по комментариям и программ- ным процедурам, описывающим алгоритм расчета (раздел 1. 3 книги [1]).
13. Откройте пример расчета PR_time_gps.m и выполните m- файл.
14. Основываясь на m- файле PR_time_gps.m выполните задания 3 и 4.
15. Задание 3. Используя в качестве основы m- файл PR_JD_data.m , сформируйте m- файл и рассчитайте номер GPS-недели, время UTC c начала текущей недели, время
GPS c начала текущей недели, номер дня года, номера юлианского дня на момент вы- полнения лабораторной работы. Результат выполнения из командного окна MatLab пе- ренесите в отчет.
16. Задание 4. В сформированном файле задайте номера дней, соответствующих субботе и воскресению и убедитесь, что происходит изменение номера недели. Результат вы- полнения из командного окна MatLab перенесите в отчет.
17. Откройте функцию week_GLONAS_gps, внимательно изучите ее по комментариям и программным процедурам.
18. Откройте пример расчета
PR_time_gps_GLON.m и выполните m- файл.
19. Основываясь на m- файле
PR_time_gps_GLON.m выполните задание 5.
20. Задание 5. Используя в качестве основы m- файл PR_time_gps_GLON.m , сформируй- те m- файл, задайте Na- календарный номер суток внутри четырехлетнего периода от ближайшего високосного года, выполните m- файл . Результат выполнения из команд- ного окна MatLab перенесите в отчет.
21. Создайте папку TIME_S0_My и скопируйтев ее все программы из папки TIME_S0.
22. Обратитесь к папке TIME_S0_My и откройте ее.
23. Последовательно открывая функции: s0_Nut, utc_nut, koef, utc_nut_fi_eps внимательно изучите их по комментариям и программным процедурам, описывающим алгоритм расчета (раздел 1. 3 книги [ ]).
24. Выполните указание 1 и дополните папку TIME_S0_My функциямиJD_epohi,
JD_data.
25. Откройте пример расчета PR_s0_Nut.m и выполните m- файл.
54
26. Основываясь на m- файле PR_s0_Nut.m выполните задание 6.
27. Задание 6. Используя в качестве прототипа m- файлPR_s0_Nut.mсформируйтеm- файл, введите в него исходные данные, соответствующие времени выполнения работы выполните m- файл (рассчитайте истинное и среднее звездное время) и занесите ре- зультаты выполнения из командного окна MatLab в отчет.
3.3 Вопросы и задания для самоподготовки
1. Что понимается под терминами звездное время, истинное звездное время, среднее звездное время, время на гринвичском меридиане ?
2. В каких спутниковых радионавигационных системах и для чего применяется юлиан- ский день?
3. Назовите основные фундаментальные эпохи, используемые в спутниковой радионави- гации.
4. Какие единицы измерения времени применяются в GPS?
5. Какие единицы измерения времени применяются в ГЛОНАСС?
6. Какие единицы измерения времени применяются в EGNOS?
7. Какие единицы измерения времени применяются в GALILEO?
8. Что в GPS обозначает дата с 5. 01. 80 на 6. 01. 80?
9. На сколько секунд системное время GPS опережает время UTC?
10. Какой смысл в ГЛОНАСС вкладывается в определение «московское декретное вре- мя»?
11. Что такое универсальное всемирное время?
12. Что такое атомное время?
13. Напишите формулу, связывающую время ГЛОНАСС и время UTC.
14. Объясните физический смысл нутации.
15. Как изменяется время GPS в течение недели.
16. Как изменяется время ГЛОНАСС в течение суток.
3.4 Тексты программ
3.4.1 Функции и файлы из папкиTIME
Функция JD_epohi
function jden = JD_epohi(epoha)
%Имя: JD_epohi
%Фукция JD_epohi(epoha) рассчитывает юлианский день
%для опорного года (epoha)
55
%Входные данные: epoha, размерность-год
%Выходные данные:jden- юлианский день, размерность -дни rk = mod(epoha,4); if ( rk == 0 ) rk = 1.0; else rk = 2.0 - rk * 0.25; end; n100 = floor(epoha / 100); n400 = floor(epoha / 400); jden = (4712 + epoha) * 365.25 + n400 - n100 + rk;
% fprintf('epoha=%d rk=%f jden=%6.2f \n', epoha, rk, jden);
Файл PR_JD_epohi.m
%Пример расчета JD_epohi epoha=2000; jden = JD_epohi(epoha)
Решение по данным примера. Юлианский день 2000 года (эпоха 2000) равен 2451544 (нулевой
день !!!)
Функция JD_
data (расчет номера юлианского дня ).
function [JD, day_year] = JD_data(year, mon, day)
%Имя:JD_data
% Функция JD_data(year, mon, day) вычисляет :
%JD - номер юлианского дня, day_year - номер дня года.
%Входные данные:
%year - год,
% mon - месяц,
% day - день.
%Выходные данные:
%JD - юлианский день, day_year- день от начала года.
%Оригинальные функции: function jd0 = JD_epohi(year),
%(смотри комментарий).
% число дней от начала периода до 12ч. всемирного времени (полдень)
% указанной даты ( по Гринвичу)
%Входные данные для контрольного примера:
%year = 2000; mon = 1; day = 1;
%количество дней в месяцах
DnMon = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
%Вычисление номера юлианского дня опорной эпохи jd0 = JD_epohi(year);
%Учет високосного года nfebr = 0; if mod(year,4) == 0 56