Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions contrib/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ This is an open-source directory of real hardware that has been modeled in Space

For example:
- [loon/antenna_pattern.textproto](loon/antenna_pattern.textproto): An antenna pattern specified using phi, theta, and gain, with separate patterns for near- and far- field. This pattern models the millimeter-wave antennas used by Loon's balloons for gateway and inter-platform links.
- [sda_oct_class_terminal/](sda_oct_class_terminal/): a free-space optical terminal of the class defined by the public SDA Optical Communication Terminal Standard 3.1.0 (ITU C-band grid, irradiance and BER requirements taken from the standard, optics and detector values assumed and tagged as such), with a matching optical ground station: antenna patterns, band profile, platform definitions and network nodes.
50 changes: 50 additions & 0 deletions contrib/sda_oct_class_terminal/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# SDA OCT Standard 3.1.0 class optical terminal, modeled in Spacetime

Entities for a free-space optical communication terminal of the class defined by the Space Development Agency's
Optical Communication Terminal (OCT) Standard, version 3.1.0 (public document, June 2023), plus a ground optical
station to close a space-to-ground link. The standard defines interoperability requirements, not a hardware design,
so every number below is tagged either **spec** (taken from the standard, requirement number given) or **assumed**
(a representative value consistent with the standard). Replace the assumed values with your terminal's datasheet.

## Files

| File | Entity | Notes |
| --- | --- | --- |
| `oct_antenna_pattern.textproto` | ANTENNA_PATTERN | Gaussian optical aperture, space terminal |
| `ogs_antenna_pattern.textproto` | ANTENNA_PATTERN | Gaussian optical aperture, ground station |
| `oct_band_profile.textproto` | BAND_PROFILE | One ITU C-band channel, rate table from the irradiance requirement |
| `oct_platform_definition.textproto` | PLATFORM_DEFINITION | Satellite transceiver model: transmitter, APD receiver, antenna, targeting |
| `ogs_platform_definition.textproto` | PLATFORM_DEFINITION | Ground station transceiver model with an elevation mask |
| `oct_network_node.textproto`, `ogs_network_node.textproto` | NETWORK_NODE | Interfaces bound to the transceiver models |

## Values and their provenance

| Quantity | Value | Source |
| --- | --- | --- |
| Spectral grid | ITU-T G.694.1, 193.1 THz + M x 100 GHz, C-band 1530 to 1565 nm, 100 GHz channel width | spec, OCT-022 |
| Channel modeled | M = 0, 193.1 THz (1552.52 nm) | spec grid, channel choice assumed |
| Modulation | OOK-NRZ | spec, section 2 |
| Required irradiance at the remote aperture | at least 25 uW/m^2 mean, including platform jitter, at 5,500 km | spec, OCT-038 |
| Maximum irradiance at the remote aperture | 10 mW/m^2 at any established link distance | spec, OCT-037 |
| Receiver performance | post-FEC BER <= 1e-6 at 25 uW/m^2 at all required rates | spec, OCT-039 |
| User throughput | continuous 1 Gbps bidirectional Ethernet through turbulence fades | spec, section 3 |
| Transmit power | 1.0 W | assumed |
| Transmit 1/e^2 half-angle divergence | 20 urad | assumed |
| Pointing error (rms) | 4 urad | assumed |
| Space terminal aperture | 0.08 m, 60 percent efficiency | assumed |
| Ground station aperture | 0.40 m, 60 percent efficiency, 20 deg elevation mask | assumed |
| Photodetector | APD, 80 percent quantum efficiency, 2.5 GHz bandwidth, 100 urad field of view, 100 GHz optical bandpass | assumed (bandpass = channel width, spec) |
| Minimum sun angle | 5 deg | assumed |
| Slew rates | 2 deg/s azimuth and elevation | assumed |

Consistency check (Gaussian beam, far field): with 1.0 W and a 20 urad 1/e^2 half-angle the beam radius at 5,500 km
is 110 m and the on-axis irradiance 52.6 uW/m^2; averaged over a 4 urad rms pointing error the mean irradiance is
48.7 uW/m^2, which meets OCT-038 (25 uW/m^2) with 2.9 dB of margin. The rate table's top step is the received power
that 25 uW/m^2 delivers through the modeled aperture: -69.0 dBW for the 0.08 m space terminal and -55.0 dBW for the
0.40 m ground station. Lower steps are assumed.

## What is not modeled here

Acquisition and tracking (spiral search, beacon), the burst-mode waveform of version 4.0.0, atmospheric attenuation
and turbulence on the ground link (those belong to the link evaluation, not the terminal), and any specific vendor's
terminal. The SDA standard is cited from the public web version; see the standard for the authoritative text.
28 changes: 28 additions & 0 deletions contrib/sda_oct_class_terminal/oct_antenna_pattern.textproto
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Copyright 2026 James Sweeney.
#
# Licensed 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.

# SDA OCT Standard 3.1.0 class space terminal aperture. Aperture and divergence are ASSUMED representative
# values (see README.md); the standard fixes the delivered irradiance (OCT-038), not the optics.
group {
type: ANTENNA_PATTERN
}
id: "gain/payload/optical/sda-oct-class-terminal"
antenna_pattern {
gaussian_optical_pattern: {
diameter_m: 0.08 # assumed
efficiency_percent: 0.60 # assumed
divergence_angle_rad: 0.00002 # assumed, 20 urad 1/e^2 half-angle
pointing_error_rad: 0.000004 # assumed, 4 urad rms
}
}
40 changes: 40 additions & 0 deletions contrib/sda_oct_class_terminal/oct_band_profile.textproto
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# Copyright 2026 James Sweeney.
#
# Licensed 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.

# One ITU-T G.694.1 C-band channel (SDA OCT Standard 3.1.0, OCT-022): 193.1 THz + M x 100 GHz, M = 0 here.
# Rate table: the top step is the received power delivered by the required irradiance of 25 uW/m^2 (OCT-038)
# through the modeled 0.08 m space-terminal aperture, -69.0 dBW, at which the receiver must reach a post-FEC
# BER of 1e-6 at all required rates (OCT-039); the user throughput target is 1 Gbps (section 3). Lower steps
# are ASSUMED fallback rates.
group {
type: BAND_PROFILE
}
id: "band/optical/sda-oct-c-band-ch0"
band_profile {
channel_width_hz: 100000000000 # spec, OCT-022: 100 GHz
rate_table: {
received_signal_power_steps: {
min_received_signal_power_dbw: -79
tx_data_rate_bps: 1e8 # assumed fallback
}
received_signal_power_steps: {
min_received_signal_power_dbw: -74
tx_data_rate_bps: 5e8 # assumed fallback
}
received_signal_power_steps: {
min_received_signal_power_dbw: -69
tx_data_rate_bps: 1e9 # spec: 1 Gbps at 25 uW/m^2 through a 0.08 m aperture
}
}
}
31 changes: 31 additions & 0 deletions contrib/sda_oct_class_terminal/oct_network_node.textproto
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Copyright 2026 James Sweeney.
#
# Licensed 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.

group {
type: NETWORK_NODE
}
id: "node/leo/sda-oct-class-terminal"
network_node {
name: "leo-oct"
type: "LEO"
node_interface: {
interface_id: "optical-link"
wireless: {
transceiver_model_id: {
platform_id: "platform/leo/sda-oct-class-terminal"
transceiver_model_id: "oct-optical-transceiver"
}
}
}
}
76 changes: 76 additions & 0 deletions contrib/sda_oct_class_terminal/oct_platform_definition.textproto
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
# Copyright 2026 James Sweeney.
#
# Licensed 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.

# SDA OCT Standard 3.1.0 class space terminal on a low-Earth-orbit platform. Motion is left to the scenario
# (attach a TLE or ephemeris in `coordinates`); the transceiver model is what this contribution provides.
group {
type: PLATFORM_DEFINITION
}
id: "platform/leo/sda-oct-class-terminal"
platform {
name: "leo-oct"
type: "LEO"
transceiver_model: {
id: "oct-optical-transceiver"
transmitter: {
name: "oct-tx"
channel_set: {
key: "band/optical/sda-oct-c-band-ch0"
value: {
channel: {
key: 193100000000000 # spec grid, M = 0: 193.1 THz (1552.52 nm)
value: {
max_power_watts: 1.0 # assumed
}
}
}
}
}
receiver: {
name: "oct-rx"
channel_set: {
key: "band/optical/sda-oct-c-band-ch0"
value: {
center_frequency_hz: 193100000000000
}
}
signal_processing_step: {
photodetector: {
avalanche_photodiode: {
field_of_view_rad: 0.0001 # assumed
bandwidth_hz: 2500000000 # assumed, 2.5 GHz
noise_temperature_k: 300 # assumed
efficiency_percent: 0.80 # assumed
dark_current_amp: 1e-9 # assumed
load_impedance_ohm: 50 # assumed
noise_factor: 4 # assumed
gain_db: 10 # assumed
optical_bandpass_filter_bandwidth_hz: 100000000000 # spec channel width, OCT-022
wavelength_m: 0.0000015525 # spec grid, M = 0 (193.1 THz)
}
}
}
}
antenna: {
name: "oct-aperture"
antenna_pattern_id: "gain/payload/optical/sda-oct-class-terminal"
targeting: {}
constraints: {
azimuth_angle_rate: { maximum_rate_deg_per_sec: 2.0 } # assumed
elevation_angle_rate: { maximum_rate_deg_per_sec: 2.0 } # assumed
minimum_sun_angle_deg: 5.0 # assumed
}
}
}
}
27 changes: 27 additions & 0 deletions contrib/sda_oct_class_terminal/ogs_antenna_pattern.textproto
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Copyright 2026 James Sweeney.
#
# Licensed 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.

# Optical ground station aperture for the space-to-ground link. All values ASSUMED (see README.md).
group {
type: ANTENNA_PATTERN
}
id: "gain/ground/optical/ogs-0.4m"
antenna_pattern {
gaussian_optical_pattern: {
diameter_m: 0.40 # assumed
efficiency_percent: 0.60 # assumed
divergence_angle_rad: 0.00002 # assumed (uplink beacon-class beam)
pointing_error_rad: 0.000004 # assumed
}
}
31 changes: 31 additions & 0 deletions contrib/sda_oct_class_terminal/ogs_network_node.textproto
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Copyright 2026 James Sweeney.
#
# Licensed 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.

group {
type: NETWORK_NODE
}
id: "node/ground/ogs-0.4m"
network_node {
name: "ogs"
type: "GROUND_STATION"
node_interface: {
interface_id: "optical-link"
wireless: {
transceiver_model_id: {
platform_id: "platform/ground/ogs-0.4m"
transceiver_model_id: "ogs-optical-transceiver"
}
}
}
}
83 changes: 83 additions & 0 deletions contrib/sda_oct_class_terminal/ogs_platform_definition.textproto
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# Copyright 2026 James Sweeney.
#
# Licensed 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.

# Optical ground station for the space-to-ground link. Place it with `coordinates.geodetic_wgs84` in the scenario.
group {
type: PLATFORM_DEFINITION
}
id: "platform/ground/ogs-0.4m"
platform {
name: "ogs"
type: "GROUND_STATION"
transceiver_model: {
id: "ogs-optical-transceiver"
transmitter: {
name: "ogs-tx"
channel_set: {
key: "band/optical/sda-oct-c-band-ch0"
value: {
channel: {
key: 193100000000000
value: {
max_power_watts: 1.0 # assumed
}
}
}
}
}
receiver: {
name: "ogs-rx"
channel_set: {
key: "band/optical/sda-oct-c-band-ch0"
value: {
center_frequency_hz: 193100000000000
}
}
signal_processing_step: {
photodetector: {
avalanche_photodiode: {
field_of_view_rad: 0.0002 # assumed
bandwidth_hz: 2500000000 # assumed, 2.5 GHz
noise_temperature_k: 300 # assumed
efficiency_percent: 0.80 # assumed
dark_current_amp: 1e-9 # assumed
load_impedance_ohm: 50 # assumed
noise_factor: 4 # assumed
gain_db: 10 # assumed
optical_bandpass_filter_bandwidth_hz: 100000000000 # spec channel width, OCT-022
wavelength_m: 0.0000015525 # spec grid, M = 0 (193.1 THz)
}
}
}
}
antenna: {
name: "ogs-aperture"
antenna_pattern_id: "gain/ground/optical/ogs-0.4m"
targeting: {}
azimuth_elevation_mask: {
azimuth_deg: 0
maximum_obscured_elevation_deg: 20 # assumed 20 deg elevation mask, all azimuths
}
azimuth_elevation_mask: {
azimuth_deg: 360
maximum_obscured_elevation_deg: 20
}
constraints: {
azimuth_angle_rate: { maximum_rate_deg_per_sec: 5.0 } # assumed
elevation_angle_rate: { maximum_rate_deg_per_sec: 5.0 } # assumed
minimum_sun_angle_deg: 5.0 # assumed
}
}
}
}