Configuration¶
FLoRaSat scenarios are configured through two complementary file types:
.nedfiles — define the network structure (which modules exist and how they connect).inifiles — set parameter values for each module
In practice, you mostly edit .ini files. The .ned file for each scenario (package.ned) is usually shared across runs.
.ini File Structure¶
A top-level .ini file imports sub-files and defines one or more named configurations:
[General]
network = Florasat.Custom_default.Custom
rng-class = "cMersenneTwister"
repeat = 1
# Import shared settings
include configurations/Scenarios.ini
include stations/WorldWide-20.ini
Named configurations use extends to compose from abstract base configurations:
Abstract configurations (marked abstract = true) cannot be run directly but serve as reusable building blocks.
OMNeT++ Parameter Notation¶
Parameters are addressed using module path wildcards:
| Pattern | Meaning |
|---|---|
*.terminal[*].dlk.mac.Ntx = 4 |
Set Ntx on all terminals' MAC layer |
*.terminal[0].mob.centerLatitude = 43.6 |
Set latitude of terminal 0 only |
**.Ntx = 4 |
Match Ntx anywhere in the hierarchy |
${Ntx = 2, 4, 6, 8} |
Parameter sweep — runs a separate simulation for each value |
Terminal Parameters¶
Positioning (*.terminal[*].mob.*)¶
| Parameter | Description | Example |
|---|---|---|
centerLatitude |
Latitude of the center of the deployment zone | 43.6 (Toulouse) |
centerLongitude |
Longitude of the center | 1.433333 |
deploymentRadius |
Radius (degrees) for random placement around the center; 0.0 places all terminals at the exact center |
0.0 |
Packet Generation (*.terminal[*].app.*)¶
| Parameter | Description | Example |
|---|---|---|
timeToFirstPacket |
Delay before the first packet is generated | 0s |
timeToNextPacket |
Interval between successive packets | 3600s |
MAC Layer — Blind Mode (*.terminal[*].dlk.mac.*)¶
| Parameter | Description | Example |
|---|---|---|
ttwDuration |
Total transmission time window per packet | 1800s |
Ntx |
Number of transmission slots within the window | 4 |
numConcurrentTx |
Number of packets handled simultaneously | 1 |
ttxStart_min |
Minimum random delay before transmitting in a slot | 0s |
ttxStart_max |
Maximum random delay before transmitting in a slot | 30s |
ttxIdle_min |
Minimum idle time between transmissions within a slot | 0s |
ttxIdle_max |
Maximum idle time between transmissions within a slot | 0s |
The slot duration is ttwDuration / Ntx. The terminal transmits once per slot at a uniformly random offset within [ttxStart_min, ttxStart_max].
MAC Layer — Satellite Detection Mode (*.terminal[*].dlk.mac.*)¶
| Parameter | Description | Example |
|---|---|---|
enableSatDetect |
Enable satellite detection before transmitting | true |
satelliteDetectionProbability |
Probability of detecting a satellite that is actually in view | 0.9 |
minimumElevation |
Minimum elevation angle (degrees) for a satellite to be considered detectable | 5.0 |
Ndetect |
Number of detection batches per slot | 1 |
NsdSync |
Detection periods per batch | 1 |
detectInitialListen |
Initial listening duration (seconds) | 0.330 |
neededLocalisation |
true = spread transmissions over successful detection windows; false = burst on first detection |
true |
satDetectMaxSuccessfulWindows |
Maximum number of slots to transmit in when in localisation mode | 2 |
enableSatDetectFallback |
Automatically switch back to blind mode when detection success rate falls below a threshold | true |
Radio Physical Layer (*.terminal[*].phy.radio.*)¶
| Parameter | Description | Example |
|---|---|---|
transmitter.power |
Uplink transmit power | 300mW |
transmitter.centerFrequency |
Carrier frequency | 402MHz |
transmitter.bandwidth |
Channel bandwidth | 100kHz |
receiver.centerFrequency |
Receive center frequency | 402MHz |
receiver.bandwidth |
Receive bandwidth | 100kHz |
Satellite Parameters¶
Orbital Parameters (*.satellite[*].NoradModule.*)¶
These are set per-satellite and define each satellite's initial orbital state.
| Parameter | Description | Example |
|---|---|---|
raan |
Right Ascension of Ascending Node (degrees) | 0.0 |
meanAnomaly |
Mean anomaly at epoch (degrees) | 0.0 |
inclination |
Orbital inclination (degrees) | 86.4 |
altitude |
Orbital altitude (km) | 781 |
eccentricity |
Orbital eccentricity | 0.0 |
epochYear |
Epoch year (2-digit) | 20 |
epochDay |
Epoch day of year (decimal) | 1.5 |
Satellite Radio — DSL (*.satellite[*].phyDSL.radio.*)¶
| Parameter | Description | Example |
|---|---|---|
receiver.centerFrequency |
Center frequency to listen on | 402MHz |
receiver.bandwidth |
Receive bandwidth | 100kHz |
Propagation and Link Budget¶
Radio Medium (**.radioMedium.*)¶
| Parameter | Description | Example |
|---|---|---|
typename |
Medium type | "CustomMedium" |
minimumElevationTermSat |
Minimum elevation for terminal-satellite links | 5.0 |
useFieldMask |
Enable the terminal-side field mask (local horizon obstruction) on terminal-satellite links | false |
fieldMaskFile |
CSV describing the field mask (Azimuth,Elevation,Attenuation); only read when useFieldMask is true |
"devices/field_mask/wall_north.csv" |
backgroundNoise.power |
Background noise power | 0dBm |
Terminal Field Mask¶
The field mask models a local horizon obstruction around the terminals (a wall, a valley, terrain). For every terminal-satellite link the medium computes the direction to the satellite as an (azimuth, elevation) pair and looks up the mask:
- A satellite whose direction falls in a fully blocked region is treated as not visible, and the link is suppressed (no reception attempted).
- A satellite in a partially obstructed region keeps the link, but the obstruction attenuation is subtracted from the received power in the link budget (Analog Model).
The mask is a CSV with a header row and three columns:
| Column | Meaning |
|---|---|
Azimuth |
Bearing in degrees, [0, 360), clockwise from North |
Elevation |
Elevation threshold in degrees. Each azimuth profile applies below its threshold; values are interpolated linearly in elevation between samples, and across neighbouring azimuth profiles (with wrap-around at 360°). Above the highest threshold of a profile, no obstruction is applied. |
Attenuation |
Obstruction loss in dB. The special value -1.0 is the blocked sentinel (link fully obstructed and dropped). Any other positive value is applied as partial attenuation to the received power. |
Configure it in the .ini:
**.radioMedium.useFieldMask = true
**.radioMedium.fieldMaskFile = "devices/field_mask/wall_north.csv"
Analog Model (**.radioMedium.analogModel.*)¶
| Parameter | Description | Example |
|---|---|---|
pathLossExponent |
Path loss exponent (2 = free space) | 2.0 |
rxAntennaGain_a, _b, _c |
Coefficients of the receive antenna gain polynomial in elevation angle | 0, 0, 1 |
txAntennaPatternAdjustement_dB |
Fixed gain adjustment for the transmit antenna pattern | 0.0 |
obstructionLossdB |
Additional obstruction loss | 0dB |
enableDoppler |
Enable Doppler shift modelling | false |
Path Loss Model (**.radioMedium.pathLoss.*)¶
| Parameter | Description | Example |
|---|---|---|
typename |
Path loss module | "CustomPHYPathLoss" |
polarizationLoss |
Polarization mismatch loss | 3dB |
fadingSigma |
Log-normal fading standard deviation | 4dB |
receiverSystemLoss |
Receiver chain implementation loss | 4dB |
decodingImplementation |
Demodulation/decoding implementation loss | 1.5dB |
noiseFigureEnhancement |
Noise figure penalty | 3dB |
Topology Control¶
| Parameter | Description | Example |
|---|---|---|
*.topologyControl.updateInterval |
How often satellite positions and links are recomputed | 1s |
*.topologyControl.walkerType |
Constellation type: "STAR" or "DELTA" |
"STAR" |
**.minimumElevation |
Minimum elevation for satellite-to-ground-station links | 5.0 |
**.intraPlaneIslDisabled |
Disable intra-plane ISLs | false |
**.interPlaneIslDisabled |
Disable inter-plane ISLs | false |
*.**.numGroundLinks |
Maximum number of simultaneous ground links per satellite | 40 |
Ground Station Parameters¶
| Parameter | Description | Example |
|---|---|---|
*.station[*].mobility.latitude |
Station latitude (degrees) | 49.235 |
*.station[*].mobility.longitude |
Station longitude (degrees) | 6.982 |
*.station[*].mobility.altitude |
Station altitude above sea level, in meters | 199 |
*.station[*].fieldMaskFile |
Per-station field mask CSV (Azimuth,Elevation,Attenuation). Empty string disables the mask |
"stations/field_mask/valley5deg.csv" |
Station Field Mask¶
Each ground station can have its own field mask describing the local horizon obstruction (surrounding terrain or buildings). It uses the same CSV format as the Terminal Field Mask. When a satellite's (azimuth, elevation) as seen from the station falls in a blocked region (attenuation -1), no station-satellite feeder link is created during topology updates.
*.station[0].fieldMaskFile = "stations/field_mask/valley5deg.csv"
*.station[0].mobility.altitude = 199 # meters above sea level
Note
The station field mask acts as a binary visibility filter on feeder links — the -1 blocked sentinel suppresses the link. (Partial dB attenuation of the feeder-link budget is applied on the terminal-satellite side only.) Station altitude is given in meters and is used both for the elevation/azimuth geometry and the slant-range distance.
Simulation Control¶
| Parameter | Description | Example |
|---|---|---|
sim-time-limit |
Total simulated time | 86400s |
repeat |
Number of independent replications | 10 |
seed-0-mt |
Random seed for the first RNG stream | ${runnumber} |
simtime-resolution |
Simulation time precision (negative = sub-second) | -11 (picoseconds) |
Parameter Sweeps¶
Use OMNeT++'s ${} syntax to iterate over values:
[Config Sweep]
# Run 5 × 3 = 15 simulations
*.terminal[*].dlk.mac.Ntx = ${Ntx = 2, 4, 6, 8, 10}
*.terminal[*].mob.centerLatitude = ${lat = 30.0, 50.0, 70.0}
Use ! to pair values instead of taking the full product:
# Run 5 simulations, one per pair
*.terminal[*].dlk.mac.Ntx = ${Ntx = 2, 4, 6, 8, 10 ! lat}
*.terminal[*].mob.centerLatitude = ${lat = 30.0, 40.0, 50.0, 60.0, 70.0}
See Parameters Reference for the complete parameter list.