Ïðàâèòåëüñòâî Ðîññèéñêîé Ôåäåðàöèè
Ôåäåðàëüíîå ãîñóäàðñòâåííîå áþäæåòíîå îáðàçîâàòåëüíîå ó÷ðåæäåíèå
âûñøåãî ïðîôåññèîíàëüíîãî îáðàçîâàíèÿ
¾Ñàíêò-Ïåòåðáóðãñêèé ãîñóäàðñòâåííûé óíèâåðñèòåò¿
Ñïåöèàëüíîñòü Àñòðîíîìèÿ (011501)
Íàïðàâëåíèå Ìàòåìàòèêà è ìåõàíèêà
Áàõàðåâ Êîíñòàíòèí Âàäèìîâè÷
Ðàçðàáîòêà è ñîçäàíèå áàçû äàííûõ íàáëþäåíèé ñïóòíèêîâ
ñèñòåìû DORIS äëÿ ðåøåíèÿ ãåîäèíàìè÷åñêèõ çàäà÷
Äèïëîìíàÿ ðàáîòà
Äîïóùåíà ê çàùèòå.
Çàâ. êàôåäðîé:
ä.ô.-ì.í., Ê.Â. Õîëøåâíèêîâ
Íàó÷íûé ðóêîâîäèòåëü:
ê.ô.-ì.í., Â.Á. Òèòîâ
Êîíñóëüòàíò:
ê.ô.-ì.í., Ì.Â. Âàñèëüåâ
Ðåöåíçåíò:
ê.ô.-ì.í., Â. Ë. Ãîðøêîâ
CàíêòÏåòåðáóðã, 2016
SAINT-PETERSBURG STATE UNIVERSITY
Main Field of Stude Astronomy(011501)
Area of Specialsation mathematics and mechanics
Konstantin Bakharev
Developing and creating observation database of DORIS
system satellites for geodynamic problem solution
Graduation Thesis
Admitted for defence.
Head of the chair:
(Professor) K. V. Kholshevnikov
Scientic supervisor:
(Ph.d.) V.B. Titov
Adviser:
(Ph.d.) M.V. Vasiliev
Scientist Reviewer:
(Ph.d) V.L. Gorshkov
Saint-Petersburg, 2016
Îãëàâëåíèå
1 Òåçèñû
4
2 Ââåäåíèå
5
3 Ñèñòåìà ñïóòíèêîâ DORIS
6
4 Ïðîãðàììíûé êîìïëåêñ
10
4.1
Îáùàÿ ñõåìà . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
4.2
Ðàáî÷èé öèêë ïðîãðàììû . . . . . . . . . . . . . . . . . . . . .
11
5 Ïîñòàíîâêà çàäà÷è
13
6 Ìîäóëü áàçû äàííûõ
14
6.1
Áàçà äàííûõ íàáëþäåíèé ñïóòíèêîâ DORIS . . . . . . . . . . .
14
6.2
Áàçà äàííûõ ýôåìåðèä DORIS . . . . . . . . . . . . . . . . . .
16
6.3
Ñëóæáû äëÿ ðàáîòû ñ èíòåðíåòîì . . . . . . . . . . . . . . . .
17
7 Ìîäóëü òåñòèðîâàíèÿ
19
8 Çàêëþ÷åíèå
20
Ïðèëîæåíèå. Ëèñòèíã ïðîãðàììû . . . . . . . . . . . . . . . . . . .
3
21
Ãëàâà 1
Òåçèñû
 äèïëîìíîé ðàáîòå ðàññìàòðèâàåòñÿ çàäà÷à ïîñòðîåíèÿ áàçû äàííûõ è ìîäóëÿ òåñòèðîâàíèÿ äëÿ ïðîãðàììíîãî êîìïëåêñà, êîòîðûé ðàáîòàåò ñ äàííûìè DORIS. Ãëàâíûì ðåçóëüòàòîì ïðîäåëàííîé ðàáîòû ÿâëÿåòñÿ ðåàëèçàöèÿ:
1. Ìîäóëÿ ïðîãðàììíîãî êîìïëåêñà, îòâå÷àþùåãî çà àãðåãàöèþ, õðàíåíèå,
îáíîâëåíèå è ïåðâè÷íóþ îáðàáîòêó äàííûõ,
2. Ìåòîäà ïîçâîëÿþùèé ïðîâîäèòü ñðàâíåíèå ôèíàëüíûõ ðåçóëüòàòîâ ïðîãðàììû ñ ðåçóëüòàòàìè äðóãèõ ó÷åíûõ.
4
Ãëàâà 2
Ââåäåíèå
 ñåðåäèíå 90-õ ãîäîâ â ýêñïëóàòàöèþ áûëè çàïóùåíû íåñêîëüêî ãëîáàëüíûõ íàâèãàöèîííûõ ñïóòíèêîâûõ ñèñòåì. Ðîññèéñêàÿ ÃËÎÍÀÑÑ, àìåðèêàíñêîå GPS, ôðàíöóçñêàÿ DORIS. Ãëîáàëüíûå íàâèãàöèîííûå ñïóòíèêîâûå
ñèñòåìû îêàçàëèñü ïîëåçíû â ðàçëè÷íûõ îáëàñòÿõ íàó÷íîé äåÿòåëüíîñòè, â
÷àñòíîñòè â àñòðîìåòðèè è ãåîäåçèè.
Îáðàáîòêîé äàííûõ ïîëó÷åííûõ îò ñèñòåì ÃËÎÍÀÑÑ è GPS çàíèìàåòñÿ îãðîìíîå êîëè÷åñòâî ãðóïï, à äàííûå ñèñòåìû DORIS â Ðîññèè îáðàáàòûâàåò ìàëîå êîëè÷åñòâî ãðóïï, âîçìîæíî ýòî ñâÿçàíî ñ òåì, ÷òî ñèñòåìà
îáðàáîòêè äàííûõ îò International DORIS Service ÿâëÿåòñÿ ïëàòíîé è ñ çàêðûòîì èñõîäíûì êîäîì, ÷òî ìåøàåò èñïîëüçîâàòü ñâîè ìîäåëè äâèæåíèÿ
ñïóòíèêà.
 èíñòèòóòå ïðèêëàäíîé àñòðîíîìèè áûë çàïóùåí ïðîåêò ñîçäàíèÿ ïðîãðàììíîãî êîìïëåêñà, îáðàáàòûâàþùèé äàííûå ñèñòåìû ñïóòíèêîâ DORIS.
5
Ãëàâà 3
Ñèñòåìà ñïóòíèêîâ DORIS
Ñèñòåìà ñïóòíèêîâ DORIS (Doppler Orbitography and Radiopositioning Integrated
by Satellite) äîïëåðîâñêàÿ îðáèòîãðàôè÷åñêàÿ ðàäèîïîçèöèîííàÿ èíòåãðèðîâàííàÿ ñïóòíèêîâàÿ ñèñòåìà, áûëà ñîçäàíà â íà÷àëå 90-õ ãîäîâ ôðàíöóçñêîé êîìïàíèåé Dassault Electronique ïî çàêàçó CNES(Ôðàíöóçíêîå ãåîãðàôè÷åñêîå àãåíñòâî*).
Ñèñòåìà ñîñòîèò èç äâóõ ÷àñòåé: íàçåìíîãî ñåãìåíòà (íàçåìíûå ñòàíöèè)
è êîñìè÷åñêîãî ñåãìåíòà(ñïóòíèêè ñ àíòåííàìè, ïðèíèìàþùèå èíôîðìàöèþ
îò íàçåìíûõ ñòàíöèé). Ñóùåñòâóåò íåñêîëüêî ðàçëè÷íûõ ñïóòíèêîâ, êàæäûé èç íèõ âûïîëíÿåò ñîáñòâåííóþ çàäà÷ó.
 íàñòîÿùåå âðåìÿ, íà Çåìëå ðàáîòàåò 58 íàçåìíûõ ñòàíöèé DORIS (ðèñ.
3.1), ðàñïîëîæåííûõ òàê, ÷òîáû â êàæäûé ìîìåíò âðåìåíè êàæäûé ñïóòíèê íàõîäèëñÿ â ïîëå çðåíèÿ êàê ìèíèìóì îäíîé ñòàíöèè(Íåêîòîðûå çîíû
îñòàþòñÿ áåç ïîêðûòèÿ ðèñ. 3.2). Îêîëî ïîëîâèíû ñòàíöèé ðàñïîëîæåíà íà
îñòðîâàõ èëè ïðèáðåæíûõ çîíàõ, ðàâíîìåðíî çàïîëíÿÿ îáà ïîëóøàðèÿ. Íàçåìíûå ñòàíöèè DORIS ñîñòîÿò èç ðàäèîìàÿ÷êà, àíòåííû, äàò÷èêîâ äàâëåíèÿ, òåìïåðàòóðû è âëàæíîñòè.
Íàçåìíàÿ ñåòü ñòàíöèé ñîñòîèò èç íåñêîëüêèõ òèïîâ ìàÿ÷êîâ: ïîñòîÿííûå, ãëàâíûå è ñëó÷àéíûå ìàÿ÷êè. Ïîñòîÿííûå îòâå÷àþò çà âîçìîæíîñòü òî÷íîãî îïðåäåëåíèÿ îðáèò ñïóòíèêîâ. Òðè ãëàâíûõ ìàÿ÷êà(Toulouse,
Kourou, Harthebeesthoek) îòíîñÿòñÿ ê ñåòè ïîñòîÿííûõ ìàÿ÷êîâ, íî òàêæå
îòâå÷àþò çà îáåñïå÷åíèå ñèíõðîíèçàöèè ñèñòåìû ê ìåæäóíàðîäíîìó àòîìíîìó âðåìåíè(International Atomic Time). Ñëó÷àéíûå ìàÿ÷êè óñòàíàâëèâà6
þòñÿ âðåìåííî, äëÿ ðåøåíèÿ ãåîôèçè÷åñêèõ çàäà÷(èçìåðåíèÿ äðåéôà ìàòåðèêîâ).
Ìàÿ÷êè ïåðåäàþò ñèãíàë íà äâóõ ÷àñòîòàõ: 2036.25 ÌÃö è 401.25 ÌÃö.
Ïîñëåäíÿÿ ÷àñòîòà íàñòðîåíà ïåðåäàâàòü ñîîáùåíèÿ, ñîäåðæàùèå èäåíòèôèêàòîð ñòàíöèè, èíôîðìàöèþ î âðåìåíè, ìåòåîðîëîãè÷åñêóþ èíôîðìàöèþ, ñëóæåáíóþ èíôîðìàöèþ.
Ðèñ. 3.1: Ðàñïîëîæåíèå ìàÿ÷êîâ íà ïîâåðõíîñòè Çåìëè
Êðîìå íàçåìíîé ñåòè ñòàíöèé ñóùåñòâóåò ìíîæåñòâî ñïóòíèêîâ. Êàæäàÿ
ïàðà ñïóòíèêà è íàçåìíàÿ ñåòü ÿâëÿþòñÿ ìèññèåé, ðåøàþùèå ñâîè çàäà÷è.
 äàííûé ìîìåíò ðàáîòàþò îêîëî ïîëóäþæèíû ìèññèé: SPOT-5, JASON-2,
JASON-3, CRYOSAT-2, HY-2A, SARAL, SENTINEL-3A.
• Îñíîâíîé çàäà÷åé ìèññèè SPOT-5 ÿâëÿåòñÿ ñîçäàíèå ôîòîñíèìêîâ ïîâåðõíîñòè Çåìëè, äëÿ êîììåð÷åñêèõ öåëåé.
• Ìèññèè JASON, HY-2A óòî÷íÿþò óðîâåíü ïîâåðõíîñòè îêåàíà, òå÷åíèÿ
è ïåðåìåùåíèÿ âîçäóøíûõ ìàññ.
• Èíôîðìàöèÿ î ñòàíöèÿõ íà çåìëå, êîòîðûå îòâå÷àþò çà ñèíõðîíèçàöèþ.
• Ìèññèè JASON, HY-2A óòî÷íÿþò óðîâåíü ïîâåðõíîñòè îêåàíà, òå÷åíèÿ
è ïåðåìåùåíèÿ âîçäóøíûõ ìàññ.
7
Ðèñ. 3.2: Ïîêðûòèå çîí âèäèìîñòè íàçåìíûõ ñòàíöèé ïî îòíîøåíèþ ê ñïóòíèêó CRIOSAT-2
• CRYOSAT èññëåäóþò â ïîëÿðíûå ëüäû, ôîòîãðàôèè ñîäåðæàò äåòàëè
ñ òî÷íîñòü äî 1,5 ñàíòèìåòðîâ.
• SARAL èññëåäóåò ìîðñêóþ ïîãîäó, ñîñòàâëÿåò êàðòó îêåàíîâ, ñëåäèò çà
êëèìàòîì è êîíòèíåíòàëüíûì ëüäîì.
• SENTINEL-3A ñëåäÿò çà òåìïåðàòóðîé íà ïîâåðõíîñòè Çåìëè, îòñëåæèâàþò ïîæàðû è ýôôåêòû ãëîáàëüíîãî ïîòåïëåíèÿ.
Ñïèñîê çàïóùåííûõ ñïóòíèêîâ ñ èõ ïàðàìåòðàìè:
8
Ñïóòíèê
Ñòàðò ìèññèè p (êì) T (ìèí)
e
Êîíåö ìèññèè
SPOT-2
22-Jan-1990
802
100.9
0.002014
29-Jul-2009
POSEIDON
10-Aug-1992
1322
112
0.000095
9-Oct-2005
SPOT-3
26-Sep-1993
819
101.2
0.001872
14-Nov-1996
SPOT-4
24-Mar-1998
791
100.9
0.001392
24-Jun-2013
JASON-1
7-Dec-2001
1328
112
0.000778
21-Jun-2013
ENVISAT
1-Apr-2002
785
100.6
0.000419
9-May-2012
SPOT-5
4-May-2002
825
101.4
0.000069
-
STPSat-1
9-Mar-2007
558
95.8
-
7-Oct-2009
JASON-2
20-Jun-2008
1328
112
0.000702
-
CRYOSAT-2
8-Apr-2010
707
99.4
0.001407
-
HY-2A
15-Aug-2011
963
104.4
0.001170
-
SARAL
25-Feb-2013
706
99.59
0.001165
-
JASON-3
17-Jan-2016
1328
112
0.000095
-
SENTINEL-3A
16-Feb-2016
802
100.96
0.000300
-
Çäåñü p ïåðèöåíòðè÷åñêîå ðàññòîÿíèå îðáèòû ñïóòíèêà, T - îðáèòàëüíûé
ïåðèîä, e ýêñöåíòðèñèòåò îðáèòû.
Îáðàáàòûâàÿ äàííûå ïîëó÷åííûå îò ñïóòíèêîâ ìîæíî ïîëó÷èòü ìíîæåñòâî ðåçóëüòàòîâ:
• Êîîðäèíàòû ñòàíöèé, ñîäåðæàùèå âðåìÿííûå ðÿäû èçìåíåíèé êîîðäèíàò íàçåìíûõ ñòàíöèé
• Ýôåìåðèäû îðáèò ñïóòíèêîâ
• Äâèæåíèå ãåîöåíòðà
• Ïàðàìåòðû âðàùåíèÿ Çåìëè, äâèæåíèå ïîëþñà
• Êîððåêöèè èîíîñôåðû
9
Ãëàâà 4
Ïðîãðàììíûé êîìïëåêñ
4.1
Îáùàÿ ñõåìà
Ðèñ. 4.1: Îáùàÿ ñõåìà ïðîãðàììíîãî êîìïëåêñà
Èíôîðìàöèÿ ñî ñïóòíèêà èíôîðìàöèÿ, êîòîðóþ ñîáèðàåò àïïàðàò DORIS,
ïóáëèêóþùàÿñÿ ïî àäðåñó ftp://cddis.nasa.gov/doris/data/. Õðàíèòñÿ â âèäå àðõèâîâ, ñîäåðæàùèõ äàííûå, ïîëó÷åííûå â òå÷åíèå îäíèõ ñóòîê. Ýòè
äàííûå âûêëàäûâàþòñÿ â îáùèé äîñòóï ñ çàäåðæêîé â äâîå ñóòîê.
Âíåøíÿÿ èíôîðìàöèÿ èíôîðìàöèÿ, êîòîðàÿ íåîáõîäèìà äëÿ ðàáîòû ìîäåëè èëè òåñòèðîâàíèÿ. Ê íåé îòíîñÿòñÿ äîáàâî÷íûå ñåêóíäû (leap
seconds), ÏÂÇ (ïàðàìåòðû âðàùåíèÿ Çåìëè), ýôåìåðèäû ñïóòíèêîâ DORIS.
(ññûëêè)
10
Áàçà äàííûõ ìîäóëü, êîòîðûé îòâå÷àåò çà ïîëó÷åíèå, õðàíåíèå è îáíîâëåíèå äàííûõ.
Ìîäåëü ÷àñòü ïðîãðàììíîãî êîìïëåêñà, êîòîðàÿ îòâå÷àåò çà ìîäåëèðîâàíèå äâèæåíèÿ ñïóòíèêà â çàâèñèìîñòè îò ìíîãèõ ïàðàìåòðîâ.
Ìîäóëü îïòèìèçàöèè ìîäåëè ìîäóëü, îòâå÷àþùèé çà îïòèìèçàöèþ ïàðàìåòðîâ â çàâèñèìîñòè îò ðàçíèöû ìåæäó äàííûìè, ïîëó÷àåìûìè â ìîäåëè è äàííûìè, ïîëó÷åííûìè èç îáðàáîòêè íàáëþäåíèé.  êà÷åñòâå ïîáî÷íîãî ïðîäóêòà îïòèìèçàöèè ìîäåëè ïîëó÷àþòñÿ óëó÷øåííûå ïîëîæåíèÿ
ñïóòíèêîâ, ÏÂÇ, è ìíîãèå äðóãèå ïàðàìåòðû.
Ìîäóëü òåñòèðîâàíèÿ ìîäóëü, êîòîðûé àïïðîêñèìèðóåò äàííûå ïîëó÷åííûå äðóãèìè èññëåäîâàòåëüñêèìè ãðóïïàìè è ñðàâíèâàåò èõ ñ ðåçóëüòàòàìè, ðàçðàáàòûâàåìîãî ïðîãðàììíîãî êîìïëåêñà.
4.2
Ðàáî÷èé öèêë ïðîãðàììû
1 Çàïóñê ïðîãðàììíîãî êîìïëåêñà. Îñóùåñòâëÿåòñÿ ñ öåëüþ îáó÷åíèÿ ìîäåëè íà ¾èñòîðè÷åñêèõ äàííûõ¿;
2 Îñíîâíîé öèêë:
2.1. Îáíîâëåíèå äàííûõ:
2.1.1. Ñîõðàíåíèå,
2.1.2. Ðàñïàêîâûâàíèå,
2.1.3. Äîáàâëåíèå â áàçó äàííûõ.
2.2. Èòåðàöèîííûé ïðîöåññ:
2.2.1. Ìîäåëü ïðåäñêàçûâàåò ïîëîæåíèå ñïóòíèêà,
2.2.2. Ñðàâíåíèå íåâÿçîê (ðåàëüíûå çíà÷åíèÿ çíà÷åíèÿ, ïîëó÷åííûå
èç ìîäåëèðîâàíèÿ),
2.2.3. Ïðè áîëüøèõ íåâÿçêàõ ïðîèñõîäèò îïòèìèçàöèÿ ïàðàìåòðîâ ìîäåëè,
2.2.4. Âîçâðàò ê íà÷àëó èòåðàöèîííîãî ïðîöåññà.
2.3. Ñîõðàíåíèå äàííûõ èòåðàöèîííîãî ïðîöåññà;
11
3 Ñðàâíåíèå ïîëó÷åííûõ ðåçóëüòàòîâ â õîäå ðàáîòû ïðîãðàììíîãî êîìïëåêñà ÈÏÀ ñ ðåçóëüòàòàìè äðóãèõ ãðóïï ó÷åíûõ.
12
Ãëàâà 5
Ïîñòàíîâêà çàäà÷è
Öåëüþ äàííîé ðàáîòû ÿâëÿåòñÿ îáåñïå÷åíèå âîçìîæíîñòè èñïîëüçîâàíèÿ
äàííûõ ïðîèçâåäåííûõ ñèñòåìîé ñïóòíèêîâ DORIS â ïðîãðàììíîì êîìïëåêñå.
Äëÿ äîñòèæåíèÿ ïîñòàâëåííîé öåëè áûëè ñôîðìóëèðîâàíû çàäà÷è, ïðèâåäåííûå íèæå.
• Ðàçðàáîòàòü è çàïðîãðàììèðîâàòü ìîäóëü áàçû äàííûõ íà ÿçûêå ïðîãðàììèðîâàíèÿ C++, ñîäåðæàùèé èíôîðìàöèþ ïîëó÷åííóþ ñî ñïóòíèêîâ.
• Ðàçðàáîòàòü è çàïðîãðàììèðîâàòü ìîäóëü òåñòèðîâàíèÿ íà ÿçûêå ïðîãðàììèðîâàíèÿ Ñ++, ïðîèçâîäÿùèé ïðîâåðêó ðåçóëüòàòîâ êîìïëåêñà è
ðåçóëüòàòû äðóãèõ èññëåäîâàòåëåé.
• Ðàçðàáîòàòü è çàïðîãðàììèðîâàòü äîïîëíèòåëüíûå ñëóæáû, çàïîëíÿþùèå áàçó äàííûõ íîâîé èíôîðìàöèåé.
Îïèñàíèå ðåøåíèÿ ïîñòàâëåííûõ çàäà÷ ïðèâåäåíî â ïîñëåäóþùèõ ãëàâàõ
äàííîé ðàáîòû.
13
Ãëàâà 6
Ìîäóëü áàçû äàííûõ
Äëÿ ðåøåíèÿ çàäà÷è ñîçäàíèÿ ìîäóëÿ áàçû äàííûõ â ðàìêàõ äàííîé ðàáîòû
áûëè âûäåëåíû ïîäçàäà÷è ïåðå÷èñëåííûå íèæå:
• Ñîçäàíèå áàçû äàííûõ íàáëþäåíèé ñïóòíèêîâ DORIS
• Ñîçäàíèå áàçû äàííûõ îáðàáîòàííûõ ýôåìåðèä DORIS
• Ñîçäàíèå áàçû äàííûõ îñòàëüíûõ ïàðàìåòðîâ
6.1
Áàçà äàííûõ íàáëþäåíèé ñïóòíèêîâ DORIS
Äëÿ ðàáîòû ïðîãðàììíîãî êîìïëåêñà â ïåðâóþ î÷åðåäü íåîáõîäèìà èíôîðìàöèÿ, íàêàïëèâàåìàÿ àíòåííîé óñòàíîâëåííîé íà ñïóòíèêå. Äàííûå èñïîëüçóþòñÿ äëÿ óòî÷íåíèÿ ïàðàìåòðîâ ìîäåëè.
Äàííûå ïîëó÷àåìûå ñèñòåìîé ñïóòíèêîâ DORIS, õðàíÿòñÿ íà ñåðâåðå[link
íà õðàíèëèùå], â àðõèâèðîâàííûõ òåêñòîâûõ ôàéëàõ, â ôîðìàòå RINEX 3.0
[link íà äîêóìåíòàöèþ]. Ïîëó÷åíèåì è îáíîâëåíèåì ýòèõ àðõèâîâ çàíèìàþòñÿ ñëóæáû, îïèñàííûå â 6 ãëàâå.
Îáùàÿ ñõåìà áàçû äàííûõ ïðåäñòàâëåííàÿ íà ðèñ. 6.2. Äàëåå ïðèâîäèòñÿ
áîëåå ïîäðîáíîå îïèñàíèå êëàññîâ îáîçíà÷åííûõ â ýòîé ñõåìå.
DORIS data õðàíèòñÿ â ôîðìàòå RINEX 3.0, ïîýòîìó íåîáõîäèìî â ïåðâóþ
î÷åðåäü ñîçäàòü îáðàáîò÷èê ýòèõ äàííûõ, â ôîðìàò êîòîðûé ìîæíî áóäåò
ñâîáîäíî èñïîëüçîâàòü íóæíûå ïàðàìåòðû èç ýòîãî ôàéëà. Îáðàáîò÷èê íàçîâåì ParserHeaderRINEX, îí áóäåò ñîçäàâàòü ñòðóêòóðó äàííûõ, õðàíÿùóþ
14
Ðèñ. 6.1: Ñõåìà áàçû äàííûõ íàáëþäåíèé
â ñåáå âñå ïîëÿ, ïåðå÷èñëåííûå â çàãîëîâêå. Çàãîëîâî÷íûé ôàéë ñîñòîèò èç
íåñêîëüêèõ ÷àñòåé:
• Îáùàÿ èíôîðìàöèÿ î ñïóòíèêå
• Èíôîðìàöèÿ î ñòàíöèÿõ íà çåìëå
• Èíôîðìàöèÿ î ñòàíöèÿõ íà çåìëå, êîòîðûå îòâå÷àþò çà ñèíõðîíèçàöèþ.
Ñîñòàâíûå ÷àñòè ïðîãðàììû:
• HeaderInfo - ñòðóêòóðà äàííûõ, ñîäåðæàùàÿ îáùóþ èíôîðìàöèþ î ñïóòíèêå
• Station - ñòðóêòóðà äàííûõ, ñîäåðæàùàÿ îáùóþ èíôîðìàöèþ î ñòàíöèè
íà Çåìëå (èìÿ, òèï ìàÿ÷êà)
• RefStation - ñòðóêòóðà äàííûõ, ñîäåðæàùàÿ äîïîëíèòåëüíóþ èíôîðìàöèþ î ñòàíöèè ñèíõðîíèçàöèè (ñäâèã ïî âðåìåíè, ïðîèçâîäíàÿ ñäâèãà â
15
ñåêóíäó, ìîìåíò âðåìåíè îò êîòîðîãî ïðîèñõîäèò îòñ÷åò ñäâèãà è ïðîèçâîäíîé)
• StationDataBase/RefStationDataBase - êëàññ, õðàíÿùèé èíôîðìàöèþ î
âñå ñòàíöèÿõ èñïîëüçóåìûõ â äàííîé RINEX ôàéëå. Ïîçâîëÿåò óçíàâàòü, ïîëó÷àòü, äîáàâëÿòü ñòàíöèè.
• ParserHeaderRINEX - âñïîìîãàòåëüíûé êëàññ, ïîçâîëÿþùèé ïîëó÷èòü
âñþ èíôîðìàöèþ èç çàãîëîâêà RINEX ôàéëà.
• ParseMainRINEX - âñïîìîãàòåëüíûé êëàññ, êîòîðûé ïîçâîëÿåò îáðàáîòàòü èíôîðìàöèþ î íàáëþäåíèÿõ èç ãëàâíîé ÷àñòè RINEX ôàéëà.
• DORISDataBase - îñíîâíîé êëàññ, êîòîðûé ïîçâîëÿåò àáñòðàãèðîâàòü
âñþ ðàáîòó ÷òåíèÿ è ïåðâè÷íîé îáðàáîòêè RINEX ôàéëîâ, ïîçâîëÿåò
äîáàâëÿòü íîâûå ôàéëû äëÿ îáðàáîòêè è ïîëó÷àòü äàííûå.
6.2
Áàçà äàííûõ ýôåìåðèä DORIS
Äàííûå îáðàáîòàííûå äðóãèìè ãðóïïàìè õðàíÿòñÿ â ôîðìàòå SP3. Ôîðìàò SP3 ïðîùå ÷åì ôîðìàò RINEX, ïîýòîìó äëÿ ÷òåíèÿ òàêèõ ôàéëîâ íå
íàäî èñïîëüçîâàòü ñëîæíûå ìåòîäû. Èç-çà òîãî, ÷òî äàííûå õðàíÿòñÿ íà
âðåìåííîé ñåòêå ñ áîëüøèì øàãîì, òî òðåáóåòñÿ óìåòü ïðèáëèæàòü äàííûå
ìåæäó óçëàìè. ß èñïîëüçîâàë ìåòîä èíòåðïîëÿöèè äëÿ ïðèáëèæåíèÿ ýòèõ
çíà÷åíèé, â êà÷åñòâå ñòåïåíè ìíîãî÷ëåíîâ áûëè èñïîëüçîâàíû ïîëèíîìû 8
ñòåïåíè. Îáîñíîâàíèå òîãî, ÷òî ýòîé ñòåïåíè õâàòàåò è ÷òî ëèøíÿÿ èíôîðìàöèÿ íå òåðÿåòñÿ áóäåò ïðèâåäåíî â ñëåäóþùåé ãëàâå. Ñîñòàâíûå ÷àñòè
ìîäóëÿ:
• EphemerisDataBase - îñíîâíîé êëàññ, îòâå÷àþùèé çà ïîëó÷åíèÿ êîîðäèíàò è ñêîðîñòåé. Ìåæäó óçëàìè èñïîëüçóåòñÿ ïðèáëèæåíèå ïîëèíîìîì
8 ñòåïåíè.
• ParserSP3 - êëàññ, ïîçâîëÿþùèé ïîëó÷èòü èçíà÷àëüíóþ ñåòêó âû÷èñëåííûõ çíà÷åíèé ýôåìåðèä.
16
Ðèñ. 6.2: Ñõåìà áàçû äàííûõ ýôåìåðèä
• PolinomUtils - âñïîìîãàòåëüíûé êëàññ, ñîäåðæàùèé äâå ôóíêöèè, ïîäñòàíîâêó çíà÷åíèÿ â ïîëèíîì è êîíñòðóèðîâàíèå ïîëèíîìà îò çíà÷åíèé
â òî÷êàõ.
6.3
Ñëóæáû äëÿ ðàáîòû ñ èíòåðíåòîì
Äëÿ ñèñòåìàòè÷åñêîãî îáíîâëåíèÿ äàííûõ òðåáóåòñÿ ñîçäàòü ñëóæáó, êîòîðàÿ ñìîæåò ïåðèîäè÷åñêè ïîëó÷àòü äàííûå èç èíòåðíåòà. Òàê êàê äàííûå
ëåæàò â àðõèâàõ íà ftp-ñåðâåðå, à â ÿçûêå ïðîãðàììèðîâàíèÿ Ñ++ ðàáîòà ñ
ñåòüþ ðåàëèçîâàíà íå î÷åíü óäîáíûì ñïîñîáîì, òî ðåàëèçîâàòü ñëóæáó áûëî
áû óäîáíåå èñïîëüçóÿ äðóãîé ÿçûê ïðîãðàììèðîâàíèÿ. Íà ýòó ðîëü áîëüøå
âñåãî ïîäõîäèò Python. Â íåì ðàáîòà ñ ñåòüþ èíòåðíåò ðåàëèçîâàíà ïðîùå
âñåãî.
Äëÿ îáíîâëåíèÿ äàííûõ ñïóòíèêîâ DORIS òðåáóåòñÿ êàæäûé äåíü ïîëó÷àòü
àðõèâ ñ íîâûìè äàííûìè, êàæäûé àðõèâ ñîäåðæèò â ñåáå äàííûå çà ñóòêè
îá îäíîì ñïóòíèêå. Èç ýòîãî âûòåêàåò, ÷òî ñëóæáà äîëæíà óìåòü ïîëó÷àòü
íå ïðîñòî àðõèâ ñ äàííûìè, íî è ïîíèìàòü, ÷òî çà äàííûå îíà ïîëó÷àåò (ðèñ
ñ äàííûìè DORIS).
Äëÿ îáíîâëåíèÿ îáðàáîòàííûõ äàííûõ ýôåìåðèä ñïóòíèêîâ òðåáóåòñÿ ñîçäàòü äðóãóþ îòäåëüíóþ ñëóæáó, òàê êàê ïóòü ïî êîòîðîìó õðàíÿòñÿ äàííûå ñèëüíî îòëè÷àåòñÿ(ðèñ ñ äàííûìè sp3).
17
Ïîñëå ïîëó÷åíèÿ àðõèâîâ è çàãðóçêè èõ íà æåñòêèé äèñê, òðåáóåòñÿ ðàñïàêîâàòü ýòè àðõèâû, òàê êàê òèï àðõèâà ÿâëÿåòñÿ ñïåöèàëèçèðîâàííûì
äëÿ Unix ñèñòåì è àëãîðèòì ðàçîðõèâèðîâàíèÿ ôîðìàòà íå ðåàëèçîâàí â
áèáëèîòåêàõ ÿçûêà Python, òî ïîòðåáîâàëîñü èñïîëüçîâàòü äîïîëíèòåëüíîå ïðîãðàììíîå îáåñïå÷åíèå, ÷òîáû ïîëó÷èòü ñîäåðæèìîå àðõèâà. Âûáîð
ïàë íà ïðîãðàììó 7z, êîòîðàÿ ïîçâîëÿåò âûçûâàòü ñåáÿ èç êîíñîëè ñèñòåìû
Windows.
Ñõåìà ðàáîòû:
• Êàæäàÿ ñëóæáà ïî òàéìåðó ïðîâåðÿåò ñàéò è ïîëó÷àåò ïîñëåäíèé àðõèâ.
• Èñïîëüçóÿ âíåøíþþ ïðîãðàììó àðõèâû ïðåâðàùàþòñÿ â òåêñòîâûå äàííûå ôîðìàòà SP3 èëè RINEX.
• Ôàéëû ñêëàäûâàþòñÿ â ñïåöèàëüíîå ìåñòî íà äèñêå, îòêóäà ïðîãðàììíûé êîìïëåêñ óìååò èõ äîñòàâàòü.
Äîïîëíèòåëüíî èìååòñÿ âîçìîæíîñòü ðó÷íîãî ïîëó÷åíèÿ äàííûõ, äëÿ ýòîãî
íåîáõîäèìî çàïóñòèòü Python ïðîãðàììó ñ àðãóìåíòàìè, êîòîðûå ñîîáùàò
íàáëþäåíèÿ êàêîãî ñïóòíèêà è íà êàêóþ äàòó âû õîòèòå ïîëó÷èòü.
18
Ãëàâà 7
Ìîäóëü òåñòèðîâàíèÿ
19
Ãëàâà 8
Çàêëþ÷åíèå
 ðàìêàõ äàííîé ðàáîòû áûëè äîñòèãíóòû ðåçóëüòàòû:
• Íàïèñàí ìîäóëü áàçû äàííûõ ýôåìåðèä è íàáëþäåíèé
• Ñîçäàíû ñëóæáû àâòîìàòè÷åñêîãî îáíîâëåíèÿ äàííûõ
• Ïðåäëîæåí è îáîñíîâàí ìåòîä òåñòèðîâàíèÿ ðåçóëüòàòîâ
20
Ïðèëîæåíèå. Ëèñòèíã ïðîãðàììû
DownloadUtil.cpp
#include <cstdlib>
#include <string>
#include <sstream>
#include "DownloadUtils.h"
namespace DownloadUtils
{
void unzipAll(string satellite) {
std::stringstream ss;
ss << "./UtilsScripts/unzip.py" << " " << satellite;
system(ss.str().c_str());
}
void downloadRaw(string satellite) {
std::stringstream ss;
ss << "./UtilsScripts/rinex_downloader.py" << " " << satellite;
system(ss.str().c_str());
}
void downloadRaw(string satellite, int year) {
std::stringstream ss;
ss << "./UtilsScripts/rinex_downloader.py" << " " << satellite
<< " " << year;
system(ss.str().c_str());
}
void downloadRaw(string satellite, int year, int day) {
std::stringstream ss;
21
ss << "./UtilsScripts/rinex_downloader.py" << " " << satellite
<< " " << year
<< " " << day;
system(ss.str().c_str());
}
void downloadProcessed(string satellite) {
std::stringstream ss;
ss << "./UtilsScripts/sp3_downloader.py" << " " << satellite;
system(ss.str().c_str());
}
void downloadProcessed(string satellite, int year) {
std::stringstream ss;
ss << "./UtilsScripts/sp3_downloader.py" << " " << satellite
<< " " << year;
system(ss.str().c_str());
}
void downloadProcessed(string satellite, int year, int day) {
std::stringstream ss;
ss << "./UtilsScripts/sp3_downloader.py" << " " << satellite
<< " " << year
<< " " << day;
system(ss.str().c_str());
}
};
// DownloadUtil.h
#pragma once
namespace DownloadUtils
22
{
void downloadRaw(string satellite);
void downloadRaw(string satellite, int year);
void downloadRaw(string satellite, int year, int day);
void downloadProcessed(string satellite);
void downloadProcessed(string satellite, int year);
void downloadProcessed(string satellite, int yers, day);
void unzip(string satellite);
};
// PolinomUtils.h
#pragma once
#include "geometry"
#include <vector>
using geometry::Point3d;
namespace PolinomUtils
{
Point3d apply(const std::vector<Point3d>& polinom, double t);
std::vector<Point3d> interpolite(const std::vector<double>& points,
const std::vector<Point3d>& values);
};
// PolinomUtils.cpp
#include "PolinomUtils.h"
namespace PolinomUtils
{
Point3d apply(const std::vector<Point3d>& polinom, double t) {
23
Point3d result = {0.0, 0.0, 0.0};
for (int i = 0; i < polinom.size(); ++i) {
result.x = result.x * t + polinom[i].x;
result.y = result.y * t + polinom[i].y;
result.z = result.z * t + polinom[i].z;
}
return result;
}
{
// âû÷èñëÿåì ðåçóëüòèðóþùèé y
double q = (x-MasX[0]) / step; // ñì. ôîðìóëó
double result = MasY[0]; // ðåçóëüòàò (y)
double mult_q = 1; // ïðîèçâåäåíèå èç q*(q-1)*(q-2)*(q-n)
double fact = 1; // ôàêòîðèàë
for ( int i = 1; i < n; i++ )
{
fact *= i;
mult_q *= (q-i+1);
result += mult_q/fact * dy[i][0];
}
// îñâîäîæäàåì dy
for ( int i = 0; i < n; i++ ) delete[] dy[i];
delete[] dy;
return result;
24
}
std::vector<Point3d> interpolite(const std::vector<double>& points,
const std::vector<Point3d>& values) {
std::vector<std::vector<Point3d> > grid(points.size());
for (int i = 0; i < grid.size(); ++i) {
grid[i].resize(points.size(), {0.0, 0.0, 0.0});
}
for (int i = 0; i < n; i++) {
grid[0][i].x = points[i].x;
grid[0][i].y = points[i].y;
grid[0][i].z = points[i].z;
}
for (int i = 1; i < n; i++) {
for (int j = 0; j < n-i; j++) {
grid[i][j].x = dgrid[i-1][j+1].x - grid[i-1][j].x;
grid[i][j].y = dgrid[i-1][j+1].y - grid[i-1][j].y;
grid[i][j].z = dgrid[i-1][j+1].z - grid[i-1][j].z;
}
}
return result;
}
};
// Geometry.h
#pragma once
namespace geometry
{
struct point3d {
double x, y, z;
};
};
25
// ParseSP3.cpp
#include "ParseSP3.h"
#include <string>
namespace ParseSP3
{
void read(std::ifstream &fin, std::vector<Point3d>& c,
std::vector<Point3d>& v,
std::vector<Time>& times) {
std::string s, name, tmp;
int year, month, day, hour, minute;
double second;
double px, py, pz;
double vx, vy, vz;
// header reading
while (s != "*") {
fin >> s;
}
// main part
while (s != "EOF") {
fin >> year >> month >> day >> hour >> minute >> second;
time::time_stamp time(year, month, day, hour, minute, second);
times.push_back(convert(time));
fin >> name;
fin >> px >> py >> pz >> tmp;
c.push_back(geometry::point3d(px, py, pz));
fin >> name;
26
fin >> vx >> vy >> vz >> tmp;
v.push_back(geometry::point3d(vx / 10.0, vy / 10.0, vz / 10.0));
fin >> s; // char "*"
}
}
};
// ñëóæáà çàãðóçêè ýôåìåðèä
import os.path,urllib,sys
def download(path, name, end, end2, url):
if (not os.path.isfile(path + name + end)):
open(path + name + end, 'wb').write(urllib.urlopen(url + name + en
def exist(year, day):
def get_begin_year(s):
return 2000 + int(s[10:12])
def get_begin_day(s):
return int(s[12:15])
def get_end_year(s):
return 2000 + int(s[17:19])
def get_end_day(s):
return int(s[19:22])
for path in os.listdir("data/"):
if get_begin_year(path) <= year and get_begin_day(path) <= day and get_
return True
return False
27
# get needed year and day
year, days = tuple(int(x) for x in sys.argv[1:])
# check that file exist
if exist(year, days):
print("file exists")
else:
path = "data/"
name = "ssaja201.b14173.e14183.DGS.sp3.001"
url = "ftp://cddis.gsfc.nasa.gov/doris/products/orbits/ssa/ja2/"
download(path, name, ".Z", ".Z", url)
print("download complete")
28
Ëèòåðàòóðà
[1] Ò.Í. Ñîòíèêîâà, Ê.Â. Õîëøåâíèêîâ, Ì.Ñ. Äæàçìàòè.
Ê âûâîäó óðàâíåíèé äâèæåíèÿ â îñêóëèðóþùèõ ýëåìåíòàõ.
Âåñòíèê Ñàíêò-Ïåòåðáóðãñêîãî óíèâåðñèòåòà, òîì 1(59), âûïóñê 2,
ñòð.340-344 (2014).
[2] Â.Â. Âèòÿçåâ è äð.
Íåáåñíûå è çåìíûå êîîðäèíàòû: Ó÷åáíîå ïîñîáèå.
- ÑÏá., Èçä-âî Ñ.-Ïåòåðá. óí-òà, 2011. -304 ñ.
[3] Ê.Â. Õîëøåâíèêîâ, Â.Á. Òèòîâ
Çàäà÷à äâóõ òåë: Ó÷åáíîå ïîñîáèå.
- ÑÏá., Èçä-âî Ñ.-Ïåòåðá. óí-òà, 2007. -180 ñ.
[4] DORIS Tables of Data and Products [Ýëåêòðîííûé ðåñóðñ].
Ðåæèì äîñòóïà:
http://ids-doris.org/data-products/tables-of-data-products.html
[5] DORIS system [Ýëåêòðîííûé ðåñóðñ].
Ðåæèì äîñòóïà:
http://www.aviso.altimetry.fr/en/techniques/doris/doris-system/groundbeacons.html
[6] DORIS Documentation [Ýëåêòðîííûé ðåñóðñ].
Ðåæèì äîñòóïà:
http://ids-doris.org/report/documentation.html
[7] Paul R. Spoord et. al.
The National Geodetic Survey Standard GPS Format SP.
Dickerson, Maryland, USA.
29
[8] G. Petit, B. Luzum.
IERS Conventions (2010).
Frankfurt am Main, 2010.
[9] Paul R. Spoord et. al.
The National Geodetic Survey Standard GPS Format SP.
Dickerson, Maryland, USA.
[10] Ò.Í. Ñîòíèêîâà, Ê.Â. Õîëøåâíèêîâ, Ì.Ñ. Äæàçìàòè.
Ê âûâîäó óðàâíåíèé äâèæåíèÿ â îñêóëèðóþùèõ ýëåìåíòàõ.
Âåñòíèê Ñàíêò-Ïåòåðáóðãñêîãî óíèâåðñèòåòà, òîì 1(59), âûïóñê 2,
ñòð.340-344 (2014).
[11] Â.Â. Âèòÿçåâ ñ ñîàâò.
Íåáåñíûå è çåìíûå êîîðäèíàòû: Ó÷åáíîå ïîñîáèå.
- ÑÏá., Èçä-âî Ñ.-Ïåòåðá. óí-òà, 2011. -304 ñ.
[12] Ê.Â. Õîëøåâíèêîâ, Â.Á. Òèòîâ
Çàäà÷à äâóõ òåë: Ó÷åáíîå ïîñîáèå.
- ÑÏá., Èçä-âî Ñ.-Ïåòåðá. óí-òà, 2007. -180 ñ.
[13] B.B. Áåëåöêèé
Î÷åðêè î äâèæåíèè êîñìè÷åñêèõ òåë
2-å èçä., ïåðåðàá. è äîï. Ìîñêâà: Íàóêà, 1977. 432 c.
[14] Í.Ã. Äóáîøèí
Íåáåñíàÿ ìåõàíèêà. Îñíîâíûå çàäà÷è è ìåòîäû
2-å èçä., ïåðåðàá. è äîï. Ìîñêâà: Íàóêà, 1968. 799 c.
[15] Ê. Ìþððåé, Ñ. Äåðìîòò
Äèíàìèêà Ñîëíå÷íîé ñèñòåìû, ïåðåâîä ïîä ðåä. È.È.Øåâ÷åíêî.
Ìîñêâà: Ôèçìàòëèò, 2009. 588 ñ.
[16] Ìþððåé, Ê., Äåðìîòò, Ñ. Äèíàìèêà Ñîëíå÷íîé ñèñòåìû / ïåðåâîä ïîä
ðåä. È.È.Øåâ÷åíêî. Ìîñêâà: Ôèçìàòëèò, 2009. 588 ñ.
30
[17] C. Marchal.
The three-body problem 1990.
[11] E. Hairer, G. Wanner.
Analysis by Its History, Undergraduate Texts in Mathematics.
New York, 1996.
[8] J. Danby.
Fundamentals of Celestial Mechanics, 2nd Revised
& Enlarged Edition Hardcover, 1988.
[18] À.À. Ñàìàðñêèé. Òåîðèÿ ðàçíîñòíûõ ñõåì.
Ì: Íàóêà, 1977
31
Отзывы:
Авторизуйтесь, чтобы оставить отзыв