orbitforge platform-access
Synopsis
orbitforge platform-access --constellation <PATH> --platform <PATH> [OPTIONS]Description
Computes access from a platform to every satellite in a constellation. The
platform can be stationary, in which case this is ordinary ground-station
analysis, or it can move along a timed path, which is what distinguishes this
command from coverage.
Moving platforms matter because the access geometry changes for two reasons at once: the satellites move, and so does the user. An aircraft crossing an ocean passes through the coverage of different planes as it goes.
Options
| Parameter | Type | Unit | Default | Required | Description |
|---|---|---|---|---|---|
--constellation | path | n/a | — | Yes | Path to a constellation JSON file. |
--platform | path | n/a | — | Yes | Platform JSON with a `fixed` or `geodetic_waypoints` trajectory. See below. |
--start | string | RFC 3339 UTC | 2026-01-01T00:00:00Z | No | Scenario start epoch. Waypoint offsets are measured from this. |
--duration-hours | float | h | 6 | No | Analysis window length. |
--step-seconds | float | s | 60 | No | Time step. |
--model | enum | n/a | two-body | No | Propagation model. |
Platform schema
Fixed site
{
"id": "madrid",
"name": "Madrid ground station",
"min_elevation_deg": 10.0,
"trajectory": {
"fixed": { "lat_deg": 40.43, "lon_deg": -3.7, "alt_km": 0.6 }
}
}Moving platform
{
"id": "flight-1",
"name": "Transatlantic flight",
"min_elevation_deg": 10.0,
"trajectory": {
"geodetic_waypoints": {
"waypoints": [
{ "t_offset_s": 0, "lat_deg": 51.47, "lon_deg": -0.45, "alt_km": 11.0 },
{ "t_offset_s": 10800, "lat_deg": 50.0, "lon_deg": -30.0, "alt_km": 11.0 },
{ "t_offset_s": 21600, "lat_deg": 40.64, "lon_deg": -73.78, "alt_km": 11.0 }
]
}
}
}| Field | Unit | Note |
|---|---|---|
t_offset_s | s | Elapsed seconds from the scenario start, strictly increasing |
lat_deg, lon_deg | deg | Geodetic position; longitude positive east |
alt_km | km | Height above the WGS84 ellipsoid |
min_elevation_deg | deg | Access mask, defaulting to 10 |
At least two waypoints are required. The platform moves along great-circle legs between them, interpolating position at each time step.
Implied leg speeds are sanity-checked. A pair of waypoints implying an unreasonable
ground speed is rejected rather than silently accepted, which catches the common error
of a mistyped t_offset_s.
Worked example
A London to New York flight at 11 km, over six hours:
orbitforge platform-access \
--constellation demo.json \
--platform aircraft.json \
--duration-hours 6 --step-seconds 60Platform `Transatlantic flight`: 60 satellites analyzed over 6.0 h, 76 passes above 10 deg.
demo-s0-p00-sat00: 4 passes, visible 8.9%, best peak elevation 87.6 deg
demo-s0-p00-sat01: 4 passes, visible 8.6%, best peak elevation 80.5 deg
demo-s0-p00-sat02: 4 passes, visible 8.9%, best peak elevation 72.8 deg
demo-s0-p00-sat03: 4 passes, visible 6.9%, best peak elevation 82.0 deg
demo-s0-p00-sat04: 3 passes, visible 6.4%, best peak elevation 83.7 degOutput elided; one line per satellite.
Reading the output
| Figure | Example | Meaning |
|---|---|---|
| Total passes | 76 | Distinct access intervals across the whole constellation |
| Passes per satellite | 3 to 4 | How many times each satellite rose above the mask |
| Visible | 8.9 percent | Fraction of the window this satellite was accessible |
| Best peak elevation | 87.6 deg | Highest elevation reached on its best pass |
Peak elevation is the useful number
An 87.6-degree peak is almost directly overhead, which is the best possible geometry: shortest slant range, least atmosphere, highest margin. A pass peaking at 15 degrees is a contact in name only, because the link is at its worst throughout.
Sorting satellites by peak elevation rather than by visible fraction tells you which contacts are worth scheduling. Two satellites with identical visible percentages can differ by several decibels of achievable margin.
Individual satellites are not the answer
Each satellite is visible only 6 to 9 percent of the window, which sounds poor until you notice there are 60 of them and 76 passes in total. What matters for a user is whether some satellite is available, not whether a particular one is.
This command reports per-satellite access. It does not report whether the platform had continuous service, which is the question a broadband user cares about. For that, examine overlap between passes: gaps in the union of all access intervals are the outages.
The coverage command answers the union question
directly for fixed grids, but does not accept a moving platform.
Fixed sites
With a fixed trajectory this is ordinary ground-station access analysis, and it
is the right command when you want per-satellite pass detail rather than the
aggregate statistics coverage reports.
Use it to answer scheduling questions: which satellites see this site, how often, and at what geometry.
Step size and short passes
At 60 seconds, a pass shorter than a minute may be missed and every pass boundary carries up to a minute of error. Low Earth orbit passes at a high elevation mask can be only a few minutes long, so reduce the step when pass timing matters.
See also
main (pre-release)