package main;
use 5.006002;
use strict;
use warnings;
# This test makes use of satellite orbital elements which I have access
# to, but which I do not have permission to distribute. The needed data
# are in variable $expect below, which contains one line per TLE element
# set, with each line specifying a required OID and epoch (in both
# ISO-8601-ish and TLE format). Order is unimportant.
#
# These data can be downloaded from the Space Track web site
# (http://www.space-track.org/), provided you have an account.
#
# Once you have the TLE data, you need a place to put it. There are two
# places to put it; the first place found will be used:
#
# 1) You can designate the directory of your choice for the data by
# putting its name in environment variable ASTRO_COORD_ECI_TLE_DIR.
# This environment variable must be defined when the tests are
# actually run.
#
# 2) If you have File::HomeDir installed, you can put it in the
# dist_config directory for Astro-Coord-ECI-TLE-Dir. You will need to
# consult the File::HomeDir documentation (or even, unfortunately,
# the source for the plug-in for your operating system) to figure out
# where this is.
#
# No matter where the file goes, its name must be 'pass_extra.tle'.
#
# The order of the data in the file is unimportant. Blank lines are
# ignored, as are lines whose first non-blank character is '#'. You can
# use either NORAD-format TLE (i.e. two lines of data per data set), or
# NASA-format TLE (with the common name of the object on a line before
# the two lines of data)
BEGIN {
eval {
require Test::More;
Test::More->VERSION( 0.88 ); # Because of done_testing();
Test::More->import();
1;
} or do {
print "1..0 # skip Test::More 0.88 required\n";
exit;
};
}
BEGIN {
eval {
require Time::Local;
Time::Local->import();
1;
} or do {
plan skip_all => 'Can not load Time::Local';
exit;
};
eval {
require File::Spec;
1;
} or do {
plan skip_all => 'Can not load File::Spec';
exit;
};
eval {
use lib qw{ inc };
require My::Module::Test;
My::Module::Test->import( ':all' );
1;
} or do {
plan skip_all => 'Can not load My::Module::Test from inc';
exit;
};
}
use Astro::Coord::ECI;
use Astro::Coord::ECI::Moon;
use Astro::Coord::ECI::Star;
use Astro::Coord::ECI::TLE qw{ :constants };
use Astro::Coord::ECI::TLE::Set;
use Astro::Coord::ECI::Utils qw{ deg2rad PARSEC rad2deg SECSPERDAY };
my @all_tle;
{
my $dir = $ENV{ASTRO_COORD_ECI_TLE_DIR};
$dir
and -d $dir
or eval {
require File::HomeDir;
$dir = File::HomeDir->my_dist_config(
'Astro-Coord-ECI-TLE-Dir' );
} or do {
plan skip_all => 'TLE directory not found';
exit;
};
my $file = File::Spec->catfile( $dir, 'pass_extra.tle' );
-f $file or do {
plan skip_all => "TLE file $file not found";
exit;
};
my $fh;
open $fh, '<', $file or do {
plan skip_all => "Unable to open $file: $!";
exit;
};
@all_tle = sort {
$a->get( 'id' ) <=> $b->get( 'id' ) ||
$a->get( 'epoch' ) <=> $b->get( 'epoch' )
} Astro::Coord::ECI::TLE->parse( <$fh> );
my $descr = join '', map {
sprintf "%5s %s %14.8f\n", $_->get( 'id'),
format_time( $_->get( 'epoch' ) ),
$_->__make_tle_epoch()
} @all_tle;
# List of OIDs and epochs expected in pass_extra.tle
my $expect = <<'EOD';
00733 2011/05/27 18:59:26 11147.79127244
03597 2011/05/27 22:21:07 11147.93133392
21938 2011/05/27 22:36:19 11147.94188938
25544 2011/04/25 08:32:05 11115.35561462
25544 2011/05/13 11:58:29 11133.49894455
EOD
$descr eq $expect
or do {
diag "The TLE data for the test are:\n";
diag <<'EOD';
OID Epoch (GMT) Epoch (in TLE)
----- -------------------- --------------
EOD
diag "Expected:\n";
diag $expect;
diag "Found in $file:\n";
diag $descr;
plan skip_all => "$file does not contain the expected data";
exit;
};
}
plan tests => 47;
my $sta = Astro::Coord::ECI->new(
name => 'Twisst',
)->geodetic(
deg2rad( 51.8 ),
deg2rad( 5.3 ),
0,
);
my $moon = Astro::Coord::ECI::Moon->new();
my ( $tle ) = get_oid( '25544', @all_tle );
$tle->set( horizon => deg2rad( 10 ) );
my @pass;
my $offset = 10;
if ( eval {
@pass = $tle->pass(
$sta,
timegm( $offset, 0, 10, 25, 3, 111 ),
timegm( $offset, 0, 10, 2, 4, 111 ),
[ $moon ],
);
1;
} ) {
ok @pass == 10,
"Found 10 passes over Twisst at $offset sec after minute"
or diag "Found @{[ scalar @pass ]} passes over Twisst";
} else {
fail "Error in pass() method: $@";
}
is format_pass( $pass[0] ), <<'EOD', 'Pass 1';
2011/04/25 20:29:44 10.1 274.3 1311.4 lit rise
2011/04/25 20:32:40 85.5 178.7 352.9 lit max
2011/04/25 20:34:18 23.2 98.6 792.2 shdw shdw
2011/04/25 20:35:36 9.9 97.9 1317.9 shdw set
EOD
is format_pass( $pass[1] ), <<'EOD', 'Pass 2';
2011/04/25 22:05:01 10.1 273.1 1309.8 lit rise
2011/04/25 22:05:46 15.7 265.9 1030.7 shdw shdw
2011/04/25 22:07:43 34.5 205.5 589.1 shdw max
2011/04/25 22:10:26 9.9 137.5 1314.0 shdw set
EOD
is format_pass( $pass[2] ), <<'EOD', 'Pass 3';
2011/04/26 20:54:23 10.0 277.1 1313.9 lit rise
2011/04/26 20:57:17 60.9 195.5 398.9 lit max
2011/04/26 20:57:52 46.5 142.8 472.9 shdw shdw
2011/04/26 21:00:10 10.0 115.1 1310.1 shdw set
EOD
is format_pass( $pass[3] ), <<'EOD', 'Pass 4';
2011/04/27 19:43:46 10.0 274.6 1312.4 lit rise
2011/04/27 19:46:42 84.8 182.0 353.1 lit max
2011/04/27 19:49:38 9.9 98.5 1317.0 lit set
EOD
is format_pass( $pass[4] ), <<'EOD', 'Pass 5';
2011/04/27 21:19:03 10.1 272.7 1310.4 lit rise
2011/04/27 21:21:22 32.0 223.9 623.4 shdw shdw
2011/04/27 21:21:44 33.5 206.0 602.1 shdw max
2011/04/27 21:24:26 9.9 138.7 1312.5 shdw set
EOD
is format_pass( $pass[5] ), <<'EOD', 'Pass 6';
2011/04/28 20:08:18 10.1 277.0 1311.1 lit rise
2011/04/28 20:11:11 59.6 196.7 403.6 lit max
2011/04/28 20:13:20 16.1 118.9 1012.8 shdw shdw
2011/04/28 20:14:05 9.9 116.0 1316.0 shdw set
EOD
is format_pass( $pass[6] ), <<'EOD', 'Pass 7';
2011/04/28 21:43:59 10.0 258.6 1309.6 lit rise
2011/04/28 21:44:48 13.9 244.5 1106.9 shdw shdw
2011/04/28 21:45:59 16.9 215.3 978.9 shdw max
2011/04/28 21:48:00 9.9 171.4 1309.0 shdw set
EOD
is format_pass( $pass[7] ), <<'EOD', 'Pass 8';
2011/04/29 20:32:50 10.0 272.4 1312.6 lit rise
2011/04/29 20:35:31 32.6 205.9 614.1 lit max
2011/04/29 20:36:43 22.6 160.3 805.6 shdw shdw
2011/04/29 20:38:11 10.0 139.9 1308.8 shdw set
EOD
is format_pass( $pass[8] ), <<'EOD', 'Pass 9';
2011/04/30 20:57:40 10.0 257.8 1310.6 lit rise
2011/04/30 20:59:38 16.5 215.4 995.9 lit max
2011/04/30 21:00:03 16.0 204.4 1012.0 shdw shdw
2011/04/30 21:01:35 10.0 173.2 1305.2 shdw set
EOD
is format_pass( $pass[9] ), <<'EOD', 'Pass 10';
2011/05/01 19:46:23 10.1 272.1 1309.5 lit rise
2011/05/01 19:49:02 31.8 206.8 624.9 lit max
2011/05/01 19:51:42 9.9 140.9 1309.4 lit set
EOD
@pass = ();
$offset = 54;
if ( eval {
@pass = $tle->pass(
$sta,
timegm( $offset, 0, 10, 25, 3, 111 ),
timegm( $offset, 0, 10, 2, 4, 111 ),
[ $moon ],
);
1;
} ) {
ok @pass == 10,
"Found 10 passes over Twisst at $offset sec after minute"
or diag "Found @{[ scalar @pass ]} passes over Twisst";
} else {
fail "Error in pass() method: $@";
}
is format_pass( $pass[0] ), <<'EOD', 'Pass 1';
2011/04/25 20:29:44 10.1 274.3 1311.4 lit rise
2011/04/25 20:32:40 85.5 178.7 352.9 lit max
2011/04/25 20:34:18 23.2 98.6 792.2 shdw shdw
2011/04/25 20:35:36 9.9 97.9 1317.9 shdw set
EOD
is format_pass( $pass[1] ), <<'EOD', 'Pass 2';
2011/04/25 22:05:01 10.1 273.1 1309.8 lit rise
2011/04/25 22:05:46 15.7 265.9 1030.7 shdw shdw
2011/04/25 22:07:43 34.5 205.5 589.1 shdw max
2011/04/25 22:10:26 9.9 137.5 1314.0 shdw set
EOD
is format_pass( $pass[2] ), <<'EOD', 'Pass 3';
2011/04/26 20:54:23 10.0 277.1 1313.9 lit rise
2011/04/26 20:57:17 60.9 195.5 398.9 lit max
2011/04/26 20:57:52 46.5 142.8 472.9 shdw shdw
2011/04/26 21:00:10 10.0 115.1 1310.1 shdw set
EOD
is format_pass( $pass[3] ), <<'EOD', 'Pass 4';
2011/04/27 19:43:46 10.0 274.6 1312.4 lit rise
2011/04/27 19:46:42 84.8 182.0 353.1 lit max
2011/04/27 19:49:38 9.9 98.5 1317.0 lit set
EOD
is format_pass( $pass[4] ), <<'EOD', 'Pass 5';
2011/04/27 21:19:03 10.1 272.7 1310.4 lit rise
2011/04/27 21:21:22 32.0 223.9 623.4 shdw shdw
2011/04/27 21:21:44 33.5 206.0 602.1 shdw max
2011/04/27 21:24:26 9.9 138.7 1312.5 shdw set
EOD
is format_pass( $pass[5] ), <<'EOD', 'Pass 6';
2011/04/28 20:08:18 10.1 277.0 1311.1 lit rise
2011/04/28 20:11:11 59.6 196.7 403.6 lit max
2011/04/28 20:13:20 16.1 118.9 1012.8 shdw shdw
2011/04/28 20:14:05 9.9 116.0 1316.0 shdw set
EOD
is format_pass( $pass[6] ), <<'EOD', 'Pass 7';
2011/04/28 21:43:59 10.0 258.6 1309.6 lit rise
2011/04/28 21:44:48 13.9 244.5 1106.9 shdw shdw
2011/04/28 21:45:59 16.9 215.3 978.9 shdw max
2011/04/28 21:48:00 9.9 171.4 1309.0 shdw set
EOD
is format_pass( $pass[7] ), <<'EOD', 'Pass 8';
2011/04/29 20:32:50 10.0 272.4 1312.6 lit rise
2011/04/29 20:35:31 32.6 205.9 614.1 lit max
2011/04/29 20:36:43 22.6 160.3 805.6 shdw shdw
2011/04/29 20:38:11 10.0 139.9 1308.8 shdw set
EOD
is format_pass( $pass[8] ), <<'EOD', 'Pass 9';
2011/04/30 20:57:40 10.0 257.8 1310.6 lit rise
2011/04/30 20:59:38 16.5 215.4 995.9 lit max
2011/04/30 21:00:03 16.0 204.4 1012.0 shdw shdw
2011/04/30 21:01:35 10.0 173.2 1305.2 shdw set
EOD
is format_pass( $pass[9] ), <<'EOD', 'Pass 10';
2011/05/01 19:46:23 10.1 272.1 1309.5 lit rise
2011/05/01 19:49:02 31.8 206.8 624.9 lit max
2011/05/01 19:51:42 9.9 140.9 1309.4 lit set
EOD
# Purpose of test: Confirm that extremely short passes are reported
# reliably, and have their maximum elevations correctly calculated.
$sta = Astro::Coord::ECI->new(
name => 'Bogota',
)->geodetic(
deg2rad( 4.656370 ),
deg2rad( -74.117790 ),
46 / 1000,
);
$tle->set( horizon => deg2rad( 11 ), twilight => deg2rad( -3 ) );
@pass = ();
$offset = 34;
if ( eval {
@pass = $tle->pass(
$sta,
timegm( $offset, 0, 17, 13, 4, 111 ),
timegm( $offset, 0, 17, 20, 4, 111 ),
[ $moon ],
);
1;
} ) {
ok @pass == 7,
"Found 7 passes over Bogota at $offset sec after minute"
or diag "Found @{[ scalar @pass ]} passes over Bogota";
} else {
fail "Error in pass() method: $@";
}
is format_pass( $pass[0] ), <<'EOD', 'Pass 1';
2011/05/14 00:32:45 11.0 244.1 1237.5 lit rise
2011/05/14 00:33:11 11.3 234.9 1223.3 lit max
2011/05/14 00:33:39 11.0 225.1 1239.4 lit set
EOD
is format_pass( $pass[1] ), <<'EOD', 'Pass 2';
2011/05/14 23:19:14 11.1 319.6 1232.4 lit rise
2011/05/14 23:21:58 73.2 232.8 359.7 lit max
2011/05/14 23:24:43 10.9 149.4 1245.3 lit set
EOD
is format_pass( $pass[2] ), <<'EOD', 'Pass 3';
2011/05/15 23:45:28 11.0 237.6 1238.1 lit rise
2011/05/15 23:45:36 11.0 234.8 1236.9 lit max
2011/05/15 23:45:44 11.0 232.0 1238.3 lit set
EOD
is format_pass( $pass[3] ), <<'EOD', 'Pass 4';
2011/05/17 09:59:17 11.0 154.7 1236.0 lit rise
2011/05/17 10:00:38 13.9 125.1 1091.2 lit max
2011/05/17 10:01:59 11.0 95.5 1236.0 lit set
EOD
is format_pass( $pass[4] ), <<'EOD', 'Pass 5';
2011/05/18 10:21:25 11.1 217.9 1230.4 lit rise
2011/05/18 10:24:09 81.8 307.8 347.4 lit max
2011/05/18 10:26:53 11.0 33.4 1233.7 lit set
EOD
is format_pass( $pass[5] ), <<'EOD', 'Pass 6';
2011/05/19 09:11:21 11.0 155.1 1233.2 shdw rise
2011/05/19 09:12:10 13.4 138.2 1109.8 lit lit
2011/05/19 09:12:43 14.0 125.1 1084.3 lit max
2011/05/19 09:14:06 10.9 94.7 1237.1 lit set
EOD
is format_pass( $pass[6] ), <<'EOD', 'Pass 7';
2011/05/20 09:33:24 11.1 218.1 1230.7 shdw rise
2011/05/20 09:35:30 50.2 226.7 439.8 shdw apls
50.3 226.0 0.5 Moon
2011/05/20 09:35:31 50.6 226.9 437.4 lit lit
2011/05/20 09:36:08 81.0 307.4 347.6 lit max
2011/05/20 09:38:52 11.0 33.1 1233.7 lit set
EOD
# Purpose of test: Confirm that extremely short passes are reported
# reliably, and have their maximum elevations correctly calculated.
@pass = ();
$offset = 44;
if ( eval {
@pass = $tle->pass(
$sta,
timegm( $offset, 0, 17, 13, 4, 111 ),
timegm( $offset, 0, 17, 20, 4, 111 ),
[ $moon ],
);
1;
} ) {
ok @pass == 7,
"Found 7 passes over Bogota at $offset sec after minute"
or diag "Found @{[ scalar @pass ]} passes over Bogota";
} else {
fail "Error in pass() method: $@";
}
is format_pass( $pass[0] ), <<'EOD', 'Pass 1';
2011/05/14 00:32:45 11.0 244.1 1237.5 lit rise
2011/05/14 00:33:11 11.3 234.9 1223.3 lit max
2011/05/14 00:33:39 11.0 225.1 1239.4 lit set
EOD
is format_pass( $pass[1] ), <<'EOD', 'Pass 2';
2011/05/14 23:19:14 11.1 319.6 1232.4 lit rise
2011/05/14 23:21:58 73.2 232.8 359.7 lit max
2011/05/14 23:24:43 10.9 149.4 1245.3 lit set
EOD
is format_pass( $pass[2] ), <<'EOD', 'Pass 3';
2011/05/15 23:45:28 11.0 237.6 1238.1 lit rise
2011/05/15 23:45:36 11.0 234.8 1236.9 lit max
2011/05/15 23:45:44 11.0 232.0 1238.3 lit set
EOD
is format_pass( $pass[3] ), <<'EOD', 'Pass 4';
2011/05/17 09:59:17 11.0 154.7 1236.0 lit rise
2011/05/17 10:00:38 13.9 125.1 1091.2 lit max
2011/05/17 10:01:59 11.0 95.5 1236.0 lit set
EOD
is format_pass( $pass[4] ), <<'EOD', 'Pass 5';
2011/05/18 10:21:25 11.1 217.9 1230.4 lit rise
2011/05/18 10:24:09 81.8 307.8 347.4 lit max
2011/05/18 10:26:53 11.0 33.4 1233.7 lit set
EOD
is format_pass( $pass[5] ), <<'EOD', 'Pass 6';
2011/05/19 09:11:21 11.0 155.1 1233.2 shdw rise
2011/05/19 09:12:10 13.4 138.2 1109.8 lit lit
2011/05/19 09:12:43 14.0 125.1 1084.3 lit max
2011/05/19 09:14:06 10.9 94.7 1237.1 lit set
EOD
# Purpose of test: Confirm that appulses are correctly reported.
is format_pass( $pass[6] ), <<'EOD', 'Pass 7';
2011/05/20 09:33:24 11.1 218.1 1230.7 shdw rise
2011/05/20 09:35:30 50.2 226.7 439.8 shdw apls
50.3 226.0 0.5 Moon
2011/05/20 09:35:31 50.6 226.9 437.4 lit lit
2011/05/20 09:36:08 81.0 307.4 347.6 lit max
2011/05/20 09:38:52 11.0 33.1 1233.7 lit set
EOD
# Purpose of test: confirm that passes in progress at the beginning of
# the prediciton interval are correctly reported.
$sta = Astro::Coord::ECI->new(
name => 'Sao Paulo',
)->geodetic(
deg2rad( -23.55 ),
deg2rad( -46.6333333333333 ),
0,
);
( $tle ) = get_oid( '03597', @all_tle );
$tle->set( visible => 0 );
@pass = ();
$offset = 0;
if ( eval {
@pass = $tle->pass(
$sta,
timegm( $offset, 0, 12, 27, 4, 111 ),
timegm( $offset, 0, 13, 27, 4, 111 ),
[ $moon ],
);
1;
} ) {
ok @pass == 1,
"Found 1 pass of OAO 2 over Sao Paulo at $offset sec after minute"
or diag "Found @{[ scalar @pass ]} passes over Sao Paulo";
} else {
fail "Error in pass() method: $@";
}
is format_pass( $pass[0] ), <<'EOD', 'Pass 1 of OAO 2 over Sao Paulo';
2011/05/27 11:58:17 20.0 204.7 1678.3 day rise
2011/05/27 11:59:57 23.2 178.2 1545.7 day max
2011/05/27 12:01:38 20.0 151.4 1681.3 day set
EOD
$sta = Astro::Coord::ECI->new(
name => 'Shanghai',
)->geodetic(
deg2rad( 31.2 ),
deg2rad( 121.5 ),
0,
);
# Purpose of test: Confirm that visible passes which begin during the
# day are correctly reported.
$tle->set( visible => 1 );
@pass = ();
$offset = 0;
if ( eval {
@pass = $tle->pass(
$sta,
timegm( $offset, 0, 6, 31, 4, 111 ),
timegm( $offset, 0, 18, 31, 4, 111 ),
[ $moon ],
);
1;
} ) {
ok @pass == 2,
"Found 2 passes of OAO 2 over Shanghai at $offset sec after minute"
or diag "Found @{[ scalar @pass ]} passes over Shanghai";
} else {
fail "Error in pass() method: $@";
}
is format_pass( $pass[0] ), <<'EOD', 'Pass 1 of OAO 2 over Shanghai';
2011/05/31 11:18:59 20.0 290.7 1670.5 day rise
2011/05/31 11:19:47 26.8 295.3 1407.6 lit lit
2011/05/31 11:22:34 58.1 4.3 861.2 lit max
2011/05/31 11:26:10 20.0 78.8 1671.0 lit set
EOD
is format_pass( $pass[1] ), <<'EOD', 'Pass 2 of OAO 2 over Shanghai';
2011/05/31 13:04:35 20.1 285.0 1664.5 lit rise
2011/05/31 13:08:17 79.9 200.9 753.7 lit max
2011/05/31 13:08:59 66.3 134.4 803.5 shdw shdw
2011/05/31 13:12:00 19.9 115.4 1666.5 shdw set
EOD
# Purpose of test: Confirm that passes which occur extremely close to
# the end of the prediction interval are reported.
( $tle ) = get_oid( '21938', @all_tle );
@pass = ();
$offset = 0;
if ( eval {
@pass = $tle->pass(
$sta,
timegm( $offset, 0, 6, 3, 5, 111 ),
timegm( $offset, 0, 12, 3, 5, 111 ),
[ $moon ],
);
1;
} ) {
ok @pass == 1,
"Found 1 pass of OID 21938 over Shanghai at $offset sec after minute"
or diag "Found @{[ scalar @pass ]} passes over Shanghai";
} else {
fail "Error in pass() method: $@";
}
is format_pass( $pass[0] ), <<'EOD', 'Pass 1 of OID 21938 over Shanghai';
2011/06/03 11:51:51 20.0 146.8 2124.6 lit rise
2011/06/03 11:55:44 40.1 89.3 1432.8 lit max
2011/06/03 11:59:38 20.0 32.1 2138.7 lit set
EOD
# Purpose of test: Confirm that the interval attribute correctly infers
# the illumination.
( $tle ) = get_oid( '00733', @all_tle );
@pass = ();
$offset = 0;
if ( eval {
$tle->set( interval => 1 );
@pass = $tle->pass(
$sta,
timegm( $offset, 0, 14, 30, 4, 111 ),
timegm( $offset, 0, 16, 30, 4, 111 ),
[ $moon ],
);
1;
} ) {
ok @pass == 1,
"Found 1 pass of OID 00733 over Shanghai at $offset sec after minute"
or diag "Found @{[ scalar @pass ]} passes over Shanghai";
} else {
fail "Error in pass() method: $@";
}
is format_pass( $pass[0] ), <<'EOD', 'Pass 1 of OID 00733 over Shanghai';
2011/05/30 14:12:20 20.0 234.7 1759.9 shdw rise
2011/05/30 14:12:21 20.1 234.9 1757.1 shdw
2011/05/30 14:12:22 20.2 235.2 1754.2 shdw
2011/05/30 14:12:23 20.2 235.4 1751.3 shdw
2011/05/30 14:12:24 20.3 235.6 1748.5 shdw
2011/05/30 14:12:25 20.3 235.9 1745.7 shdw
2011/05/30 14:12:26 20.4 236.1 1743.0 shdw
2011/05/30 14:12:27 20.5 236.3 1740.2 shdw
2011/05/30 14:12:28 20.5 236.6 1737.5 shdw
2011/05/30 14:12:29 20.6 236.8 1734.8 shdw
2011/05/30 14:12:30 20.6 237.1 1732.1 shdw
2011/05/30 14:12:31 20.7 237.3 1729.4 shdw
2011/05/30 14:12:32 20.7 237.6 1726.8 shdw
2011/05/30 14:12:33 20.8 237.8 1724.2 shdw
2011/05/30 14:12:34 20.9 238.0 1721.6 shdw
2011/05/30 14:12:35 20.9 238.3 1719.1 shdw
2011/05/30 14:12:36 21.0 238.5 1716.5 shdw
2011/05/30 14:12:37 21.0 238.8 1714.0 shdw
2011/05/30 14:12:38 21.1 239.0 1711.5 shdw
2011/05/30 14:12:39 21.1 239.3 1709.1 shdw
2011/05/30 14:12:40 21.2 239.5 1706.7 shdw
2011/05/30 14:12:41 21.2 239.8 1704.2 shdw
2011/05/30 14:12:42 21.3 240.0 1701.9 shdw
2011/05/30 14:12:43 21.3 240.3 1699.5 shdw
2011/05/30 14:12:44 21.4 240.5 1697.2 shdw
2011/05/30 14:12:45 21.5 240.8 1694.9 shdw
2011/05/30 14:12:46 21.5 241.1 1692.6 shdw
2011/05/30 14:12:47 21.6 241.3 1690.3 shdw
2011/05/30 14:12:48 21.6 241.6 1688.1 shdw
2011/05/30 14:12:49 21.7 241.8 1685.9 shdw
2011/05/30 14:12:50 21.7 242.1 1683.7 shdw
2011/05/30 14:12:51 21.8 242.3 1681.6 shdw
2011/05/30 14:12:52 21.8 242.6 1679.5 shdw
2011/05/30 14:12:53 21.9 242.9 1677.4 shdw
2011/05/30 14:12:54 21.9 243.1 1675.3 shdw
2011/05/30 14:12:55 21.9 243.4 1673.2 shdw
2011/05/30 14:12:56 22.0 243.7 1671.2 shdw
2011/05/30 14:12:57 22.0 243.9 1669.2 shdw
2011/05/30 14:12:58 22.1 244.2 1667.3 shdw
2011/05/30 14:12:59 22.1 244.5 1665.3 shdw
2011/05/30 14:13:00 22.2 244.7 1663.4 shdw
2011/05/30 14:13:01 22.2 245.0 1661.6 shdw
2011/05/30 14:13:02 22.3 245.3 1659.7 shdw
2011/05/30 14:13:03 22.3 245.5 1657.9 shdw
2011/05/30 14:13:04 22.3 245.8 1656.1 shdw
2011/05/30 14:13:05 22.4 246.1 1654.3 shdw
2011/05/30 14:13:06 22.4 246.3 1652.6 shdw
2011/05/30 14:13:07 22.5 246.6 1650.8 shdw
2011/05/30 14:13:08 22.5 246.9 1649.2 shdw
2011/05/30 14:13:09 22.5 247.2 1647.5 shdw
2011/05/30 14:13:10 22.6 247.4 1645.9 shdw
2011/05/30 14:13:11 22.6 247.7 1644.3 shdw
2011/05/30 14:13:12 22.7 248.0 1642.7 shdw
2011/05/30 14:13:13 22.7 248.3 1641.1 shdw
2011/05/30 14:13:14 22.7 248.5 1639.6 shdw
2011/05/30 14:13:15 22.8 248.8 1638.1 shdw
2011/05/30 14:13:16 22.8 249.1 1636.7 shdw
2011/05/30 14:13:17 22.8 249.4 1635.2 shdw
2011/05/30 14:13:18 22.9 249.7 1633.8 shdw
2011/05/30 14:13:19 22.9 249.9 1632.5 shdw
2011/05/30 14:13:20 22.9 250.2 1631.1 shdw
2011/05/30 14:13:21 23.0 250.5 1629.8 shdw
2011/05/30 14:13:22 23.0 250.8 1628.5 shdw
2011/05/30 14:13:23 23.0 251.1 1627.2 shdw
2011/05/30 14:13:24 23.1 251.3 1626.0 shdw
2011/05/30 14:13:25 23.1 251.6 1624.8 shdw
2011/05/30 14:13:26 23.1 251.9 1623.6 shdw
2011/05/30 14:13:27 23.1 252.2 1622.5 shdw
2011/05/30 14:13:28 23.2 252.5 1621.4 shdw
2011/05/30 14:13:29 23.2 252.8 1620.3 shdw
2011/05/30 14:13:30 23.2 253.1 1619.2 shdw
2011/05/30 14:13:31 23.3 253.3 1618.2 shdw
2011/05/30 14:13:32 23.3 253.6 1617.2 shdw
2011/05/30 14:13:33 23.3 253.9 1616.3 shdw
2011/05/30 14:13:34 23.3 254.2 1615.3 shdw
2011/05/30 14:13:35 23.3 254.5 1614.4 shdw
2011/05/30 14:13:36 23.4 254.8 1613.5 shdw
2011/05/30 14:13:37 23.4 255.1 1612.7 shdw
2011/05/30 14:13:38 23.4 255.4 1611.9 shdw
2011/05/30 14:13:39 23.4 255.7 1611.1 shdw
2011/05/30 14:13:40 23.4 255.9 1610.3 shdw
2011/05/30 14:13:41 23.5 256.2 1609.6 shdw
2011/05/30 14:13:42 23.5 256.5 1608.9 shdw
2011/05/30 14:13:43 23.5 256.8 1608.2 shdw
2011/05/30 14:13:44 23.5 257.1 1607.6 shdw
2011/05/30 14:13:45 23.5 257.4 1607.0 shdw
2011/05/30 14:13:46 23.5 257.7 1606.4 shdw
2011/05/30 14:13:47 23.6 258.0 1605.9 shdw
2011/05/30 14:13:48 23.6 258.3 1605.4 shdw
2011/05/30 14:13:49 23.6 258.6 1604.9 shdw
2011/05/30 14:13:50 23.6 258.9 1604.4 shdw
2011/05/30 14:13:51 23.6 259.2 1604.0 shdw
2011/05/30 14:13:52 23.6 259.5 1603.6 shdw
2011/05/30 14:13:53 23.6 259.8 1603.2 shdw
2011/05/30 14:13:54 23.6 260.0 1602.9 shdw
2011/05/30 14:13:55 23.6 260.3 1602.6 shdw
2011/05/30 14:13:56 23.6 260.6 1602.3 shdw
2011/05/30 14:13:57 23.6 260.9 1602.1 shdw
2011/05/30 14:13:58 23.6 261.2 1601.9 shdw
2011/05/30 14:13:59 23.6 261.5 1601.7 shdw
2011/05/30 14:14:00 23.7 261.8 1601.6 shdw
2011/05/30 14:14:01 23.7 262.1 1601.4 shdw
2011/05/30 14:14:02 23.7 262.4 1601.4 shdw
2011/05/30 14:14:03 23.7 262.7 1601.3 shdw
2011/05/30 14:14:04 23.7 263.0 1601.3 shdw max
2011/05/30 14:14:05 23.7 263.3 1601.3 lit lit
2011/05/30 14:14:06 23.7 263.6 1601.3 lit
2011/05/30 14:14:07 23.7 263.9 1601.4 lit
2011/05/30 14:14:08 23.6 264.2 1601.5 lit
2011/05/30 14:14:09 23.6 264.5 1601.6 lit
2011/05/30 14:14:10 23.6 264.8 1601.8 lit
2011/05/30 14:14:11 23.6 265.1 1601.9 lit
2011/05/30 14:14:12 23.6 265.4 1602.2 lit
2011/05/30 14:14:13 23.6 265.6 1602.4 lit
2011/05/30 14:14:14 23.6 265.9 1602.7 lit
2011/05/30 14:14:15 23.6 266.2 1603.0 lit
2011/05/30 14:14:16 23.6 266.5 1603.3 lit
2011/05/30 14:14:17 23.6 266.8 1603.7 lit
2011/05/30 14:14:18 23.6 267.1 1604.1 lit
2011/05/30 14:14:19 23.6 267.4 1604.5 lit
2011/05/30 14:14:20 23.6 267.7 1605.0 lit
2011/05/30 14:14:21 23.5 268.0 1605.5 lit
2011/05/30 14:14:22 23.5 268.3 1606.0 lit
2011/05/30 14:14:23 23.5 268.6 1606.6 lit
2011/05/30 14:14:24 23.5 268.9 1607.1 lit
2011/05/30 14:14:25 23.5 269.2 1607.8 lit
2011/05/30 14:14:26 23.5 269.5 1608.4 lit
2011/05/30 14:14:27 23.4 269.7 1609.1 lit
2011/05/30 14:14:28 23.4 270.0 1609.8 lit
2011/05/30 14:14:29 23.4 270.3 1610.5 lit
2011/05/30 14:14:30 23.4 270.6 1611.3 lit
2011/05/30 14:14:31 23.4 270.9 1612.1 lit
2011/05/30 14:14:32 23.3 271.2 1612.9 lit
2011/05/30 14:14:33 23.3 271.5 1613.7 lit
2011/05/30 14:14:34 23.3 271.8 1614.6 lit
2011/05/30 14:14:35 23.3 272.1 1615.5 lit
2011/05/30 14:14:36 23.3 272.4 1616.5 lit
2011/05/30 14:14:37 23.2 272.6 1617.5 lit
2011/05/30 14:14:38 23.2 272.9 1618.5 lit
2011/05/30 14:14:39 23.2 273.2 1619.5 lit
2011/05/30 14:14:40 23.1 273.5 1620.6 lit
2011/05/30 14:14:41 23.1 273.8 1621.6 lit
2011/05/30 14:14:42 23.1 274.1 1622.8 lit
2011/05/30 14:14:43 23.1 274.4 1623.9 lit
2011/05/30 14:14:44 23.0 274.6 1625.1 lit
2011/05/30 14:14:45 23.0 274.9 1626.3 lit
2011/05/30 14:14:46 23.0 275.2 1627.5 lit
2011/05/30 14:14:47 22.9 275.5 1628.8 lit
2011/05/30 14:14:48 22.9 275.8 1630.1 lit
2011/05/30 14:14:49 22.9 276.1 1631.4 lit
2011/05/30 14:14:50 22.8 276.3 1632.8 lit
2011/05/30 14:14:51 22.8 276.6 1634.2 lit
2011/05/30 14:14:52 22.8 276.9 1635.6 lit
2011/05/30 14:14:53 22.7 277.2 1637.0 lit
2011/05/30 14:14:54 22.7 277.5 1638.5 lit
2011/05/30 14:14:55 22.7 277.7 1640.0 lit
2011/05/30 14:14:56 22.6 278.0 1641.5 lit
2011/05/30 14:14:57 22.6 278.3 1643.0 lit
2011/05/30 14:14:58 22.5 278.6 1644.6 lit
2011/05/30 14:14:59 22.5 278.8 1646.2 lit
2011/05/30 14:15:00 22.5 279.1 1647.9 lit
2011/05/30 14:15:01 22.4 279.4 1649.5 lit
2011/05/30 14:15:02 22.4 279.7 1651.2 lit
2011/05/30 14:15:03 22.3 279.9 1653.0 lit
2011/05/30 14:15:04 22.3 280.2 1654.7 lit
2011/05/30 14:15:05 22.3 280.5 1656.5 lit
2011/05/30 14:15:06 22.2 280.7 1658.3 lit
2011/05/30 14:15:07 22.2 281.0 1660.1 lit
2011/05/30 14:15:08 22.1 281.3 1662.0 lit
2011/05/30 14:15:09 22.1 281.5 1663.9 lit
2011/05/30 14:15:10 22.0 281.8 1665.8 lit
2011/05/30 14:15:11 22.0 282.1 1667.7 lit
2011/05/30 14:15:12 21.9 282.3 1669.7 lit
2011/05/30 14:15:13 21.9 282.6 1671.7 lit
2011/05/30 14:15:14 21.8 282.9 1673.7 lit
2011/05/30 14:15:15 21.8 283.1 1675.7 lit
2011/05/30 14:15:16 21.8 283.4 1677.8 lit
2011/05/30 14:15:17 21.7 283.7 1679.9 lit
2011/05/30 14:15:18 21.7 283.9 1682.0 lit
2011/05/30 14:15:19 21.6 284.2 1684.2 lit
2011/05/30 14:15:20 21.5 284.4 1686.4 lit
2011/05/30 14:15:21 21.5 284.7 1688.6 lit
2011/05/30 14:15:22 21.4 284.9 1690.8 lit
2011/05/30 14:15:23 21.4 285.2 1693.1 lit
2011/05/30 14:15:24 21.3 285.5 1695.3 lit
2011/05/30 14:15:25 21.3 285.7 1697.7 lit
2011/05/30 14:15:26 21.2 286.0 1700.0 lit
2011/05/30 14:15:27 21.2 286.2 1702.3 lit
2011/05/30 14:15:28 21.1 286.5 1704.7 lit
2011/05/30 14:15:29 21.1 286.7 1707.1 lit
2011/05/30 14:15:30 21.0 287.0 1709.6 lit
2011/05/30 14:15:31 21.0 287.2 1712.0 lit
2011/05/30 14:15:32 20.9 287.5 1714.5 lit
2011/05/30 14:15:33 20.8 287.7 1717.0 lit
2011/05/30 14:15:34 20.8 288.0 1719.6 lit
2011/05/30 14:15:35 20.7 288.2 1722.1 lit
2011/05/30 14:15:36 20.7 288.5 1724.7 lit
2011/05/30 14:15:37 20.6 288.7 1727.3 lit
2011/05/30 14:15:38 20.6 288.9 1729.9 lit
2011/05/30 14:15:39 20.5 289.2 1732.6 lit
2011/05/30 14:15:40 20.4 289.4 1735.3 lit
2011/05/30 14:15:41 20.4 289.7 1738.0 lit
2011/05/30 14:15:42 20.3 289.9 1740.7 lit
2011/05/30 14:15:43 20.3 290.1 1743.5 lit
2011/05/30 14:15:44 20.2 290.4 1746.2 lit
2011/05/30 14:15:45 20.1 290.6 1749.0 lit
2011/05/30 14:15:46 20.1 290.8 1751.9 lit
2011/05/30 14:15:47 20.0 291.1 1754.7 lit
2011/05/30 14:15:48 20.0 291.3 1757.6 lit set
EOD
########################################################################
sub get_oid {
my ( $oid, @all_tle ) = @_;
return Astro::Coord::ECI::TLE::Set->aggregate(
grep { $_->get( 'id' ) == $oid } @all_tle );
}
1;
# ex: set textwidth=72 :