<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.simtx.net/index.php?action=history&amp;feed=atom&amp;title=SimTX_API%2FSatellites</id>
	<title>SimTX API/Satellites - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.simtx.net/index.php?action=history&amp;feed=atom&amp;title=SimTX_API%2FSatellites"/>
	<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=SimTX_API/Satellites&amp;action=history"/>
	<updated>2026-11-04T21:39:05Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=SimTX_API/Satellites&amp;diff=2392&amp;oldid=prev</id>
		<title>Clanker: Remove development history and server internals</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=SimTX_API/Satellites&amp;diff=2392&amp;oldid=prev"/>
		<updated>2026-10-24T17:14:27Z</updated>

		<summary type="html">&lt;p&gt;Remove development history and server internals&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:14, 24 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l94&quot;&gt;Line 94:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 94:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Accuracy ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Accuracy ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;SimTX&#039;s own ports of &lt;/del&gt;the &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;model in other languages are tested against reference vectors &lt;/del&gt;to 1 cm in position, 10&amp;lt;sup&amp;gt;−5&amp;lt;/sup&amp;gt; m/s in velocity and 0.01 Hz in Doppler at 437.8 MHz, over intervals of up to ten years&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;. A third-party port that meets the same tolerances &lt;/del&gt;draws satellites where the server simulates them.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;An implementation that agrees with &lt;/ins&gt;the &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;server &lt;/ins&gt;to 1 cm in position, 10&amp;lt;sup&amp;gt;−5&amp;lt;/sup&amp;gt; m/s in velocity and 0.01 Hz in Doppler at 437.8 MHz, over intervals of up to ten years&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;, &lt;/ins&gt;draws satellites where the server simulates them.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Ephemerides ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Ephemerides ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l102&quot;&gt;Line 102:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 102:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;A [[SimTX API/Packets/PassPredictionRequest|PassPredictionRequest]] asks when a satellite is above &amp;lt;code&amp;gt;min_elevation_deg&amp;lt;/code&amp;gt; for an observer, within a window of at most 7 days. The observer is a ground station with a live session on that server (PUBLIC or the account&amp;#039;s own) or an arbitrary [[SimTX API/Data types#GeoPoint|position]]. Each [[SimTX API/Packets/PassPredictionResponse|Pass]] gives the times of acquisition (AOS), closest approach (TCA) and loss of signal (LOS), the maximum elevation, the azimuths at AOS and LOS and, when a frequency was given, the largest Doppler shift.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;A [[SimTX API/Packets/PassPredictionRequest|PassPredictionRequest]] asks when a satellite is above &amp;lt;code&amp;gt;min_elevation_deg&amp;lt;/code&amp;gt; for an observer, within a window of at most 7 days. The observer is a ground station with a live session on that server (PUBLIC or the account&amp;#039;s own) or an arbitrary [[SimTX API/Data types#GeoPoint|position]]. Each [[SimTX API/Packets/PassPredictionResponse|Pass]] gives the times of acquisition (AOS), closest approach (TCA) and loss of signal (LOS), the maximum elevation, the azimuths at AOS and LOS and, when a frequency was given, the largest Doppler shift.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;The search scans elevation and elevation rate every min(30 s&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;period / 40); a change of the rate from rising to falling below the threshold triggers a golden-section search, so grazing passes shorter than one step are found. AOS &lt;/del&gt;and LOS are &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;refined by bisection and TCA by golden-section search, each &lt;/del&gt;to 1 ms. Passes that overlap the window are clipped to it: an always-visible geostationary satellite gives one window-long pass, a never-visible one none&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;. Pass edges agree with a 0.1 s brute-force scan to 0.2 s&lt;/del&gt;.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;AOS&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;TCA &lt;/ins&gt;and LOS are &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;given &lt;/ins&gt;to 1 ms &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;and are accurate to about 0.2 s; short grazing passes are included&lt;/ins&gt;. Passes that overlap the window are clipped to it: an always-visible geostationary satellite gives one window-long pass, a never-visible one none.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Deorbit ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Deorbit ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Clanker</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=SimTX_API/Satellites&amp;diff=2267&amp;oldid=prev</id>
		<title>Clanker: Protocol v25 reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=SimTX_API/Satellites&amp;diff=2267&amp;oldid=prev"/>
		<updated>2026-10-24T16:19:30Z</updated>

		<summary type="html">&lt;p&gt;Protocol v25 reference&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{SimTX API navigation}}&lt;br /&gt;
SimTX satellites are &amp;#039;&amp;#039;&amp;#039;user-launched&amp;#039;&amp;#039;&amp;#039; [[SimTX API/Stations|stations]] of kind &amp;lt;code&amp;gt;SATELLITE&amp;lt;/code&amp;gt;. An account designs one (orbit, attitude, antennas and rigs), launches it through the [[SimTX API/Station endpoints|account service]], and from then on any number of sessions can transmit from it (a downlink) or receive on it (the uplink) while it moves. There are no real or system satellites; every satellite belongs to an account.&lt;br /&gt;
&lt;br /&gt;
== Life cycle ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! State !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ACTIVE&amp;lt;/code&amp;gt; || Launched and in orbit. Usable for sessions; listed if PUBLIC.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DEORBITING&amp;lt;/code&amp;gt; || The deorbit burn has fired. The satellite is fully usable on its falling orbit until it reenters.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DEORBITED&amp;lt;/code&amp;gt; || Reentered. Sessions are refused with &amp;lt;code&amp;gt;STATION_INACTIVE&amp;lt;/code&amp;gt;. The record remains until the owner deletes it.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Launch.&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;POST /api/v1/satellites&amp;lt;/code&amp;gt; with the name, callsign, visibility, limits, orbit (without epoch), attitude, 1 to 4 antennas and up to 8 rigs. The account service sets the orbit epoch to the launch instant. See [[SimTX API/Station endpoints#Launching a satellite|Station endpoints]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Sealed.&amp;#039;&amp;#039;&amp;#039; After launch only the name, callsign, visibility and limits can change. The orbit, attitude, antennas and rigs cannot; to change them, deorbit the satellite and launch another.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Deorbit.&amp;#039;&amp;#039;&amp;#039; A retrograde burn, not a deletion, and it cannot be undone. See [[#Deorbit|Deorbit]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Antennas&amp;#039;&amp;#039;&amp;#039; on satellites are modelled in free space. The circularly polarised types &amp;lt;code&amp;gt;TURNSTILE&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;HELIX&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;MONOPOLE&amp;lt;/code&amp;gt; are intended for them; a NEC deck must not contain a &amp;lt;code&amp;gt;GN&amp;lt;/code&amp;gt; card.&lt;br /&gt;
&lt;br /&gt;
== Satellites on the wire ==&lt;br /&gt;
* The [[SimTX API/Packets/StationList|station list]] contains every ACTIVE or DEORBITING PUBLIC satellite, with or without sessions. &amp;lt;code&amp;gt;core.location&amp;lt;/code&amp;gt; is the sub-satellite point at &amp;lt;code&amp;gt;captured_at_ms&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;core.orbit&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;core.attitude&amp;lt;/code&amp;gt; describe its motion. &amp;lt;code&amp;gt;LiveSession.location&amp;lt;/code&amp;gt; of a session on the satellite moves with it.&lt;br /&gt;
* A session bound to a satellite gets the elements in &amp;lt;code&amp;gt;SessionStatus.station.core.orbit&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;UPDATED&amp;lt;/code&amp;gt; statuses when they change or when the deorbit burn fires. See [[SimTX API/Session status#Satellites|Session status]].&lt;br /&gt;
* [[SimTX API/Packets/EphemerisRequest|EphemerisRequest]] returns positions over a time window, and [[SimTX API/Packets/PassPredictionRequest|PassPredictionRequest]] returns passes over an observer. Both are control requests and need the server features &amp;lt;code&amp;gt;ephemeris&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;passes&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The account service lists PUBLIC satellites without authentication at &amp;lt;code&amp;gt;GET /api/v1/satellites&amp;lt;/code&amp;gt;. See [[SimTX API/Public endpoints#Public satellites|Public endpoints]].&lt;br /&gt;
&lt;br /&gt;
Clients may propagate the elements locally to draw satellites, using the model below, or ask the server. &amp;#039;&amp;#039;&amp;#039;The server is authoritative.&amp;#039;&amp;#039;&amp;#039; Use the server&amp;#039;s simulation clock (&amp;lt;code&amp;gt;ServerHello.simulation_time_ms&amp;lt;/code&amp;gt;, or a recent &amp;lt;code&amp;gt;StationList.captured_at_ms&amp;lt;/code&amp;gt;) as &amp;quot;now&amp;quot;, not the local clock.&lt;br /&gt;
&lt;br /&gt;
== Orbit model ==&lt;br /&gt;
Every satellite uses the model &amp;lt;code&amp;gt;simtx-j2-v1&amp;lt;/code&amp;gt;: mean Keplerian elements with the secular rates caused by the Earth&amp;#039;s oblateness (J2), and nothing else. There are no short-period terms, no drag and no decay; a satellite stays in its orbit until its owner deorbits it.&lt;br /&gt;
&lt;br /&gt;
=== Elements and constants ===&lt;br /&gt;
The [[SimTX API/Data types#OrbitalElements|OrbitalElements]] are the mean semi-major axis &amp;#039;&amp;#039;a&amp;#039;&amp;#039;, eccentricity &amp;#039;&amp;#039;e&amp;#039;&amp;#039;, inclination &amp;#039;&amp;#039;i&amp;#039;&amp;#039;, right ascension of the ascending node Ω, argument of perigee ω and mean anomaly &amp;#039;&amp;#039;M&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, all at the epoch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
μ    = 398600.4418 km³/s²       gravitational parameter&lt;br /&gt;
J2   = 1.08262668e-3&lt;br /&gt;
R_J2 = 6378.137 km               reference radius for J2&lt;br /&gt;
R    = 6371.0 km                 sphere for heights, latitude, longitude and look angles&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Secular rates ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
n0 = √(μ / a³)          p = a (1 − e²)          η = √(1 − e²)          k = 1.5 J2 (R_J2 / p)²&lt;br /&gt;
&lt;br /&gt;
dΩ/dt = −k n0 cos i&lt;br /&gt;
dω/dt =  ½ k n0 (5 cos² i − 1)&lt;br /&gt;
dM/dt =  n0 (1 + ½ k η (3 cos² i − 1))          period = 2π / (dM/dt)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The three angles grow linearly with Δt = t − epoch.&lt;br /&gt;
&lt;br /&gt;
=== Position and velocity ===&lt;br /&gt;
# Solve Kepler&amp;#039;s equation &amp;#039;&amp;#039;M&amp;#039;&amp;#039; = &amp;#039;&amp;#039;E&amp;#039;&amp;#039; − &amp;#039;&amp;#039;e&amp;#039;&amp;#039; sin &amp;#039;&amp;#039;E&amp;#039;&amp;#039; by Newton&amp;#039;s method, starting from &amp;#039;&amp;#039;E&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = &amp;#039;&amp;#039;M&amp;#039;&amp;#039; + &amp;#039;&amp;#039;e&amp;#039;&amp;#039; sin &amp;#039;&amp;#039;M&amp;#039;&amp;#039; (or π when &amp;#039;&amp;#039;e&amp;#039;&amp;#039; &amp;gt; 0.8), to |Δ&amp;#039;&amp;#039;E&amp;#039;&amp;#039;| &amp;lt; 10&amp;lt;sup&amp;gt;−14&amp;lt;/sup&amp;gt; in at most 16 iterations.&lt;br /&gt;
# The perifocal position is &amp;#039;&amp;#039;r&amp;#039;&amp;#039; = (&amp;#039;&amp;#039;a&amp;#039;&amp;#039; (cos &amp;#039;&amp;#039;E&amp;#039;&amp;#039; − &amp;#039;&amp;#039;e&amp;#039;&amp;#039;), &amp;#039;&amp;#039;a&amp;#039;&amp;#039; η sin &amp;#039;&amp;#039;E&amp;#039;&amp;#039;, 0).&lt;br /&gt;
# Rotate it by R3(Ω) R1(&amp;#039;&amp;#039;i&amp;#039;&amp;#039;) R3(ω) into the model&amp;#039;s inertial frame. The model has no precession or nutation.&lt;br /&gt;
# The velocity is the derivative of the perifocal position with d&amp;#039;&amp;#039;E&amp;#039;&amp;#039;/dt = (d&amp;#039;&amp;#039;M&amp;#039;&amp;#039;/dt) / (1 − &amp;#039;&amp;#039;e&amp;#039;&amp;#039; cos &amp;#039;&amp;#039;E&amp;#039;&amp;#039;), rotated the same way, plus (dΩ/dt) ẑ × &amp;#039;&amp;#039;r&amp;#039;&amp;#039; plus (dω/dt) ĥ × &amp;#039;&amp;#039;r&amp;#039;&amp;#039;, where ĥ is the orbit normal.&lt;br /&gt;
&lt;br /&gt;
=== Earth-fixed coordinates ===&lt;br /&gt;
The inertial frame is turned into Earth-fixed (ECEF) coordinates by the Earth Rotation Angle, using UTC as UT1:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
θ    = 2π (frac(Du) + 0.7790572732640 + 0.00273781191135448 Du),    Du = JD(UTC) − 2451545.0&lt;br /&gt;
r_ecef = R3(θ) r&lt;br /&gt;
v_ecef = R3(θ) v − ω_E × r_ecef,                                      ω_E = 2π × 1.00273781191135448 / 86400 rad/s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Latitude, longitude and height are taken on the 6,371 km sphere, which is also the frame of [[SimTX API/Packets/EphemerisResponse|EphemerisSample]] &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Look angles and Doppler ===&lt;br /&gt;
Look angles are computed in the observer&amp;#039;s topocentric east-north-up frame on the sphere: azimuth from north through east, and &amp;#039;&amp;#039;&amp;#039;geometric&amp;#039;&amp;#039;&amp;#039; elevation (refraction is left to the propagation model). The range rate is positive when the satellite recedes, and the Doppler shift is −&amp;#039;&amp;#039;f&amp;#039;&amp;#039; × (range rate) / &amp;#039;&amp;#039;c&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== Attitude ===&lt;br /&gt;
The [[SimTX API/Data types#Attitude|Attitude]] decides where a satellite&amp;#039;s antennas point. It is defined against the orbiting (LVLH) frame built from the inertial position &amp;#039;&amp;#039;r&amp;#039;&amp;#039; and velocity &amp;#039;&amp;#039;v&amp;#039;&amp;#039;:&lt;br /&gt;
* z&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; = −r̂ (nadir), y&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; = −ĥ (ĥ = &amp;#039;&amp;#039;r&amp;#039;&amp;#039; × &amp;#039;&amp;#039;v&amp;#039;&amp;#039; normalised), x&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; = y&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; × z&amp;lt;sub&amp;gt;L&amp;lt;/sub&amp;gt; (along-track; the velocity direction on circular orbits).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode !! Body axes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nadir&amp;lt;/code&amp;gt; (yaw) || The LVLH frame rotated by the yaw angle about z&amp;lt;sub&amp;gt;b&amp;lt;/sub&amp;gt;. No mode set means nadir with yaw 0.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;inertial&amp;lt;/code&amp;gt; (α, δ, roll) || z&amp;lt;sub&amp;gt;b&amp;lt;/sub&amp;gt; = (cos δ cos α, cos δ sin α, sin δ) in the inertial frame. At roll 0, x&amp;lt;sub&amp;gt;b&amp;lt;/sub&amp;gt; = (−sin α, cos α, 0), towards increasing right ascension, and y&amp;lt;sub&amp;gt;b&amp;lt;/sub&amp;gt; = z&amp;lt;sub&amp;gt;b&amp;lt;/sub&amp;gt; × x&amp;lt;sub&amp;gt;b&amp;lt;/sub&amp;gt;, towards the celestial north pole. Roll rotates about z&amp;lt;sub&amp;gt;b&amp;lt;/sub&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;spin&amp;lt;/code&amp;gt; (axis, rpm, φ&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;) || z&amp;lt;sub&amp;gt;b&amp;lt;/sub&amp;gt; along the named axis: &amp;lt;code&amp;gt;ORBIT_NORMAL&amp;lt;/code&amp;gt; z = +ĥ, x = along-track, y = nadir; &amp;lt;code&amp;gt;NADIR&amp;lt;/code&amp;gt; z = −r̂, x = along-track, y = −ĥ; &amp;lt;code&amp;gt;VELOCITY&amp;lt;/code&amp;gt; z = along-track, x = nadir, y = +ĥ. The body then turns about z&amp;lt;sub&amp;gt;b&amp;lt;/sub&amp;gt; by φ = φ&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; + 2π (rpm / 60) Δt, relative to the orbiting frame.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A rotation by ψ about z&amp;lt;sub&amp;gt;b&amp;lt;/sub&amp;gt; maps x to cos ψ x + sin ψ y and y to −sin ψ x + cos ψ y. Every axis is finally rotated into Earth-fixed coordinates by R3(θ). Antenna boresight is the body +z axis for &amp;lt;code&amp;gt;HELIX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;TURNSTILE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MONOPOLE&amp;lt;/code&amp;gt; and NEC decks; Yagi booms (+y in the template) are mapped to +z.&lt;br /&gt;
&lt;br /&gt;
=== Validation ===&lt;br /&gt;
The account service accepts an orbit only when:&lt;br /&gt;
* the model is &amp;lt;code&amp;gt;simtx-j2-v1&amp;lt;/code&amp;gt;;&lt;br /&gt;
* the perigee &amp;#039;&amp;#039;a&amp;#039;&amp;#039; (1 − &amp;#039;&amp;#039;e&amp;#039;&amp;#039;) − &amp;#039;&amp;#039;R&amp;#039;&amp;#039; is at least 200 km and the apogee &amp;#039;&amp;#039;a&amp;#039;&amp;#039; (1 + &amp;#039;&amp;#039;e&amp;#039;&amp;#039;) − &amp;#039;&amp;#039;R&amp;#039;&amp;#039; at most 40,000 km above the 6,371 km sphere, which limits &amp;#039;&amp;#039;e&amp;#039;&amp;#039; to about 0.752;&lt;br /&gt;
* 0 ≤ &amp;#039;&amp;#039;e&amp;#039;&amp;#039; &amp;lt; 1, 0 ≤ &amp;#039;&amp;#039;i&amp;#039;&amp;#039; ≤ 180°, all angles finite;&lt;br /&gt;
* a spin rate, if any, is 0 to 60 rpm.&lt;br /&gt;
&lt;br /&gt;
=== Accuracy ===&lt;br /&gt;
SimTX&amp;#039;s own ports of the model in other languages are tested against reference vectors to 1 cm in position, 10&amp;lt;sup&amp;gt;−5&amp;lt;/sup&amp;gt; m/s in velocity and 0.01 Hz in Doppler at 437.8 MHz, over intervals of up to ten years. A third-party port that meets the same tolerances draws satellites where the server simulates them.&lt;br /&gt;
&lt;br /&gt;
== Ephemerides ==&lt;br /&gt;
An [[SimTX API/Packets/EphemerisRequest|EphemerisRequest]] asks for a satellite&amp;#039;s position from &amp;lt;code&amp;gt;from_ms&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;to_ms&amp;lt;/code&amp;gt; every &amp;lt;code&amp;gt;step_seconds&amp;lt;/code&amp;gt;, at most 3,600 samples. The [[SimTX API/Packets/EphemerisResponse|EphemerisResponse]] gives, for each sample, the sub-satellite latitude and longitude, the height above the sphere and the Earth-fixed position. The satellite must be PUBLIC or the account&amp;#039;s own; otherwise the answer is [[SimTX API/Packets/Error|Error]] &amp;lt;code&amp;gt;NOT_FOUND&amp;lt;/code&amp;gt;. For a deorbiting satellite the samples stop at its reentry.&lt;br /&gt;
&lt;br /&gt;
== Passes ==&lt;br /&gt;
A [[SimTX API/Packets/PassPredictionRequest|PassPredictionRequest]] asks when a satellite is above &amp;lt;code&amp;gt;min_elevation_deg&amp;lt;/code&amp;gt; for an observer, within a window of at most 7 days. The observer is a ground station with a live session on that server (PUBLIC or the account&amp;#039;s own) or an arbitrary [[SimTX API/Data types#GeoPoint|position]]. Each [[SimTX API/Packets/PassPredictionResponse|Pass]] gives the times of acquisition (AOS), closest approach (TCA) and loss of signal (LOS), the maximum elevation, the azimuths at AOS and LOS and, when a frequency was given, the largest Doppler shift.&lt;br /&gt;
&lt;br /&gt;
The search scans elevation and elevation rate every min(30 s, period / 40); a change of the rate from rising to falling below the threshold triggers a golden-section search, so grazing passes shorter than one step are found. AOS and LOS are refined by bisection and TCA by golden-section search, each to 1 ms. Passes that overlap the window are clipped to it: an always-visible geostationary satellite gives one window-long pass, a never-visible one none. Pass edges agree with a 0.1 s brute-force scan to 0.2 s.&lt;br /&gt;
&lt;br /&gt;
== Deorbit ==&lt;br /&gt;
Deorbiting is a retrograde burn, not a deletion, and it cannot be undone.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Preview.&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;POST /api/v1/stations/{id}/deorbit/preview&amp;lt;/code&amp;gt; returns the [[SimTX API/Data types#Deorbit|deorbit]] that a burn fired now would produce (burn time, reentry time and place, delta-v, and the post-burn orbit) without changing anything. Use it to confirm with the user.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Burn.&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;POST /api/v1/stations/{id}/deorbit&amp;lt;/code&amp;gt; fires it. The burn takes the satellite&amp;#039;s state at the burn time and lowers its speed along the velocity vector until the new orbit&amp;#039;s perigee is 100 km below the surface. Position is continuous; the velocity change is the burn. The stored orbit is replaced by the post-burn elements (epoch = burn time) and the satellite becomes &amp;lt;code&amp;gt;DEORBITING&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Falling.&amp;#039;&amp;#039;&amp;#039; While deorbiting, the satellite works normally on its falling orbit: tickets, sessions, the station list, ephemerides and passes. Sessions bound to it receive [[SimTX API/Packets/SessionStatus|SessionStatus]] &amp;lt;code&amp;gt;UPDATED&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;UPDATE_REASON_DEORBIT_SCHEDULED&amp;lt;/code&amp;gt; and the new elements.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Reentry.&amp;#039;&amp;#039;&amp;#039; The satellite reenters at &amp;lt;code&amp;gt;reentry_at_ms&amp;lt;/code&amp;gt;, the first time after the burn that its height drops below 80 km, above &amp;lt;code&amp;gt;reentry_point&amp;lt;/code&amp;gt;. The servers then end its sessions with &amp;lt;code&amp;gt;ENDED&amp;lt;/code&amp;gt; and the reason &amp;#039;&amp;#039;Satellite burned up on reentry&amp;#039;&amp;#039;, and the account service marks it &amp;lt;code&amp;gt;DEORBITED&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Clients&amp;#039;&amp;#039;&amp;#039; stop drawing the satellite at &amp;lt;code&amp;gt;reentry_at_ms&amp;lt;/code&amp;gt; and cut ground tracks there. They draw the fall from the post-burn elements and never re-plan the burn themselves.&lt;br /&gt;
&lt;br /&gt;
Typical results:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Orbit !! Delta-v !! Time to reentry&lt;br /&gt;
|-&lt;br /&gt;
| LEO 550 km || 189 m/s || 29 min&lt;br /&gt;
|-&lt;br /&gt;
| Geostationary || 1,506 m/s || 5.15 h&lt;br /&gt;
|-&lt;br /&gt;
| Molniya, burn at apogee || 62 m/s || 5.8 h&lt;br /&gt;
|-&lt;br /&gt;
| Molniya, burn at perigee || 2,614 m/s || 29 min&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Deorbiting satellites count towards the owner&amp;#039;s satellite quota until they reenter. A deorbited satellite can then be deleted.&lt;br /&gt;
&lt;br /&gt;
{{SimTX API navbox}}&lt;br /&gt;
[[Category:SimTX API]]&lt;/div&gt;</summary>
		<author><name>Clanker</name></author>
	</entry>
</feed>