Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • orekit/rugged
  • sdinot/rugged
  • yzokras/rugged
  • youngcle/rugged-mod
4 results
Show changes
Showing
with 3289 additions and 0 deletions
# Rugged library dump file, created on 2015-02-11T14:08:32Z
# all units are SI units (m, m/s, rad ...)
direct location: date 2012-01-01T12:30:00.00000000000000Z position 1.500000000000000e+00 0.000000000000000e+00 -2.000000000000000e-01 los 0.000000000000000e+00 -7.547095802227720e-01 6.560590289905073e-01 lightTime true aberration true refraction false
span: minDate 2012-01-01T12:29:59.85000000000000Z maxDate 2012-01-01T12:30:00.15000000000000Z tStep 1.000000000000000e-03 tolerance 5.000000000000000e+00 inertialFrame EME2000
transform: index 150 body r -8.085963389171905e-01 -3.465415132416124e-04 4.896468952533136e-04 -5.883634938068593e-01 Ω -8.740475534355121e-08 1.215132763920863e-09 -7.292109805268457e-05 ΩDot -1.642299174832473e-16 8.973031065833714e-17 1.983408395826415e-19 spacecraft p 1.384771423708159e+04 3.157872644483112e+03 -7.179504513218164e+06 v -3.193269831348565e+01 -8.025700179158079e+00 8.276060585645734e+00 a -9.306388141791047e-01 -8.320023410534990e+00 1.352798021525103e-03 r -6.828948932066574e-01 4.142451147005848e-01 -3.878489669799004e-01 4.600312256701621e-01 Ω -1.009835959093257e-03 1.982938126604663e-04 1.645927204535755e-04 ΩDot -3.647403055483546e-07 2.008714378022283e-07 -1.257148591486377e-06
ellipsoid: ae 6.378137000000000e+06 f 3.352810664747481e-03 frame ITRF_CIO_CONV_2010_SIMPLE_EOP
algorithm: DUVENHAGE
DEM tile: t0 latMin -4.014257279586958e-01 latStep 6.817692390602850e-05 latRows 257 lonMin 2.495820830351891e+00 lonStep 6.817692390602850e-05 lonCols 257
DEM cell: t0 latIndex 192 lonIndex 0 elevation -1.282721242683617e+03
DEM cell: t0 latIndex 80 lonIndex 192 elevation 3.211682285355159e+03
DEM cell: t0 latIndex 96 lonIndex 64 elevation 1.075720914066972e+03
DEM cell: t0 latIndex 97 lonIndex 64 elevation 9.498384803599795e+02
DEM cell: t0 latIndex 96 lonIndex 65 elevation 1.001623033275892e+03
DEM cell: t0 latIndex 97 lonIndex 65 elevation 9.831021315425144e+02
DEM cell: t0 latIndex 98 lonIndex 56 elevation 4.037205937396239e+02
DEM cell: t0 latIndex 99 lonIndex 56 elevation 3.509794615703248e+02
DEM cell: t0 latIndex 98 lonIndex 57 elevation 4.551790818839939e+02
DEM cell: t0 latIndex 99 lonIndex 57 elevation 4.092183869677025e+02
DEM cell: t0 latIndex 100 lonIndex 52 elevation 1.818042833221984e+02
DEM cell: t0 latIndex 101 lonIndex 52 elevation 1.967888111569631e+02
DEM cell: t0 latIndex 100 lonIndex 53 elevation 2.123112720834445e+02
DEM cell: t0 latIndex 101 lonIndex 53 elevation 2.599883852797756e+02
DEM cell: t0 latIndex 99 lonIndex 52 elevation 1.165402192703470e+02
DEM cell: t0 latIndex 99 lonIndex 53 elevation 1.681060844126773e+02
DEM cell: t0 latIndex 98 lonIndex 51 elevation 1.106742561780528e+02
DEM cell: t0 latIndex 99 lonIndex 51 elevation 1.089346532856847e+02
DEM cell: t0 latIndex 98 lonIndex 52 elevation 7.247914242540050e+01
DEM cell: t0 latIndex 98 lonIndex 50 elevation 7.769426987315585e+01
DEM cell: t0 latIndex 99 lonIndex 50 elevation 4.265142906455210e+01
DEM cell: t0 latIndex 97 lonIndex 50 elevation 4.500756443755694e+01
DEM cell: t0 latIndex 97 lonIndex 51 elevation 7.421501844304876e+01
direct location result: latitude -3.947445425992010e-01 longitude 2.499243584750142e+00 elevation 8.434706922629509e+01
direct location: date 2012-01-01T12:30:00.00000000000000Z position 1.500000000000000e+00 0.000000000000000e+00 -2.000000000000000e-01 los 0.000000000000000e+00 -7.548246479094037e-01 6.559266353095021e-01 lightTime true aberration true refraction false
DEM cell: t0 latIndex 96 lonIndex 52 elevation 1.110753711365716e+02
DEM cell: t0 latIndex 97 lonIndex 52 elevation 8.027308091623061e+01
DEM cell: t0 latIndex 96 lonIndex 53 elevation 1.950053829821900e+02
DEM cell: t0 latIndex 97 lonIndex 53 elevation 1.459661208883268e+02
DEM cell: t0 latIndex 97 lonIndex 49 elevation -1.609219755441909e+01
DEM cell: t0 latIndex 98 lonIndex 49 elevation -2.653137720265925e+01
DEM cell: t0 latIndex 97 lonIndex 48 elevation -9.460844691182658e+01
DEM cell: t0 latIndex 98 lonIndex 48 elevation -6.303622859747302e+01
direct location result: latitude -3.947611273580563e-01 longitude 2.499133846389992e+00 elevation -4.295871413137783e+01
direct location: date 2012-01-01T12:30:00.00000000000000Z position 1.500000000000000e+00 0.000000000000000e+00 -2.000000000000000e-01 los 0.000000000000000e+00 -7.595223858294946e-01 6.504811645419663e-01 lightTime true aberration true refraction false
DEM cell: t0 latIndex 91 lonIndex 0 elevation -4.644285910379659e+02
DEM cell: t0 latIndex 92 lonIndex 0 elevation -6.361521230433466e+02
DEM cell: t0 latIndex 91 lonIndex 1 elevation -6.695324221432916e+02
DEM cell: t0 latIndex 92 lonIndex 1 elevation -6.941696826528058e+02
DEM cell: t0 latIndex 96 lonIndex 12 elevation -6.229043689225860e+02
DEM cell: t0 latIndex 97 lonIndex 12 elevation -6.074403513292080e+02
DEM cell: t0 latIndex 96 lonIndex 13 elevation -6.849894309179065e+02
DEM cell: t0 latIndex 97 lonIndex 13 elevation -6.129357249231432e+02
DEM cell: t0 latIndex 90 lonIndex 4 elevation -8.534523757445398e+02
DEM cell: t0 latIndex 91 lonIndex 4 elevation -8.996784383751103e+02
DEM cell: t0 latIndex 90 lonIndex 5 elevation -9.026655203899021e+02
DEM cell: t0 latIndex 91 lonIndex 5 elevation -9.279387777828925e+02
DEM cell: t0 latIndex 92 lonIndex 2 elevation -7.517293327072680e+02
DEM cell: t0 latIndex 93 lonIndex 2 elevation -7.766413818620708e+02
DEM cell: t0 latIndex 92 lonIndex 3 elevation -8.594398740278656e+02
DEM cell: t0 latIndex 93 lonIndex 3 elevation -8.590835217917245e+02
DEM cell: t0 latIndex 90 lonIndex 1 elevation -7.251222469503653e+02
DEM cell: t0 latIndex 90 lonIndex 2 elevation -7.924361301694835e+02
DEM cell: t0 latIndex 91 lonIndex 2 elevation -7.590003401646543e+02
DEM cell: t0 latIndex 90 lonIndex 0 elevation -5.786400093316511e+02
direct location result: latitude -3.952555711362365e-01 longitude 2.495847653590435e+00 elevation -5.905034290161145e+02
direct location: date 2012-01-01T12:30:00.00000000000000Z position 1.500000000000000e+00 0.000000000000000e+00 -2.000000000000000e-01 los 0.000000000000000e+00 -7.596364750290255e-01 6.503479267326657e-01 lightTime true aberration true refraction false
DEM tile: t1 latMin -4.014257279586958e-01 latStep 6.817692390602850e-05 latRows 257 lonMin 2.478367537831948e+00 lonStep 6.817692390602850e-05 lonCols 257
DEM cell: t1 latIndex 192 lonIndex 0 elevation -1.282721242683617e+03
DEM cell: t1 latIndex 80 lonIndex 192 elevation 3.211682285355159e+03
DEM cell: t1 latIndex 90 lonIndex 255 elevation -6.028136533065612e+02
DEM cell: t1 latIndex 90 lonIndex 256 elevation -5.786400093316511e+02
DEM cell: t1 latIndex 91 lonIndex 255 elevation -6.221990476940956e+02
DEM cell: t1 latIndex 91 lonIndex 256 elevation -4.644285910379659e+02
DEM cell: t1 latIndex 92 lonIndex 256 elevation -6.361521230433466e+02
DEM cell: t1 latIndex 91 lonIndex 257 elevation -6.361521230433466e+02
DEM cell: t1 latIndex 92 lonIndex 257 elevation -5.119072938899205e+02
direct location result: latitude -3.952672865845636e-01 longitude 2.495769458919830e+00 elevation -5.923807760050810e+02
direct location: date 2012-01-01T12:30:00.00000000000000Z position 1.500000000000000e+00 0.000000000000000e+00 -2.000000000000000e-01 los 0.000000000000000e+00 -7.597505408555608e-01 6.502146689130315e-01 lightTime true aberration true refraction false
DEM cell: t1 latIndex 92 lonIndex 248 elevation -1.470524675650724e+02
DEM cell: t1 latIndex 93 lonIndex 248 elevation -1.448837787295385e+02
DEM cell: t1 latIndex 92 lonIndex 249 elevation -2.503632800423777e+02
DEM cell: t1 latIndex 93 lonIndex 249 elevation -2.077565123004881e+02
DEM cell: t1 latIndex 90 lonIndex 254 elevation -5.859504161342276e+02
DEM cell: t1 latIndex 91 lonIndex 254 elevation -6.458840770174961e+02
direct location result: latitude -3.952790935038382e-01 longitude 2.495690638626864e+00 elevation -5.963149908542051e+02
# Rugged library dump file, created on 2015-04-23T15:12:38Z
# all units are SI units (m, m/s, rad ...)
direct location: date 2013-07-09T08:04:01.64555485306736Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los -2.397859534323394e-02 1.069618325126766e-01 9.939739399066714e-01 lightTime false aberration false refraction false
span: minDate 2013-07-09T07:44:31.00000000000000Z maxDate 2013-07-09T08:13:29.00000000000000Z tStep 1.000000000000000e-01 tolerance 1.000000000000000e+01 inertialFrame EME2000
transform: index 11706 body r -9.126227111915787e-01 2.903948203646350e-04 6.031760832458322e-04 4.088023224821415e-01 Ω -9.759363848525831e-08 2.685469893129743e-09 -7.292108611062513e-05 ΩDot -2.894633518922737e-16 -1.401923338483166e-16 3.822089661987461e-19 spacecraft p -9.813172457506880e-01 -2.293861089274287e-01 -7.170114055550980e+06 v 1.721804626498136e-02 -5.160520845023520e-02 -8.541224850640113e+00 a -3.826063343921664e-01 -2.431259446863342e+00 6.594385725102986e-03 r -5.316321568749174e-01 5.693171838660510e-01 4.158849079021506e-01 -4.693452218895723e-01 Ω 1.024382530168276e-03 -9.422884774760976e-05 1.535223674917447e-04 ΩDot -1.147097938604457e-08 1.286556172365012e-07 3.416768201783130e-07
algorithm: DUVENHAGE
ellipsoid: ae 6.378137000000000e+06 f 3.352810664747481e-03 frame ITRF_CIO_CONV_2010_SIMPLE_EOP
DEM tile: t0 latMin -1.745329251994330e-02 latStep 1.454441043328608e-05 latRows 1201 lonMin 6.108652381980153e-01 lonStep 1.454441043328608e-05 lonCols 1201
DEM cell: t0 latIndex 939 lonIndex 2 elevation 1.141932549078131e+03
DEM cell: t0 latIndex 635 lonIndex 1044 elevation 3.059853107443227e+03
DEM cell: t0 latIndex 1184 lonIndex 865 elevation 2.283370902248552e+03
DEM cell: t0 latIndex 1185 lonIndex 865 elevation 2.283369398664941e+03
DEM cell: t0 latIndex 1184 lonIndex 866 elevation 2.275368031868235e+03
DEM cell: t0 latIndex 1185 lonIndex 866 elevation 2.281366531059011e+03
DEM tile: t1 latMin 0.000000000000000e+00 latStep 1.454441043328608e-05 latRows 1201 lonMin 6.108652381980153e-01 lonStep 1.454441043328608e-05 lonCols 1201
DEM cell: t1 latIndex 1162 lonIndex 1200 elevation 8.242020012027025e+02
DEM cell: t1 latIndex 1200 lonIndex 612 elevation 2.889312890594999e+03
DEM cell: t1 latIndex 0 lonIndex 888 elevation 2.114929904457000e+03
DEM cell: t1 latIndex 0 lonIndex 889 elevation 2.115931793474417e+03
DEM cell: t1 latIndex 1 lonIndex 888 elevation 2.114929426260988e+03
DEM cell: t1 latIndex 1 lonIndex 889 elevation 2.109931313132628e+03
DEM cell: t1 latIndex 0 lonIndex 885 elevation 2.135924237404747e+03
DEM cell: t1 latIndex 1 lonIndex 885 elevation 2.135923765646068e+03
DEM cell: t1 latIndex 0 lonIndex 886 elevation 2.129926126422164e+03
DEM cell: t1 latIndex 1 lonIndex 886 elevation 2.129925652517708e+03
DEM cell: t1 latIndex 0 lonIndex 887 elevation 2.124928015439582e+03
DEM cell: t1 latIndex 1 lonIndex 887 elevation 2.124927539389348e+03
direct location result: latitude 6.217101136089454e-06 longitude 6.237751969228724e-01 elevation 2.118695205480773e+03
# Rugged library dump file, created on 2015-06-17T12:40:59Z
# all units are SI units (m, m/s, rad ...)
direct location: date 2009-12-10T19:49:15.69409696600003Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los -2.222227735527040e-02 -9.103563670459193e-02 9.955996601239552e-01 lightTime false aberration false refraction false
span: minDate 2009-12-10T19:43:11.00000000000000Z maxDate 2009-12-10T19:54:00.00000000000000Z tStep 1.000000000000000e-01 tolerance 1.000000000000000e+01 inertialFrame EME2000
transform: index 3647 body r -9.892006943727071e-01 6.548538144006332e-05 4.928252940714298e-04 1.465665005635631e-01 Ω -7.256918583080753e-08 -1.041477941363816e-09 -7.292111444123439e-05 ΩDot -1.633367752479824e-16 1.747255489539140e-16 1.600518399853031e-19 spacecraft p 1.915468890219927e-01 -8.990556518547237e-01 -7.156923547128990e+06 v -2.488758510805678e-02 8.481932866150421e-02 -4.020837052430704e+00 a -2.066722296571628e-01 -2.090489712840085e+00 -7.003752909213540e-03 r -1.763451310531075e-01 -4.315699021299694e-01 8.655337192606597e-01 1.830333170551214e-01 Ω -8.737537450216512e-04 5.311070290168704e-04 2.103617306756347e-04 ΩDot 1.145446212396803e-07 1.919398959490098e-07 6.635983002829190e-08
algorithm: DUVENHAGE
ellipsoid: ae 6.378137000000000e+06 f 3.352810664747481e-03 frame ITRF_CIO_CONV_2010_SIMPLE_EOP
DEM tile: t0 latMin 1.047197551196598e+00 latStep 1.454441043328608e-05 latRows 1201 lonMin -2.164208272472969e+00 lonStep 2.908882086657216e-05 lonCols 601
DEM cell: t0 latIndex 1200 lonIndex 454 elevation 1.437147018278546e+02
DEM cell: t0 latIndex 928 lonIndex 17 elevation 1.615747402326250e+03
DEM cell: t0 latIndex 749 lonIndex 584 elevation 3.826208316815853e+02
DEM cell: t0 latIndex 749 lonIndex 585 elevation 3.856180070818848e+02
DEM cell: t0 latIndex 749 lonIndex 586 elevation 3.886151824821843e+02
DEM cell: t0 latIndex 750 lonIndex 584 elevation 3.836203882299900e+02
DEM cell: t0 latIndex 750 lonIndex 585 elevation 3.856175611585988e+02
DEM cell: t0 latIndex 750 lonIndex 586 elevation 3.886147340872076e+02
DEM cell: t0 latIndex 751 lonIndex 588 elevation 3.936086266060671e+02
DEM cell: t0 latIndex 752 lonIndex 588 elevation 3.936081732677089e+02
DEM cell: t0 latIndex 751 lonIndex 589 elevation 3.956057970629851e+02
DEM cell: t0 latIndex 752 lonIndex 589 elevation 3.966053412529362e+02
DEM cell: t0 latIndex 736 lonIndex 600 elevation 4.295819170687835e+02
DEM cell: t0 latIndex 737 lonIndex 600 elevation 4.285814340701368e+02
DEM cell: t0 latIndex 736 lonIndex 601 elevation 5.754850304128064e+02
DEM cell: t0 latIndex 737 lonIndex 601 elevation 5.764867282588906e+02
DEM cell: t0 latIndex 748 lonIndex 592 elevation 4.015986981091023e+02
DEM cell: t0 latIndex 749 lonIndex 592 elevation 4.015982348839813e+02
DEM cell: t0 latIndex 748 lonIndex 593 elevation 4.045958759810924e+02
DEM cell: t0 latIndex 749 lonIndex 593 elevation 4.045954102842808e+02
direct location result: latitude 1.058104370487310e+00 longitude -2.147166209870915e+00 elevation 3.882040377058536e+02
# Rugged library dump file, created on 2016-08-25T11:36:58Z
# all units are SI units (m, m/s, rad ...)
sensor: sensorName s0 nbPixels 200 position 1.500000000000000e+00 0.000000000000000e+00 -2.000000000000000e-01
sensor datation: sensorName s0 lineNumber 1.000000000000000e+02 date 2012-01-01T12:30:00.00000000000000Z
sensor LOS: sensorName s0 date 2012-01-01T12:30:00.00000000000000Z pixelNumber 0 los 0.000000000000000e+00 -7.547095802227720e-01 6.560590289905073e-01
direct location: date 2012-01-01T12:30:00.00000000000000Z position 1.500000000000000e+00 0.000000000000000e+00 -2.000000000000000e-01 los 0.000000000000000e+00 -7.547095802227720e-01 6.560590289905073e-01 lightTime true aberration true refraction false
span: minDate 2012-01-01T12:29:59.85000000000000Z maxDate 2012-01-01T12:30:00.15000000000000Z tStep 1.000000000000000e-03 tolerance 5.000000000000000e+00 inertialFrame EME2000
transform: index 150 body r -8.085963389171905e-01 -3.465415132634738e-04 4.896468952577882e-04 -5.883634938068593e-01 Ω -8.740475539607400e-08 1.215132816692757e-09 -7.292109805268452e-05 ΩDot -1.641702845856317e-16 8.967282378770661e-17 1.982686818602039e-19 spacecraft p 1.384771423699730e+04 3.157872644810937e+03 -7.179504513218164e+06 v -3.193269795630194e+01 -8.025701643721955e+00 8.276060585691415e+00 a -9.306383564355984e-01 -8.320024052654388e+00 1.352798609222994e-03 r -6.828948932119083e-01 4.142451147050121e-01 -3.878489669751732e-01 4.600312256623658e-01 Ω -1.009835943938631e-03 1.982939067387613e-04 1.645926841490188e-04 ΩDot -3.647402648477413e-07 2.008713174452711e-07 -1.257148546282535e-06
ellipsoid: ae 6.378137000000000e+06 f 3.352810664747481e-03 frame ITRF_CIO_CONV_2010_SIMPLE_EOP
algorithm: CONSTANT_ELEVATION_OVER_ELLIPSOID elevation 1.000000000000000e+02
direct location result: latitude -3.947439031048142e-01 longitude 2.499247813392400e+00 elevation 1.000000008142965e+02
sensor LOS: sensorName s0 date 2012-01-01T12:30:00.00000000000000Z pixelNumber 1 los 0.000000000000000e+00 -7.548246479094037e-01 6.559266353095021e-01
direct location: date 2012-01-01T12:30:00.00000000000000Z position 1.500000000000000e+00 0.000000000000000e+00 -2.000000000000000e-01 los 0.000000000000000e+00 -7.548246479094037e-01 6.559266353095021e-01 lightTime true aberration true refraction false
direct location result: latitude -3.947552846081879e-01 longitude 2.499172490136166e+00 elevation 1.000000008170387e+02
sensor LOS: sensorName s0 date 2012-01-01T12:30:00.00000000000000Z pixelNumber 2 los 0.000000000000000e+00 -7.549396923710934e-01 6.557942214465139e-01
direct location: date 2012-01-01T12:30:00.00000000000000Z position 1.500000000000000e+00 0.000000000000000e+00 -2.000000000000000e-01 los 0.000000000000000e+00 -7.549396923710934e-01 6.557942214465139e-01 lightTime true aberration true refraction false
direct location result: latitude -3.947666718219440e-01 longitude 2.499097114958829e+00 elevation 1.000000008196107e+02
# Rugged library dump file, created on 2019-02-12T13:28:19Z
# all units are SI units (m, m/s, rad ...)
sensor: sensorName s0 nbPixels 6992 position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00
sensor datation: sensorName s0 lineNumber 1.093179500000000e+04 date 2018-11-17T09:28:13.50738549333433Z
direct location: date 2018-11-17T09:28:13.50738549333433Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.766362001712258e-03 -7.071346636500928e-03 9.999734376572147e-01 lightTime false aberration true refraction false
span: minDate 2018-11-17T09:28:09.75815400000000Z maxDate 2018-11-17T09:28:24.37500000000000Z tStep 1.000000000000000e-03 tolerance 1.000000000000000e+00 inertialFrame EME2000
transform: index 3749 body r -1.582419730578572e-01 -8.877875020391763e-04 1.556906340657658e-04 -9.873999521756794e-01 Ω -1.314379576583188e-07 1.929883563714465e-09 -7.292103298515694e-05 ΩDot -1.238204383721699e-16 -4.429578390177184e-17 2.220234885205757e-19 spacecraft p -2.043780763621181e+06 2.649055676516346e+06 -6.230074460056063e+06 v 8.500193464365886e+03 -1.120156363674237e+04 -7.562611889558547e+03 a -7.774014494482032e+02 -2.165448216679694e+02 2.038618372832540e+02 r -4.471787778551135e-01 -2.556359378108412e-01 7.875656535717214e-01 3.382628404801900e-01 Ω 1.895876683374440e-03 6.208707436271533e-04 6.748857995964048e-04 ΩDot 2.850236048816703e-06 1.374797997377696e-04 -1.976120196823438e-05
algorithm: DUVENHAGE
ellipsoid: ae 6.378137000000000e+06 f 3.352810664747481e-03 frame ITRF_CIO_CONV_2010_SIMPLE_EOP
DEM tile: t0 latMin 7.854054356026650e-01 latStep 1.454441043328608e-05 latRows 1850 lonMin 1.745401974046496e-01 lonStep 1.454441043328608e-05 lonCols 2950
DEM cell: t0 latIndex 1051 lonIndex 2937 elevation 1.309400956268308e+01
DEM cell: t0 latIndex 1809 lonIndex 653 elevation 3.915338283287048e+03
DEM cell: t0 latIndex 1743 lonIndex 2713 elevation 3.241641450760227e+03
DEM cell: t0 latIndex 1744 lonIndex 2713 elevation 3.183645801580853e+03
DEM cell: t0 latIndex 1743 lonIndex 2714 elevation 3.205639259625923e+03
DEM cell: t0 latIndex 1744 lonIndex 2714 elevation 3.139643613453759e+03
DEM cell: t0 latIndex 1744 lonIndex 2704 elevation 2.730665494724698e+03
DEM cell: t0 latIndex 1745 lonIndex 2704 elevation 2.724669818480428e+03
DEM cell: t0 latIndex 1744 lonIndex 2705 elevation 2.812663306597604e+03
DEM cell: t0 latIndex 1745 lonIndex 2705 elevation 2.789667633360545e+03
DEM cell: t0 latIndex 1744 lonIndex 2694 elevation 2.449679932277680e+03
DEM cell: t0 latIndex 1745 lonIndex 2694 elevation 2.324684218138123e+03
DEM cell: t0 latIndex 1744 lonIndex 2695 elevation 2.408678984770245e+03
DEM cell: t0 latIndex 1745 lonIndex 2695 elevation 2.377683274941762e+03
DEM cell: t0 latIndex 1747 lonIndex 2695 elevation 2.284691855284797e+03
DEM cell: t0 latIndex 1748 lonIndex 2695 elevation 2.230696145456314e+03
DEM cell: t0 latIndex 1747 lonIndex 2696 elevation 2.312690920710585e+03
DEM cell: t0 latIndex 1748 lonIndex 2696 elevation 2.265695215193176e+03
DEM cell: t0 latIndex 1749 lonIndex 2696 elevation 2.213699509675768e+03
DEM cell: t0 latIndex 1748 lonIndex 2697 elevation 2.299694284930039e+03
DEM cell: t0 latIndex 1749 lonIndex 2697 elevation 2.243698583723704e+03
DEM cell: t0 latIndex 1748 lonIndex 2694 elevation 2.204697075719452e+03
DEM cell: t0 latIndex 1749 lonIndex 2694 elevation 2.151701361579895e+03
DEM cell: t0 latIndex 1749 lonIndex 2695 elevation 2.179700435627831e+03
DEM cell: t0 latIndex 1750 lonIndex 2692 elevation 2.065707490722317e+03
DEM cell: t0 latIndex 1751 lonIndex 2692 elevation 2.019711767960612e+03
DEM cell: t0 latIndex 1750 lonIndex 2693 elevation 2.084706569081327e+03
DEM cell: t0 latIndex 1751 lonIndex 2693 elevation 2.051710850630697e+03
DEM cell: t0 latIndex 1750 lonIndex 2690 elevation 2.054709334004296e+03
DEM cell: t0 latIndex 1751 lonIndex 2690 elevation 2.052713602620443e+03
DEM cell: t0 latIndex 1750 lonIndex 2691 elevation 2.046708412363307e+03
DEM cell: t0 latIndex 1751 lonIndex 2691 elevation 1.988712685290527e+03
DEM cell: t0 latIndex 1752 lonIndex 2690 elevation 1.767717871236589e+03
DEM cell: t0 latIndex 1752 lonIndex 2691 elevation 1.932716958217748e+03
DEM cell: t0 latIndex 1751 lonIndex 2689 elevation 1.977714519950358e+03
DEM cell: t0 latIndex 1752 lonIndex 2689 elevation 1.812718784255430e+03
DEM cell: t0 latIndex 1753 lonIndex 2689 elevation 1.752723048560503e+03
DEM cell: t0 latIndex 1753 lonIndex 2690 elevation 1.771722139852736e+03
direct location result: latitude 8.108879611499973e-01 longitude 2.136511932240912e-01 elevation 1.806659334316842e+03
# Rugged library dump file, created on 2019-02-12T13:32:28Z
# all units are SI units (m, m/s, rad ...)
sensor: sensorName s0 nbPixels 6992 position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00
sensor datation: sensorName s0 lineNumber 1.555651300000000e+04 date 2018-11-17T09:28:15.00578210106806Z
direct location: date 2018-11-17T09:28:15.00578210106806Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.630437590029585e-03 -1.988452149915022e-02 9.998009539287460e-01 lightTime false aberration true refraction false
span: minDate 2018-11-17T09:28:09.75815400000000Z maxDate 2018-11-17T09:28:24.37500000000000Z tStep 1.000000000000000e-03 tolerance 1.000000000000000e+00 inertialFrame EME2000
transform: index 5248 body r -1.582959385747423e-01 -8.877789928041023e-04 1.557391550098440e-04 -9.873913020806478e-01 Ω -1.314379578439253e-07 1.929883497315641e-09 -7.292103298515672e-05 ΩDot -1.238198063406674e-16 -4.429504278953000e-17 2.220223692809437e-19 spacecraft p -2.031142024066962e+06 2.632378682422574e+06 -6.241283006704280e+06 v 8.397013991525502e+03 -1.122240538848754e+04 -7.476888804772309e+03 a -5.680029219465155e+02 -2.953217064872529e+02 9.484900057803327e+01 r -4.473594211185816e-01 -2.560156449934148e-01 7.879614096264105e-01 3.368120466886735e-01 Ω 1.874199110824172e-03 6.297218887138226e-04 6.941311311658171e-04 ΩDot 2.110863271348145e-05 1.094333236463635e-04 -6.188132051280828e-06
algorithm: DUVENHAGE
ellipsoid: ae 6.378137000000000e+06 f 3.352810664747481e-03 frame ITRF_CIO_CONV_2010_SIMPLE_EOP
DEM tile: t0 latMin 7.854054356026650e-01 latStep 1.454441043328608e-05 latRows 1850 lonMin 1.745401974046496e-01 lonStep 1.454441043328608e-05 lonCols 2950
DEM cell: t0 latIndex 1051 lonIndex 2937 elevation 1.309400956268308e+01
DEM cell: t0 latIndex 1809 lonIndex 653 elevation 3.915338283287048e+03
DEM cell: t0 latIndex 1611 lonIndex 2905 elevation 2.683570229905023e+03
DEM cell: t0 latIndex 1612 lonIndex 2905 elevation 2.659575158110089e+03
DEM cell: t0 latIndex 1611 lonIndex 2906 elevation 2.640567641818916e+03
DEM cell: t0 latIndex 1612 lonIndex 2906 elevation 2.617572573031192e+03
DEM cell: t0 latIndex 1595 lonIndex 2880 elevation 2.623557283660889e+03
DEM cell: t0 latIndex 1596 lonIndex 2880 elevation 2.576562136685689e+03
DEM cell: t0 latIndex 1595 lonIndex 2881 elevation 2.647554647459412e+03
DEM cell: t0 latIndex 1596 lonIndex 2881 elevation 2.594559503491423e+03
DEM cell: t0 latIndex 1592 lonIndex 2872 elevation 2.390563886371358e+03
DEM cell: t0 latIndex 1593 lonIndex 2872 elevation 2.289568715338474e+03
DEM cell: t0 latIndex 1592 lonIndex 2873 elevation 2.342561241148249e+03
DEM cell: t0 latIndex 1593 lonIndex 2873 elevation 2.331566073122576e+03
DEM cell: t0 latIndex 1594 lonIndex 2876 elevation 2.458562987470839e+03
DEM cell: t0 latIndex 1595 lonIndex 2876 elevation 2.494567828466797e+03
DEM cell: t0 latIndex 1594 lonIndex 2877 elevation 2.475560348262151e+03
DEM cell: t0 latIndex 1595 lonIndex 2877 elevation 2.528565192265320e+03
DEM cell: t0 latIndex 1596 lonIndex 2872 elevation 2.190583202239821e+03
DEM cell: t0 latIndex 1597 lonIndex 2872 elevation 2.147588031206936e+03
DEM cell: t0 latIndex 1596 lonIndex 2873 elevation 2.264580569045554e+03
DEM cell: t0 latIndex 1597 lonIndex 2873 elevation 2.203585401019881e+03
DEM cell: t0 latIndex 1596 lonIndex 2868 elevation 2.121593735016887e+03
DEM cell: t0 latIndex 1597 lonIndex 2868 elevation 2.114598551955160e+03
DEM cell: t0 latIndex 1596 lonIndex 2869 elevation 2.106591101822620e+03
DEM cell: t0 latIndex 1597 lonIndex 2869 elevation 2.110595921768104e+03
DEM cell: t0 latIndex 1596 lonIndex 2864 elevation 2.166604267793952e+03
DEM cell: t0 latIndex 1597 lonIndex 2864 elevation 2.083609072703383e+03
DEM cell: t0 latIndex 1596 lonIndex 2865 elevation 2.144601634599685e+03
DEM cell: t0 latIndex 1597 lonIndex 2865 elevation 2.076606442516327e+03
DEM cell: t0 latIndex 1596 lonIndex 2867 elevation 2.148596368211153e+03
DEM cell: t0 latIndex 1597 lonIndex 2867 elevation 2.111601182142215e+03
DEM cell: t0 latIndex 1598 lonIndex 2865 elevation 2.042611250432968e+03
DEM cell: t0 latIndex 1597 lonIndex 2866 elevation 2.091603812329271e+03
DEM cell: t0 latIndex 1598 lonIndex 2866 elevation 2.054608623253123e+03
DEM cell: t0 latIndex 1599 lonIndex 2865 elevation 1.847616058349609e+03
DEM cell: t0 latIndex 1599 lonIndex 2866 elevation 1.838613434176975e+03
DEM cell: t0 latIndex 1598 lonIndex 2864 elevation 1.985613877612813e+03
DEM cell: t0 latIndex 1599 lonIndex 2864 elevation 1.872618682522244e+03
direct location result: latitude 8.086569515781713e-01 longitude 2.161986944259714e-01 elevation 1.912154442728379e+03
# Rugged library dump file, created on 2019-02-08T16:07:07Z
# all units are SI units (m, m/s, rad ...)
sensor: sensorName s0 nbPixels 6992 position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00
sensor datation: sensorName s0 lineNumber -6.400000000000001e+02 date 2018-11-17T09:28:09.75815400000000Z
sensor datation: sensorName s0 lineNumber 4.447408424880824e+04 date 2018-11-17T09:28:24.37500000000000Z
sensor datation: sensorName s0 lineNumber 2.826900000000000e+04 date 2018-11-17T09:28:19.12459483660332Z
direct location: date 2018-11-17T09:28:19.12459483660332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675073979757700e-03 -1.455869843117481e-02 9.998926134476405e-01 lightTime false aberration false refraction false
span: minDate 2018-11-17T09:28:09.75815400000000Z maxDate 2018-11-17T09:28:24.37500000000000Z tStep 1.000000000000000e-03 tolerance 1.000000000000000e+00 inertialFrame EME2000
transform: index 9366 body r -1.584446506666181e-01 -8.881578177468675e-04 1.564888965877765e-04 -9.873674490087516e-01 Ω -1.314379583538120e-07 1.929883314912744e-09 -7.292103298515580e-05 ΩDot -1.238180701885198e-16 -4.429300681876970e-17 2.220189200053709e-19 spacecraft p -1.997175450486062e+06 2.586441579861389e+06 -6.271423934028421e+06 v 8.113280864301501e+03 -1.114024972785023e+04 -7.189075879755639e+03 a -1.053681313757033e+03 -1.503500666930414e+03 -2.459309668330822e+02 r -4.479168627946637e-01 -2.570042078686272e-01 7.890099484043995e-01 3.328402356700476e-01 Ω 1.817311260304385e-03 6.600167203271428e-04 7.119941113907730e-04 ΩDot 4.061126512029496e-05 1.694535855585867e-04 2.046888666103640e-04
algorithm: DUVENHAGE
ellipsoid: ae 6.378137000000000e+06 f 3.352810664747481e-03 frame ITRF_CIO_CONV_2010_SIMPLE_EOP
DEM tile: t0 latMin 7.854054356026650e-01 latStep 1.454441043328608e-05 latRows 1850 lonMin 1.745401974046496e-01 lonStep 1.454441043328608e-05 lonCols 2950
DEM cell: t0 latIndex 1051 lonIndex 2937 elevation 1.309400956268308e+01
DEM cell: t0 latIndex 1809 lonIndex 653 elevation 3.915338283287048e+03
DEM cell: t0 latIndex 1248 lonIndex 2816 elevation 1.597661494047886e+03
DEM cell: t0 latIndex 1249 lonIndex 2816 elevation 1.603667936647203e+03
DEM cell: t0 latIndex 1248 lonIndex 2817 elevation 1.604658335707728e+03
DEM cell: t0 latIndex 1249 lonIndex 2817 elevation 1.605664779237111e+03
DEM cell: t0 latIndex 1231 lonIndex 2793 elevation 8.766249753387451e+02
DEM cell: t0 latIndex 1232 lonIndex 2793 elevation 8.306313965465546e+02
DEM cell: t0 latIndex 1231 lonIndex 2794 elevation 8.766218011874729e+02
DEM cell: t0 latIndex 1232 lonIndex 2794 elevation 8.436282233253479e+02
DEM cell: t0 latIndex 1248 lonIndex 2800 elevation 1.355712027490404e+03
DEM cell: t0 latIndex 1249 lonIndex 2800 elevation 1.409718455208672e+03
DEM cell: t0 latIndex 1248 lonIndex 2801 elevation 1.375708869150247e+03
DEM cell: t0 latIndex 1249 lonIndex 2801 elevation 1.425715297798581e+03
DEM cell: t0 latIndex 1240 lonIndex 2793 elevation 9.406827662090301e+02
DEM cell: t0 latIndex 1241 lonIndex 2793 elevation 1.012689187416840e+03
DEM cell: t0 latIndex 1240 lonIndex 2794 elevation 9.406796004283481e+02
DEM cell: t0 latIndex 1241 lonIndex 2794 elevation 1.007686022566223e+03
DEM cell: t0 latIndex 1240 lonIndex 2784 elevation 9.277112582351684e+02
DEM cell: t0 latIndex 1241 lonIndex 2784 elevation 9.847176710723877e+02
DEM cell: t0 latIndex 1240 lonIndex 2785 elevation 9.287080924544864e+02
DEM cell: t0 latIndex 1241 lonIndex 2785 elevation 9.967145062217712e+02
DEM cell: t0 latIndex 1240 lonIndex 2786 elevation 9.207049266738044e+02
DEM cell: t0 latIndex 1241 lonIndex 2786 elevation 9.997113413711547e+02
DEM cell: t0 latIndex 1242 lonIndex 2784 elevation 9.297240839096070e+02
DEM cell: t0 latIndex 1242 lonIndex 2785 elevation 1.020720919989056e+03
DEM cell: t0 latIndex 1240 lonIndex 2783 elevation 9.097144240158505e+02
DEM cell: t0 latIndex 1241 lonIndex 2783 elevation 8.897208359230041e+02
DEM cell: t0 latIndex 1241 lonIndex 2782 elevation 8.387240007736206e+02
DEM cell: t0 latIndex 1242 lonIndex 2782 elevation 8.257304117507088e+02
DEM cell: t0 latIndex 1242 lonIndex 2783 elevation 8.767272478301578e+02
DEM cell: t0 latIndex 1243 lonIndex 2784 elevation 9.347304967468261e+02
DEM cell: t0 latIndex 1244 lonIndex 2784 elevation 9.137369095840454e+02
DEM cell: t0 latIndex 1243 lonIndex 2785 elevation 9.877273337563408e+02
DEM cell: t0 latIndex 1244 lonIndex 2785 elevation 9.537337475236257e+02
DEM cell: t0 latIndex 1243 lonIndex 2782 elevation 8.687368227277967e+02
DEM cell: t0 latIndex 1243 lonIndex 2783 elevation 8.967336597373114e+02
DEM cell: t0 latIndex 1244 lonIndex 2782 elevation 7.297432337048849e+02
DEM cell: t0 latIndex 1244 lonIndex 2783 elevation 8.807400716444652e+02
DEM cell: t0 latIndex 1242 lonIndex 2780 elevation 6.947367395918104e+02
DEM cell: t0 latIndex 1243 lonIndex 2780 elevation 6.547431487087673e+02
DEM cell: t0 latIndex 1242 lonIndex 2781 elevation 7.347335756712596e+02
DEM cell: t0 latIndex 1243 lonIndex 2781 elevation 6.997399857182820e+02
DEM cell: t0 latIndex 1244 lonIndex 2780 elevation 6.207495578257243e+02
DEM cell: t0 latIndex 1244 lonIndex 2781 elevation 6.667463957653046e+02
direct location result: latitude 8.034866377791225e-01 longitude 2.149826025000848e-01 elevation 6.766765876031756e+02
direct location: date 2018-11-17T09:28:19.12459483660332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675042663896624e-03 -1.456183361787985e-02 9.998925678460457e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034863471945004e-01 longitude 2.149835637695512e-01 elevation 6.803274355079967e+02
direct location: date 2018-11-17T09:28:19.12459483660332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675011353747724e-03 -1.456496881978930e-02 9.998925222343867e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034860569079852e-01 longitude 2.149845245803098e-01 elevation 6.839735377672140e+02
direct location: date 2018-11-17T09:28:19.12459483660332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674980049311240e-03 -1.456810403689894e-02 9.998924766126629e-01 lightTime false aberration false refraction false
DEM cell: t0 latIndex 1242 lonIndex 2786 elevation 1.042717756068505e+03
DEM cell: t0 latIndex 1243 lonIndex 2786 elevation 1.034724170765855e+03
DEM cell: t0 latIndex 1242 lonIndex 2787 elevation 1.053714592147954e+03
DEM cell: t0 latIndex 1243 lonIndex 2787 elevation 1.076721007775370e+03
direct location result: latitude 8.034857669188987e-01 longitude 2.149854849334069e-01 elevation 6.876149051242718e+02
direct location: date 2018-11-17T09:28:19.12459483660332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674948750587419e-03 -1.457123926920459e-02 9.998924309808744e-01 lightTime false aberration false refraction false
DEM cell: t0 latIndex 1243 lonIndex 2779 elevation 6.157463116992526e+02
DEM cell: t0 latIndex 1244 lonIndex 2779 elevation 5.807527198861440e+02
direct location result: latitude 8.034854772265824e-01 longitude 2.149864448298378e-01 elevation 6.912515480966839e+02
direct location: date 2018-11-17T09:28:19.12459483660332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674917457576505e-03 -1.457437451670205e-02 9.998923853390211e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034781401708480e-01 longitude 2.149980710325160e-01 elevation 8.070092894686161e+02
direct location: date 2018-11-17T09:28:19.12459483660332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674886170278741e-03 -1.457750977938711e-02 9.998923396871029e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034766451042998e-01 longitude 2.150008551040355e-01 elevation 8.298238649580798e+02
direct location: date 2018-11-17T09:28:19.12459483660332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674854888694373e-03 -1.458064505725559e-02 9.998922940251196e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034756953353469e-01 longitude 2.150028138458636e-01 elevation 8.439627365661802e+02
direct location: date 2018-11-17T09:28:19.12459483660332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674823612823641e-03 -1.458378035030327e-02 9.998922483530713e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034755257729028e-01 longitude 2.150035917614869e-01 elevation 8.456884143626966e+02
direct location: date 2018-11-17T09:28:19.12459483660332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674792342666794e-03 -1.458691565852597e-02 9.998922026709579e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034753542091236e-01 longitude 2.150043727022487e-01 elevation 8.474459228337357e+02
direct location: date 2018-11-17T09:28:19.12459483660332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674761078224073e-03 -1.459005098191950e-02 9.998921569787793e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034751805962782e-01 longitude 2.150051567402929e-01 elevation 8.492360215613375e+02
sensor datation: sensorName s0 lineNumber 2.827000000000000e+04 date 2018-11-17T09:28:19.12491883400332Z
direct location: date 2018-11-17T09:28:19.12491883400332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675073979757700e-03 -1.455869843117481e-02 9.998926134476405e-01 lightTime false aberration false refraction false
transform: index 9367 body r -1.584446866682885e-01 -8.881578120866489e-04 1.564889289424889e-04 -9.873674432314973e-01 Ω -1.314379583539358e-07 1.929883314868440e-09 -7.292103298515577e-05 ΩDot -1.238180697668843e-16 -4.429300632436523e-17 2.220189192587132e-19 spacecraft p -1.997167340633883e+06 2.586430434855095e+06 -6.271431123986675e+06 v 8.093431637307245e+03 -1.116772142469675e+04 -7.194252862198937e+03 a -1.116003951062058e+03 -1.540338922892465e+03 -2.412844583841287e+02 r -4.479170084500233e-01 -2.570044435935310e-01 7.890101945163001e-01 3.328392742206238e-01 Ω 1.817282407156245e-03 6.626536544364022e-04 7.166540889464018e-04 ΩDot 3.596261918459965e-05 1.762501149190991e-04 2.132352467042442e-04
direct location result: latitude 8.034861115536909e-01 longitude 2.149827595350881e-01 elevation 6.783715396658736e+02
direct location: date 2018-11-17T09:28:19.12491883400332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675042663896624e-03 -1.456183361787985e-02 9.998925678460457e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034858212636020e-01 longitude 2.149837203567396e-01 elevation 6.820177172318605e+02
direct location: date 2018-11-17T09:28:19.12491883400332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675011353747724e-03 -1.456496881978930e-02 9.998925222343867e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034855312710353e-01 longitude 2.149846807205700e-01 elevation 6.856591585036738e+02
direct location: date 2018-11-17T09:28:19.12491883400332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674980049311240e-03 -1.456810403689894e-02 9.998924766126629e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034852415753052e-01 longitude 2.149856406276390e-01 elevation 6.892958742637608e+02
direct location: date 2018-11-17T09:28:19.12491883400332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674948750587419e-03 -1.457123926920459e-02 9.998924309808744e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034849521757428e-01 longitude 2.149866000789734e-01 elevation 6.929278751330255e+02
direct location: date 2018-11-17T09:28:19.12491883400332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674917457576505e-03 -1.457437451670205e-02 9.998923853390211e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034779039700788e-01 longitude 2.149977891017566e-01 elevation 8.040903082873930e+02
direct location: date 2018-11-17T09:28:19.12491883400332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674886170278741e-03 -1.457750977938711e-02 9.998923396871029e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034764271073798e-01 longitude 2.150005456251370e-01 elevation 8.266152946789650e+02
direct location: date 2018-11-17T09:28:19.12491883400332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674854888694373e-03 -1.458064505725559e-02 9.998922940251196e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034754231341417e-01 longitude 2.150025864059567e-01 elevation 8.416165884873407e+02
direct location: date 2018-11-17T09:28:19.12491883400332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674823612823641e-03 -1.458378035030327e-02 9.998922483530713e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034751905258215e-01 longitude 2.150034597399208e-01 elevation 8.443453426151726e+02
direct location: date 2018-11-17T09:28:19.12491883400332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674792342666794e-03 -1.458691565852597e-02 9.998922026709579e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034750171426467e-01 longitude 2.150042434351802e-01 elevation 8.461318032601336e+02
direct location: date 2018-11-17T09:28:19.12491883400332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674761078224073e-03 -1.459005098191950e-02 9.998921569787793e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034748416752459e-01 longitude 2.150050302808785e-01 elevation 8.479514137281045e+02
sensor datation: sensorName s0 lineNumber 2.827100000000000e+04 date 2018-11-17T09:28:19.12524283140332Z
direct location: date 2018-11-17T09:28:19.12524283140332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675073979757700e-03 -1.455869843117481e-02 9.998926134476405e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034855854619085e-01 longitude 2.149829168583992e-01 elevation 6.800662978562299e+02
direct location: date 2018-11-17T09:28:19.12524283140332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675042663896624e-03 -1.456183361787985e-02 9.998925678460457e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034852954660465e-01 longitude 2.149838772326810e-01 elevation 6.837078100397765e+02
direct location: date 2018-11-17T09:28:19.12524283140332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675011353747724e-03 -1.456496881978930e-02 9.998925222343867e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034850057670984e-01 longitude 2.149848371500809e-01 elevation 6.873445954856186e+02
direct location: date 2018-11-17T09:28:19.12524283140332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674980049311240e-03 -1.456810403689894e-02 9.998924766126629e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034847163643943e-01 longitude 2.149857966116262e-01 elevation 6.909766648201133e+02
direct location: date 2018-11-17T09:28:19.12524283140332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674948750587419e-03 -1.457123926920459e-02 9.998924309808744e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034844272572674e-01 longitude 2.149867556183403e-01 elevation 6.946040286302061e+02
direct location: date 2018-11-17T09:28:19.12524283140332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674917457576505e-03 -1.457437451670205e-02 9.998923853390211e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034776503522245e-01 longitude 2.149975340220436e-01 elevation 8.014503496617313e+02
direct location: date 2018-11-17T09:28:19.12524283140332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674886170278741e-03 -1.457750977938711e-02 9.998923396871029e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034761982247219e-01 longitude 2.150002531119613e-01 elevation 8.235818314577672e+02
direct location: date 2018-11-17T09:28:19.12524283140332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674854888694373e-03 -1.458064505725559e-02 9.998922940251196e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034752047351187e-01 longitude 2.150022780290727e-01 elevation 8.384163523875080e+02
direct location: date 2018-11-17T09:28:19.12524283140332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674823612823641e-03 -1.458378035030327e-02 9.998922483530713e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034748559822209e-01 longitude 2.150033271441628e-01 elevation 8.429929974173764e+02
direct location: date 2018-11-17T09:28:19.12524283140332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674792342666794e-03 -1.458691565852597e-02 9.998922026709579e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034746807741404e-01 longitude 2.150041136022667e-01 elevation 8.448084979820026e+02
direct location: date 2018-11-17T09:28:19.12524283140332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674761078224073e-03 -1.459005098191950e-02 9.998921569787793e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034745034462479e-01 longitude 2.150049032646113e-01 elevation 8.466577147154819e+02
sensor datation: sensorName s0 lineNumber 2.827200000000000e+04 date 2018-11-17T09:28:19.12556682880332Z
direct location: date 2018-11-17T09:28:19.12556682880332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675073979757700e-03 -1.455869843117481e-02 9.998926134476405e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034850594593131e-01 longitude 2.149830740537422e-01 elevation 6.817596725910751e+02
direct location: date 2018-11-17T09:28:19.12556682880332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675042663896624e-03 -1.456183361787985e-02 9.998925678460457e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034847697572988e-01 longitude 2.149840339812393e-01 elevation 6.853965253139291e+02
direct location: date 2018-11-17T09:28:19.12556682880332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675011353747724e-03 -1.456496881978930e-02 9.998925222343867e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034844803516044e-01 longitude 2.149849934527626e-01 elevation 6.890286607118401e+02
direct location: date 2018-11-17T09:28:19.12556682880332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674980049311240e-03 -1.456810403689894e-02 9.998924766126629e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034841912415632e-01 longitude 2.149859524693356e-01 elevation 6.926560893741186e+02
direct location: date 2018-11-17T09:28:19.12556682880332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674948750587419e-03 -1.457123926920459e-02 9.998924309808744e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034838980952460e-01 longitude 2.149869175875534e-01 elevation 6.963477300883122e+02
direct location: date 2018-11-17T09:28:19.12556682880332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674917457576505e-03 -1.457437451670205e-02 9.998923853390211e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034773811105287e-01 longitude 2.149973025827283e-01 elevation 7.990591927384747e+02
direct location: date 2018-11-17T09:28:19.12556682880332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674886170278741e-03 -1.457750977938711e-02 9.998923396871029e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034759590857122e-01 longitude 2.149999761285500e-01 elevation 8.207115658936996e+02
direct location: date 2018-11-17T09:28:19.12556682880332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674854888694373e-03 -1.458064505725559e-02 9.998922940251196e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034749781958609e-01 longitude 2.150019819791355e-01 elevation 8.353456457015349e+02
direct location: date 2018-11-17T09:28:19.12556682880332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674823612823641e-03 -1.458378035030327e-02 9.998922483530713e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034745221121821e-01 longitude 2.150031935361046e-01 elevation 8.416299581679682e+02
direct location: date 2018-11-17T09:28:19.12556682880332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674792342666794e-03 -1.458691565852597e-02 9.998922026709579e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034743450741185e-01 longitude 2.150039827647494e-01 elevation 8.434745795160588e+02
direct location: date 2018-11-17T09:28:19.12556682880332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674761078224073e-03 -1.459005098191950e-02 9.998921569787793e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034741658802406e-01 longitude 2.150047752520647e-01 elevation 8.453534899946595e+02
sensor datation: sensorName s0 lineNumber 2.827300000000000e+04 date 2018-11-17T09:28:19.12589082620332Z
direct location: date 2018-11-17T09:28:19.12589082620332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675073979757700e-03 -1.455869843117481e-02 9.998926134476405e-01 lightTime false aberration false refraction false
transform: index 9368 body r -1.584447226656651e-01 -8.881578064271043e-04 1.564889612933425e-04 -9.873674374549306e-01 Ω -1.314379583540596e-07 1.929883314824150e-09 -7.292103298515575e-05 ΩDot -1.238180693452490e-16 -4.429300582996081e-17 2.220189185120558e-19 spacecraft p -1.997159247754292e+06 2.586419266380107e+06 -6.271438318355227e+06 v 8.092333508739787e+03 -1.116921194570312e+04 -7.194479291258267e+03 a -1.080253304207286e+03 -1.440703052233391e+03 -2.115737164041393e+02 r -4.479171556600077e-01 -2.570046781213964e-01 7.890104406288291e-01 3.328383115986899e-01 Ω 1.817316212887617e-03 6.628269035324033e-04 7.168600329624706e-04 ΩDot 3.164883823458545e-05 1.702480831396255e-04 1.986527941775519e-04
direct location result: latitude 8.034845335439709e-01 longitude 2.149832311290860e-01 elevation 6.834516941253315e+02
direct location: date 2018-11-17T09:28:19.12589082620332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675042663896624e-03 -1.456183361787985e-02 9.998925678460457e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034842441354411e-01 longitude 2.149841906103497e-01 elevation 6.870838931412167e+02
direct location: date 2018-11-17T09:28:19.12589082620332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675011353747724e-03 -1.456496881978930e-02 9.998925222343867e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034839509473890e-01 longitude 2.149851558047580e-01 elevation 6.907762192663471e+02
direct location: date 2018-11-17T09:28:19.12589082620332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674980049311240e-03 -1.456810403689894e-02 9.998924766126629e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034836567014476e-01 longitude 2.149861225927678e-01 elevation 6.944853731187388e+02
direct location: date 2018-11-17T09:28:19.12589082620332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674948750587419e-03 -1.457123926920459e-02 9.998924309808744e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034833639821339e-01 longitude 2.149870870625394e-01 elevation 6.981702363457604e+02
direct location: date 2018-11-17T09:28:19.12589082620332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674917457576505e-03 -1.457437451670205e-02 9.998923853390211e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034770969999045e-01 longitude 2.149970936721582e-01 elevation 7.969044247220546e+02
direct location: date 2018-11-17T09:28:19.12589082620332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674886170278741e-03 -1.457750977938711e-02 9.998923396871029e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034757098800366e-01 longitude 2.149997143928589e-01 elevation 8.180014804468951e+02
direct location: date 2018-11-17T09:28:19.12589082620332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674854888694373e-03 -1.458064505725559e-02 9.998922940251196e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034747435786753e-01 longitude 2.150016981668857e-01 elevation 8.324034773648349e+02
direct location: date 2018-11-17T09:28:19.12589082620332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674823612823641e-03 -1.458378035030327e-02 9.998922483530713e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034741889202773e-01 longitude 2.150030589138596e-01 elevation 8.402561516723064e+02
direct location: date 2018-11-17T09:28:19.12589082620332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674792342666794e-03 -1.458691565852597e-02 9.998922026709579e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034740100472242e-01 longitude 2.150038509206318e-01 elevation 8.421299735198463e+02
direct location: date 2018-11-17T09:28:19.12589082620332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674761078224073e-03 -1.459005098191950e-02 9.998921569787793e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034738289819376e-01 longitude 2.150046462411378e-01 elevation 8.440386641183494e+02
sensor datation: sensorName s0 lineNumber 2.827400000000000e+04 date 2018-11-17T09:28:19.12621482360332Z
direct location: date 2018-11-17T09:28:19.12621482360332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675073979757700e-03 -1.455869843117481e-02 9.998926134476405e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034840043074890e-01 longitude 2.149833932328766e-01 elevation 6.851965881007317e+02
direct location: date 2018-11-17T09:28:19.12621482360332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675042663896624e-03 -1.456183361787985e-02 9.998925678460457e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034837085182460e-01 longitude 2.149843623698809e-01 elevation 6.889303164468179e+02
direct location: date 2018-11-17T09:28:19.12621482360332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675011353747724e-03 -1.456496881978930e-02 9.998925222343867e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034834142749974e-01 longitude 2.149853291592384e-01 elevation 6.926394462134429e+02
direct location: date 2018-11-17T09:28:19.12621482360332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674980049311240e-03 -1.456810403689894e-02 9.998924766126629e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034831215601124e-01 longitude 2.149862936277078e-01 elevation 6.963242577232501e+02
direct location: date 2018-11-17T09:28:19.12621482360332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674948750587419e-03 -1.457123926920459e-02 9.998924309808744e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034828303562845e-01 longitude 2.149872558015554e-01 elevation 6.999850261487917e+02
direct location: date 2018-11-17T09:28:19.12621482360332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674917457576505e-03 -1.457437451670205e-02 9.998923853390211e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034767992755202e-01 longitude 2.149969053676118e-01 elevation 7.949662719291899e+02
direct location: date 2018-11-17T09:28:19.12621482360332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674886170278741e-03 -1.457750977938711e-02 9.998923396871029e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034754508877961e-01 longitude 2.149994674704398e-01 elevation 8.154471195087370e+02
direct location: date 2018-11-17T09:28:19.12621482360332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674854888694373e-03 -1.458064505725559e-02 9.998922940251196e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034745010011134e-01 longitude 2.150014264038878e-01 elevation 8.295879778091600e+02
direct location: date 2018-11-17T09:28:19.12621482360332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674823612823641e-03 -1.458378035030327e-02 9.998922483530713e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034738564144045e-01 longitude 2.150029232549413e-01 elevation 8.388714522666150e+02
direct location: date 2018-11-17T09:28:19.12621482360332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674792342666794e-03 -1.458691565852597e-02 9.998922026709579e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034736757014795e-01 longitude 2.150037180472429e-01 elevation 8.407745523850105e+02
direct location: date 2018-11-17T09:28:19.12621482360332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674761078224073e-03 -1.459005098191950e-02 9.998921569787793e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034734927594821e-01 longitude 2.150045162089748e-01 elevation 8.427131075345702e+02
sensor datation: sensorName s0 lineNumber 2.827500000000000e+04 date 2018-11-17T09:28:19.12653882100332Z
direct location: date 2018-11-17T09:28:19.12653882100332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675073979757700e-03 -1.455869843117481e-02 9.998926134476405e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034834650470514e-01 longitude 2.149835705156732e-01 elevation 6.871009929198575e+02
direct location: date 2018-11-17T09:28:19.12653882100332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675042663896624e-03 -1.456183361787985e-02 9.998925678460457e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034831708104887e-01 longitude 2.149845373003178e-01 elevation 6.908100351139315e+02
direct location: date 2018-11-17T09:28:19.12653882100332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675011353747724e-03 -1.456496881978930e-02 9.998925222343867e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034828781039869e-01 longitude 2.149855017614823e-01 elevation 6.944947320382794e+02
direct location: date 2018-11-17T09:28:19.12653882100332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674980049311240e-03 -1.456810403689894e-02 9.998924766126629e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034825869102004e-01 longitude 2.149864639254930e-01 elevation 6.981553594849091e+02
direct location: date 2018-11-17T09:28:19.12653882100332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674948750587419e-03 -1.457123926920459e-02 9.998924309808744e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034822972121003e-01 longitude 2.149874238181954e-01 elevation 7.017921882113734e+02
direct location: date 2018-11-17T09:28:19.12653882100332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674917457576505e-03 -1.457437451670205e-02 9.998923853390211e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034764891090868e-01 longitude 2.149967359008398e-01 elevation 7.932260930306617e+02
direct location: date 2018-11-17T09:28:19.12653882100332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674886170278741e-03 -1.457750977938711e-02 9.998923396871029e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034751824156783e-01 longitude 2.149992349022573e-01 elevation 8.130436040854728e+02
direct location: date 2018-11-17T09:28:19.12653882100332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674854888694373e-03 -1.458064505725559e-02 9.998922940251196e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034742505918092e-01 longitude 2.150011665005881e-01 elevation 8.268971007924486e+02
direct location: date 2018-11-17T09:28:19.12653882100332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674823612823641e-03 -1.458378035030327e-02 9.998922483530713e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034735245992095e-01 longitude 2.150027865574396e-01 elevation 8.374757857096932e+02
direct location: date 2018-11-17T09:28:19.12653882100332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674792342666794e-03 -1.458691565852597e-02 9.998922026709579e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034733420416067e-01 longitude 2.150035841425556e-01 elevation 8.394082406366659e+02
direct location: date 2018-11-17T09:28:19.12653882100332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674761078224073e-03 -1.459005098191950e-02 9.998921569787793e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034731572176724e-01 longitude 2.150043851534342e-01 elevation 8.413767435665499e+02
sensor datation: sensorName s0 lineNumber 2.827600000000000e+04 date 2018-11-17T09:28:19.12686281840332Z
direct location: date 2018-11-17T09:28:19.12686281840332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675073979757700e-03 -1.455869843117481e-02 9.998926134476405e-01 lightTime false aberration false refraction false
transform: index 9369 body r -1.584447586673350e-01 -8.881578007668832e-04 1.564889936480546e-04 -9.873674316776738e-01 Ω -1.314379583541834e-07 1.929883314779866e-09 -7.292103298515577e-05 ΩDot -1.238180689236135e-16 -4.429300533555636e-17 2.220189177653981e-19 spacecraft p -1.997151155954951e+06 2.586408096464416e+06 -6.271445512935354e+06 v 8.091271130266433e+03 -1.117060283063097e+04 -7.194676009643846e+03 a -1.044503457528476e+03 -1.341066578308776e+03 -1.818631308446282e+02 r -4.479173029656718e-01 -2.570049126060395e-01 7.890106867331848e-01 3.328373488975490e-01 Ω 1.817345704800610e-03 6.629941506377007e-04 7.170513945397830e-04 ΩDot 2.733498444375428e-05 1.642460865486166e-04 1.840703496106509e-04
direct location result: latitude 8.034829263055876e-01 longitude 2.149837470159440e-01 elevation 6.889971765945945e+02
direct location: date 2018-11-17T09:28:19.12686281840332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675042663896624e-03 -1.456183361787985e-02 9.998925678460457e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034826336114423e-01 longitude 2.149847114637728e-01 elevation 6.926816957627383e+02
direct location: date 2018-11-17T09:28:19.12686281840332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675011353747724e-03 -1.456496881978930e-02 9.998925222343867e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034823424316320e-01 longitude 2.149856736119741e-01 elevation 6.963421196761177e+02
direct location: date 2018-11-17T09:28:19.12686281840332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674980049311240e-03 -1.456810403689894e-02 9.998924766126629e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034820527490903e-01 longitude 2.149866334864504e-01 elevation 6.999787196835825e+02
direct location: date 2018-11-17T09:28:19.12686281840332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674948750587419e-03 -1.457123926920459e-02 9.998924309808744e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034817645470610e-01 longitude 2.149875911126339e-01 elevation 7.035917622113589e+02
direct location: date 2018-11-17T09:28:19.12686281840332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674917457576505e-03 -1.457437451670205e-02 9.998923853390211e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034761677048545e-01 longitude 2.149965834455797e-01 elevation 7.916647288555585e+02
direct location: date 2018-11-17T09:28:19.12686281840332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674886170278741e-03 -1.457750977938711e-02 9.998923396871029e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034749048302526e-01 longitude 2.149990161298855e-01 elevation 8.107851023370356e+02
direct location: date 2018-11-17T09:28:19.12686281840332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674854888694373e-03 -1.458064505725559e-02 9.998922940251196e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034739925202281e-01 longitude 2.150009181968722e-01 elevation 8.243281503278567e+02
direct location: date 2018-11-17T09:28:19.12686281840332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674823612823641e-03 -1.458378035030327e-02 9.998922483530713e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034732535744913e-01 longitude 2.150025578599207e-01 elevation 8.351129417466944e+02
direct location: date 2018-11-17T09:28:19.12686281840332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674792342666794e-03 -1.458691565852597e-02 9.998922026709579e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034730090742463e-01 longitude 2.150034491928779e-01 elevation 8.380309321979194e+02
direct location: date 2018-11-17T09:28:19.12686281840332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674761078224073e-03 -1.459005098191950e-02 9.998921569787793e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034728223632561e-01 longitude 2.150042530606624e-01 elevation 8.400294644407792e+02
sensor datation: sensorName s0 lineNumber 2.827700000000000e+04 date 2018-11-17T09:28:19.12718681580332Z
direct location: date 2018-11-17T09:28:19.12718681580332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675073979757700e-03 -1.455869843117481e-02 9.998926134476405e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034823880765704e-01 longitude 2.149839227504206e-01 elevation 6.908852429504817e+02
direct location: date 2018-11-17T09:28:19.12718681580332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675042663896624e-03 -1.456183361787985e-02 9.998925678460457e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034820969147108e-01 longitude 2.149848848767784e-01 elevation 6.945454001321826e+02
direct location: date 2018-11-17T09:28:19.12718681580332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675011353747724e-03 -1.456496881978930e-02 9.998925222343867e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034818072516638e-01 longitude 2.149858447270533e-01 elevation 6.981817088394623e+02
direct location: date 2018-11-17T09:28:19.12718681580332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674980049311240e-03 -1.456810403689894e-02 9.998924766126629e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034815190706375e-01 longitude 2.149868023267313e-01 elevation 7.017944360609551e+02
direct location: date 2018-11-17T09:28:19.12718681580332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674948750587419e-03 -1.457123926920459e-02 9.998924309808744e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034812323551419e-01 longitude 2.149877577008400e-01 elevation 7.053838439770665e+02
direct location: date 2018-11-17T09:28:19.12718681580332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674917457576505e-03 -1.457437451670205e-02 9.998923853390211e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034758362031313e-01 longitude 2.149964462828335e-01 elevation 7.902640378623594e+02
direct location: date 2018-11-17T09:28:19.12718681580332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674886170278741e-03 -1.457750977938711e-02 9.998923396871029e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034746185371490e-01 longitude 2.149988105416534e-01 elevation 8.086652340027457e+02
direct location: date 2018-11-17T09:28:19.12718681580332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674854888694373e-03 -1.458064505725559e-02 9.998922940251196e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034737269686929e-01 longitude 2.150006812236585e-01 elevation 8.218782262415143e+02
direct location: date 2018-11-17T09:28:19.12718681580332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674823612823641e-03 -1.458378035030327e-02 9.998922483530713e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034730011002850e-01 longitude 2.150023010970906e-01 elevation 8.324549700724398e+02
direct location: date 2018-11-17T09:28:19.12718681580332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674792342666794e-03 -1.458691565852597e-02 9.998922026709579e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034726768037741e-01 longitude 2.150033131984376e-01 elevation 8.366425574495763e+02
direct location: date 2018-11-17T09:28:19.12718681580332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674761078224073e-03 -1.459005098191950e-02 9.998921569787793e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034724882006824e-01 longitude 2.150041199307748e-01 elevation 8.386711993450938e+02
sensor datation: sensorName s0 lineNumber 2.827800000000000e+04 date 2018-11-17T09:28:19.12751081320332Z
direct location: date 2018-11-17T09:28:19.12751081320332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675073979757700e-03 -1.455869843117481e-02 9.998926134476405e-01 lightTime false aberration false refraction false
DEM cell: t0 latIndex 1241 lonIndex 2781 elevation 7.737271656242370e+02
direct location result: latitude 8.034818503571547e-01 longitude 2.149840977198244e-01 elevation 6.927652369134296e+02
direct location: date 2018-11-17T09:28:19.12751081320332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675042663896624e-03 -1.456183361787985e-02 9.998925678460457e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034815607175569e-01 longitude 2.149850575398944e-01 elevation 6.964011914450123e+02
direct location: date 2018-11-17T09:28:19.12751081320332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675011353747724e-03 -1.456496881978930e-02 9.998925222343867e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034812725614497e-01 longitude 2.149860151071217e-01 elevation 7.000135410976690e+02
direct location: date 2018-11-17T09:28:19.12751081320332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674980049311240e-03 -1.456810403689894e-02 9.998924766126629e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034809858723084e-01 longitude 2.149869704465865e-01 elevation 7.036025485941086e+02
direct location: date 2018-11-17T09:28:19.12751081320332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674948750587419e-03 -1.457123926920459e-02 9.998924309808744e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034779956693721e-01 longitude 2.149920176475284e-01 elevation 7.502040425837138e+02
direct location: date 2018-11-17T09:28:19.12751081320332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674917457576505e-03 -1.457437451670205e-02 9.998923853390211e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034754957031464e-01 longitude 2.149963227453380e-01 elevation 7.890065316861063e+02
direct location: date 2018-11-17T09:28:19.12751081320332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674886170278741e-03 -1.457750977938711e-02 9.998923396871029e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034743239202250e-01 longitude 2.149986175620463e-01 elevation 8.066777501202871e+02
direct location: date 2018-11-17T09:28:19.12751081320332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674854888694373e-03 -1.458064505725559e-02 9.998922940251196e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034734541552684e-01 longitude 2.150004552473356e-01 elevation 8.195438593706660e+02
direct location: date 2018-11-17T09:28:19.12751081320332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674823612823641e-03 -1.458378035030327e-02 9.998922483530713e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034727421461642e-01 longitude 2.150020541475587e-01 elevation 8.299001135596468e+02
direct location: date 2018-11-17T09:28:19.12751081320332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674792342666794e-03 -1.458691565852597e-02 9.998922026709579e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034723452368835e-01 longitude 2.150031761455188e-01 elevation 8.352430095654670e+02
direct location: date 2018-11-17T09:28:19.12751081320332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674761078224073e-03 -1.459005098191950e-02 9.998921569787793e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034721547367586e-01 longitude 2.150039857498851e-01 elevation 8.373018396690280e+02
sensor datation: sensorName s0 lineNumber 2.827900000000000e+04 date 2018-11-17T09:28:19.12783481060332Z
direct location: date 2018-11-17T09:28:19.12783481060332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675073979757700e-03 -1.455869843117481e-02 9.998926134476405e-01 lightTime false aberration false refraction false
transform: index 9370 body r -1.584447946689907e-01 -8.881577951066632e-04 1.564890260027538e-04 -9.873674259004180e-01 Ω -1.314379583543072e-07 1.929883314735572e-09 -7.292103298515577e-05 ΩDot -1.238180685019781e-16 -4.429300484115192e-17 2.220189170187407e-19 spacecraft p -1.997143065200118e+06 2.586396925207659e+06 -6.271452707697343e+06 v 8.090244501492019e+03 -1.117189407867757e+04 -7.194843017558988e+03 a -1.008754382913370e+03 -1.241429493725617e+03 -1.521527079090525e+02 r -4.479174503627756e-01 -2.570051470512479e-01 7.890109328281188e-01 3.328363861229399e-01 Ω 1.817370882825691e-03 6.631553957239936e-04 7.172281736707170e-04 ΩDot 2.302105874949273e-05 1.582441209968415e-04 1.694879125788701e-04
direct location result: latitude 8.034813131445031e-01 longitude 2.149842719248564e-01 elevation 6.946372031899516e+02
direct location: date 2018-11-17T09:28:19.12783481060332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675042663896624e-03 -1.456183361787985e-02 9.998925678460457e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034810250172490e-01 longitude 2.149852294536607e-01 elevation 6.982491127248313e+02
direct location: date 2018-11-17T09:28:19.12783481060332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.675011353747724e-03 -1.456496881978930e-02 9.998925222343867e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034807383583591e-01 longitude 2.149861847525656e-01 elevation 7.018376578533130e+02
direct location: date 2018-11-17T09:28:19.12783481060332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674980049311240e-03 -1.456810403689894e-02 9.998924766126629e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034804531515740e-01 longitude 2.149871378462499e-01 elevation 7.054030970968001e+02
direct location: date 2018-11-17T09:28:19.12783481060332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674948750587419e-03 -1.457123926920459e-02 9.998924309808744e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034772479117380e-01 longitude 2.149925105079432e-01 elevation 7.554259544974287e+02
direct location: date 2018-11-17T09:28:19.12783481060332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674917457576505e-03 -1.457437451670205e-02 9.998923853390211e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034751472160672e-01 longitude 2.149962112990982e-01 elevation 7.878761228217490e+02
direct location: date 2018-11-17T09:28:19.12783481060332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674886170278741e-03 -1.457750977938711e-02 9.998923396871029e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034740214410198e-01 longitude 2.149984364845999e-01 elevation 8.048153762291109e+02
direct location: date 2018-11-17T09:28:19.12783481060332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674854888694373e-03 -1.458064505725559e-02 9.998922940251196e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034731743163441e-01 longitude 2.150002399065484e-01 elevation 8.173212888576050e+02
direct location: date 2018-11-17T09:28:19.12783481060332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674823612823641e-03 -1.458378035030327e-02 9.998922483530713e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034724768554609e-01 longitude 2.150018167908085e-01 elevation 8.274460918626510e+02
direct location: date 2018-11-17T09:28:19.12783481060332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674792342666794e-03 -1.458691565852597e-02 9.998922026709579e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034720143803415e-01 longitude 2.150030380202833e-01 elevation 8.338321804411532e+02
direct location: date 2018-11-17T09:28:19.12783481060332Z position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 los 1.674761078224073e-03 -1.459005098191950e-02 9.998921569787793e-01 lightTime false aberration false refraction false
direct location result: latitude 8.034718219783675e-01 longitude 2.150038505039797e-01 elevation 8.359212754610172e+02
# Rugged library dump file, created on 2015-02-25T14:11:26Z
# all units are SI units (m, m/s, rad ...)
algorithm: DUVENHAGE
DEM tile: t0 latMin -4.014257279586958e-01 latStep 6.817692390602850e-05 latRows 257 lonMin 2.495820830351891e+00 lonStep 6.817692390602850e-05 lonCols 257
DEM cell: t0 latIndex 192 lonIndex 0 elevation -6.124011631478857e+02
DEM cell: t0 latIndex 128 lonIndex 128 elevation 3.151327114467009e+03
DEM cell: t0 latIndex 122 lonIndex 99 elevation 1.778606495649060e+03
DEM cell: t0 latIndex 122 lonIndex 100 elevation 1.809481571226391e+03
DEM cell: t0 latIndex 123 lonIndex 99 elevation 1.772149770526270e+03
DEM cell: t0 latIndex 123 lonIndex 100 elevation 1.804520334312959e+03
inverse location: sensorName s0 latitude -3.930524233859007e-01 longitude 2.502596047891660e+00 elevation 1.785429914217195e+03 minLine 0 maxLine 2000 lightTime true aberration true refraction false
sensor: sensorName s0 nbPixels 2000 position 1.500000000000000e+00 0.000000000000000e+00 -2.000000000000000e-01
sensor mean plane: sensorName s0 minLine 0 maxLine 2000 maxEval 50 accuracy 1.000000000000000e-02 normal 1.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 cachedResults 0
sensor datation: sensorName s0 lineNumber 1.000000000000000e+03 date 2012-01-01T12:30:00.00000000000000Z
span: minDate 2012-01-01T12:29:57.50000000000000Z maxDate 2012-01-01T12:30:02.50000000000000Z tStep 1.000000000000000e-03 tolerance 5.000000000000000e+00 inertialFrame EME2000
transform: index 2500 body r -8.085963389171905e-01 -3.465415132416124e-04 4.896468952533136e-04 -5.883634938068593e-01 Ω -8.740475534355121e-08 1.215132763920863e-09 -7.292109805268457e-05 ΩDot -1.642299174832473e-16 8.973031065833714e-17 1.983408395826415e-19 spacecraft p 1.384770770635060e+04 3.157810312896036e+03 -7.179504513258174e+06 v -3.180198832979256e+01 -6.779040795561070e+00 8.276861119339028e+00 a -9.324121873999545e-01 -8.319728238691058e+00 1.345786832372742e-03 r -6.828948903548651e-01 4.142451171315383e-01 -3.878489660867486e-01 4.600312284675194e-01 Ω -1.009782076972198e-03 1.982726233227751e-04 1.647740165426390e-04 ΩDot -3.649972672343429e-07 2.007836645730816e-07 -1.257082123046451e-06
ellipsoid: ae 6.378137000000000e+06 f 3.352810664747481e-03 frame ITRF_CIO_CONV_2010_SIMPLE_EOP
sensor rate: sensorName s0 lineNumber 1.000000000000000e+03 rate 6.666666666666666e+02
sensor datation: sensorName s0 lineNumber 1.753125119831697e+03 date 2012-01-01T12:30:01.12968767974755Z
transform: index 3630 body r -8.086205790715331e-01 -3.465213511527127e-04 4.896611176157392e-04 -5.883301787746077e-01 Ω -8.740475552913246e-08 1.215132865316375e-09 -7.292109805268537e-05 ΩDot -1.642303315278493e-16 8.973086775115428e-17 1.983413459366029e-19 spacecraft p 1.381161686138390e+04 3.149035127746873e+03 -7.179495156850004e+06 v -3.198309695268937e+01 -7.869713919215563e+00 8.283718407079078e+00 a -9.313885738644379e-01 -8.324782304826440e+00 1.354189237138481e-03 r -6.826577475060918e-01 4.145470548488056e-01 -3.882264160785311e-01 4.597927673908209e-01 Ω -1.009835304084986e-03 1.983572786405474e-04 1.645625945551068e-04 ΩDot -3.648903522451360e-07 2.009701619867746e-07 -1.257044812963575e-06
sensor rate: sensorName s0 lineNumber 1.753125119831697e+03 rate 6.666666666666666e+02
sensor datation: sensorName s0 lineNumber 1.753079999999987e+03 date 2012-01-01T12:30:01.12961999999998Z
sensor rate: sensorName s0 lineNumber 1.753079999999987e+03 rate 6.666666666666666e+02
sensor LOS: sensorName s0 date 2012-01-01T12:30:01.12961999999998Z pixelNumber 999 los 0.000000000000000e+00 -7.660363365669057e-01 6.427972705753770e-01
sensor LOS: sensorName s0 date 2012-01-01T12:30:01.12961999999998Z pixelNumber 1000 los 0.000000000000000e+00 -7.660525495492120e-01 6.427779486954669e-01
sensor LOS: sensorName s0 date 2012-01-01T12:30:01.12961999999998Z pixelNumber 0 los 0.000000000000000e+00 -7.495978631423039e-01 6.618935288794506e-01
sensor LOS: sensorName s0 date 2012-01-01T12:30:01.12961999999998Z pixelNumber 1 los 0.000000000000000e+00 -7.496145577932898e-01 6.618746216198131e-01
sensor LOS: sensorName s0 date 2012-01-01T12:30:01.12961999999998Z pixelNumber 16 los 0.000000000000000e+00 -7.498649203239307e-01 6.615909622021642e-01
sensor LOS: sensorName s0 date 2012-01-01T12:30:01.12961999999998Z pixelNumber 17 los 0.000000000000000e+00 -7.498816073432156e-01 6.615720482066600e-01
sensor LOS: sensorName s0 date 2012-01-01T12:30:01.12961999999998Z pixelNumber 18 los 0.000000000000000e+00 -7.498982938854290e-01 6.615531337902669e-01
sensor datation: sensorName s0 lineNumber 1.753080000000047e+03 date 2012-01-01T12:30:01.12962000000007Z
inverse location result: lineNumber 1.753080000000047e+03 pixelNumber 1.700000000063574e+01
# Rugged library dump file, created on 2015-03-24T07:07:27Z
# all units are SI units (m, m/s, rad ...)
algorithm: DUVENHAGE
DEM tile: t0 latMin -4.014257279586958e-01 latStep 6.817692390602850e-05 latRows 257 lonMin 2.495820830351891e+00 lonStep 6.817692390602850e-05 lonCols 257
DEM cell: t0 latIndex 192 lonIndex 0 elevation -6.124011631478857e+02
DEM cell: t0 latIndex 128 lonIndex 128 elevation 3.151327114467009e+03
DEM cell: t0 latIndex 123 lonIndex 101 elevation 1.838123293450827e+03
DEM cell: t0 latIndex 123 lonIndex 102 elevation 1.870339491485550e+03
DEM cell: t0 latIndex 124 lonIndex 101 elevation 1.832853313250435e+03
DEM cell: t0 latIndex 124 lonIndex 102 elevation 1.866819199623890e+03
sensor: sensorName s0 nbPixels 2000 position 1.500000000000000e+00 0.000000000000000e+00 -2.000000000000000e-01
inverse location: sensorName s0 latitude -3.930305027145593e-01 longitude 2.502739578717502e+00 elevation 1.853045504720662e+03 minLine 0 maxLine 2000 lightTime true aberration true refraction false
sensor mean plane: sensorName s0 minLine 0 maxLine 2000 maxEval 50 accuracy 1.000000000000000e-02 normal 1.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 cachedResults 5 lineNumber 1.753079999999941e+03 date 2012-01-01T12:30:01.12961999999991Z target -4.733584770718903e+06 3.515842173828561e+06 -2.428300713188566e+06 targetDirection 4.440892098500626e-16 -7.496646388847980e-01 6.618178973144536e-01 -1.357198500050715e-08 -1.198160098465607e-08 -1.357198500050715e-08 lineNumber 1.753079999999936e+03 date 2012-01-01T12:30:01.12961999999990Z target -4.733634454810624e+06 3.515791377291927e+06 -2.428292161157289e+06 targetDirection 1.221245327087672e-15 -7.496479456645485e-01 6.618368058373009e-01 -1.357209409884309e-08 -1.198230643978911e-08 -1.357209409884309e-08 lineNumber 1.753080000000098e+03 date 2012-01-01T12:30:01.12962000000015Z target -4.733684171891571e+06 3.515740571824192e+06 -2.428283613116900e+06 targetDirection 2.664535259100376e-15 -7.496312519673904e-01 6.618557139390744e-01 -1.357220357852602e-08 -1.198301226854942e-08 -1.357220357852602e-08 lineNumber 1.753080000000016e+03 date 2012-01-01T12:30:01.12962000000002Z target -4.733734047015606e+06 3.515689711809538e+06 -2.428275079609979e+06 targetDirection 1.110223024625157e-15 -7.496145577933011e-01 6.618746216197999e-01 -1.357231495356307e-08 -1.198371980774984e-08 -1.357231495356307e-08 lineNumber 1.753080000000124e+03 date 2012-01-01T12:30:01.12962000000019Z target -4.733783920649958e+06 3.515638855451895e+06 -2.428266547191616e+06 targetDirection 1.665334536937735e-15 -7.495978631423109e-01 6.618935288794415e-01 -1.357242629275803e-08 -1.198442735245515e-08 -1.357242629275803e-08
sensor datation: sensorName s0 lineNumber 1.000000000000000e+03 date 2012-01-01T12:30:00.00000000000000Z
span: minDate 2012-01-01T12:29:57.50000000000000Z maxDate 2012-01-01T12:30:02.50000000000000Z tStep 1.000000000000000e-03 tolerance 5.000000000000000e+00 inertialFrame EME2000
transform: index 2500 body r -8.085963389171905e-01 -3.465415132416124e-04 4.896468952533136e-04 -5.883634938068593e-01 Ω -8.740475534355121e-08 1.215132763920863e-09 -7.292109805268457e-05 ΩDot -1.642299174832473e-16 8.973031065833714e-17 1.983408395826415e-19 spacecraft p 1.384770770635060e+04 3.157810312896036e+03 -7.179504513258174e+06 v -3.180198832979256e+01 -6.779040795561070e+00 8.276861119339028e+00 a -9.324121873999545e-01 -8.319728238691058e+00 1.345786832372742e-03 r -6.828948903548651e-01 4.142451171315383e-01 -3.878489660867486e-01 4.600312284675194e-01 Ω -1.009782076972198e-03 1.982726233227751e-04 1.647740165426390e-04 ΩDot -3.649972672343429e-07 2.007836645730816e-07 -1.257082123046451e-06
ellipsoid: ae 6.378137000000000e+06 f 3.352810664747481e-03 frame ITRF_CIO_CONV_2010_SIMPLE_EOP
sensor datation: sensorName s0 lineNumber 1.753080000000073e+03 date 2012-01-01T12:30:01.12962000000011Z
transform: index 3630 body r -8.086205790715331e-01 -3.465213511527127e-04 4.896611176157392e-04 -5.883301787746077e-01 Ω -8.740475552913246e-08 1.215132865316375e-09 -7.292109805268537e-05 ΩDot -1.642303315278493e-16 8.973086775115428e-17 1.983413459366029e-19 spacecraft p 1.381161686138390e+04 3.149035127746873e+03 -7.179495156850004e+06 v -3.198309695268937e+01 -7.869713919215563e+00 8.283718407079078e+00 a -9.313885738644379e-01 -8.324782304826440e+00 1.354189237138481e-03 r -6.826577475060918e-01 4.145470548488056e-01 -3.882264160785311e-01 4.597927673908209e-01 Ω -1.009835304084986e-03 1.983572786405474e-04 1.645625945551068e-04 ΩDot -3.648903522451360e-07 2.009701619867746e-07 -1.257044812963575e-06
sensor rate: sensorName s0 lineNumber 1.753080000000073e+03 rate 6.666666666666666e+02
sensor datation: sensorName s0 lineNumber 1.753079999999983e+03 date 2012-01-01T12:30:01.12961999999997Z
sensor LOS: sensorName s0 date 2012-01-01T12:30:01.12961999999997Z pixelNumber 999 los 0.000000000000000e+00 -7.660363365669057e-01 6.427972705753770e-01
sensor LOS: sensorName s0 date 2012-01-01T12:30:01.12961999999997Z pixelNumber 1000 los 0.000000000000000e+00 -7.660525495492120e-01 6.427779486954669e-01
sensor LOS: sensorName s0 date 2012-01-01T12:30:01.12961999999997Z pixelNumber 0 los 0.000000000000000e+00 -7.495978631423039e-01 6.618935288794506e-01
sensor LOS: sensorName s0 date 2012-01-01T12:30:01.12961999999997Z pixelNumber 1 los 0.000000000000000e+00 -7.496145577932898e-01 6.618746216198131e-01
sensor LOS: sensorName s0 date 2012-01-01T12:30:01.12961999999997Z pixelNumber 4 los 0.000000000000000e+00 -7.496646388847948e-01 6.618178973144580e-01
sensor LOS: sensorName s0 date 2012-01-01T12:30:01.12961999999997Z pixelNumber 5 los 0.000000000000000e+00 -7.496813316281102e-01 6.617989883705653e-01
sensor LOS: sensorName s0 date 2012-01-01T12:30:01.12961999999997Z pixelNumber 6 los 0.000000000000000e+00 -7.496980238944815e-01 6.617800790056386e-01
sensor datation: sensorName s0 lineNumber 1.753079999999893e+03 date 2012-01-01T12:30:01.12961999999984Z
inverse location result: lineNumber 1.753079999999893e+03 pixelNumber 5.000000000428289e+00
inverse location: sensorName s0 latitude -3.930323254721546e-01 longitude 2.502727645691323e+00 elevation 1.847490708944211e+03 minLine 0 maxLine 2000 lightTime true aberration true refraction false
sensor datation: sensorName s0 lineNumber 1.753080000000180e+03 date 2012-01-01T12:30:01.12962000000027Z
sensor rate: sensorName s0 lineNumber 1.753080000000180e+03 rate 6.666666666666666e+02
sensor datation: sensorName s0 lineNumber 1.753080000000150e+03 date 2012-01-01T12:30:01.12962000000022Z
sensor LOS: sensorName s0 date 2012-01-01T12:30:01.12962000000022Z pixelNumber 7 los 0.000000000000000e+00 -7.497147156838981e-01 6.617611692196904e-01
sensor datation: sensorName s0 lineNumber 1.753080000000120e+03 date 2012-01-01T12:30:01.12962000000018Z
inverse location result: lineNumber 1.753080000000120e+03 pixelNumber 6.000000000570598e+00
inverse location: sensorName s0 latitude -3.930341476421113e-01 longitude 2.502715716159622e+00 elevation 1.841953904196975e+03 minLine 0 maxLine 2000 lightTime true aberration true refraction false
sensor datation: sensorName s0 lineNumber 1.753080000000450e+03 date 2012-01-01T12:30:01.12962000000067Z
sensor rate: sensorName s0 lineNumber 1.753080000000450e+03 rate 6.666666666666666e+02
sensor LOS: sensorName s0 date 2012-01-01T12:30:01.12962000000027Z pixelNumber 8 los 0.000000000000000e+00 -7.497314069963494e-01 6.617422590127325e-01
sensor datation: sensorName s0 lineNumber 1.753079999999910e+03 date 2012-01-01T12:30:01.12961999999986Z
inverse location result: lineNumber 1.753079999999910e+03 pixelNumber 7.000000000854453e+00
# Rugged library dump file, created on 2015-07-23T14:25:51Z
# all units are SI units (m, m/s, rad ...)
sensor: sensorName s0 nbPixels 2552 position 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00
inverse location: sensorName s0 latitude 1.426113542156674e+00 longitude -8.868185262195961e-01 elevation 3.102209319249422e+01 minLine -23040 maxLine 39851 lightTime false aberration false refraction false
sensor mean plane: sensorName s0 minLine -23040 maxLine 39851 maxEval 50 accuracy 1.000000000000000e-02 normal 9.994827482027009e-01 -2.652758464258975e-02 1.818029972819145e-02 cachedResults 6 lineNumber 2.496503931691230e+04 date 2015-07-07T18:40:12.48786757028467Z target 5.829885691015603e+05 -7.150938152185429e+05 6.289925119642745e+06 targetDirection -1.574993670955663e-02 8.911384689865436e-02 9.958969132317702e-01 -2.069121568391233e-07 2.118875364268554e-08 -2.069121568391233e-07 lineNumber 2.498990311831761e+04 date 2015-07-07T18:40:12.52680428328538Z target 5.827831035018093e+05 -7.152819110623585e+05 6.290040934506435e+06 targetDirection -1.574653262138034e-02 8.923613956787135e-02 9.958860166231007e-01 -2.106025594148216e-07 6.293169679808365e-08 -2.106025594148216e-07 lineNumber 2.501446735659665e+04 date 2015-07-07T18:40:12.56527188043036Z target 5.825914009565986e+05 -7.154869255677856e+05 6.290306437975926e+06 targetDirection -1.574243698611968e-02 8.937839743168323e-02 9.958733241483490e-01 -2.139580511938570e-07 1.003165269577007e-07 -2.139580511938570e-07 lineNumber 2.503906484840334e+04 date 2015-07-07T18:40:12.60379155259964Z target 5.823982602071301e+05 -7.156902096509174e+05 6.290556499572599e+06 targetDirection -1.573844749711850e-02 8.951962023030334e-02 9.958607025403716e-01 -2.164310151145369e-07 1.276529299636964e-07 -2.164310151145369e-07 lineNumber 2.506393183649445e+04 date 2015-07-07T18:40:12.64273325595032Z target 5.821928312311379e+05 -7.158784186376551e+05 6.290673076115117e+06 targetDirection -1.573492577246402e-02 8.964463942750402e-02 9.958495120914844e-01 -2.189036239175299e-07 1.552935576937779e-07 -2.189036239175299e-07 lineNumber 2.508894303441162e+04 date 2015-07-07T18:40:12.68190079188860Z target 5.819807540563018e+05 -7.160584640312950e+05 6.290717393595084e+06 targetDirection -1.573177124337613e-02 8.976098395370098e-02 9.958390819470831e-01 -2.207684005657831e-07 1.758718590383612e-07 -2.207684005657831e-07
sensor datation: sensorName s0 lineNumber 8.405500000000000e+03 date 2015-07-07T18:39:46.55562900000000Z
span: minDate 2015-07-07T18:38:55.00000000000000Z maxDate 2015-07-07T18:40:35.80000000000000Z tStep 1.000000000000000e-01 tolerance 1.000000000000000e+01 inertialFrame EME2000
transform: index 516 body r -2.177937215786530e-01 -7.327669555860111e-04 1.897190121950331e-04 -9.759945296466600e-01 Ω -1.102119044807511e-07 3.608696529657919e-09 -7.292106718403156e-05 ΩDot -1.242024347024099e-16 -2.613635776865916e-17 1.864594523542536e-19 spacecraft p -3.566422630398301e+02 -4.258914869799046e+02 -7.158956735101774e+06 v -7.418089019766342e+01 -3.428198127164766e+02 -1.850797604708845e-01 a 1.095670688921161e+02 1.182390694645536e+03 -7.505797508270007e-02 r -6.234703793985741e-02 7.494015157786920e-01 6.578869048593570e-01 4.117080790195870e-02 Ω 1.016965607321450e-03 -1.766672912355467e-04 2.200251772998514e-04 ΩDot -8.541831902061166e-07 1.677502045483661e-04 4.581593874451730e-05
ellipsoid: ae 6.378137000000000e+06 f 3.352810664747481e-03 frame ITRF_CIO_CONV_2010_SIMPLE_EOP
sensor datation: sensorName s0 lineNumber 2.496503925597668e+04 date 2015-07-07T18:40:12.48786747485948Z
transform: index 775 body r -2.187152841723702e-01 -7.325893313267924e-04 1.904097590204008e-04 -9.757884255956278e-01 Ω -1.102119076976303e-07 3.608695853043322e-09 -7.292106718404156e-05 ΩDot -1.242034967780088e-16 -2.611193104220005e-17 1.864622725616803e-19 spacecraft p 5.893360284424853e+01 2.270010215908405e+02 -7.158967334657327e+06 v -1.256875338933382e+02 -2.315544869961368e+02 -6.143872625348799e-01 a -2.991050511747990e+02 -4.922561897467523e+03 -1.631427367003653e-01 r -7.121951955935480e-02 7.504990196615283e-01 6.562822802914443e-01 3.118605611938691e-02 Ω 1.025791280551210e-03 -1.602743286567663e-04 2.237358366388949e-04 ΩDot -5.506323746359040e-05 -6.847191984170615e-04 5.295499556290598e-05
sensor rate: sensorName s0 lineNumber 2.496503925597668e+04 rate 6.385696040868454e+02
sensor datation: sensorName s0 lineNumber 2.496503931691246e+04 date 2015-07-07T18:40:12.48786757028491Z
sensor LOS: sensorName s0 date 2015-07-07T18:40:12.48786757028491Z pixelNumber 1275 los -1.530469679155502e-02 1.052282317151670e-01 9.943303201181274e-01
sensor LOS: sensorName s0 date 2015-07-07T18:40:12.48786757028491Z pixelNumber 1276 los -1.530505436550880e-02 1.052156640641227e-01 9.943316445464334e-01
sensor LOS: sensorName s0 date 2015-07-07T18:40:12.48786757028491Z pixelNumber 0 los -1.481288944757218e-02 1.212648644244146e-01 9.925096528308137e-01
sensor LOS: sensorName s0 date 2015-07-07T18:40:12.48786757028491Z pixelNumber 1 los -1.481330341735178e-02 1.212522760703962e-01 9.925111846168859e-01
sensor LOS: sensorName s0 date 2015-07-07T18:40:12.48786757028491Z pixelNumber 2550 los -1.572509919997303e-02 8.921598849965143e-02 9.958881607144354e-01
sensor LOS: sensorName s0 date 2015-07-07T18:40:12.48786757028491Z pixelNumber 2551 los -1.572540117814331e-02 8.920343838289327e-02 9.958892801604283e-01
sensor datation: sensorName s0 lineNumber 2.496331776312614e+04 date 2015-07-07T18:40:12.48517161705554Z
sensor LOS: sensorName s0 date 2015-07-07T18:40:12.48517161705554Z pixelNumber 2550 los -1.572509919997303e-02 8.921598849965143e-02 9.958881607144354e-01
sensor LOS: sensorName s0 date 2015-07-07T18:40:12.48517161705554Z pixelNumber 2551 los -1.572540117814331e-02 8.920343838289327e-02 9.958892801604283e-01
inverse location result: lineNumber 2.496331776312614e+04 pixelNumber 2.558141579736633e+03
package fr.cs.examples;
import java.io.File;
import java.net.URISyntaxException;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.hipparchus.geometry.euclidean.threed.Rotation;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
import org.hipparchus.stat.descriptive.DescriptiveStatistics;
import org.hipparchus.util.FastMath;
import org.orekit.bodies.GeodeticPoint;
import org.orekit.data.DataContext;
import org.orekit.data.DirectoryCrawler;
import org.orekit.frames.Frame;
import org.orekit.frames.FramesFactory;
import org.orekit.frames.Transform;
import org.orekit.rugged.api.AlgorithmId;
import org.orekit.rugged.api.BodyRotatingFrameId;
import org.orekit.rugged.api.EllipsoidId;
import org.orekit.rugged.api.InertialFrameId;
import org.orekit.rugged.api.Rugged;
import org.orekit.rugged.api.RuggedBuilder;
import org.orekit.rugged.linesensor.LineSensor;
import org.orekit.rugged.linesensor.LinearLineDatation;
import org.orekit.rugged.linesensor.SensorPixel;
import org.orekit.rugged.los.FixedRotation;
import org.orekit.rugged.los.LOSBuilder;
import org.orekit.rugged.los.TimeDependentLOS;
import org.orekit.rugged.refraction.AtmosphericRefraction;
import org.orekit.rugged.refraction.MultiLayerModel;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.TimeScale;
import org.orekit.time.TimeScalesFactory;
import org.orekit.utils.AngularDerivativesFilter;
import org.orekit.utils.CartesianDerivativesFilter;
import org.orekit.utils.IERSConventions;
import org.orekit.utils.PVCoordinates;
import org.orekit.utils.TimeStampedAngularCoordinates;
import org.orekit.utils.TimeStampedPVCoordinates;
/** A simple example of how to use the atmospheric refraction correction.
*/
public class AtmosphericRefractionExamples {
public static void main(String[] args) throws URISyntaxException {
// Initialize Orekit, assuming an orekit-data folder is in user home directory
File home = new File(System.getProperty("user.home"));
File orekitData = new File(home, "orekit-data");
DataContext.getDefault().getDataProvidersManager().addProvider(new DirectoryCrawler(orekitData));
// Sensor's definition
// ===================
// Line of sight
// -------------
// The raw viewing direction of pixel i with respect to the instrument is defined by the vector:
List<Vector3D> rawDirs = new ArrayList<Vector3D>();
for (int i = 0; i < 2000; i++) {
// 20° field of view, 2000 pixels
rawDirs.add(new Vector3D(0., i*FastMath.toRadians(20.)/2000., 1.));
}
// The instrument is oriented 10° off nadir around the X-axis, we need to rotate the viewing
// direction to obtain the line of sight in the satellite frame
LOSBuilder losBuilder = new LOSBuilder(rawDirs);
losBuilder.addTransform(new FixedRotation("10-degrees-rotation", Vector3D.PLUS_I, FastMath.toRadians(10.)));
TimeDependentLOS lineOfSight = losBuilder.build();
// Datation model
// --------------
// We use Orekit for handling time and dates, and Rugged for defining the datation model:
TimeScale gps = TimeScalesFactory.getGPS();
AbsoluteDate absDate = new AbsoluteDate("2009-12-11T16:59:30.0", gps);
LinearLineDatation lineDatation = new LinearLineDatation(absDate, 1., 20.);
// Line sensor
// -----------
// With the LOS and the datation now define, we can initialize a line sensor object in Rugged:
LineSensor lineSensor = new LineSensor("mySensor", lineDatation, Vector3D.ZERO, lineOfSight);
// Satellite position, velocity and attitude
// =========================================
// Reference frames
// ----------------
// In our application, we simply need to know the name of the frames we are working with. Positions and
// velocities are given in the ITRF terrestrial frame, while the quaternions are given in EME2000
// inertial frame.
Frame eme2000 = FramesFactory.getEME2000();
boolean simpleEOP = true; // we don't want to compute tiny tidal effects at millimeter level
Frame itrf = FramesFactory.getITRF(IERSConventions.IERS_2010, simpleEOP);
// Satellite attitude
// ------------------
ArrayList<TimeStampedAngularCoordinates> satelliteQList = new ArrayList<TimeStampedAngularCoordinates>();
addSatelliteQ(gps, satelliteQList, "2009-12-11T16:58:42.592937", -0.340236, 0.333952, -0.844012, -0.245684);
addSatelliteQ(gps, satelliteQList, "2009-12-11T16:59:06.592937", -0.354773, 0.329336, -0.837871, -0.252281);
addSatelliteQ(gps, satelliteQList, "2009-12-11T16:59:30.592937", -0.369237, 0.324612, -0.831445, -0.258824);
addSatelliteQ(gps, satelliteQList, "2009-12-11T16:59:54.592937", -0.3836, 0.319792, -0.824743, -0.265299);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:00:18.592937", -0.397834, 0.314883, -0.817777, -0.271695);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:00:42.592937", -0.411912, 0.309895, -0.810561, -0.278001);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:01:06.592937", -0.42581, 0.304838, -0.803111, -0.284206);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:01:30.592937", -0.439505, 0.299722, -0.795442, -0.290301);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:01:54.592937", -0.452976, 0.294556, -0.787571, -0.296279);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:02:18.592937", -0.466207, 0.28935, -0.779516, -0.302131);
// Positions and velocities
// ------------------------
ArrayList<TimeStampedPVCoordinates> satellitePVList = new ArrayList<TimeStampedPVCoordinates>();
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T16:58:42.592937", -726361.466, -5411878.485, 4637549.599, -2463.635, -4447.634, -5576.736);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T16:59:04.192937", -779538.267, -5506500.533, 4515934.894, -2459.848, -4312.676, -5683.906);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T16:59:25.792937", -832615.368, -5598184.195, 4392036.13, -2454.395, -4175.564, -5788.201);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T16:59:47.392937", -885556.748, -5686883.696, 4265915.971, -2447.273, -4036.368, -5889.568);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:00:08.992937", -938326.32, -5772554.875, 4137638.207, -2438.478, -3895.166, -5987.957);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:00:30.592937", -990887.942, -5855155.21, 4007267.717, -2428.011, -3752.034, -6083.317);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:00:52.192937", -1043205.448, -5934643.836, 3874870.441, -2415.868, -3607.05, -6175.600);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:01:13.792937", -1095242.669, -6010981.571, 3740513.34, -2402.051, -3460.291, -6264.760);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:01:35.392937", -1146963.457, -6084130.93, 3604264.372, -2386.561, -3311.835, -6350.751);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:01:56.992937", -1198331.706, -6154056.146, 3466192.446, -2369.401, -3161.764, -6433.531);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:02:18.592937", -1249311.381, -6220723.191, 3326367.397, -2350.574, -3010.159, -6513.056);
// Rugged initialization
// ---------------------
RuggedBuilder builder = new RuggedBuilder().
setAlgorithm(AlgorithmId.IGNORE_DEM_USE_ELLIPSOID).
setEllipsoid(EllipsoidId.WGS84, BodyRotatingFrameId.ITRF).
setTimeSpan(absDate, absDate.shiftedBy(60.0), 0.01, 5. / lineSensor.getRate(0.)).
setTrajectory(InertialFrameId.EME2000,
satellitePVList, 4, CartesianDerivativesFilter.USE_P,
satelliteQList, 4, AngularDerivativesFilter.USE_R).
addLineSensor(lineSensor);
// Build Rugged without atmospheric refraction model
Rugged ruggedWithout = builder.build();
// Defines atmospheric refraction model (with the default multi layers model)
AtmosphericRefraction atmosphericRefraction = new MultiLayerModel(ruggedWithout.getEllipsoid());
// One can use its own atmospheric model that must extend the abstract refraction.AtmosphericRefraction class.
// Set the optional grid steps, for the inverse location computation. Useless for direct location computation.
// This setting is optional as default values exist. But can be useful for instance to improve results by given smaller steps
// or to speed up the computation bigger steps.
int pixelStep = 100;
int lineStep = 100;
atmosphericRefraction.setGridSteps(pixelStep, lineStep);
// To compute the inverse location grid with atmospheric refraction, a default margin is available:
// atmosphericRefraction.getComputationParameters().getDefaultInverseLocMargin();
// but can be modified with:
// atmosphericRefraction.setInverseLocMargin(margin);
// Build Rugged with atmospheric refraction model
builder.setRefractionCorrection(atmosphericRefraction);
Rugged ruggedWith = builder.build();
// Direct location on a line WITHOUT and WITH atmospheric correction
// -----------------------------------------------------------------
double chosenLine = 200.;
// Without atmosphere
GeodeticPoint[] gpWithoutAtmosphericRefractionCorrection = ruggedWithout.directLocation("mySensor", chosenLine);
// With atmosphere
GeodeticPoint[] gpWithAtmosphericRefractionCorrection = ruggedWith.directLocation("mySensor", chosenLine);
double earthRadius = ruggedWithout.getEllipsoid().getEquatorialRadius();
DescriptiveStatistics statDistance = new DescriptiveStatistics();
for (int i = 0; i < gpWithAtmosphericRefractionCorrection.length; i++) {
double currentRadius = earthRadius + (gpWithAtmosphericRefractionCorrection[i].getAltitude()+ gpWithoutAtmosphericRefractionCorrection[i].getAltitude())/2.;
double distance = computeDistanceInMeter(currentRadius, gpWithAtmosphericRefractionCorrection[i], gpWithoutAtmosphericRefractionCorrection[i]);
statDistance.addValue(distance);
}
System.out.format("Distance must be > 0 and < 2m:" +
" Max = " + DFS.format(statDistance.getMax()) +
" Min = " + DFS.format(statDistance.getMin()) +
" Median = " + DFS.format(statDistance.getPercentile(50.)) +
" Mean = " + DFS.format(statDistance.getMean()) +
" Std deviation= " + DFS.format(statDistance.getStandardDeviation()) +
"\n");
// Inverse loc WITH atmospheric correction
// ==========================================================================
final double epsilonPixel = 1.e-3;
final double epsilonLine = 1.1e-2;
int minLine = (int) FastMath.floor(lineSensor.getLine(ruggedWithout.getMinDate()));
int maxLine = (int) FastMath.ceil(lineSensor.getLine(ruggedWithout.getMaxDate()));
for (int i = 0; i < gpWithAtmosphericRefractionCorrection.length; i++) {
// to check if we go back to the initial point when taking the geodetic point with atmospheric correction
GeodeticPoint gpWith = gpWithAtmosphericRefractionCorrection[i];
SensorPixel sensorPixelReverseWith = ruggedWith.inverseLocation("mySensor", gpWith, minLine, maxLine);
if (sensorPixelReverseWith != null) {
// Compare the computed pixel vs expected
if (FastMath.abs(i - sensorPixelReverseWith.getPixelNumber()) > epsilonPixel) {
System.out.format("Problem with pixel " + i + " . Delta pixel= " + DFS.format((i - sensorPixelReverseWith.getPixelNumber())) + "\n");
}
// Compare the computed line vs the expected
if (FastMath.abs(chosenLine - sensorPixelReverseWith.getLineNumber())> epsilonLine) {
System.out.format("Probem with line, for pixel " + i + ". Delta line= " + DFS.format((chosenLine - sensorPixelReverseWith.getLineNumber())) + "\n");
}
} else {
System.out.println("Inverse location failed for pixel " + i + " with atmospheric refraction correction for geodetic point computed with" );
}
} // end loop on pixel i
System.out.format("Inverse location gave same pixel and line as direct location input for" +
" epsilon pixel= " + DFS.format(epsilonPixel) +
" and epsilon line= " + DFS.format(epsilonLine) +
"\n");
}
private static void addSatellitePV(TimeScale gps, Frame eme2000, Frame itrf,
ArrayList<TimeStampedPVCoordinates> satellitePVList,
String absDate,
double px, double py, double pz, double vx, double vy, double vz) {
AbsoluteDate ephemerisDate = new AbsoluteDate(absDate, gps);
Vector3D position = new Vector3D(px, py, pz); // in ITRF, unit: m
Vector3D velocity = new Vector3D(vx, vy, vz); // in ITRF, unit: m/s
PVCoordinates pvITRF = new PVCoordinates(position, velocity);
Transform transform = itrf.getTransformTo(eme2000, ephemerisDate);
PVCoordinates pvEME2000 = transform.transformPVCoordinates(pvITRF);
satellitePVList.add(new TimeStampedPVCoordinates(ephemerisDate, pvEME2000.getPosition(), pvEME2000.getVelocity(), Vector3D.ZERO));
}
private static void addSatelliteQ(TimeScale gps, ArrayList<TimeStampedAngularCoordinates> satelliteQList, String absDate,
double q0, double q1, double q2, double q3) {
AbsoluteDate attitudeDate = new AbsoluteDate(absDate, gps);
Rotation rotation = new Rotation(q0, q1, q2, q3, true); // q0 is the scalar term
TimeStampedAngularCoordinates pair =
new TimeStampedAngularCoordinates(attitudeDate, rotation, Vector3D.ZERO, Vector3D.ZERO);
satelliteQList.add(pair);
}
private static double computeDistanceInMeter(double earthRadius, final GeodeticPoint gp1, final GeodeticPoint gp2) {
// get vectors on unit sphere from angular coordinates
final Vector3D p1 = new Vector3D(gp1.getLongitude(), gp1.getLatitude());
final Vector3D p2 = new Vector3D(gp2.getLongitude(), gp2.getLatitude());
return earthRadius * Vector3D.angle(p1, p2);
}
/** Definition of print format. */
private static final DecimalFormatSymbols SYMBOLS = new DecimalFormatSymbols(Locale.US);
/** Defined of number of digit after the point. */
private static final DecimalFormat DFS = new DecimalFormat("#.#####", SYMBOLS);
}
/* Copyright 2013-2022 CS GROUP
* Licensed to CS GROUP (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You 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.
*/
package fr.cs.examples;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.hipparchus.geometry.euclidean.threed.Rotation;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
import org.hipparchus.util.FastMath;
import org.orekit.bodies.GeodeticPoint;
import org.orekit.data.DataContext;
import org.orekit.data.DirectoryCrawler;
import org.orekit.errors.OrekitException;
import org.orekit.frames.Frame;
import org.orekit.frames.FramesFactory;
import org.orekit.frames.Transform;
import org.orekit.rugged.api.AlgorithmId;
import org.orekit.rugged.api.BodyRotatingFrameId;
import org.orekit.rugged.api.EllipsoidId;
import org.orekit.rugged.api.InertialFrameId;
import org.orekit.rugged.api.Rugged;
import org.orekit.rugged.api.RuggedBuilder;
import org.orekit.rugged.errors.RuggedException;
import org.orekit.rugged.linesensor.LineSensor;
import org.orekit.rugged.linesensor.LinearLineDatation;
import org.orekit.rugged.los.FixedRotation;
import org.orekit.rugged.los.LOSBuilder;
import org.orekit.rugged.los.TimeDependentLOS;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.TimeScale;
import org.orekit.time.TimeScalesFactory;
import org.orekit.utils.AngularDerivativesFilter;
import org.orekit.utils.CartesianDerivativesFilter;
import org.orekit.utils.IERSConventions;
import org.orekit.utils.PVCoordinates;
import org.orekit.utils.TimeStampedAngularCoordinates;
import org.orekit.utils.TimeStampedPVCoordinates;
public class DirectLocation {
public static void main(String[] args) {
try {
// Initialize Orekit, assuming an orekit-data folder is in user home directory
File home = new File(System.getProperty("user.home"));
File orekitData = new File(home, "orekit-data");
DataContext.getDefault().getDataProvidersManager().addProvider(new DirectoryCrawler(orekitData));
// Sensor's definition
// ===================
// Line of sight
// -------------
// The raw viewing direction of pixel i with respect to the instrument is defined by the vector:
List<Vector3D> rawDirs = new ArrayList<Vector3D>();
for (int i = 0; i < 2000; i++) {
// 20° field of view, 2000 pixels
rawDirs.add(new Vector3D(0d, i*FastMath.toRadians(20)/2000d, 1d));
}
// The instrument is oriented 10° off nadir around the X-axis, we need to rotate the viewing
// direction to obtain the line of sight in the satellite frame
LOSBuilder losBuilder = new LOSBuilder(rawDirs);
losBuilder.addTransform(new FixedRotation("10-degrees-rotation", Vector3D.PLUS_I, FastMath.toRadians(10)));
TimeDependentLOS lineOfSight = losBuilder.build();
// Datation model
// --------------
// We use Orekit for handling time and dates, and Rugged for defining the datation model:
TimeScale gps = TimeScalesFactory.getGPS();
AbsoluteDate absDate = new AbsoluteDate("2009-12-11T16:59:30.0", gps);
LinearLineDatation lineDatation = new LinearLineDatation(absDate, 1d, 20);
// Line sensor
// -----------
// With the LOS and the datation now defined, we can initialize a line sensor object in Rugged:
LineSensor lineSensor = new LineSensor("mySensor", lineDatation, Vector3D.ZERO, lineOfSight);
// Satellite position, velocity and attitude
// =========================================
// Reference frames
// ----------------
// In our application, we simply need to know the name of the frames we are working with. Positions and
// velocities are given in the ITRF terrestrial frame, while the quaternions are given in EME2000
// inertial frame.
Frame eme2000 = FramesFactory.getEME2000();
boolean simpleEOP = true; // we don't want to compute tiny tidal effects at millimeter level
Frame itrf = FramesFactory.getITRF(IERSConventions.IERS_2010, simpleEOP);
// Satellite attitude
// ------------------
ArrayList<TimeStampedAngularCoordinates> satelliteQList = new ArrayList<TimeStampedAngularCoordinates>();
addSatelliteQ(gps, satelliteQList, "2009-12-11T16:58:42.592937", -0.340236d, 0.333952d, -0.844012d, -0.245684d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T16:59:06.592937", -0.354773d, 0.329336d, -0.837871d, -0.252281d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T16:59:30.592937", -0.369237d, 0.324612d, -0.831445d, -0.258824d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T16:59:54.592937", -0.3836d, 0.319792d, -0.824743d, -0.265299d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:00:18.592937", -0.397834d, 0.314883d, -0.817777d, -0.271695d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:00:42.592937", -0.411912d, 0.309895d, -0.810561d, -0.278001d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:01:06.592937", -0.42581d, 0.304838d, -0.803111d, -0.284206d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:01:30.592937", -0.439505d, 0.299722d, -0.795442d, -0.290301d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:01:54.592937", -0.452976d, 0.294556d, -0.787571d, -0.296279d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:02:18.592937", -0.466207d, 0.28935d, -0.779516d, -0.302131d);
// Positions and velocities
// ------------------------
ArrayList<TimeStampedPVCoordinates> satellitePVList = new ArrayList<TimeStampedPVCoordinates>();
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T16:58:42.592937", -726361.466d, -5411878.485d, 4637549.599d, -2463.635d, -4447.634d, -5576.736d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T16:59:04.192937", -779538.267d, -5506500.533d, 4515934.894d, -2459.848d, -4312.676d, -5683.906d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T16:59:25.792937", -832615.368d, -5598184.195d, 4392036.13d, -2454.395d, -4175.564d, -5788.201d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T16:59:47.392937", -885556.748d, -5686883.696d, 4265915.971d, -2447.273d, -4036.368d, -5889.568d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:00:08.992937", -938326.32d, -5772554.875d, 4137638.207d, -2438.478d, -3895.166d, -5987.957d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:00:30.592937", -990887.942d, -5855155.21d, 4007267.717d, -2428.011d, -3752.034d, -6083.317d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:00:52.192937", -1043205.448d, -5934643.836d, 3874870.441d, -2415.868d, -3607.05d, -6175.6d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:01:13.792937", -1095242.669d, -6010981.571d, 3740513.34d, -2402.051d, -3460.291d, -6264.76d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:01:35.392937", -1146963.457d, -6084130.93d, 3604264.372d, -2386.561d, -3311.835d, -6350.751d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:01:56.992937", -1198331.706d, -6154056.146d, 3466192.446d, -2369.401d, -3161.764d, -6433.531d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:02:18.592937", -1249311.381d, -6220723.191d, 3326367.397d, -2350.574d, -3010.159d, -6513.056d);
// Rugged initialization
// ---------------------
Rugged rugged = new RuggedBuilder().
setAlgorithm(AlgorithmId.IGNORE_DEM_USE_ELLIPSOID).
setEllipsoid(EllipsoidId.WGS84, BodyRotatingFrameId.ITRF).
setTimeSpan(absDate, absDate.shiftedBy(60.0), 0.01, 5 / lineSensor.getRate(0)).
setTrajectory(InertialFrameId.EME2000,
satellitePVList, 4, CartesianDerivativesFilter.USE_P,
satelliteQList, 4, AngularDerivativesFilter.USE_R).
addLineSensor(lineSensor).
build();
// Direct location of a single sensor pixel (first line, first pixel)
// ------------------------------------------------------------------
Vector3D position = lineSensor.getPosition(); // This returns a zero vector since we set the relative position of the sensor w.r.T the satellite to 0.
AbsoluteDate firstLineDate = lineSensor.getDate(0);
Vector3D los = lineSensor.getLOS(firstLineDate, 0);
GeodeticPoint upLeftPoint = rugged.directLocation(firstLineDate, position, los);
System.out.format(Locale.US, "upper left point: φ = %8.3f °, λ = %8.3f °, h = %8.3f m%n",
FastMath.toDegrees(upLeftPoint.getLatitude()),
FastMath.toDegrees(upLeftPoint.getLongitude()),
upLeftPoint.getAltitude());
} catch (OrekitException oe) {
System.err.println(oe.getLocalizedMessage());
System.exit(1);
} catch (RuggedException re) {
System.err.println(re.getLocalizedMessage());
System.exit(1);
}
}
private static void addSatellitePV(TimeScale gps, Frame eme2000, Frame itrf,
ArrayList<TimeStampedPVCoordinates> satellitePVList,
String absDate,
double px, double py, double pz, double vx, double vy, double vz) {
AbsoluteDate ephemerisDate = new AbsoluteDate(absDate, gps);
Vector3D position = new Vector3D(px, py, pz); // in ITRF, unit: m
Vector3D velocity = new Vector3D(vx, vy, vz); // in ITRF, unit: m/s
PVCoordinates pvITRF = new PVCoordinates(position, velocity);
Transform transform = itrf.getTransformTo(eme2000, ephemerisDate);
PVCoordinates pvEME2000 = transform.transformPVCoordinates(pvITRF);
satellitePVList.add(new TimeStampedPVCoordinates(ephemerisDate, pvEME2000.getPosition(), pvEME2000.getVelocity(), Vector3D.ZERO));
}
private static void addSatelliteQ(TimeScale gps, ArrayList<TimeStampedAngularCoordinates> satelliteQList, String absDate,
double q0, double q1, double q2, double q3) {
AbsoluteDate attitudeDate = new AbsoluteDate(absDate, gps);
Rotation rotation = new Rotation(q0, q1, q2, q3, true); // q0 is the scalar term
TimeStampedAngularCoordinates pair =
new TimeStampedAngularCoordinates(attitudeDate, rotation, Vector3D.ZERO, Vector3D.ZERO);
satelliteQList.add(pair);
}
}
/* Copyright 2013-2022 CS GROUP
* Licensed to CS GROUP (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You 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.
*/
package fr.cs.examples;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.hipparchus.geometry.euclidean.threed.Rotation;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
import org.hipparchus.util.FastMath;
import org.orekit.bodies.GeodeticPoint;
import org.orekit.data.DataContext;
import org.orekit.data.DirectoryCrawler;
import org.orekit.errors.OrekitException;
import org.orekit.frames.Frame;
import org.orekit.frames.FramesFactory;
import org.orekit.frames.Transform;
import org.orekit.rugged.api.AlgorithmId;
import org.orekit.rugged.api.BodyRotatingFrameId;
import org.orekit.rugged.api.EllipsoidId;
import org.orekit.rugged.api.InertialFrameId;
import org.orekit.rugged.api.Rugged;
import org.orekit.rugged.api.RuggedBuilder;
import org.orekit.rugged.errors.RuggedException;
import org.orekit.rugged.linesensor.LineSensor;
import org.orekit.rugged.linesensor.LinearLineDatation;
import org.orekit.rugged.los.FixedRotation;
import org.orekit.rugged.los.LOSBuilder;
import org.orekit.rugged.los.TimeDependentLOS;
import org.orekit.rugged.raster.TileUpdater;
import org.orekit.rugged.raster.UpdatableTile;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.TimeScale;
import org.orekit.time.TimeScalesFactory;
import org.orekit.utils.AngularDerivativesFilter;
import org.orekit.utils.CartesianDerivativesFilter;
import org.orekit.utils.Constants;
import org.orekit.utils.IERSConventions;
import org.orekit.utils.PVCoordinates;
import org.orekit.utils.TimeStampedAngularCoordinates;
import org.orekit.utils.TimeStampedPVCoordinates;
public class DirectLocationWithDEM {
public static void main(String[] args) {
try {
// Initialize Orekit, assuming an orekit-data folder is in user home directory
File home = new File(System.getProperty("user.home"));
File orekitData = new File(home, "orekit-data");
DataContext.getDefault().getDataProvidersManager().addProvider(new DirectoryCrawler(orekitData));
// Sensor's definition
// ===================
// Line of sight
// -------------
// The raw viewing direction of pixel i with respect to the instrument is defined by the vector:
List<Vector3D> rawDirs = new ArrayList<Vector3D>();
for (int i = 0; i < 2000; i++) {
// 20° field of view, 2000 pixels
rawDirs.add(new Vector3D(0d, i*FastMath.toRadians(20)/2000d, 1d));
}
// The instrument is oriented 10° off nadir around the X-axis, we need to rotate the viewing
// direction to obtain the line of sight in the satellite frame
LOSBuilder losBuilder = new LOSBuilder(rawDirs);
losBuilder.addTransform(new FixedRotation("10-degrees-rotation", Vector3D.PLUS_I, FastMath.toRadians(10)));
TimeDependentLOS lineOfSight = losBuilder.build();
// Datation model
// --------------
// We use Orekit for handling time and dates, and Rugged for defining the datation model:
TimeScale gps = TimeScalesFactory.getGPS();
AbsoluteDate absDate = new AbsoluteDate("2009-12-11T16:59:30.0", gps);
LinearLineDatation lineDatation = new LinearLineDatation(absDate, 1d, 20);
// Line sensor
// -----------
// With the LOS and the datation now defined, we can initialize a line sensor object in Rugged:
LineSensor lineSensor = new LineSensor("mySensor", lineDatation, Vector3D.ZERO, lineOfSight);
// Satellite position, velocity and attitude
// =========================================
// Reference frames
// ----------------
// In our application, we simply need to know the name of the frames we are working with. Positions and
// velocities are given in the ITRF terrestrial frame, while the quaternions are given in EME2000
// inertial frame.
Frame eme2000 = FramesFactory.getEME2000();
boolean simpleEOP = true; // we don't want to compute tiny tidal effects at millimeter level
Frame itrf = FramesFactory.getITRF(IERSConventions.IERS_2010, simpleEOP);
// Satellite attitude
// ------------------
ArrayList<TimeStampedAngularCoordinates> satelliteQList = new ArrayList<TimeStampedAngularCoordinates>();
addSatelliteQ(gps, satelliteQList, "2009-12-11T16:58:42.592937", -0.340236d, 0.333952d, -0.844012d, -0.245684d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T16:59:06.592937", -0.354773d, 0.329336d, -0.837871d, -0.252281d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T16:59:30.592937", -0.369237d, 0.324612d, -0.831445d, -0.258824d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T16:59:54.592937", -0.3836d, 0.319792d, -0.824743d, -0.265299d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:00:18.592937", -0.397834d, 0.314883d, -0.817777d, -0.271695d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:00:42.592937", -0.411912d, 0.309895d, -0.810561d, -0.278001d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:01:06.592937", -0.42581d, 0.304838d, -0.803111d, -0.284206d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:01:30.592937", -0.439505d, 0.299722d, -0.795442d, -0.290301d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:01:54.592937", -0.452976d, 0.294556d, -0.787571d, -0.296279d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:02:18.592937", -0.466207d, 0.28935d, -0.779516d, -0.302131d);
// Positions and velocities
// ------------------------
ArrayList<TimeStampedPVCoordinates> satellitePVList = new ArrayList<TimeStampedPVCoordinates>();
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T16:58:42.592937", -726361.466d, -5411878.485d, 4637549.599d, -2463.635d, -4447.634d, -5576.736d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T16:59:04.192937", -779538.267d, -5506500.533d, 4515934.894d, -2459.848d, -4312.676d, -5683.906d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T16:59:25.792937", -832615.368d, -5598184.195d, 4392036.13d, -2454.395d, -4175.564d, -5788.201d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T16:59:47.392937", -885556.748d, -5686883.696d, 4265915.971d, -2447.273d, -4036.368d, -5889.568d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:00:08.992937", -938326.32d, -5772554.875d, 4137638.207d, -2438.478d, -3895.166d, -5987.957d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:00:30.592937", -990887.942d, -5855155.21d, 4007267.717d, -2428.011d, -3752.034d, -6083.317d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:00:52.192937", -1043205.448d, -5934643.836d, 3874870.441d, -2415.868d, -3607.05d, -6175.6d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:01:13.792937", -1095242.669d, -6010981.571d, 3740513.34d, -2402.051d, -3460.291d, -6264.76d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:01:35.392937", -1146963.457d, -6084130.93d, 3604264.372d, -2386.561d, -3311.835d, -6350.751d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:01:56.992937", -1198331.706d, -6154056.146d, 3466192.446d, -2369.401d, -3161.764d, -6433.531d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:02:18.592937", -1249311.381d, -6220723.191d, 3326367.397d, -2350.574d, -3010.159d, -6513.056d);
// Rugged initialization
// ---------------------
Rugged rugged = new RuggedBuilder().
setAlgorithm(AlgorithmId.DUVENHAGE).
setDigitalElevationModel(new VolcanicConeElevationUpdater(new GeodeticPoint(FastMath.toRadians(37.58),
FastMath.toRadians(-96.95),
2463.0),
FastMath.toRadians(30.0), 16.0,
FastMath.toRadians(1.0), 1201),
8).
setEllipsoid(EllipsoidId.WGS84, BodyRotatingFrameId.ITRF).
setTimeSpan(absDate, absDate.shiftedBy(60.0), 0.01, 5 / lineSensor.getRate(0)).
setTrajectory(InertialFrameId.EME2000,
satellitePVList, 4, CartesianDerivativesFilter.USE_P,
satelliteQList, 4, AngularDerivativesFilter.USE_R).
addLineSensor(lineSensor).
build();
// Direct location of a single sensor pixel (first line, first pixel)
// ------------------------------------------------------------------
Vector3D position = lineSensor.getPosition(); // This returns a zero vector since we set the relative position of the sensor w.r.T the satellite to 0.
AbsoluteDate firstLineDate = lineSensor.getDate(0);
Vector3D los = lineSensor.getLOS(firstLineDate, 0);
GeodeticPoint upLeftPoint = rugged.directLocation(firstLineDate, position, los);
System.out.format(Locale.US, "upper left point: φ = %8.3f °, λ = %8.3f °, h = %8.3f m%n",
FastMath.toDegrees(upLeftPoint.getLatitude()),
FastMath.toDegrees(upLeftPoint.getLongitude()),
upLeftPoint.getAltitude());
} catch (OrekitException oe) {
System.err.println(oe.getLocalizedMessage());
System.exit(1);
} catch (RuggedException re) {
System.err.println(re.getLocalizedMessage());
System.exit(1);
}
}
private static void addSatellitePV(TimeScale gps, Frame eme2000, Frame itrf,
ArrayList<TimeStampedPVCoordinates> satellitePVList,
String absDate,
double px, double py, double pz, double vx, double vy, double vz) {
AbsoluteDate ephemerisDate = new AbsoluteDate(absDate, gps);
Vector3D position = new Vector3D(px, py, pz); // in ITRF, unit: m
Vector3D velocity = new Vector3D(vx, vy, vz); // in ITRF, unit: m/s
PVCoordinates pvITRF = new PVCoordinates(position, velocity);
Transform transform = itrf.getTransformTo(eme2000, ephemerisDate);
PVCoordinates pvEME2000 = transform.transformPVCoordinates(pvITRF);
satellitePVList.add(new TimeStampedPVCoordinates(ephemerisDate, pvEME2000.getPosition(), pvEME2000.getVelocity(), Vector3D.ZERO));
}
private static void addSatelliteQ(TimeScale gps, ArrayList<TimeStampedAngularCoordinates> satelliteQList, String absDate,
double q0, double q1, double q2, double q3) {
AbsoluteDate attitudeDate = new AbsoluteDate(absDate, gps);
Rotation rotation = new Rotation(q0, q1, q2, q3, true); // q0 is the scalar term
TimeStampedAngularCoordinates pair =
new TimeStampedAngularCoordinates(attitudeDate, rotation, Vector3D.ZERO, Vector3D.ZERO);
satelliteQList.add(pair);
}
private static class VolcanicConeElevationUpdater implements TileUpdater {
private GeodeticPoint summit;
private double slope;
private double base;
private double size;
private int n;
public VolcanicConeElevationUpdater(GeodeticPoint summit, double slope, double base,
double size, int n) {
this.summit = summit;
this.slope = slope;
this.base = base;
this.size = size;
this.n = n;
}
@Override
public void updateTile(double latitude, double longitude, UpdatableTile tile) {
double step = size / (n - 1);
double minLatitude = size * FastMath.floor(latitude / size);
double minLongitude = size * FastMath.floor(longitude / size);
double sinSlope = FastMath.sin(slope);
tile.setGeometry(minLatitude, minLongitude, step, step, n, n);
for (int i = 0; i < n; ++i) {
double cellLatitude = minLatitude + i * step;
for (int j = 0; j < n; ++j) {
double cellLongitude = minLongitude + j * step;
double distance = Constants.WGS84_EARTH_EQUATORIAL_RADIUS *
FastMath.hypot(cellLatitude - summit.getLatitude(),
cellLongitude - summit.getLongitude());
double altitude = FastMath.max(summit.getAltitude() - distance * sinSlope,
base);
tile.setElevation(i, j, altitude);
}
}
}
}
}
/* Copyright 2013-2022 CS GROUP
* Licensed to CS GROUP (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You 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.
*/
package fr.cs.examples;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.hipparchus.geometry.euclidean.threed.Rotation;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
import org.hipparchus.util.FastMath;
import org.orekit.bodies.GeodeticPoint;
import org.orekit.bodies.OneAxisEllipsoid;
import org.orekit.data.DataContext;
import org.orekit.data.DirectoryCrawler;
import org.orekit.errors.OrekitException;
import org.orekit.frames.Frame;
import org.orekit.frames.FramesFactory;
import org.orekit.frames.Transform;
import org.orekit.rugged.api.AlgorithmId;
import org.orekit.rugged.api.BodyRotatingFrameId;
import org.orekit.rugged.api.EllipsoidId;
import org.orekit.rugged.api.InertialFrameId;
import org.orekit.rugged.api.Rugged;
import org.orekit.rugged.api.RuggedBuilder;
import org.orekit.rugged.errors.RuggedException;
import org.orekit.rugged.linesensor.LineSensor;
import org.orekit.rugged.linesensor.LinearLineDatation;
import org.orekit.rugged.linesensor.SensorPixel;
import org.orekit.rugged.los.FixedRotation;
import org.orekit.rugged.los.LOSBuilder;
import org.orekit.rugged.los.TimeDependentLOS;
import org.orekit.rugged.utils.RoughVisibilityEstimator;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.TimeScale;
import org.orekit.time.TimeScalesFactory;
import org.orekit.utils.AngularDerivativesFilter;
import org.orekit.utils.CartesianDerivativesFilter;
import org.orekit.utils.IERSConventions;
import org.orekit.utils.PVCoordinates;
import org.orekit.utils.TimeStampedAngularCoordinates;
import org.orekit.utils.TimeStampedPVCoordinates;
public class InverseLocation {
public static void main(String[] args) {
try {
// Initialize Orekit, assuming an orekit-data folder is in user home directory
File home = new File(System.getProperty("user.home"));
File orekitData = new File(home, "orekit-data");
DataContext.getDefault().getDataProvidersManager().addProvider(new DirectoryCrawler(orekitData));
// Sensor's definition
// ===================
// Line of sight
// -------------
// The raw viewing direction of pixel i with respect to the instrument is defined by the vector:
List<Vector3D> rawDirs = new ArrayList<Vector3D>();
for (int i = 0; i < 2000; i++) {
// 20° field of view, 2000 pixels
rawDirs.add(new Vector3D(0d, i*FastMath.toRadians(20)/2000d, 1d));
}
// The instrument is oriented 10° off nadir around the X-axis, we need to rotate the viewing
// direction to obtain the line of sight in the satellite frame
LOSBuilder losBuilder = new LOSBuilder(rawDirs);
losBuilder.addTransform(new FixedRotation("10-degrees-rotation", Vector3D.PLUS_I, FastMath.toRadians(10)));
TimeDependentLOS lineOfSight = losBuilder.build();
// Datation model
// --------------
// We use Orekit for handling time and dates, and Rugged for defining the datation model:
TimeScale gps = TimeScalesFactory.getGPS();
AbsoluteDate absDate = new AbsoluteDate("2009-12-11T16:59:30.0", gps);
LinearLineDatation lineDatation = new LinearLineDatation(absDate, 1d, 20);
// Line sensor
// -----------
// With the LOS and the datation now defined , we can initialize a line sensor object in Rugged:
String sensorName = "mySensor";
LineSensor lineSensor = new LineSensor(sensorName, lineDatation, Vector3D.ZERO, lineOfSight);
// Satellite position, velocity and attitude
// =========================================
// Reference frames
// ----------------
// In our application, we simply need to know the name of the frames we are working with. Positions and
// velocities are given in the ITRF terrestrial frame, while the quaternions are given in EME2000
// inertial frame.
Frame eme2000 = FramesFactory.getEME2000();
boolean simpleEOP = true; // we don't want to compute tiny tidal effects at millimeter level
Frame itrf = FramesFactory.getITRF(IERSConventions.IERS_2010, simpleEOP);
// Satellite attitude
// ------------------
ArrayList<TimeStampedAngularCoordinates> satelliteQList = new ArrayList<TimeStampedAngularCoordinates>();
addSatelliteQ(gps, satelliteQList, "2009-12-11T16:58:42.592937", -0.340236d, 0.333952d, -0.844012d, -0.245684d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T16:59:06.592937", -0.354773d, 0.329336d, -0.837871d, -0.252281d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T16:59:30.592937", -0.369237d, 0.324612d, -0.831445d, -0.258824d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T16:59:54.592937", -0.3836d, 0.319792d, -0.824743d, -0.265299d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:00:18.592937", -0.397834d, 0.314883d, -0.817777d, -0.271695d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:00:42.592937", -0.411912d, 0.309895d, -0.810561d, -0.278001d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:01:06.592937", -0.42581d, 0.304838d, -0.803111d, -0.284206d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:01:30.592937", -0.439505d, 0.299722d, -0.795442d, -0.290301d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:01:54.592937", -0.452976d, 0.294556d, -0.787571d, -0.296279d);
addSatelliteQ(gps, satelliteQList, "2009-12-11T17:02:18.592937", -0.466207d, 0.28935d, -0.779516d, -0.302131d);
// Positions and velocities
// ------------------------
ArrayList<TimeStampedPVCoordinates> satellitePVList = new ArrayList<TimeStampedPVCoordinates>();
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T16:58:42.592937", -726361.466d, -5411878.485d, 4637549.599d, -2463.635d, -4447.634d, -5576.736d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T16:59:04.192937", -779538.267d, -5506500.533d, 4515934.894d, -2459.848d, -4312.676d, -5683.906d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T16:59:25.792937", -832615.368d, -5598184.195d, 4392036.13d, -2454.395d, -4175.564d, -5788.201d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T16:59:47.392937", -885556.748d, -5686883.696d, 4265915.971d, -2447.273d, -4036.368d, -5889.568d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:00:08.992937", -938326.32d, -5772554.875d, 4137638.207d, -2438.478d, -3895.166d, -5987.957d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:00:30.592937", -990887.942d, -5855155.21d, 4007267.717d, -2428.011d, -3752.034d, -6083.317d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:00:52.192937", -1043205.448d, -5934643.836d, 3874870.441d, -2415.868d, -3607.05d, -6175.6d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:01:13.792937", -1095242.669d, -6010981.571d, 3740513.34d, -2402.051d, -3460.291d, -6264.76d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:01:35.392937", -1146963.457d, -6084130.93d, 3604264.372d, -2386.561d, -3311.835d, -6350.751d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:01:56.992937", -1198331.706d, -6154056.146d, 3466192.446d, -2369.401d, -3161.764d, -6433.531d);
addSatellitePV(gps, eme2000, itrf, satellitePVList, "2009-12-11T17:02:18.592937", -1249311.381d, -6220723.191d, 3326367.397d, -2350.574d, -3010.159d, -6513.056d);
// Rugged initialization
// ---------------------
RuggedBuilder ruggedBuilder = new RuggedBuilder();
ruggedBuilder.setAlgorithm(AlgorithmId.IGNORE_DEM_USE_ELLIPSOID);
ruggedBuilder.setEllipsoid(EllipsoidId.WGS84, BodyRotatingFrameId.ITRF);
ruggedBuilder.setTimeSpan(absDate, absDate.shiftedBy(60.0), 0.01, 5 / lineSensor.getRate(0));
ruggedBuilder.setTrajectory(InertialFrameId.EME2000,
satellitePVList, 4, CartesianDerivativesFilter.USE_P,
satelliteQList, 4, AngularDerivativesFilter.USE_R).
addLineSensor(lineSensor);
Rugged rugged = ruggedBuilder.build();
// Inverse location of a Geodetic Point
// ------------------------------------
// Point defined by its latitude, longitude and altitude
double latitude = FastMath.toRadians(37.585);
double longitude = FastMath.toRadians(-96.949);
double altitude = 0.0d;
// For a GeodeticPoint : angles are given in radians and altitude in meters
GeodeticPoint gp = new GeodeticPoint(latitude, longitude, altitude);
// Search the sensor pixel seeing point
// ....................................
// interval of lines where to search the point
int minLine = 0;
int maxLine = 100;
SensorPixel sensorPixel = rugged.inverseLocation(sensorName, gp, minLine, maxLine);
// we need to test if the sensor pixel is found in the prescribed lines otherwise the sensor pixel is null
// Be careful: no exception is thrown if the pixel is not found
if (sensorPixel != null){
// The pixel was found
System.out.format(Locale.US, "Sensor Pixel found : line = %5.3f, pixel = %5.3f %n", sensorPixel.getLineNumber(), sensorPixel.getPixelNumber());
} else {
// The pixel was not found: set to null
System.out.println("Sensor Pixel is null: point cannot be seen between the prescribed line numbers\n");
}
// Find the date at which the sensor sees the ground point
// .......................................................
AbsoluteDate dateLine = rugged.dateLocation(sensorName, gp, minLine, maxLine);
System.out.println("Date at which the sensor sees the ground point : " + dateLine);
// How to find min and max lines ? with the RoughVisibilityEstimator
// -------------------------------
// Create a RoughVisibilityEstimator for inverse location
OneAxisEllipsoid oneAxisEllipsoid = ruggedBuilder.getEllipsoid();
Frame pvFrame = ruggedBuilder.getInertialFrame();
// Initialize the RoughVisibilityEstimator
RoughVisibilityEstimator roughVisibilityEstimator = new RoughVisibilityEstimator(oneAxisEllipsoid, pvFrame, satellitePVList);
// Compute the approximated line with a rough estimator
AbsoluteDate roughLineDate = roughVisibilityEstimator.estimateVisibility(gp);
double roughLine = lineSensor.getLine(roughLineDate);
// Compute the min / max lines interval using a margin around the roughLine
int sensorMinLine= 0;
int sensorMaxLine = 1000;
int margin = 100;
int minLineRough = (int) FastMath.max(roughLine - margin, sensorMinLine);
int maxLineRough = (int) FastMath.min(roughLine + margin, sensorMaxLine);
SensorPixel sensorPixelRoughLine = rugged.inverseLocation(sensorName, gp, minLineRough, maxLineRough);
System.out.format(Locale.US, "Rough line found = %5.1f; InverseLocation gives (margin of %d around rough line): line = %5.3f, pixel = %5.3f %n", roughLine, margin, sensorPixelRoughLine.getLineNumber(), sensorPixel.getPixelNumber());
} catch (OrekitException oe) {
System.err.println(oe.getLocalizedMessage());
System.exit(1);
} catch (RuggedException re) {
System.err.println(re.getLocalizedMessage());
System.exit(1);
}
}
private static void addSatellitePV(TimeScale gps, Frame eme2000, Frame itrf,
ArrayList<TimeStampedPVCoordinates> satellitePVList,
String absDate,
double px, double py, double pz, double vx, double vy, double vz) {
AbsoluteDate ephemerisDate = new AbsoluteDate(absDate, gps);
Vector3D position = new Vector3D(px, py, pz); // in ITRF, unit: m
Vector3D velocity = new Vector3D(vx, vy, vz); // in ITRF, unit: m/s
PVCoordinates pvITRF = new PVCoordinates(position, velocity);
Transform transform = itrf.getTransformTo(eme2000, ephemerisDate);
PVCoordinates pvEME2000 = transform.transformPVCoordinates(pvITRF);
satellitePVList.add(new TimeStampedPVCoordinates(ephemerisDate, pvEME2000.getPosition(), pvEME2000.getVelocity(), Vector3D.ZERO));
}
private static void addSatelliteQ(TimeScale gps, ArrayList<TimeStampedAngularCoordinates> satelliteQList, String absDate,
double q0, double q1, double q2, double q3) {
AbsoluteDate attitudeDate = new AbsoluteDate(absDate, gps);
Rotation rotation = new Rotation(q0, q1, q2, q3, true); // q0 is the scalar term
TimeStampedAngularCoordinates pair =
new TimeStampedAngularCoordinates(attitudeDate, rotation, Vector3D.ZERO, Vector3D.ZERO);
satelliteQList.add(pair);
}
}
/* Copyright 2013-2022 CS GROUP
* Licensed to CS GROUP (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You 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.
*/
package fr.cs.examples.refiningPleiades;
import java.io.File;
import java.util.List;
import java.util.Locale;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
import org.hipparchus.util.FastMath;
import org.orekit.bodies.BodyShape;
import org.orekit.bodies.GeodeticPoint;
import org.orekit.data.DataContext;
import org.orekit.data.DirectoryCrawler;
import org.orekit.errors.OrekitException;
import org.orekit.forces.gravity.potential.NormalizedSphericalHarmonicsProvider;
import org.orekit.orbits.Orbit;
import org.orekit.rugged.adjustment.measurements.SensorToGroundMapping;
import org.orekit.rugged.api.AlgorithmId;
import org.orekit.rugged.api.BodyRotatingFrameId;
import org.orekit.rugged.api.EllipsoidId;
import org.orekit.rugged.api.InertialFrameId;
import org.orekit.rugged.api.Rugged;
import org.orekit.rugged.api.RuggedBuilder;
import org.orekit.rugged.errors.RuggedException;
import org.orekit.rugged.linesensor.LineSensor;
import org.orekit.time.AbsoluteDate;
import org.orekit.utils.AngularDerivativesFilter;
import org.orekit.utils.CartesianDerivativesFilter;
import org.orekit.utils.PVCoordinates;
import org.orekit.utils.TimeStampedAngularCoordinates;
import org.orekit.utils.TimeStampedPVCoordinates;
import fr.cs.examples.refiningPleiades.generators.GroundMeasurementGenerator;
import fr.cs.examples.refiningPleiades.generators.Noise;
import fr.cs.examples.refiningPleiades.metrics.DistanceTools;
import fr.cs.examples.refiningPleiades.models.OrbitModel;
import fr.cs.examples.refiningPleiades.models.PleiadesViewingModel;
/**
* Class for testing refining (Ground Control Points GCP study)
* with or without noisy measurements
* @author Jonathan Guinet
* @author Lucie Labat-Allee
* @author Guylaine Prat
* @see SensorToGroundMapping
* @see GroundMeasurementGenerator
* @since 2.0
*/
public class GroundRefining extends Refining {
/** Pleiades viewing model */
private static PleiadesViewingModel pleiadesViewingModel;
/** Sensor name */
private static String sensorName;
/** Main function
*/
public static void main(String[] args) {
try {
// Initialize Orekit, assuming an orekit-data folder is in user home directory
// ---------------------------------------------------------------------------
File home = new File(System.getProperty("user.home"));
File orekitData = new File(home, "orekit-data");
DataContext.getDefault().getDataProvidersManager().addProvider(new DirectoryCrawler(orekitData));
// Initialize refining context
// ---------------------------
GroundRefining refining = new GroundRefining();
// Sensor's definition: create Pleiades viewing model
// --------------------------------------------------
System.out.format("**** Build Pleiades viewing model and orbit definition **** %n");
AbsoluteDate minDate = pleiadesViewingModel.getMinDate();
AbsoluteDate maxDate = pleiadesViewingModel.getMaxDate();
AbsoluteDate refDate = pleiadesViewingModel.getDatationReference();
LineSensor lineSensor = pleiadesViewingModel.getLineSensor();
// Satellite position, velocity and attitude: create an orbit model
// ----------------------------------------------------------------
OrbitModel orbitmodel = new OrbitModel();
BodyShape earth = orbitmodel.createEarth();
NormalizedSphericalHarmonicsProvider gravityField = orbitmodel.createGravityField();
Orbit orbit = orbitmodel.createOrbit(gravityField.getMu(), refDate);
// Nadir's pointing
final double [] rollPoly = {0.0,0.0,0.0};
double[] pitchPoly = {0.0,0.0};
double[] yawPoly = {0.0,0.0,0.0};
orbitmodel.setLOFTransform(rollPoly, pitchPoly, yawPoly, minDate);
// Satellite attitude
List<TimeStampedAngularCoordinates> satelliteQList =
orbitmodel.orbitToQ(orbit, earth, minDate.shiftedBy(-0.0), maxDate.shiftedBy(+0.0), 0.25);
int nbQPoints = 2;
// Position and velocities
PVCoordinates PV = orbit.getPVCoordinates(earth.getBodyFrame());
List<TimeStampedPVCoordinates> satellitePVList =
orbitmodel.orbitToPV(orbit, earth, minDate.shiftedBy(-0.0), maxDate.shiftedBy(+0.0), 0.25);
int nbPVPoints = 8;
// Convert frame and coordinates type in one call
GeodeticPoint gp = earth.transform(PV.getPosition(), earth.getBodyFrame(), orbit.getDate());
System.out.format(Locale.US, "Geodetic Point at date %s : φ = %8.10f °, λ = %8.10f %n",
orbit.getDate().toString(),
FastMath.toDegrees(gp.getLatitude()),
FastMath.toDegrees(gp.getLongitude()));
// Rugged initialization
// ---------------------
System.out.format("\n**** Rugged initialization **** %n");
RuggedBuilder ruggedBuilder = new RuggedBuilder();
ruggedBuilder.addLineSensor(lineSensor);
ruggedBuilder.setAlgorithm(AlgorithmId.IGNORE_DEM_USE_ELLIPSOID);
ruggedBuilder.setEllipsoid(EllipsoidId.WGS84, BodyRotatingFrameId.ITRF);
ruggedBuilder.setTimeSpan(minDate,maxDate, 0.001, 5.0);
ruggedBuilder.setTrajectory(InertialFrameId.EME2000, satellitePVList,nbPVPoints,
CartesianDerivativesFilter.USE_PV, satelliteQList,
nbQPoints, AngularDerivativesFilter.USE_R);
ruggedBuilder.setName("Rugged_refining");
Rugged rugged = ruggedBuilder.build();
// Compute ground sample distance (GSD)
// ------------------------------------
double [] gsd = refining.computeGSD(rugged, lineSensor);
System.out.format("GSD - X: %2.2f Y: %2.2f **** %n", gsd[0], gsd[1]);
// Initialize disruptions:
// -----------------------
// Introduce rotations around instrument axes (roll and pitch translations, scale factor)
System.out.format("\n**** Add disruptions: roll and pitch rotations, scale factor **** %n");
double rollValue = FastMath.toRadians(-0.01);
double pitchValue = FastMath.toRadians(0.02);
double factorValue = 1.05;
System.out.format("roll: %3.5f \tpitch: %3.5f \tfactor: %3.5f \n",rollValue, pitchValue, factorValue);
// Apply disruptions on physical model
refining.applyDisruptions(rugged, sensorName, rollValue, pitchValue, factorValue);
// Generate measurements (observations) from physical model disrupted
// ------------------------------------------------------------------
int lineSampling = 1000;
int pixelSampling = 1000;
// Noise definition
// distribution: gaussian(0), vector dimension:3
final Noise noise = new Noise(0,3);
// lat mean, long mean, alt mean
final double[] mean = {0.0,0.0,0.0};
// lat std, long std, alt std}
final double[] standardDeviation = {0.0,0.0,0.0};
noise.setMean(mean);
noise.setStandardDeviation(standardDeviation);
// Ground measurements
GroundMeasurementGenerator measurements = refining.generateNoisyPoints(lineSampling, pixelSampling,
rugged, sensorName,
pleiadesViewingModel.getDimension(),
noise);
// Compute ground truth residuals
// ------------------------------
System.out.format("\n**** Ground truth residuals **** %n");
refining.computeMetrics(measurements.getGroundMapping(), rugged, false);
// Initialize physical model without disruptions
// ---------------------------------------------
System.out.format("\n**** Initialize physical model without disruptions: reset Roll/Pitch/Factor **** %n");
refining.resetModel(rugged, sensorName, true);
// Compute initial residuals
// -------------------------
System.out.format("\n**** Initial Residuals **** %n");
refining.computeMetrics(measurements.getGroundMapping(), rugged, false);
// Start optimization
// ------------------
System.out.format("\n**** Start optimization **** %n");
int maxIterations = 100;
double convergenceThreshold = 1.e-11;
refining.optimization(maxIterations, convergenceThreshold, measurements.getObservables(), rugged);
// Check estimated values
// ----------------------
System.out.format("\n**** Check parameters ajustement **** %n");
refining.paramsEstimation(rugged, sensorName, rollValue, pitchValue, factorValue);
// Compute statistics
// ------------------
System.out.format("\n**** Compute Statistics **** %n");
// Residuals computed in meters
refining.computeMetrics(measurements.getGroundMapping(), rugged, false);
// Residuals computed in degrees
refining.computeMetrics(measurements.getGroundMapping(), rugged, true);
} catch (OrekitException oe) {
System.err.println(oe.getLocalizedMessage());
System.exit(1);
} catch (RuggedException re) {
System.err.println(re.getLocalizedMessage());
System.exit(1);
}
}
/** Constructor */
private GroundRefining() {
sensorName = "line";
pleiadesViewingModel = new PleiadesViewingModel(sensorName);
}
/** Estimate ground sample distance (GSD)
* @param LineSensor line sensor
* @return the GSD
*/
private double[] computeGSD(final Rugged rugged, final LineSensor lineSensor) {
// Get number of line
int dimension = pleiadesViewingModel.getDimension();
// Get position
Vector3D position = lineSensor.getPosition(); // This returns a zero vector since we set the relative position of the sensor w.r.T the satellite to 0.
// Get upper left geodetic point
AbsoluteDate firstLineDate = lineSensor.getDate(0);
Vector3D los = lineSensor.getLOS(firstLineDate,0);
GeodeticPoint upLeftPoint = rugged.directLocation(firstLineDate, position, los);
los = lineSensor.getLOS(firstLineDate,dimension-1);
// Get center geodetic point
AbsoluteDate lineDate = lineSensor.getDate(dimension/2);
los = lineSensor.getLOS(lineDate,dimension/2);
// Get upper right geodetic point
int pixelPosition = dimension-1;
los = lineSensor.getLOS(firstLineDate,pixelPosition);
GeodeticPoint upperRight = rugged.directLocation(firstLineDate, position, los);
// Get lower left geodetic point
AbsoluteDate lineDate_y = lineSensor.getDate(dimension-1);
los = lineSensor.getLOS(lineDate_y,0);
GeodeticPoint lowerLeft = rugged.directLocation(lineDate_y, position, los);
double gsdX = DistanceTools.computeDistanceInMeter(upLeftPoint, upperRight)/dimension;
double gsdY = DistanceTools.computeDistanceInMeter(upLeftPoint, lowerLeft)/dimension;
double [] gsd = {gsdX, gsdY};
return gsd;
}
// /**
// * Get the Pleiades viewing model
// * @return the Pleiades viewing model
// */
// public PleiadesViewingModel getPleiadesViewingModel() {
// return pleiadesViewingModel;
// }
//
// /**
// * Set the Pleiades viewing model
// * @param pleiadesViewingModel Pleiades viewing model to set
// */
// public void setPleiadesViewingModel(final PleiadesViewingModel pleiadesViewingModel) {
// this.pleiadesViewingModel = pleiadesViewingModel;
// }
//
// /**
// * Get the orbit model
// * @return the orbit model
// */
// public OrbitModel getOrbitmodel() {
// return orbitmodel;
// }
//
// /**
// * Set the orbit model
// * @param orbitmodel the orbit model to set
// */
// public void setOrbitmodel(final OrbitModel orbitmodel) {
// this.orbitmodel = orbitmodel;
// }
//
// /**
// * Get the sensor name
// * @return the sensor name
// */
// public String getSensorName() {
// return sensorName;
// }
//
// /**
// * Get the Rugged instance
// * @return the rugged instance
// */
// public Rugged getRugged() {
// return rugged;
// }
//
// /**
// * Set the Rugged instance
// * @param rugged the Rugged instance to set
// */
// public void setRugged(final Rugged rugged) {
// this.rugged = rugged;
// }
}
/* Copyright 2013-2022 CS GROUP
* Licensed to CS GROUP (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You 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.
*/
package fr.cs.examples.refiningPleiades;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
import org.hipparchus.util.FastMath;
import org.orekit.bodies.BodyShape;
import org.orekit.bodies.GeodeticPoint;
import org.orekit.data.DataContext;
import org.orekit.data.DirectoryCrawler;
import org.orekit.errors.OrekitException;
import org.orekit.orbits.Orbit;
import org.orekit.rugged.adjustment.measurements.SensorToGroundMapping;
import org.orekit.rugged.api.AlgorithmId;
import org.orekit.rugged.api.BodyRotatingFrameId;
import org.orekit.rugged.api.EllipsoidId;
import org.orekit.rugged.api.InertialFrameId;
import org.orekit.rugged.api.Rugged;
import org.orekit.rugged.api.RuggedBuilder;
import org.orekit.rugged.errors.RuggedException;
import org.orekit.rugged.linesensor.LineSensor;
import org.orekit.time.AbsoluteDate;
import org.orekit.utils.AngularDerivativesFilter;
import org.orekit.utils.CartesianDerivativesFilter;
import org.orekit.utils.Constants;
import org.orekit.utils.PVCoordinates;
import org.orekit.utils.TimeStampedAngularCoordinates;
import org.orekit.utils.TimeStampedPVCoordinates;
import fr.cs.examples.refiningPleiades.generators.GroundMeasurementGenerator;
import fr.cs.examples.refiningPleiades.generators.InterMeasurementGenerator;
import fr.cs.examples.refiningPleiades.generators.Noise;
import fr.cs.examples.refiningPleiades.metrics.DistanceTools;
import fr.cs.examples.refiningPleiades.models.OrbitModel;
import fr.cs.examples.refiningPleiades.models.PleiadesViewingModel;
/**
* Class for testing refining (tie points study)
* with or without noisy measurements
* @author Jonathan Guinet
* @author Lucie Labat-Allee
* @author Guylaine Prat
* @see SensorToGroundMapping
* @see GroundMeasurementGenerator
* @since 2.0
*/
public class InterRefining extends Refining {
/** Pleiades viewing model A */
private static PleiadesViewingModel pleiadesViewingModelA;
/** Pleiades viewing model B */
private static PleiadesViewingModel pleiadesViewingModelB;
/** Sensor name A corresponding to viewing model A */
private static String sensorNameA;
/** Sensor name A corresponding to viewing model B */
private static String sensorNameB;
/** Main function
*/
public static void main(String[] args) {
try {
// Initialize Orekit, assuming an orekit-data folder is in user home directory
// ---------------------------------------------------------------------------
File home = new File(System.getProperty("user.home"));
File orekitData = new File(home, "orekit-data");
DataContext.getDefault().getDataProvidersManager().addProvider(new DirectoryCrawler(orekitData));
// Initialize refining context
// ---------------------------
InterRefining refining = new InterRefining();
// Sensors's definition: creation of 2 Pleiades viewing models
// -----------------------------------------------------------
System.out.format("**** Build Pleiades viewing model A and its orbit definition **** %n");
// 1/- Create First Pleiades Viewing Model
final AbsoluteDate minDateA = pleiadesViewingModelA.getMinDate();
final AbsoluteDate maxDateA = pleiadesViewingModelA.getMaxDate();
final AbsoluteDate refDateA = pleiadesViewingModelA.getDatationReference();
LineSensor lineSensorA = pleiadesViewingModelA.getLineSensor();
System.out.format(Locale.US, "Viewing model A - date min: %s max: %s ref: %s %n", minDateA, maxDateA, refDateA);
// ----Satellite position, velocity and attitude: create orbit model A
OrbitModel orbitmodelA = new OrbitModel();
BodyShape earthA = orbitmodelA.createEarth();
Orbit orbitA = orbitmodelA.createOrbit(Constants.EIGEN5C_EARTH_MU, refDateA);
// ----If no LOF Transform Attitude Provider is Nadir Pointing Yaw Compensation
final double [] rollPoly = {0.0,0.0,0.0};
double[] pitchPoly = {0.025,0.0};
double[] yawPoly = {0.0,0.0,0.0};
orbitmodelA.setLOFTransform(rollPoly, pitchPoly, yawPoly, minDateA);
// ----Satellite attitude
List<TimeStampedAngularCoordinates> satelliteQListA = orbitmodelA.orbitToQ(orbitA, earthA, minDateA.shiftedBy(-0.0), maxDateA.shiftedBy(+0.0), 0.25);
int nbQPoints = 2;
// ----Position and velocities
PVCoordinates PVA = orbitA.getPVCoordinates(earthA.getBodyFrame());
List<TimeStampedPVCoordinates> satellitePVListA = orbitmodelA.orbitToPV(orbitA, earthA, minDateA.shiftedBy(-0.0), maxDateA.shiftedBy(+0.0), 0.25);
int nbPVPoints = 8;
// ----Convert frame and coordinates type in one call
GeodeticPoint gpA = earthA.transform(PVA.getPosition(), earthA.getBodyFrame(), orbitA.getDate());
System.out.format(Locale.US, "(A) Geodetic Point at date %s : φ = %8.10f °, λ = %8.10f %n",
orbitA.getDate().toString(),
FastMath.toDegrees(gpA.getLatitude()),
FastMath.toDegrees(gpA.getLongitude()));
// Rugged A initialization
// ---------------------
System.out.format("**** Rugged A initialization **** %n");
RuggedBuilder ruggedBuilderA = new RuggedBuilder();
ruggedBuilderA.addLineSensor(lineSensorA);
ruggedBuilderA.setAlgorithm(AlgorithmId.IGNORE_DEM_USE_ELLIPSOID);
ruggedBuilderA.setEllipsoid(EllipsoidId.WGS84, BodyRotatingFrameId.ITRF);
ruggedBuilderA.setTimeSpan(minDateA,maxDateA, 0.001, 5.0);
ruggedBuilderA.setTrajectory(InertialFrameId.EME2000, satellitePVListA, nbPVPoints,
CartesianDerivativesFilter.USE_PV, satelliteQListA,
nbQPoints, AngularDerivativesFilter.USE_R);
ruggedBuilderA.setLightTimeCorrection(false);
ruggedBuilderA.setAberrationOfLightCorrection(false);
ruggedBuilderA.setName("RuggedA");
Rugged ruggedA = ruggedBuilderA.build();
System.out.format("\n**** Build Pleiades viewing model B and its orbit definition **** %n");
// 2/- Create Second Pleiades Viewing Model
final AbsoluteDate minDateB = pleiadesViewingModelB.getMinDate();
final AbsoluteDate maxDateB = pleiadesViewingModelB.getMaxDate();
final AbsoluteDate refDateB = pleiadesViewingModelB.getDatationReference();
LineSensor lineSensorB = pleiadesViewingModelB.getLineSensor();
System.out.format(Locale.US, "Viewing model B - date min: %s max: %s ref: %s %n", minDateB, maxDateB, refDateB);
// ----Satellite position, velocity and attitude: create orbit model B
OrbitModel orbitmodelB = new OrbitModel();
BodyShape earthB = orbitmodelB.createEarth();
Orbit orbitB = orbitmodelB.createOrbit(Constants.EIGEN5C_EARTH_MU, refDateB);
// ----Satellite attitude
List<TimeStampedAngularCoordinates> satelliteQListB = orbitmodelB.orbitToQ(orbitB, earthB, minDateB.shiftedBy(-0.0), maxDateB.shiftedBy(+0.0), 0.25);
// ----Position and velocities
PVCoordinates PVB = orbitB.getPVCoordinates(earthB.getBodyFrame());
List<TimeStampedPVCoordinates> satellitePVListB = orbitmodelB.orbitToPV(orbitB, earthB, minDateB.shiftedBy(-0.0), maxDateB.shiftedBy(+0.0), 0.25);
GeodeticPoint gpB = earthB.transform(PVB.getPosition(), earthB.getBodyFrame(), orbitB.getDate());
System.out.format(Locale.US, "(B) Geodetic Point at date %s : φ = %8.10f °, λ = %8.10f %n",orbitA.getDate().toString(),
FastMath.toDegrees(gpB.getLatitude()),
FastMath.toDegrees(gpB.getLongitude()));
// Rugged B initialization
// ---------------------
System.out.format("**** Rugged B initialization **** %n");
RuggedBuilder ruggedBuilderB = new RuggedBuilder();
ruggedBuilderB.addLineSensor(lineSensorB);
ruggedBuilderB.setAlgorithm(AlgorithmId.IGNORE_DEM_USE_ELLIPSOID);
ruggedBuilderB.setEllipsoid(EllipsoidId.WGS84, BodyRotatingFrameId.ITRF);
ruggedBuilderB.setTimeSpan(minDateB,maxDateB, 0.001, 5.0);
ruggedBuilderB.setTrajectory(InertialFrameId.EME2000, satellitePVListB, nbPVPoints,
CartesianDerivativesFilter.USE_PV, satelliteQListB,
nbQPoints, AngularDerivativesFilter.USE_R);
ruggedBuilderB.setLightTimeCorrection(false);
ruggedBuilderB.setAberrationOfLightCorrection(false);
ruggedBuilderB.setName("RuggedB");
Rugged ruggedB = ruggedBuilderB.build();
// Compute distance between LOS
// -----------------------------
double distance = refining.computeDistanceBetweenLOS(ruggedA, lineSensorA, ruggedB, lineSensorB);
System.out.format("distance %f meters %n",distance);
// Initialize disruptions:
// -----------------------
// Introduce rotations around instrument axes (roll and pitch translations, scale factor)
System.out.format("\n**** Add disruptions on both acquisitions (A,B): roll and pitch rotations, scale factor **** %n");
double rollValueA = FastMath.toRadians(0.004);
double pitchValueA = FastMath.toRadians(0.0008);
double rollValueB = FastMath.toRadians(-0.004);
double pitchValueB = FastMath.toRadians(0.0008);
double factorValue = 1.0;
System.out.format("Acquisition A roll: %3.5f \tpitch: %3.5f \tfactor: %3.5f \n",rollValueA,pitchValueA,factorValue);
System.out.format("Acquisition B roll: %3.5f \tpitch: %3.5f \tfactor: %3.5f \n",rollValueB,pitchValueB,factorValue);
// Apply disruptions on physical model (acquisition A)
refining.applyDisruptions(ruggedA, sensorNameA, rollValueA, pitchValueA, factorValue);
// Apply disruptions on physical model (acquisition B)
refining.applyDisruptions(ruggedB, sensorNameB, rollValueB, pitchValueB, factorValue);
// Generate measurements (observations) from physical model disrupted
// ------------------------------------------------------------------
int lineSampling = 1000;
int pixelSampling = 1000;
// Noise definition
// distribution: gaussian(0), vector dimension: 2
final Noise noise = new Noise(0,2);
// {pixelA mean, pixelB mean}
final double[] mean = {5.0,0.0};
// {pixelB std, pixelB std}
final double[] standardDeviation = {0.1,0.1};
noise.setMean(mean);
noise.setStandardDeviation(standardDeviation);
System.out.format("\tSensor A mean: %f std %f %n",mean[0],standardDeviation[0]);
System.out.format("\tSensor B mean: %f std %f %n",mean[1],standardDeviation[1]);
// Inter-measurements (between both viewing models)
InterMeasurementGenerator measurements = refining.generateNoisyPoints(lineSampling, pixelSampling,
ruggedA, sensorNameA,
pleiadesViewingModelA.getDimension(),
ruggedB, sensorNameB,
pleiadesViewingModelB.getDimension(),
noise);
// Compute ground truth residuals
// ------------------------------
System.out.format("\n**** Ground truth residuals **** %n");
refining.computeMetrics(measurements.getInterMapping(), ruggedA, ruggedB, false);
// Initialize physical models without disruptions
// -----------------------------------------------
System.out.format("\n**** Initialize physical models (A,B) without disruptions: reset Roll/Pitch/Factor **** %n");
refining.resetModel(ruggedA, sensorNameA, false);
refining.resetModel(ruggedB, sensorNameB, false);
// Compute initial residuals
// -------------------------
System.out.format("\n**** Initial Residuals **** %n");
refining.computeMetrics(measurements.getInterMapping(), ruggedA, ruggedB, false);
// Start optimization
// ------------------
System.out.format("\n**** Start optimization **** %n");
final int maxIterations = 100;
final double convergenceThreshold = 1.e-7;
List<Rugged> ruggedList = Arrays.asList(ruggedA, ruggedB);
refining.optimization(maxIterations, convergenceThreshold,
measurements.getObservables(), ruggedList);
// Check estimated values
// ----------------------
System.out.format("\n**** Check parameters ajustement **** %n");
System.out.format("Acquisition A:%n");
refining.paramsEstimation(ruggedA, sensorNameA, rollValueA, pitchValueA, factorValue);
System.out.format("Acquisition B:%n");
refining.paramsEstimation(ruggedB, sensorNameB, rollValueB, pitchValueB, factorValue);
// Compute statistics
// ------------------
System.out.format("\n**** Compute Statistics **** %n");
refining.computeMetrics(measurements.getInterMapping(), ruggedA, ruggedB, false);
} catch (OrekitException oe) {
System.err.println(oe.getLocalizedMessage());
System.exit(1);
} catch (RuggedException re) {
System.err.println(re.getLocalizedMessage());
System.exit(1);
}
}
/** Constructor */
private InterRefining() {
sensorNameA = "SensorA";
final double incidenceAngleA = -5.0;
final String dateA = "2016-01-01T11:59:50.0";
pleiadesViewingModelA = new PleiadesViewingModel(sensorNameA, incidenceAngleA, dateA);
sensorNameB = "SensorB";
final double incidenceAngleB = 0.0;
final String dateB = "2016-01-01T12:02:50.0";
pleiadesViewingModelB = new PleiadesViewingModel(sensorNameB, incidenceAngleB, dateB);
}
/** Estimate distance between LOS
* @param lineSensorA line sensor A
* @param lineSensorB line sensor B
* @return GSD
*/
private double computeDistanceBetweenLOS(final Rugged ruggedA, final LineSensor lineSensorA,
final Rugged ruggedB, final LineSensor lineSensorB) {
// Get number of line of sensors
int dimensionA = pleiadesViewingModelA.getDimension();
int dimensionB = pleiadesViewingModelB.getDimension();
Vector3D positionA = lineSensorA.getPosition();
// This returns a zero vector since we set the relative position of the sensor w.r.T the satellite to 0.
AbsoluteDate lineDateA = lineSensorA.getDate(dimensionA/2);
Vector3D losA = lineSensorA.getLOS(lineDateA,dimensionA/2);
GeodeticPoint centerPointA = ruggedA.directLocation(lineDateA, positionA, losA);
System.out.format(Locale.US, "\ncenter geodetic position A : φ = %8.10f °, λ = %8.10f °, h = %8.3f m%n",
FastMath.toDegrees(centerPointA.getLatitude()),
FastMath.toDegrees(centerPointA.getLongitude()),centerPointA.getAltitude());
Vector3D positionB = lineSensorB.getPosition();
// This returns a zero vector since we set the relative position of the sensor w.r.T the satellite to 0.
AbsoluteDate lineDateB = lineSensorB.getDate(dimensionB/2);
Vector3D losB = lineSensorB.getLOS(lineDateB,dimensionB/2);
GeodeticPoint centerPointB = ruggedB.directLocation(lineDateB, positionB, losB);
System.out.format(Locale.US, "center geodetic position B : φ = %8.10f °, λ = %8.10f °, h = %8.3f m%n",
FastMath.toDegrees(centerPointB.getLatitude()),
FastMath.toDegrees(centerPointB.getLongitude()),centerPointB.getAltitude());
lineDateB = lineSensorB.getDate(0);
losB = lineSensorB.getLOS(lineDateB,0);
GeodeticPoint firstPointB = ruggedB.directLocation(lineDateB, positionB, losB);
System.out.format(Locale.US, "first geodetic position B : φ = %8.10f °, λ = %8.10f °, h = %8.3f m%n",
FastMath.toDegrees(firstPointB.getLatitude()),
FastMath.toDegrees(firstPointB.getLongitude()),firstPointB.getAltitude());
lineDateB = lineSensorB.getDate(dimensionB-1);
losB = lineSensorB.getLOS(lineDateB,dimensionB-1);
GeodeticPoint lastPointB = ruggedB.directLocation(lineDateB, positionB, losB);
System.out.format(Locale.US, "last geodetic position B : φ = %8.10f °, λ = %8.10f °, h = %8.3f m%n",
FastMath.toDegrees(lastPointB.getLatitude()),
FastMath.toDegrees(lastPointB.getLongitude()),lastPointB.getAltitude());
double distance = DistanceTools.computeDistanceInMeter(centerPointA, centerPointB);
return distance;
}
}
/* Copyright 2013-2022 CS GROUP
* Licensed to CS GROUP (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You 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.
*/
package fr.cs.examples.refiningPleiades;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.hipparchus.optim.nonlinear.vector.leastsquares.LeastSquaresOptimizer.Optimum;
import org.orekit.rugged.adjustment.AdjustmentContext;
import org.orekit.rugged.adjustment.measurements.Observables;
import org.orekit.rugged.adjustment.measurements.SensorToGroundMapping;
import org.orekit.rugged.adjustment.measurements.SensorToSensorMapping;
import org.orekit.rugged.api.Rugged;
import org.orekit.rugged.errors.RuggedException;
import org.orekit.rugged.errors.RuggedMessages;
import fr.cs.examples.refiningPleiades.generators.GroundMeasurementGenerator;
import fr.cs.examples.refiningPleiades.generators.InterMeasurementGenerator;
import fr.cs.examples.refiningPleiades.generators.Noise;
import fr.cs.examples.refiningPleiades.metrics.LocalisationMetrics;
/**
* Class for refining problems common methods
* @author Jonathan Guinet
* @author Lucie Labat-Allee
* @author Guylaine Prat
* @see SensorToGroundMapping
* @see SensorToSensorMapping
* @see GroundMeasurementGenerator
* @see InterMeasurementGenerator
* @since 2.0
*/
public class Refining {
/**
* Constructor
*/
public Refining() {
}
/** Apply disruptions on acquisition for roll, pitch and scale factor
* @param rugged Rugged instance
* @param sensorName line sensor name
* @param rollValue rotation on roll value
* @param pitchValue rotation on pitch value
* @param factorValue scale factor
*/
public void applyDisruptions(final Rugged rugged, final String sensorName,
final double rollValue, final double pitchValue, final double factorValue) {
rugged.
getLineSensor(sensorName).
getParametersDrivers().
filter(driver -> driver.getName().equals(sensorName + rollSuffix)).
findFirst().get().setValue(rollValue);
rugged.
getLineSensor(sensorName).
getParametersDrivers().
filter(driver -> driver.getName().equals(sensorName + pitchSuffix)).
findFirst().get().setValue(pitchValue);
rugged.
getLineSensor(sensorName).
getParametersDrivers().
filter(driver -> driver.getName().equals(factorName)).
findFirst().get().setValue(factorValue);
}
/** Generate measurements without noise (sensor to ground mapping)
* @param lineSampling line sampling
* @param pixelSampling pixel sampling
* @param rugged Rugged instance
* @param sensorName line sensor name
* @param dimension number of line of the sensor
* @return ground measurements generator (sensor to ground mapping)
*/
public GroundMeasurementGenerator generatePoints(final int lineSampling, final int pixelSampling,
final Rugged rugged, final String sensorName,
final int dimension) {
GroundMeasurementGenerator measurements = new GroundMeasurementGenerator(rugged, sensorName, dimension);
System.out.format("\n**** Generate measurements (without noise; sensor to ground mapping) **** %n");
// Generation measurements without noise
measurements.createMeasurement(lineSampling, pixelSampling);
System.out.format("Number of tie points generated: %d %n", measurements.getMeasurementCount());
return measurements;
}
/** Generate measurements without noise (sensor to sensor mapping)
* @param lineSampling line sampling
* @param pixelSampling pixel sampling
* @param ruggedA Rugged instance of acquisition A
* @param sensorNameA line sensor name A
* @param dimensionA dimension for acquisition A
* @param ruggedB Rugged instance of acquisition B
* @param sensorNameB line sensor name B
* @param dimensionB dimension for acquisition B
* @return inter measurements generator (sensor to sensor mapping)
*/
public InterMeasurementGenerator generatePoints(final int lineSampling, final int pixelSampling,
final Rugged ruggedA, final String sensorNameA, final int dimensionA,
final Rugged ruggedB, final String sensorNameB, final int dimensionB) {
// Outliers control
final double outlierValue = 1e+2;
// Earth constraint weight
final double earthConstraintWeight = 0.1;
// Generate measurements with constraints on outliers control and Earth distance
InterMeasurementGenerator measurements = new InterMeasurementGenerator(ruggedA, sensorNameA, dimensionA,
ruggedB, sensorNameB, dimensionB,
outlierValue,
earthConstraintWeight);
System.out.format("\n**** Generate measurements (without noise; sensor to sensor mapping) **** %n");
// Generation measurements without noise
measurements.createMeasurement(lineSampling, pixelSampling);
System.out.format("Number of tie points generated: %d %n", measurements.getMeasurementCount());
return measurements;
}
/** Generate noisy measurements (sensor to ground mapping)
* @param lineSampling line sampling
* @param pixelSampling pixel sampling
* @param rugged Rugged instance
* @param sensorName line sensor name
* @param dimension dimension
* @param noise Noise structure to generate noisy measurements
* @return ground measurements generator (sensor to ground mapping)
*/
public GroundMeasurementGenerator generateNoisyPoints(final int lineSampling, final int pixelSampling,
final Rugged rugged, final String sensorName, final int dimension,
final Noise noise) {
// Generate ground measurements
GroundMeasurementGenerator measurements = new GroundMeasurementGenerator(rugged, sensorName, dimension);
System.out.format("\n**** Generate noisy measurements (sensor to ground mapping) **** %n");
// Generate noisy measurements
measurements.createNoisyMeasurement(lineSampling, pixelSampling, noise);
System.out.format("Number of tie points generated: %d %n", measurements.getMeasurementCount());
return measurements;
}
/** Generate noisy measurements (sensor to sensor mapping)
* @param lineSampling line sampling
* @param pixelSampling pixel sampling
* @param ruggedA Rugged instance of acquisition A
* @param sensorNameA line sensor name A
* @param dimensionA dimension for acquisition A
* @param ruggedB Rugged instance of acquisition B
* @param sensorNameB line sensor name B
* @param dimensionB dimension for acquisition B
* @param noise noise structure to generate noisy measurements
* @return inter-measurements generator (sensor to sensor mapping)
*/
public InterMeasurementGenerator generateNoisyPoints(final int lineSampling, final int pixelSampling,
final Rugged ruggedA, final String sensorNameA, final int dimensionA,
final Rugged ruggedB, final String sensorNameB, final int dimensionB,
final Noise noise) {
// Outliers control
final double outlierValue = 1.e+2;
// Earth constraint weight
final double earthConstraintWeight = 0.1;
// Generate measurements with constraints on Earth distance and outliers control
InterMeasurementGenerator measurements = new InterMeasurementGenerator(ruggedA, sensorNameA, dimensionA,
ruggedB, sensorNameB, dimensionB,
outlierValue,
earthConstraintWeight);
System.out.format("\n**** Generate noisy measurements (sensor to sensor mapping) **** %n");
// Generation noisy measurements
measurements.createNoisyMeasurement(lineSampling, pixelSampling, noise);
System.out.format("Number of tie points generated: %d %n", measurements.getMeasurementCount());
return measurements;
}
/** Compute metrics to evaluate geometric performances in location,
* for Ground Control Points GCP study.
* @param groundMapping sensor to ground mapping
* @param rugged Rugged instance
* @param unit flag to know if distance is computed in meters (false) or with angular (true)
*/
public void computeMetrics(final SensorToGroundMapping groundMapping,
final Rugged rugged, final boolean unit) {
String stUnit = null;
if(unit) {
stUnit="degrees";
} else {
stUnit="meters";
}
LocalisationMetrics residuals = new LocalisationMetrics(groundMapping, rugged, unit);
System.out.format("Max: %3.4e Mean: %3.4e %s%n",residuals.getMaxResidual(),residuals.getMeanResidual(), stUnit);
}
/** Compute metrics to evaluate geometric performances in location,
* for tie points study.
* @param interMapping sensor to sensor mapping
* @param ruggedA Rugged instance A
* @param ruggedB Rugged instance B
* @param unit flag to know if distance is computed in meters (false) or with angular (true)
*/
public void computeMetrics(final SensorToSensorMapping interMapping,
final Rugged ruggedA, final Rugged ruggedB,
final boolean unit) {
String stUnit = null;
if(unit) stUnit="degrees";
else stUnit="meters";
LocalisationMetrics residuals = new LocalisationMetrics(interMapping, ruggedA, ruggedB, unit);
System.out.format("Max: %1.4e Mean: %1.4e %s%n",residuals.getMaxResidual(),residuals.getMeanResidual(), stUnit);
System.out.format("LOS distance Max: %1.4e Mean: %1.4e %s%n",residuals.getLosMaxDistance(),residuals.getLosMeanDistance(), stUnit);
System.out.format("Earth distance Max: %1.4e Mean: %1.4e %s%n",residuals.getEarthMaxDistance(),residuals.getEarthMeanDistance(), stUnit);
}
/** Reset a model
* @param rugged Rugged instance
* @param sensorName line sensor name
* @param isSelected flag to known if factor parameter is selected or not
*/
public void resetModel(final Rugged rugged, final String sensorName, final boolean isSelected) {
rugged.
getLineSensor(sensorName).
getParametersDrivers().
filter(driver -> driver.getName().equals(sensorName + rollSuffix)
|| driver.getName().equals(sensorName + pitchSuffix)).
forEach(driver -> {
driver.setSelected(true);
driver.setValue(0.0);
});
rugged.
getLineSensor(sensorName).
getParametersDrivers().
filter(driver -> driver.getName().equals(factorName)).
forEach(driver -> {
driver.setSelected(isSelected);
// default value: no Z scale factor applied
driver.setValue(1.0);
});
}
/** Start optimization to adjust parameters (Ground Control Points GCP study).
* @param maxIterations iterations max
* @param convergenceThreshold threshold of convergence
* @param measurements ground measurements
* @param rugged Rugged instance
*/
public void optimization(final int maxIterations, final double convergenceThreshold,
final Observables measurements, final Rugged rugged) {
System.out.format("Iterations max: %d\tconvergence threshold: %3.6e \n", maxIterations, convergenceThreshold);
AdjustmentContext adjustmentContext = new AdjustmentContext(Collections.singletonList(rugged), measurements);
Optimum optimum = adjustmentContext.estimateFreeParameters(Collections.singletonList(rugged.getName()), maxIterations, convergenceThreshold);
// Print statistics
System.out.format("Max value: %3.6e %n", optimum.getResiduals().getMaxValue());
System.out.format("Optimization performed in %d iterations \n", optimum.getIterations());
System.out.format("Optimization performed with %d evaluations of model (objective) function \n", optimum.getEvaluations());
System.out.format("RMSE: %f \n", optimum.getRMS());
}
/** Start optimization to adjust parameters (tie points study).
* @param maxIterations iterations max
* @param convergenceThreshold threshold of convergence
* @param measurements measurements
* @param ruggeds Rugged instances A and B
*/
public void optimization(final int maxIterations, final double convergenceThreshold,
final Observables measurements,
final Collection<Rugged> ruggeds) {
System.out.format("Iterations max: %d\tconvergence threshold: %3.6e \n", maxIterations, convergenceThreshold);
if(ruggeds.size()!= 2 ) {
throw new RuggedException(RuggedMessages.UNSUPPORTED_REFINING_CONTEXT,ruggeds.size());
}
AdjustmentContext adjustmentContext = new AdjustmentContext(ruggeds, measurements);
List<String> ruggedNameList = new ArrayList<String>();
for(Rugged rugged : ruggeds) {
ruggedNameList.add(rugged.getName());
}
Optimum optimum = adjustmentContext.estimateFreeParameters(ruggedNameList, maxIterations, convergenceThreshold);
// Print statistics
System.out.format("Max value: %3.6e %n", optimum.getResiduals().getMaxValue());
System.out.format("Optimization performed in %d iterations \n", optimum.getIterations());
System.out.format("Optimization performed with %d evaluations of model (objective) function \n", optimum.getEvaluations());
System.out.format("RMSE: %f \n", optimum.getRMS());
}
/** Check adjusted parameters of an acquisition
* @param rugged Rugged instance
* @param sensorName line sensor name
* @param rollValue rotation on roll value
* @param pitchValue rotation on pitch value
* @param factorValue scale factor
*/
public void paramsEstimation(final Rugged rugged, final String sensorName,
final double rollValue, final double pitchValue, final double factorValue) {
// Estimate Roll
double estimatedRoll = rugged.getLineSensor(sensorName).
getParametersDrivers().
filter(driver -> driver.getName().equals(sensorName + rollSuffix)).
findFirst().get().getValue();
double rollError = (estimatedRoll - rollValue);
System.out.format("Estimated roll: %3.5f\troll error: %3.6e %n", estimatedRoll, rollError);
// Estimate pitch
double estimatedPitch = rugged.getLineSensor(sensorName).
getParametersDrivers().
filter(driver -> driver.getName().equals(sensorName + pitchSuffix)).
findFirst().get().getValue();
double pitchError = (estimatedPitch - pitchValue);
System.out.format("Estimated pitch: %3.5f\tpitch error: %3.6e %n", estimatedPitch, pitchError);
// Estimate scale factor
double estimatedFactor = rugged.getLineSensor(sensorName).
getParametersDrivers().
filter(driver -> driver.getName().equals(factorName)).
findFirst().get().getValue();
double factorError = (estimatedFactor - factorValue);
System.out.format("Estimated factor: %3.5f\tfactor error: %3.6e %n", estimatedFactor, factorError);
}
/**
* Part of the name of parameter drivers
*/
static final String rollSuffix = "_roll";
static final String pitchSuffix = "_pitch";
static final String factorName = "factor";
public static String getRollsuffix() {
return rollSuffix;
}
public static String getPitchsuffix() {
return pitchSuffix;
}
public static String getFactorname() {
return factorName;
}
}
/* Copyright 2013-2022 CS GROUP
* Licensed to CS GROUP (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You 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.
*/
package fr.cs.examples.refiningPleiades.generators;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
import org.hipparchus.random.GaussianRandomGenerator;
import org.hipparchus.random.UncorrelatedRandomVectorGenerator;
import org.hipparchus.random.Well19937a;
import org.hipparchus.util.FastMath;
import org.orekit.bodies.GeodeticPoint;
import org.orekit.rugged.adjustment.measurements.Observables;
import org.orekit.rugged.adjustment.measurements.SensorToGroundMapping;
import org.orekit.rugged.api.Rugged;
import org.orekit.rugged.linesensor.LineSensor;
import org.orekit.rugged.linesensor.SensorPixel;
import org.orekit.time.AbsoluteDate;
/** Ground measurements generator (sensor to ground mapping).
* @author Jonathan Guinet
* @author Lucie Labat-Allee
* @author Guylaine Prat
* @since 2.0
*/
public class GroundMeasurementGenerator implements Measurable {
/** Sensor to ground mapping. */
private SensorToGroundMapping groundMapping;
/** Observables which contains ground mapping. */
private Observables observables;
/** Rugged instance */
private Rugged rugged;
/** Line sensor */
private LineSensor sensor;
/** Number of lines of the sensor */
private int dimension;
/** Number of measurements */
private int measurementCount;
/** Simple constructor.
* @param rugged Rugged instance
* @param sensorName sensor name
* @param dimension number of line of the sensor
*/
public GroundMeasurementGenerator(final Rugged rugged, final String sensorName, final int dimension) {
// Generate reference mapping
this.groundMapping = new SensorToGroundMapping(rugged.getName(), sensorName);
// Create observables for one model
this.observables = new Observables(1);
this.rugged = rugged;
this.sensor = rugged.getLineSensor(groundMapping.getSensorName());
this.dimension = dimension;
this.measurementCount = 0;
}
/** Get the sensor to ground mapping
* @return the sensor to ground mapping
*/
public SensorToGroundMapping getGroundMapping() {
return groundMapping;
}
/** Get the observables which contains the ground mapping
* @return the observables which contains the ground mapping
*/
public Observables getObservables() {
return observables;
}
@Override
public int getMeasurementCount() {
return measurementCount;
}
@Override
public void createMeasurement(final int lineSampling, final int pixelSampling) {
for (double line = 0; line < dimension; line += lineSampling) {
final AbsoluteDate date = sensor.getDate(line);
for (int pixel = 0; pixel < sensor.getNbPixels(); pixel += pixelSampling) {
final GeodeticPoint gp2 = rugged.directLocation(date, sensor.getPosition(),
sensor.getLOS(date, pixel));
groundMapping.addMapping(new SensorPixel(line, pixel), gp2);
// increment the number of measurements
measurementCount++;
}
}
observables.addGroundMapping(groundMapping);
}
@Override
public void createNoisyMeasurement(final int lineSampling, final int pixelSampling, final Noise noise) {
// Estimate latitude and longitude errors (rad)
final Vector3D latLongError = estimateLatLongError();
// Get noise features
final double[] mean = noise.getMean(); // [latitude, longitude, altitude] mean
final double[] std = noise.getStandardDeviation(); // [latitude, longitude, altitude] standard deviation
final double latErrorMean = mean[0] * latLongError.getX();
final double lonErrorMean = mean[1] * latLongError.getY();
final double latErrorStd = std[0] * latLongError.getX();
final double lonErrorStd = std[1] * latLongError.getY();
// Gaussian random generator
// Build a null mean random uncorrelated vector generator with standard deviation corresponding to the estimated error on ground
final double meanGenerator[] = {latErrorMean, lonErrorMean, mean[2]};
final double stdGenerator[] = {latErrorStd, lonErrorStd, std[2]};
// seed has been fixed for tests purpose
final GaussianRandomGenerator rng = new GaussianRandomGenerator(new Well19937a(0xefac03d9be4d24b9l));
final UncorrelatedRandomVectorGenerator rvg = new UncorrelatedRandomVectorGenerator(meanGenerator, stdGenerator, rng);
for (double line = 0; line < dimension; line += lineSampling) {
final AbsoluteDate date = sensor.getDate(line);
for (int pixel = 0; pixel < sensor.getNbPixels(); pixel += pixelSampling) {
// Components of generated vector follow (independent) Gaussian distribution
final Vector3D vecRandom = new Vector3D(rvg.nextVector());
final GeodeticPoint gp2 = rugged.directLocation(date, sensor.getPosition(),
sensor.getLOS(date, pixel));
final GeodeticPoint gpNoisy = new GeodeticPoint(gp2.getLatitude() + vecRandom.getX(),
gp2.getLongitude() + vecRandom.getY(),
gp2.getAltitude() + vecRandom.getZ());
groundMapping.addMapping(new SensorPixel(line, pixel), gpNoisy);
// increment the number of measurements
measurementCount++;
}
}
this.observables.addGroundMapping(groundMapping);
}
/** Compute latitude and longitude errors
* @return the latitude and longitude errors (rad)
*/
private Vector3D estimateLatLongError() {
final int pix = sensor.getNbPixels() / 2;
final int line = (int) FastMath.floor(pix); // assumption : same number of line and pixels;
final AbsoluteDate date = sensor.getDate(line);
final GeodeticPoint gp_pix0 = rugged.directLocation(date, sensor.getPosition(), sensor.getLOS(date, pix));
final AbsoluteDate date1 = sensor.getDate(line + 1);
final GeodeticPoint gp_pix1 = rugged.directLocation(date1, sensor.getPosition(), sensor.getLOS(date1, pix + 1));
final double latErr = FastMath.abs(gp_pix0.getLatitude() - gp_pix1.getLatitude());
final double lonErr = FastMath.abs(gp_pix0.getLongitude() - gp_pix1.getLongitude());
return new Vector3D(latErr, lonErr, 0.0);
}
}
/* Copyright 2013-2022 CS GROUP
* Licensed to CS GROUP (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You 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.
*/
package fr.cs.examples.refiningPleiades.generators;
import org.hipparchus.random.GaussianRandomGenerator;
import org.hipparchus.random.UncorrelatedRandomVectorGenerator;
import org.hipparchus.random.Well19937a;
import org.orekit.bodies.GeodeticPoint;
import org.orekit.rugged.api.Rugged;
import org.orekit.rugged.errors.RuggedException;
import org.orekit.rugged.errors.RuggedMessages;
import org.orekit.rugged.linesensor.LineSensor;
import org.orekit.rugged.linesensor.SensorPixel;
import org.orekit.rugged.adjustment.measurements.Observables;
import org.orekit.rugged.adjustment.measurements.SensorToSensorMapping;
import org.orekit.rugged.utils.SpacecraftToObservedBody;
import org.orekit.time.AbsoluteDate;
import fr.cs.examples.refiningPleiades.metrics.DistanceTools;
/**
* Inter-measurements generator (sensor to sensor mapping).
* @author Jonathan Guinet
* @author Lucie Labatallee
* @author Guylaine Prat
* @since 2.0
*/
public class InterMeasurementGenerator implements Measurable {
/** Mapping from sensor A to sensor B. */
private SensorToSensorMapping interMapping;
/** Observables which contains sensor to sensor mapping.*/
private Observables observables;
/** Rugged instance corresponding to the viewing model A */
private Rugged ruggedA;
/** Rugged instance corresponding to the viewing model B */
private Rugged ruggedB;
/** Sensor A */
private LineSensor sensorA;
/** Sensor B */
private LineSensor sensorB;
/** Number of measurements */
private int measurementCount;
/** Sensor name B */
private String sensorNameB;
/** Number of line for acquisition A */
private int dimensionA;
/** Number of line for acquisition B */
private int dimensionB;
/** Limit value for outlier points */
private double outlier;
/** Default constructor: measurements generation without outlier points control
* and without Earth distance constraint.
* @param ruggedA Rugged instance corresponding to the viewing model A
* @param sensorNameA sensor name A
* @param dimensionA number of line for acquisition A
* @param ruggedB Rugged instance corresponding to the viewing model B
* @param sensorNameB sensor name B
* @param dimensionB number of line for acquisition B
*/
public InterMeasurementGenerator(final Rugged ruggedA, final String sensorNameA, final int dimensionA,
final Rugged ruggedB, final String sensorNameB, final int dimensionB) {
// Initialize parameters
initParams(ruggedA, sensorNameA, dimensionA, ruggedB, sensorNameB, dimensionB);
// Generate reference mapping, without Earth distance constraint
interMapping = new SensorToSensorMapping(sensorNameA, sensorNameB);
// Create observables for two models
observables = new Observables(2);
}
/** Constructor for measurements generation taking into account outlier points control,
* without Earth distance constraint.
* @param ruggedA Rugged instance corresponding to the viewing model A
* @param sensorNameA sensor name A
* @param dimensionA dimension for acquisition A
* @param ruggedB Rugged instance corresponding to the viewing model B
* @param sensorNameB sensor name B
* @param dimensionB dimension for acquisition B
* @param outlier limit value for outlier points
*/
public InterMeasurementGenerator(final Rugged ruggedA, final String sensorNameA, final int dimensionA,
final Rugged ruggedB, final String sensorNameB, final int dimensionB,
final double outlier) {
this(ruggedA, sensorNameA, dimensionA, ruggedB, sensorNameB, dimensionB);
this.outlier = outlier;
}
/** Constructor for measurements generation taking into account outlier points control,
* and Earth distance constraint.
* @param ruggedA Rugged instance corresponding to the viewing model A
* @param sensorNameA sensor name A
* @param dimensionA dimension for acquisition A
* @param ruggedB Rugged instance corresponding to the viewing model B
* @param sensorNameB sensor name B
* @param dimensionB dimension for acquisition B
* @param outlier limit value for outlier points
* @param earthConstraintWeight weight given to the Earth distance constraint
* with respect to the LOS distance (between 0 and 1).
*/
public InterMeasurementGenerator(final Rugged ruggedA, final String sensorNameA, final int dimensionA,
final Rugged ruggedB, final String sensorNameB, final int dimensionB,
final double outlier, final double earthConstraintWeight) {
// Initialize parameters
initParams(ruggedA, sensorNameA, dimensionA, ruggedB, sensorNameB, dimensionB);
// Generate reference mapping, with Earth distance constraints.
// Weighting will be applied as follow :
// (1-earthConstraintWeight) for losDistance weighting
// earthConstraintWeight for earthDistance weighting
interMapping = new SensorToSensorMapping(sensorNameA, ruggedA.getName(), sensorNameB, ruggedB.getName(), earthConstraintWeight);
// Outlier points control
this.outlier = outlier;
// Observables which contains sensor to sensor mapping
this.observables = new Observables(2);
}
/** Get the mapping from sensor A to sensor B
* @return the mapping from sensor A to sensor B
*/
public SensorToSensorMapping getInterMapping() {
return interMapping;
}
/** Get the observables which contains sensor to sensor mapping
* @return the observables which contains sensor to sensor mapping
*/
public Observables getObservables() {
return observables;
}
@Override
public int getMeasurementCount() {
return measurementCount;
}
@Override
public void createMeasurement(final int lineSampling, final int pixelSampling) {
// Search the sensor pixel seeing point
final int minLine = 0;
final int maxLine = dimensionB - 1;
for (double line = 0; line < dimensionA; line += lineSampling) {
final AbsoluteDate dateA = sensorA.getDate(line);
for (double pixelA = 0; pixelA < sensorA.getNbPixels(); pixelA += pixelSampling) {
final GeodeticPoint gpA = ruggedA.directLocation(dateA, sensorA.getPosition(),
sensorA.getLOS(dateA, pixelA));
final SensorPixel sensorPixelB = ruggedB.inverseLocation(sensorNameB, gpA, minLine, maxLine);
// We need to test if the sensor pixel is found in the prescribed lines
// otherwise the sensor pixel is null
if (sensorPixelB != null) {
final AbsoluteDate dateB = sensorB.getDate(sensorPixelB.getLineNumber());
final double pixelB = sensorPixelB.getPixelNumber();
final SpacecraftToObservedBody scToBodyA = ruggedA.getScToBody();
final GeodeticPoint gpB = ruggedB.directLocation(dateB, sensorB.getPosition(),
sensorB.getLOS(dateB, pixelB));
final double geoDistance = DistanceTools.computeDistanceInMeter(gpA, gpB);
if (geoDistance < this.outlier) {
final SensorPixel realPixelA = new SensorPixel(line, pixelA);
final SensorPixel realPixelB = new SensorPixel(sensorPixelB.getLineNumber(), sensorPixelB.getPixelNumber());
final AbsoluteDate realDateA = sensorA.getDate(realPixelA.getLineNumber());
final AbsoluteDate realDateB = sensorB.getDate(realPixelB.getLineNumber());
final double[] distanceLOSB = ruggedB.distanceBetweenLOS(sensorA, realDateA, realPixelA.getPixelNumber(), scToBodyA,
sensorB, realDateB, realPixelB.getPixelNumber());
final double losDistance = 0.0;
final double earthDistance = distanceLOSB[1];
interMapping.addMapping(realPixelA, realPixelB, losDistance, earthDistance);
// Increment the number of measurements
this.measurementCount++;
}
}
}
}
this.observables.addInterMapping(interMapping);
}
/** Tie point creation from direct 1ocation with Rugged A and inverse location with Rugged B
* @param lineSampling sampling along lines
* @param pixelSampling sampling along columns
* @param noise errors to apply to measure for pixel A and pixel B
*/
public void createNoisyMeasurement(final int lineSampling, final int pixelSampling, final Noise noise) {
// Get noise features (errors)
// [pixelA, pixelB] mean
final double[] mean = noise.getMean();
// [pixelA, pixelB] standard deviation
final double[] std = noise.getStandardDeviation();
// Search the sensor pixel seeing point
final int minLine = 0;
final int maxLine = dimensionB - 1;
final double meanA[] = { mean[0], mean[0] };
final double stdA[] = { std[0], std[0] };
final double meanB[] = { mean[1], mean[1] };
final double stdB[] = { std[1], std[1] };
// Seed has been fixed for tests purpose
final GaussianRandomGenerator rngA = new GaussianRandomGenerator(new Well19937a(0xefac03d9be4d24b9l));
final UncorrelatedRandomVectorGenerator rvgA = new UncorrelatedRandomVectorGenerator(meanA, stdA, rngA);
// Seed has been fixed for tests purpose
final GaussianRandomGenerator rngB = new GaussianRandomGenerator(new Well19937a(0xdf1c03d9be0b34b9l));
final UncorrelatedRandomVectorGenerator rvgB = new UncorrelatedRandomVectorGenerator(meanB, stdB, rngB);
for (double line = 0; line < dimensionA; line += lineSampling) {
final AbsoluteDate dateA = sensorA.getDate(line);
for (double pixelA = 0; pixelA < sensorA.getNbPixels(); pixelA += pixelSampling) {
final GeodeticPoint gpA = ruggedA.directLocation(dateA, sensorA.getPosition(),
sensorA.getLOS(dateA, pixelA));
final SensorPixel sensorPixelB = ruggedB.inverseLocation(sensorNameB, gpA, minLine, maxLine);
// We need to test if the sensor pixel is found in the prescribed lines
// otherwise the sensor pixel is null
if (sensorPixelB != null) {
final AbsoluteDate dateB = sensorB.getDate(sensorPixelB.getLineNumber());
final double pixelB = sensorPixelB.getPixelNumber();
// Get spacecraft to body transform of Rugged instance A
final SpacecraftToObservedBody scToBodyA = ruggedA.getScToBody();
final GeodeticPoint gpB = ruggedB.directLocation(dateB, sensorB.getPosition(),
sensorB.getLOS(dateB, pixelB));
final double geoDistance = DistanceTools.computeDistanceInMeter(gpA, gpB);
// Create the inter mapping if distance is below outlier value
if (geoDistance < outlier) {
final double[] vecRandomA = rvgA.nextVector();
final double[] vecRandomB = rvgB.nextVector();
final SensorPixel realPixelA = new SensorPixel(line + vecRandomA[0], pixelA + vecRandomA[1]);
final SensorPixel realPixelB = new SensorPixel(sensorPixelB.getLineNumber() + vecRandomB[0],
sensorPixelB.getPixelNumber() + vecRandomB[1]);
final AbsoluteDate realDateA = sensorA.getDate(realPixelA.getLineNumber());
final AbsoluteDate realDateB = sensorB.getDate(realPixelB.getLineNumber());
final double[] distanceLOSB = ruggedB.distanceBetweenLOS(sensorA, realDateA, realPixelA.getPixelNumber(), scToBodyA,
sensorB, realDateB, realPixelB.getPixelNumber());
final Double losDistance = 0.0;
final Double earthDistance = distanceLOSB[1];
interMapping.addMapping(realPixelA, realPixelB, losDistance, earthDistance);
// Increment the number of measurements
this.measurementCount++;
} // end test if geoDistance < outlier
} // end test if sensorPixelB != null
} // end loop on pixel of sensorA
} // end loop on line of sensorA
this.observables.addInterMapping(interMapping);
}
/** Default constructor: measurements generation without outlier points control
* and Earth distances constraint.
* @param rA Rugged instance A
* @param sNameA sensor name A
* @param dimA dimension for acquisition A
* @param rB Rugged instance B
* @param sNameB sensor name B
* @param dimB dimension for acquisition B
*/
private void initParams(final Rugged rA, final String sNameA, final int dimA,
final Rugged rB, final String sNameB, final int dimB) {
this.sensorNameB = sNameB;
// Check that sensors's name is different
if (sNameA.contains(sNameB)) {
throw new RuggedException(RuggedMessages.DUPLICATED_PARAMETER_NAME, sNameA);
}
this.ruggedA = rA;
this.ruggedB = rB;
this.sensorA = rA.getLineSensor(sNameA);
this.sensorB = rB.getLineSensor(sNameB);
this.dimensionA = dimA;
this.dimensionB = dimB;
this.measurementCount = 0;
}
}
/* Copyright 2013-2022 CS GROUP
* Licensed to CS GROUP (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You 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.
*/
package fr.cs.examples.refiningPleiades.generators;
/** For measurements generator.
* @author Lucie Labat-Allee
* @author Guylaine Prat
* @since 2.0
*/
public interface Measurable {
/** Get the number of measurements
* @return the number of measurements
*/
int getMeasurementCount();
/** Create measurements (without noise)
* @param lineSampling line sampling
* @param pixelSampling pixel sampling
*/
void createMeasurement(int lineSampling, int pixelSampling);
/** Create noisy measurements
* @param lineSampling line sampling
* @param pixelSampling pixel sampling
* @param noise the noise to add to the measurements
*/
void createNoisyMeasurement(int lineSampling, int pixelSampling, Noise noise);
}