Skip to main content
The communication modules model radio frequency links between spacecraft and ground stations. The simpleAntenna module models an individual antenna as a 2D Gaussian beam, and the linkBudget module computes end-to-end link performance between any two antenna modules.
Both simpleAntenna and linkBudget are currently in beta and may change in future releases.

Antenna

Models a directional antenna mounted on a spacecraft or placed at a ground station. The radiation pattern is approximated as a 2D Gaussian beam parameterized by directivity and beam shape ratio. The module computes EIRP (for transmitting), G/T (for receiving), and noise power.Configuration parameters
ParameterUnitDescription
FrequencyHzOperating frequency (30 MHz – 60 GHz)
BandwidthHzChannel bandwidth
DirectivitydBAntenna directivity (must be > 9 dB)
Beam shape ratio kRatio of HPBW in azimuth to elevation (k = 1 for symmetric beam)
Transmit power P_TxWRF transmit power
Receiver noise temperature T_EKEquivalent noise temperature of the receiver
Radiation efficiency η_rAntenna radiation efficiency (0 < η ≤ 1)
Messages
MessageTypeDirectionDescription
scStateInMsgSCStatesMsgPayloadInputSpacecraft state (space-based antennas)
groundStateInMsgGroundStateMsgPayloadInputGround state (ground-based antennas)
antennaSetStateInMsgAntennaStateMsgPayloadInput (optional)Set antenna mode (Off/Rx/Tx/RxTx)
sunInMsgSpicePlanetStateMsgPayloadInput (optional)Sun position for sky noise calculation
sunEclipseInMsgEclipseMsgPayloadInput (optional)Eclipse state for solar noise contribution
antennaOutMsgAntennaLogMsgPayloadOutputEIRP, G/T, noise power, and antenna state
from Basilisk.simulation import simpleAntenna

antenna = simpleAntenna.SimpleAntenna()
antenna.ModelTag = 'commAntenna'

# Required parameters (S-band example)
antenna.setAntennaName('CommAntenna')
antenna.setAntennaFrequency(2.2e9)          # [Hz]
antenna.setAntennaBandwidth(5e6)            # [Hz]
antenna.setAntennaDirectivity_dB(20.0)      # [dB] > 9 dB
antenna.setAntennaHpbwRatio(1.0)            # [-] symmetric beam
antenna.setAntennaP_Tx(100.0)               # [W]
antenna.setAntennaEquivalentNoiseTemp(50.0) # [K]
antenna.setAntennaRadEfficiency(0.55)       # [-]

# Connect to spacecraft state (space-based)
antenna.scStateInMsg.subscribeTo(scObject.scStateOutMsg)

# Optional: set antenna position/orientation offset
antenna.setAntennaPositionBodyFrame([0.5, 0.0, 0.0])    # [m]
antenna.setAntennaOrientationBodyFrame([0.0, 0.0, 0.0]) # MRP

# Set antenna mode directly or via input message
antenna.setAntennaState(simpleAntenna.AntennaTypes.ANTENNA_RXTX)

# Optional: enable sky noise using Haslam map
antenna.setUseHaslamMap(True)
antenna.sunInMsg.subscribeTo(gravFactory.spiceObject.planetStateOutMsgs[sunIdx])
antenna.addPlanetToModel(gravFactory.spiceObject.planetStateOutMsgs[earthIdx])
antenna.sunEclipseInMsg.subscribeTo(eclipseObject.eclipseOutMsgs[0])

sim.AddModelToTask(taskName, antenna)
Antenna states
ConstantValueDescription
ANTENNA_OFF0No transmission or reception
ANTENNA_RX1Reception only
ANTENNA_TX2Transmission only
ANTENNA_RXTX3Simultaneous Tx and Rx
Supported link configurations
  • Spacecraft ↔ Spacecraft
  • Spacecraft ↔ Ground (Earth)
Ground ↔ Ground links are not supported.
Computes the end-to-end radio link budget between two simpleAntenna modules. The primary output is the Carrier-to-Noise Ratio (CNR) for each receiving antenna.The link budget equation is:
P_Rx [dBW] = P_EIRP + G_Rx − L_FSPL − L_atm − L_point − L_freq
Loss terms
TermDescriptionAlways computed
L_FSPLFree space path lossYes
L_atmAtmospheric attenuation (ITU-R P.676, space-ground only)Optional
L_pointAntenna pointing error lossOptional (default on)
L_freqFrequency offset / bandwidth overlap lossOptional (default on)
Messages
MessageTypeDirectionDescription
antennaInPayload_1AntennaLogMsgPayloadInputOutput from antenna 1
antennaInPayload_2AntennaLogMsgPayloadInputOutput from antenna 2
linkBudgetOutPayloadLinkBudgetMsgPayloadOutputCNR, distance, bandwidth, and individual losses
from Basilisk.simulation import linkBudget

lb = linkBudget.LinkBudget()
lb.ModelTag = 'linkBudget'

# Connect two antenna output messages
lb.antennaInPayload_1.subscribeTo(antenna1.antennaOutMsg)
lb.antennaInPayload_2.subscribeTo(antenna2.antennaOutMsg)

# Configure optional loss terms
lb.atmosAtt = True    # enable atmospheric attenuation (space-ground only)
lb.pointingLoss = True
lb.freqLoss = True

sim.AddModelToTask(taskName, lb)

# Record outputs
lbLog = lb.linkBudgetOutPayload.recorder()
sim.AddModelToTask(taskName, lbLog)
After running the simulation, access logged results:
CNR1     = lbLog.CNR1       # [-]  Carrier-to-Noise Ratio at antenna 1
CNR2     = lbLog.CNR2       # [-]  Carrier-to-Noise Ratio at antenna 2
distance = lbLog.distance   # [m]  Distance between antennas
bw       = lbLog.bandwidth  # [Hz] Overlapping bandwidth
freq     = lbLog.frequency  # [Hz] Center frequency

# Retrieve individual loss terms
L_FSPL  = lb.getL_FSPL()    # [dB]
L_atm   = lb.getL_atm()     # [dB]
L_point = lb.getL_point()   # [dB]
L_freq  = lb.getL_freq()    # [dB]
Atmospheric attenuation notes
  • Valid for frequencies from 1 GHz to 1000 GHz (ITU-R P.676-13)
  • Minimum elevation angle: 5° (lower angles cause numerical instability)
  • Clear-sky model only — rain, cloud, and ionospheric effects are not included
  • Automatically disabled for space-to-space links
  • The atmospheric lookup table is precomputed at initialization; re-initialize if the ground antenna frequency changes

Build docs developers (and LLMs) love