NAME
Astro::App::Satpass2::TUTORIAL - Tutorial on the use of Astro::App::Satpass2
INTRODUCTION
This package was created to provide a flexible way to predict satellite positions, passes, and visibility. Unfortunately, with flexibility comes complexity, more often than not. This document's purpose is to get you up and running, and walk you through some of the things the package can do.
The simplest way to access Astro::App::Satpass2
functionality is through the satpass2 script, and that what this tutorial does.
To get any real use out of this package, you need satellite orbital data. The best source is http://www.space-track.org/, but this requires registration, so this tutorial will assume you are not registered and use data from other sources. Most other sources are redistributions of Space Track data, and will not be as up-to-date, but are generally good enough for non-critical computations.
SETUP
The first thing that needs to be done, of course, is to install Astro::App::Satpass2
itself. The recommended way to do this is normally to use one of the CPAN tools. With cpan, the installation would be simply
$ cpan
... front matter ...
cpan> install Astro::App::Satpass2
... cpan downloads, tests, and installs this package
and all dependencies ...
cpan> exit
You could equally well use CPANPLUS (cpanp) or cpanminus (cpanm); the choice is yours. If you are using Active State's ActivePerl, you should use their ppi tool to install distribution Astro-App-Satpass2.
There are several Perl modules that this package considers optional, but which will be used if they are available. Unless stated otherwise, the examples in this tutorial assume that optional module Astro::SpaceTrack is installed, so that you can download satellite orbital data directly into Astro::App::Satpass2
.
The author also recommends optional module Date::Manip, but since the latest version of this module only installs under Perl 5.10 and above, this tutorial will not assume it is installed. When it is not, Astro::App::Satpass2
uses a home-grown ISO-8601-ish date parser. All dates specified in the examples will be compatible with both date parsers.
It does not matter whether you install optional modules before or after installing Astro::App::Satpass2
; it will use them if it finds them.
CONFIGURATION
There are several possibilities for configuring Astro::App::Satpass2
. This tutorial will cover the following:
Configuring from a satpass initialization file
If you already have configured the initialization file for the satpass script packaged in the Astro-satpass
distribution, Astro::App::Satpass2
will read this script, making allowances for at least some of the incompatibilities between the two tools.
Since the intent is to remove the satpass compatibility when satpass is retired, you may at some time wish to convert your satpass initialization file to a Astro::App::Satpass2
initialization file. To do this from inside the satpass2 script, simply issue the command
satpass2> save -changes
The name and location of the saved file depend on your operating system, but will be reported when you issue this command. Once the file is saved, you can display its location using
satpass2> initfile
The configuration file's location is actually determined using File::HomeDir->my_dist_config( 'Astro-App-Satpass2' )
. See the File::HomeDir documentation for details.
Subsequent runs of the satpass2 script will initialize from the new file. This form of the save
command just saves changes from the default configuration. If you wish to save all configuration, omit the -changes
option.
Be aware that save
only saves the configuration of the Astro::App::Satpass2
object and its related helper objects. If your initialization file does other things, like download data and make predictions, these will not be written to the new file, and you must add them back by hand.
Configuring manually
Before you do any predictions, Astro::App::Satpass2
needs to know where you are. The embedded Astro::SpaceTrack object will also need some configuration so it knows how to fetch data from its various sources.
Specifically, you need your latitude, longitude (from Greenwich England), and height above sea level. The height is least critical, and any reasonable guess will probably work.
Latitude and longitude can be specified in either decimal degrees (e.g. 40.5) or degrees, minutes and seconds (e.g. 40d30m0s). South latitude and West longitude are negative.
Height is assumed to be in meters, but you can be specify it in feet by appending 'ft'. For example, '10' specifies 10 meters, as does '10m', but '10ft' specifies 10 feet.
Because it would be painful to specify your position every time you use it, Astro::App::Satpass2
allows a configuration file. The example that follows will end by creating a configuration file and storing the configuration in it.
And here, finally, is the example. We make the egregious assumption that the President of the United States uses this software, so we use the executive mansion as our location.
$ satpass2
... front matter displayed ...
satpass2>
satpass2> # This is a comment, as is any line beginning
satpass2> # with a hash mark ('#'). Comments and blank
satpass2> # lines are ignored.
satpass2>
satpass2> # Enter the name of our location. This is for
satpass2> # information only, and will be displayed by
satpass2> # the location command. Command arguments that
satpass2> # contain spaces need to be quoted.
satpass2> set location '1600 Pennsylvania Ave, Washington DC'
satpass2>
satpass2> # Set our latitude and longitude.
satpass2> set latitude 38d53m55.5s longitude -77d2m15.7s
satpass2>
satpass2> # Set our height above sea level.
satpass2> set height 54.72ft
satpass2>
satpass2> # Some of our data sources will try to fetch
satpass2> # their data from Space Track when we ask for
satpass2> # it. We are assuming no Space Track username,
satpass2> # so we tell them to just give us what they have.
satpass2> spacetrack set direct 1
satpass2>
satpass2> # Some data sources come either with or without the
satpass2> # actual name of the spacecraft. We want the name
satpass2> # if it is available.
satpass2> spacetrack set with_name 1
satpass2>
satpass2> # Save our configuration. All we really need to
satpass2> # save are the changes from the default.
satpass2> save -changes
satpass2>
satpass2> # We can now exit. When we restart, we will get
satpass2> # the configuration we just set up.
satpass2> exit
Geocoding the address
Looking up a latitude and longitude can be a bit of a pain. If you live in the United States, Astro::App::Satpass2
can geocode your address, and then query the U. S. Geological Survey for your height above sea level.
This requires two more optional modules: Geo::Coder::Geocoder::US and Geo::WebService::Elevation::USGS. With these installed, the address entry in the previous example becomes
satpass2> geocode '1600 Pennsylvania Ave, Washington DC'
When you issue this command, the geocoded location is displayed, formatted as set
commands:
set location '1600 Pennsylvania Ave NW, Washington DC 20502'
set latitude 38.898748
set longitude -77.037684
set height 17.38
PREDICTING PASSES
The main use of this package is probably predicting when satellites are going to pass over the observer.
Visible Passes
This is the functionality that tells you when you can go out and see a satellite, assuming clear skies and a satellite large enough to be visible. Visible passes require three things to happen:
* The satellite must be above the horizon (of course!),
* The Sun must be shining on the satellite (they do not have lights), and
* The Sun must not be shining where you are (otherwise the sky is too bright to see the satellite).
The example is for the International Space Station, and we will use NASA's predictions of its orbit over the next week as a starting point.
$ satpass
... front matter ...
satpass2>
satpass2> # Tell the Astro::SpaceTrack object to fetch us
satpass2> # all the predicted orbital elements from NASA's
satpass2> # Human Space Flight web site. We include the
satpass2> # effective date, since the data may include
satpass2> # planned changes in orbit.
satpass2> spacetrack spaceflight -all -effective
satpass2>
satpass2> # Make the default pass prediction, which is for
satpass2> # seven days starting today at noon.
satpass2> pass
You may want to print this information and stick it on your refrigerator. Astro::App::Satpass2
has something a bit like Unix output redirection to get your information into a file:
satpass2> pass >pass.txt
After which you open pass.txt in some simple editor and print it. A word-processing editor will probably not work satisfactorily unless you set the entire document to a mono-space font.
You may want a prediction for some specific date. The following example does a prediction for the night of April 1 2011 (specifically, for one day starting at noon on that day) and saves the output in april_fool.txt.
satpass2> pass '2011/4/1 12:00:00' +1 >april_fool.txt
Note that the date is quoted because of the space between the date and the time. If you had Date::Manip installed, you could specify the date more flexibly, as (say) '1-Apr-2011 noon'
.
Different Viewing Conditions
Astro::App::Satpass2
assumes a few things about viewing conditions where you are. These may or may not be true. If they are not, you can change them.
The settings discussed below are part of your configuration, and can be saved using
satpass2> save -changes
as discussed above. If you have already saved your configuration you will be asked whether you want to overwrite the old configuration. Any answer beginning with 'y' (case-insensitive) will be considered true. Any other answer will be considered false.
The horizon
Astro::App::Satpass2
assumes that you do not have a very good horizon, and that you can not see a satellite until it is at least 20 degrees above the horizon, and therefore does not report passes that do not get at least 20 degrees above the horizon. If you are at the beach you may be able to see to within 5 degrees of the horizon. You can configure Astro::App::Satpass2
to report passes more than 5 degrees above the horizon by
satpass2> set horizon 5
If you are on the top of a mountain, you may even be able to see a bit over the normal horizon. If you can see 2 degrees over the horizon,
satpass2> set horizon -2
Twilight
Astro::App::Satpass2
does not predict visible passes that occur during the day, and it defines day as any time after the start of morning twilight and before the end of evening twilight. These in turn are defined as the point when the upper limb of the Sun passes above or below a given distance below the horizon.
By default, Astro::App::Satpass2
uses civil twilight to decide whether it is day or night. This is defined as the point at which the upper limb of the Sun is 6 degrees below the horizon. For a dimmer satellite, you may want to use nautical twilight (9 degrees below the horizon) or astronomical twilight (12 degrees below the horizon). You can change to nautical twilight using
satpass2> set twilight nautical
and similarly for astronomical. Or, you can define your own twilight by entering it in degrees, remembering that degrees below the horizon are negative. If you are looking for the International Space Station, you may be able to spot it with the Sun only 3 degrees below the horizon:
satpass2> set twilight -3
All Passes
If you are interested in communicating with the satellite rather than looking at it, all you care about is whether the satellite is above the horizon, not whether it is day or night or whether the satellite is illuminated by the Sun. In this case you want to
satpass2> set visible 0
which turns off the latter two checks and reports any pass of the satellite over your location, visible or not. To go back to predicting just visible passes,
satpass2> set visible 1
IRIDIUM FLARES
I know of no scientific value to these, but they are fun to watch. The Iridium constellation is 66 satellites (plus spares) used for satellite telephone service. The original-design Iridium satellites are triangular prisms, with one main mission antenna leaning out from each face of the prism. The main mission antennae are about the size of a door, flat, and shiny, and because the satellites are maintained in a precise orientation in orbit, it can be predicted when one of these antennae will reflect the Sun to a given position. A bright flare can be brighter than Venus at its brightest, and under good conditions is visible during the day.
Predicting Flares
Predicting flares is a bit like predicting satellite passes - you download the orbital data and predict the flare from the data.
$ satpass2
... front matter ...
satpass2>
satpass2> # Download the data on Iridium satellites.
satpass2> spacetrack celestrak iridium
satpass2>
satpass2> # Predict flares for the next seven days,
satpass2> # starting today at noon.
satpass2> flare
This will take a while, because it has to cover all 66 in-service Iridium satellites, 24 hours per day. And this does not include spares, which are usually kept under control, just to prove that they work. If you want them as well,
satpass2> flare -spare
If you want a copy of all this to stick on your refrigerator door, capture it to a file in the same way you captured the pass data:
satpass2> flare >flare.txt
If you want to append it to the pass.txt file created for satellite passes,
satpass2> flare >>pass.txt
just as you would under Unix.
But maybe you are not interested in daylight flares. If not,
satpass2> flare -noday
If you are also not interested in flares at 4:00 AM,
satpass2> flare -noam -noday
or equivalently,
satpass2> flare -pm
The -am
, -day
, and -pm
options select which flares are reported, by time. The -am
option selects flares from midnight until the start of morning twilight; -day
selects flares from the start of morning twilight to the end of evening twilight, and -pm
selects flares from the end of evening twilight until midnight.
The options can be negated by prefixing no
to the option name (e.g. -noday
). If you specify no options, they are all considered to be asserted. If you specify no asserted options, all unspecified options are considered to be asserted. Otherwise, only explicitly-asserted options are considered to be asserted.
If you do not want flares for a particular part of the day, calculations for that part of the day are not done. This can speed the prediction process.
Different Flare Visibility
Flare brightness is measured in magnitude, a system used by astronomers to measure the brightness of stars. This system goes back a couple thousand years, and originally classified the brightest stars as first magnitude, the less-bright stars as second magnitude, and so on. The system has been formalized to a logarithmic scale in which a brightness difference of five magnitudes represents a light intensity difference of a factor of 100. Brighter stars may have negative magnitudes (Sirius is about -1.4).
Obviously a flare that would be fairly bright at night might be completely invisible during the day, so day and night have separate settings to control the minimum reportable brightness. Astro::App::Satpass2
uses the flare_mag_day
setting to determine the dimmest reportable flare during the day; this defaults to -6
. The dimmest reportable flare at night is determined by the flare_mag_night
setting, which defaults to 0
.
In order to duplicate (fairly closely) the Iridium flares reported by http://www.heavens-above.com/, you will want to tweak Astro::App::Satpass2
's settings a bit:
satpass2> set twilight -1.8 flare_mag_night -1
seems to come fairly close.
OTHER CUSTOMIZATIONS
There are other customizations of the output that you may want.
Location
If you want to display your location, just issue the
satpass2> location
command. The output of this can be directed to a file, just as the output of any other command. For a nice list of passes and flares for your refrigerator door, you can do something like this:
satpass2> location >this_week.txt
satpass2> spacetrack spaceflight -all -effective
satpass2> pass >>this_week.txt
satpass2> spacetrack celestrak iridium
satpass2> flare -pm >>this_week.txt
satpass2> exit
Date and Time Format
By default, date and time are displayed in an ISO-8601-ish format. If you want something friendlier, you can specify a strftime (3)
format independently for the date and the time. These settings can be saved to your initialization file just like any other setting.
The date and time format settings belong to the formatter object, which is a separate subsystem all to itself. So:
satpass2>
satpass2> # Display the date as weekday day-month-year
satpass2> formatter date_format '%a %d-%b-%Y'
satpass2>
satpass2> # Display the time as 1-12 AM or PM
satpass2> formatter time_format '%I:%M:%S %p'
satpass2>
satpass2> # Save the configuration, overwriting any previous one
satpass2> save -changes -confirm
INTERMEDIATE TOPICS
This section covers things that are beyond just getting the application up and running.
Time Zones
By default, times are reported in your local zone. Summer time/daylight saving time is accounted for (unless the underlying Perl is broken), even when predictions cross the boundary between standard and summer time. But you may want some other zone. There are two cases here, depending on what optional modules you have installed.
Without any optional modules, the only supported zone other than your default local zone is GMT. You can get GMT output by
satpass2> formatter gmt 1
The default ISO-8601-ish time parser does not have a corresponding setting, but does allow you to append a 'Z'
to the time to specify GMT.
The default formatter object also has a tz
setting, but this is unsupported because it relies on the TZ
environment variable, and the author has no control over whether your OS' POSIX code supports this. You can try it with something like
satpass2> formatter tz MST7MDT
(for Mountain time). If it works, fine. If not, you can make it work by installing DateTime and DateTime::TimeZone. Doing this also gives you the Olson database zone names (e.g. America/New_York
) if you prefer these.
Similarly, if you install the optional Date::Manip module, you can set a default input zone other than your own by something like
satpass2> time_parser tz MST7MDT
The time_parser
and formatter
time zones are set separately not only so that you can make them different, but because the author can not guarantee that the underlying modules will accept the same settings.
Multiple Locations
What this topic actually describes is a way to have multiple locations on tap, so that if you are going to be at point 'A' from Monday through Wednesday, and point 'B' Thursday and Friday you can easily switch between them.
This section relies on the fact that Astro::App::Satpass2
can define a thing called a macro
, which is a named set of commands, somewhat like a bash
shell function. The macro is executed by giving its name, so in essence macros are a way to create new commands. You can pass arguments to macros, but that is a more advanced topic. Here, we are just going to set up macros representing a number of locations.
The definition of a macro is simply the list of commands it issues. Each command is a single argument, and therefore probably needs to be quoted. When the command to be issued itself contains quotes, you either use a different style (single versus double quotes) or you escape the quote mark with a back slash ('\'
).
The first thing our hypothetical user needs is a macro to set the location to his or her home location. The definition comes from our first example:
satpass2> macro define home \
> "set location '1600 Pennsylvania Ave, Washington DC'" \
> "set latitude 38d53m55.5s longitude -77d2m15.7s" \
> "set height 54.72ft"
satpass2>
Normally, this would all have to go on the same line, but Astro::App::Satpass2
recognizes an end-of-line back slash as a continuation mark, so all four lines above are parsed as though they are the same line. Astro::App::Satpass2
changes the prompt for a continuation line, just to keep you on your toes.
Now we need another place to visit -- say, the residence of the Prime Minister of Canada:
satpass2> macro define sussex_drive \
> "set location '24 Sussex Drive, Ottawa, ON'" \
> "set latitude 45.444348 longitude -75.693934" \
> "set height 50m"
satpass2>
Now, to switch locations to the Prime Minister's residence, just say
satpass2> sussex_drive
satpass2>
satpass2> # and to confirm it,
satpass2> location
Location: 24 Sussex Drive, Ottawa, ON
Latitude 45.4443, longitude -75.6939, height 50 m
satpass2>
And to return home, just say
satpass2> home
Of course, these are really only useful if they are in your initialization file. And they can be, with the usual incantation:
satpass2> save -changes -confirm
Temporary Settings
As you recall from the section on IRIDIUM FLARES, if you are trying to imitate the results from Heavens Above you have to tweak the default settings a bit. These settings stay tweaked until you put them back to their original values. If you always want the tweaks when you do Iridium flare predictions, you can put them into a macro along with the flare prediction. Values of settings can be localized to a macro (among other things), so that the old values are restored when the macro exits. The example could be defined as a macro like this:
satpass2> macro define iridium_flare \
> 'localize twilight flare_mag_night' \
> 'set twilight -1.8 flare_mag_night -1' \
> 'flare "$@"'
satpass2>
Note the use of single quotes rather than double quotes to enclose the flare
command. In double quotes, or outside quotes altogether, the $
is magical, and introduces something to be interpolated into the command. Exactly what is interpolated depends on what follows the $
. The $@
is replaced by the arguments of the macro (or whatever), but we do not want this to happen until the macro is expanded. Enclosing the $@
in double quotes ensures that macro arguments containing spaces remain single arguments; without the double quotes they would become multiple arguments.
So if you say
satpass2> iridium_flare -noam 'today 12:00' +3
The twilight
and flare_mag_night
settings will be changed, the flare prediction will be run, and the old twilight
and flare_mag_night
settings will be restored. Because the macro arguments get passed to the flare
command, the prediction will be for the three days starting at noon today, and will exclude flares occurring between midnight and the beginning of morning twilight.
Note that only attributes of the Astro::App::Satpass2
object (those set with a set
command) can be localized; attributes of helper objects can not be. But you can localize the entire helper object. For example, for a temporary change to the Astro::SpaceTrack object,
satpass2> localize spacetrack
inside the appropriate scope. Yes, you can localize outside a macro (or any other localization scope, such as inside a source
file or a begin
-end
block), but it does no good to do so, because the old value is not restored until you exit, and what good is that?
Reporting Position
By default, anything that reports a satellite position does it in elevation, azimuth and range. You may want some other units, such as right ascension and declination.
Deciding what to display is the job of the formatter
helper object. Normally this is an Astro::App::Satpass2::Format::Template, and for the full story you should see the documentation to that class.
But there are a number of prepackaged coordinate sets:
az_rng --------- azimuth (with bearing) and range
azel ----------- elevation and azimuth (with bearing)
azel_rng ------- elevation, azimuth (with bearing) and range
equatorial ----- right ascension and declination
equatorial_rng - right ascension, declination and range
By default, you get azel_rng
, but you can get any of the others via the local_coord() method of the formatter object. For example, if you want right ascension, declination and range, just
satpass2> tell formatter local_coord equatorial_rng
User-defined Position Coordinates
Astro::App::Satpass2::Format::Template defines these local coordinates in terms of Template-Toolkit templates, so you can add definitions, or change the existing definitions, in the same way that you would change one of the reporting templates, using that formatter's template() method. For example, to make azel
report azimuth first,
satpass2> formatter template azel <<'EOD'
> [% data.azimuth( bearing = 2 ) %]
> [%= data.elevation %]
> EOD
See the Astro::App::Satpass2::FormatValue documentation for what format effectors are available. Inside the template, the data
object will contain the data you want to format.
AUTHOR
Thomas R. Wyant, III wyant@cpan.org
COPYRIGHT AND LICENSE
Copyright (C) 2011-2012 by Thomas R. Wyant, III
This program is free software; you can redistribute it and/or modify it under the same terms as Perl 5.10.0. For more details, see the full text of the licenses in the directory LICENSES.
This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose.