FERS 1.0.0
The Flexible Extensible Radar Simulator
Loading...
Searching...
No Matches
xml_serializer_utils.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-only
2//
3// Copyright (c) 2026-present FERS Contributors (see AUTHORS.md).
4//
5// See the GNU GPLv2 LICENSE file in the FERS project root for more information.
6
8
9#include <cmath>
10
12#include "core/world.h"
13#include "math/coord.h"
14#include "math/path.h"
15#include "math/rotation_path.h"
16#include "radar/platform.h"
17#include "radar/receiver.h"
18#include "radar/target.h"
19#include "radar/transmitter.h"
21#include "signal/radar_signal.h"
23#include "timing/timing.h"
24
26{
27 void addChildWithText(const XmlElement& parent, const std::string& name, const std::string& text)
28 {
29 parent.addChild(name).setText(text);
30 }
31
32 void setAttributeFromBool(const XmlElement& element, const std::string& name, const bool value)
33 {
34 element.setAttribute(name, value ? "true" : "false");
35 }
36
37 void serializeSchedule(const std::vector<radar::SchedulePeriod>& schedule, const XmlElement& parent)
38 {
39 if (schedule.empty())
40 {
41 return;
42 }
43 const XmlElement sched_elem = parent.addChild("schedule");
44 for (const auto& period : schedule)
45 {
46 XmlElement p_elem = sched_elem.addChild("period");
47 p_elem.setAttribute("start", std::to_string(period.start));
48 p_elem.setAttribute("end", std::to_string(period.end));
49 }
50 }
51
53 {
54 addChildWithNumber(parent, "starttime", p.start);
55 addChildWithNumber(parent, "endtime", p.end);
56 addChildWithNumber(parent, "rate", p.rate);
57
59 {
60 addChildWithNumber(parent, "c", p.c);
61 }
62 if (p.sim_sampling_rate != 1000.0)
63 {
64 addChildWithNumber(parent, "simSamplingRate", p.sim_sampling_rate);
65 }
66 if (p.random_seed)
67 {
68 addChildWithNumber(parent, "randomseed", *p.random_seed);
69 }
70 if (p.adc_bits != 0)
71 {
72 addChildWithNumber(parent, "adc_bits", p.adc_bits);
73 }
74 if (p.oversample_ratio != 1)
75 {
76 addChildWithNumber(parent, "oversample", p.oversample_ratio);
77 }
79 {
80 addChildWithText(parent, "rotationangleunit",
82 }
83
84 const XmlElement origin = parent.addChild("origin");
85 origin.setAttribute("latitude", std::to_string(p.origin_latitude));
86 origin.setAttribute("longitude", std::to_string(p.origin_longitude));
87 origin.setAttribute("altitude", std::to_string(p.origin_altitude));
88
89 const XmlElement cs = parent.addChild("coordinatesystem");
90 switch (p.coordinate_frame)
91 {
93 cs.setAttribute("frame", "ENU");
94 break;
96 cs.setAttribute("frame", "UTM");
97 cs.setAttribute("zone", std::to_string(p.utm_zone));
98 cs.setAttribute("hemisphere", p.utm_north_hemisphere ? "N" : "S");
99 break;
101 cs.setAttribute("frame", "ECEF");
102 break;
103 }
104 }
105
106 void serializeWaveform(const fers_signal::RadarSignal& waveform, const XmlElement& parent)
107 {
108 parent.setAttribute("name", waveform.getName());
109
110 addChildWithNumber(parent, "power", waveform.getPower());
111 addChildWithNumber(parent, "carrier_frequency", waveform.getCarrier());
112
113 if (dynamic_cast<const fers_signal::CwSignal*>(waveform.getSignal()) != nullptr)
114 {
115 (void)parent.addChild("cw"); // Empty element
116 }
117 else
118 {
119 const XmlElement pulsed_file = parent.addChild("pulsed_from_file");
120 const auto& filename = waveform.getFilename();
121 pulsed_file.setAttribute("filename", filename.value_or(""));
122 }
123 }
124
126 {
127 parent.setAttribute("name", timing.getName());
128 setAttributeFromBool(parent, "synconpulse", timing.getSyncOnPulse());
129
130 addChildWithNumber(parent, "frequency", timing.getFrequency());
131 if (const auto val = timing.getFreqOffset())
132 {
133 addChildWithNumber(parent, "freq_offset", *val);
134 }
135 if (const auto val = timing.getRandomFreqOffsetStdev())
136 {
137 addChildWithNumber(parent, "random_freq_offset_stdev", *val);
138 }
139 if (const auto val = timing.getPhaseOffset())
140 {
141 addChildWithNumber(parent, "phase_offset", *val);
142 }
143 if (const auto val = timing.getRandomPhaseOffsetStdev())
144 {
145 addChildWithNumber(parent, "random_phase_offset_stdev", *val);
146 }
147
148 std::vector<RealType> alphas, weights;
149 timing.copyAlphas(alphas, weights);
150 for (size_t i = 0; i < alphas.size(); ++i)
151 {
152 XmlElement entry = parent.addChild("noise_entry");
153 addChildWithNumber(entry, "alpha", alphas[i]);
154 addChildWithNumber(entry, "weight", weights[i]);
155 }
156 }
157
159 {
160 parent.setAttribute("name", antenna.getName());
161
162 if (const auto* sinc = dynamic_cast<const antenna::Sinc*>(&antenna))
163 {
164 parent.setAttribute("pattern", "sinc");
165 addChildWithNumber(parent, "alpha", sinc->getAlpha());
166 addChildWithNumber(parent, "beta", sinc->getBeta());
167 addChildWithNumber(parent, "gamma", sinc->getGamma());
168 }
169 else if (const auto* gaussian = dynamic_cast<const antenna::Gaussian*>(&antenna))
170 {
171 parent.setAttribute("pattern", "gaussian");
172 addChildWithNumber(parent, "azscale", gaussian->getAzimuthScale());
173 addChildWithNumber(parent, "elscale", gaussian->getElevationScale());
174 }
175 else if (const auto* sh = dynamic_cast<const antenna::SquareHorn*>(&antenna))
176 {
177 parent.setAttribute("pattern", "squarehorn");
178 addChildWithNumber(parent, "diameter", sh->getDimension());
179 }
180 else if (const auto* parabolic = dynamic_cast<const antenna::Parabolic*>(&antenna))
181 {
182 parent.setAttribute("pattern", "parabolic");
183 addChildWithNumber(parent, "diameter", parabolic->getDiameter());
184 }
185 else if (const auto* xml_ant = dynamic_cast<const antenna::XmlAntenna*>(&antenna))
186 {
187 parent.setAttribute("pattern", "xml");
188 parent.setAttribute("filename", xml_ant->getFilename());
189 }
190 else if (const auto* h5_ant = dynamic_cast<const antenna::H5Antenna*>(&antenna))
191 {
192 parent.setAttribute("pattern", "file");
193 parent.setAttribute("filename", h5_ant->getFilename());
194 }
195 else
196 {
197 parent.setAttribute("pattern", "isotropic");
198 }
199
200 if (antenna.getEfficiencyFactor() != 1.0)
201 {
202 addChildWithNumber(parent, "efficiency", antenna.getEfficiencyFactor());
203 }
204 }
205
206 void serializeMotionPath(const math::Path& path, const XmlElement& parent)
207 {
208 switch (path.getType())
209 {
211 parent.setAttribute("interpolation", "static");
212 break;
214 parent.setAttribute("interpolation", "linear");
215 break;
217 parent.setAttribute("interpolation", "cubic");
218 break;
219 }
220
221 for (const auto& [pos, t] : path.getCoords())
222 {
223 XmlElement wp_elem = parent.addChild("positionwaypoint");
224 addChildWithNumber(wp_elem, "x", pos.x);
225 addChildWithNumber(wp_elem, "y", pos.y);
226 addChildWithNumber(wp_elem, "altitude", pos.z);
227 addChildWithNumber(wp_elem, "time", t);
228 }
229 }
230
231 void serializeRotation(const math::RotationPath& rotPath, const XmlElement& parent)
232 {
234 {
235 const XmlElement fixed_elem = parent.addChild("fixedrotation");
236 const auto start = rotPath.getStart();
237 const auto rate = rotPath.getRate();
238 const auto unit = params::rotationAngleUnit();
239
240 RealType start_az = rotation_angle_utils::internal_azimuth_to_external(start.azimuth, unit);
242 {
243 start_az = std::fmod(start_az + 360.0, 360.0);
244 }
245 const RealType start_el = rotation_angle_utils::internal_elevation_to_external(start.elevation, unit);
246 const RealType rate_az = rotation_angle_utils::internal_azimuth_rate_to_external(rate.azimuth, unit);
247 const RealType rate_el = rotation_angle_utils::internal_elevation_rate_to_external(rate.elevation, unit);
248
249 addChildWithNumber(fixed_elem, "startazimuth", start_az);
250 addChildWithNumber(fixed_elem, "startelevation", start_el);
251 addChildWithNumber(fixed_elem, "azimuthrate", rate_az);
252 addChildWithNumber(fixed_elem, "elevationrate", rate_el);
253 }
254 else
255 {
256 const XmlElement rot_elem = parent.addChild("rotationpath");
257 switch (rotPath.getType())
258 {
260 rot_elem.setAttribute("interpolation", "static");
261 break;
263 rot_elem.setAttribute("interpolation", "linear");
264 break;
266 rot_elem.setAttribute("interpolation", "cubic");
267 break;
268 default:
269 break;
270 }
271 const auto unit = params::rotationAngleUnit();
272 for (const auto& wp : rotPath.getCoords())
273 {
274 XmlElement wp_elem = rot_elem.addChild("rotationwaypoint");
277 {
278 azimuth = std::fmod(azimuth + 360.0, 360.0);
279 }
280 const RealType elevation = rotation_angle_utils::internal_elevation_to_external(wp.elevation, unit);
281 addChildWithNumber(wp_elem, "azimuth", azimuth);
282 addChildWithNumber(wp_elem, "elevation", elevation);
283 addChildWithNumber(wp_elem, "time", wp.t);
284 }
285 }
286 }
287
289 {
290 const XmlElement tx_elem = parent.addChild("transmitter");
291 tx_elem.setAttribute("name", tx.getName());
292 tx_elem.setAttribute("waveform", (tx.getSignal() != nullptr) ? tx.getSignal()->getName() : "");
293 tx_elem.setAttribute("antenna", (tx.getAntenna() != nullptr) ? tx.getAntenna()->getName() : "");
294 tx_elem.setAttribute("timing", tx.getTiming() ? tx.getTiming()->getName() : "");
295
297 {
298 const XmlElement mode_elem = tx_elem.addChild("pulsed_mode");
299 addChildWithNumber(mode_elem, "prf", tx.getPrf());
300 }
301 else
302 {
303 (void)tx_elem.addChild("cw_mode");
304 }
305
306 serializeSchedule(tx.getSchedule(), tx_elem);
307 }
308
309 void serializeReceiver(const radar::Receiver& rx, const XmlElement& parent)
310 {
311 const XmlElement rx_elem = parent.addChild("receiver");
312 rx_elem.setAttribute("name", rx.getName());
313 rx_elem.setAttribute("antenna", (rx.getAntenna() != nullptr) ? rx.getAntenna()->getName() : "");
314 rx_elem.setAttribute("timing", rx.getTiming() ? rx.getTiming()->getName() : "");
317
319 {
320 const XmlElement mode_elem = rx_elem.addChild("pulsed_mode");
321 addChildWithNumber(mode_elem, "prf", rx.getWindowPrf());
322 addChildWithNumber(mode_elem, "window_skip", rx.getWindowSkip());
323 addChildWithNumber(mode_elem, "window_length", rx.getWindowLength());
324 }
325 else
326 {
327 (void)rx_elem.addChild("cw_mode");
328 }
329
330 if (rx.getNoiseTemperature() > 0)
331 {
332 addChildWithNumber(rx_elem, "noise_temp", rx.getNoiseTemperature());
333 }
334
335 serializeSchedule(rx.getSchedule(), rx_elem);
336 }
337
338 void serializeMonostatic(const radar::Transmitter& tx, const radar::Receiver& rx, const XmlElement& parent)
339 {
340 const XmlElement mono_elem = parent.addChild("monostatic");
341 mono_elem.setAttribute("name", tx.getName());
342 mono_elem.setAttribute("antenna", (tx.getAntenna() != nullptr) ? tx.getAntenna()->getName() : "");
343 mono_elem.setAttribute("waveform", (tx.getSignal() != nullptr) ? tx.getSignal()->getName() : "");
344 mono_elem.setAttribute("timing", tx.getTiming() ? tx.getTiming()->getName() : "");
347
349 {
350 const XmlElement mode_elem = mono_elem.addChild("pulsed_mode");
351 addChildWithNumber(mode_elem, "prf", tx.getPrf());
352 addChildWithNumber(mode_elem, "window_skip", rx.getWindowSkip());
353 addChildWithNumber(mode_elem, "window_length", rx.getWindowLength());
354 }
355 else
356 {
357 (void)mono_elem.addChild("cw_mode");
358 }
359
360 if (rx.getNoiseTemperature() > 0)
361 {
362 addChildWithNumber(mono_elem, "noise_temp", rx.getNoiseTemperature());
363 }
364
365 serializeSchedule(tx.getSchedule(), mono_elem);
366 }
367
368 void serializeTarget(const radar::Target& target, const XmlElement& parent)
369 {
370 const XmlElement target_elem = parent.addChild("target");
371 target_elem.setAttribute("name", target.getName());
372
373 const XmlElement rcs_elem = target_elem.addChild("rcs");
374 if (const auto* iso = dynamic_cast<const radar::IsoTarget*>(&target))
375 {
376 rcs_elem.setAttribute("type", "isotropic");
377 addChildWithNumber(rcs_elem, "value", iso->getConstRcs());
378 }
379 else if (const auto* file_target = dynamic_cast<const radar::FileTarget*>(&target))
380 {
381 rcs_elem.setAttribute("type", "file");
382 rcs_elem.setAttribute("filename", file_target->getFilename());
383 }
384
385 // Serialize fluctuation model if present
386 if (const auto* model = target.getFluctuationModel())
387 {
388 if (const auto* chi = dynamic_cast<const radar::RcsChiSquare*>(model))
389 {
390 XmlElement model_elem = target_elem.addChild("model");
391 model_elem.setAttribute("type", "chisquare");
392 addChildWithNumber(model_elem, "k", chi->getK());
393 }
394 }
395 }
396
397 void serializePlatform(const radar::Platform& platform, const core::World& world, const XmlElement& parent)
398 {
399 parent.setAttribute("name", platform.getName());
400
401 const XmlElement motion_elem = parent.addChild("motionpath");
402 serializeMotionPath(*platform.getMotionPath(), motion_elem);
403
404 serializeRotation(*platform.getRotationPath(), parent);
405
406 for (const auto& tx : world.getTransmitters())
407 {
408 if (tx->getPlatform() == &platform)
409 {
410 if (tx->getAttached() != nullptr)
411 {
412 serializeMonostatic(*tx, *dynamic_cast<const radar::Receiver*>(tx->getAttached()), parent);
413 }
414 else
415 {
416 serializeTransmitter(*tx, parent);
417 }
418 }
419 }
420
421 for (const auto& rx : world.getReceivers())
422 {
423 if (rx->getPlatform() == &platform && (rx->getAttached() == nullptr))
424 {
425 serializeReceiver(*rx, parent);
426 }
427 }
428
429 for (const auto& target : world.getTargets())
430 {
431 if (target->getPlatform() == &platform)
432 {
433 serializeTarget(*target, parent);
434 }
435 }
436 }
437}
Header file defining various types of antennas and their gain patterns.
Class representing a node in an XML document.
XmlElement addChild(const std::string_view name) const noexcept
Add a child element to the current node.
void setAttribute(const std::string_view name, const std::string_view value) const
Set an attribute on the XML element.
void setText(const std::string_view text) const
Set the text content of the XML element.
Abstract base class representing an antenna.
std::string getName() const noexcept
Retrieves the name of the antenna.
Represents a Gaussian-shaped antenna gain pattern.
Represents an antenna whose gain pattern is loaded from a HDF5 file.
Represents a parabolic reflector antenna.
Represents a sinc function-based antenna gain pattern.
Represents a square horn antenna.
Represents an antenna whose gain pattern is defined by an XML file.
The World class manages the simulator environment.
Definition world.h:39
const std::vector< std::unique_ptr< radar::Target > > & getTargets() const noexcept
Retrieves the list of radar targets.
Definition world.h:200
const std::vector< std::unique_ptr< radar::Transmitter > > & getTransmitters() const noexcept
Retrieves the list of radar transmitters.
Definition world.h:220
const std::vector< std::unique_ptr< radar::Receiver > > & getReceivers() const noexcept
Retrieves the list of radar receivers.
Definition world.h:210
Class representing a radar signal with associated properties.
const std::optional< std::string > & getFilename() const noexcept
Gets the filename associated with this signal.
const std::string & getName() const noexcept
Gets the name of the radar signal.
RealType getCarrier() const noexcept
Gets the carrier frequency of the radar signal.
const Signal * getSignal() const noexcept
Gets the underlying signal object.
RealType getPower() const noexcept
Gets the power of the radar signal.
Represents a path with coordinates and allows for various interpolation methods.
Definition path.h:30
const std::vector< Coord > & getCoords() const noexcept
Gets the list of coordinates in the path.
Definition path.h:83
InterpType getType() const noexcept
Retrieves the current interpolation type of the path.
Definition path.h:76
Manages rotational paths with different interpolation techniques.
InterpType getType() const noexcept
Gets the interpolation type of the path.
RotationCoord getRate() const noexcept
Gets the rate of change for the rotation.
const std::vector< RotationCoord > & getCoords() const noexcept
Gets the list of rotation coordinates.
RotationCoord getStart() const noexcept
Gets the starting rotation coordinate.
File-based radar target.
Definition target.h:226
Isotropic radar target.
Definition target.h:188
const std::string & getName() const noexcept
Retrieves the name of the object.
Definition object.h:79
Represents a simulation platform with motion and rotation paths.
Definition platform.h:32
math::Path * getMotionPath() const noexcept
Gets the motion path of the platform.
Definition platform.h:60
const std::string & getName() const noexcept
Gets the name of the platform.
Definition platform.h:90
math::RotationPath * getRotationPath() const noexcept
Gets the rotation path of the platform.
Definition platform.h:67
const antenna::Antenna * getAntenna() const noexcept
Gets the antenna associated with this radar.
Definition radar_obj.h:90
std::shared_ptr< timing::Timing > getTiming() const
Retrieves the timing source for the radar.
Definition radar_obj.cpp:66
Chi-square distributed RCS model.
Definition target.h:82
Manages radar signal reception and response processing.
Definition receiver.h:37
bool checkFlag(RecvFlag flag) const noexcept
Checks if a specific flag is set.
Definition receiver.h:88
const std::vector< SchedulePeriod > & getSchedule() const noexcept
Retrieves the list of active reception periods.
Definition receiver.h:277
RealType getNoiseTemperature() const noexcept
Retrieves the noise temperature of the receiver.
Definition receiver.h:102
OperationMode getMode() const noexcept
Gets the operational mode of the receiver.
Definition receiver.h:160
RealType getWindowPrf() const noexcept
Retrieves the pulse repetition frequency (PRF) of the radar window.
Definition receiver.h:116
RealType getWindowSkip() const noexcept
Retrieves the window skip time.
Definition receiver.h:123
RealType getWindowLength() const noexcept
Retrieves the radar window length.
Definition receiver.h:109
Base class for radar targets.
Definition target.h:118
const RcsModel * getFluctuationModel() const
Gets the RCS fluctuation model.
Definition target.h:167
Represents a radar transmitter system.
Definition transmitter.h:33
RealType getPrf() const noexcept
Retrieves the pulse repetition frequency (PRF).
Definition transmitter.h:64
fers_signal::RadarSignal * getSignal() const noexcept
Retrieves the radar signal currently being transmitted.
Definition transmitter.h:71
const std::vector< SchedulePeriod > & getSchedule() const noexcept
Retrieves the list of active transmission periods.
OperationMode getMode() const noexcept
Gets the operational mode of the transmitter.
Definition transmitter.h:85
Manages timing properties such as frequency, offsets, and synchronization.
double RealType
Type for real numbers.
Definition config.h:27
Coordinate and rotation structure operations.
@ Degrees
Compass azimuth and elevation expressed in degrees.
@ UTM
Universal Transverse Mercator.
@ ENU
East-North-Up local tangent plane (default)
@ ECEF
Earth-Centered, Earth-Fixed.
RotationAngleUnit rotationAngleUnit() noexcept
Definition parameters.h:286
constexpr std::string_view rotationAngleUnitToken(const RotationAngleUnit unit) noexcept
Definition parameters.h:294
@ PULSED_MODE
The component operates in a pulsed mode.
RealType internal_elevation_to_external(const RealType elevation, const params::RotationAngleUnit unit) noexcept
RealType internal_azimuth_rate_to_external(const RealType azimuth_rate, const params::RotationAngleUnit unit) noexcept
RealType internal_elevation_rate_to_external(const RealType elevation_rate, const params::RotationAngleUnit unit) noexcept
RealType internal_azimuth_to_external(const RealType azimuth, const params::RotationAngleUnit unit) noexcept
void serializeMotionPath(const math::Path &path, const XmlElement &parent)
Serializes a motion path into a parent XML element.
void addChildWithNumber(const XmlElement &parent, const std::string &name, T value)
Adds a child element with the specified numeric content.
void addChildWithText(const XmlElement &parent, const std::string &name, const std::string &text)
Adds a child element with the specified text content.
void serializeReceiver(const radar::Receiver &rx, const XmlElement &parent)
Serializes a receiver into a parent XML element.
void serializeAntenna(const antenna::Antenna &antenna, const XmlElement &parent)
Serializes an antenna into a parent XML element.
void serializeMonostatic(const radar::Transmitter &tx, const radar::Receiver &rx, const XmlElement &parent)
Serializes a monostatic radar setup containing both a transmitter and receiver.
void serializeRotation(const math::RotationPath &rotPath, const XmlElement &parent)
Serializes a rotation path into a parent XML element.
void serializeSchedule(const std::vector< radar::SchedulePeriod > &schedule, const XmlElement &parent)
Serializes a schedule (active periods) into a parent XML element.
void serializePlatform(const radar::Platform &platform, const core::World &world, const XmlElement &parent)
Serializes a platform and its attached components into a parent XML element.
void serializeTransmitter(const radar::Transmitter &tx, const XmlElement &parent)
Serializes a transmitter into a parent XML element.
void serializeTarget(const radar::Target &target, const XmlElement &parent)
Serializes a target into a parent XML element.
void serializeTiming(const timing::PrototypeTiming &timing, const XmlElement &parent)
Serializes a timing object into a parent XML element.
void serializeWaveform(const fers_signal::RadarSignal &waveform, const XmlElement &parent)
Serializes a waveform into a parent XML element.
void setAttributeFromBool(const XmlElement &element, const std::string &name, const bool value)
Sets a boolean attribute on an XML element.
void serializeParameters(const XmlElement &parent, const params::Parameters &p)
Serializes a Parameters object into a parent XML element.
Provides the definition and functionality of the Path class for handling coordinate-based paths with ...
Defines the Platform class used in radar simulation.
Header file for the PrototypeTiming class.
Classes for handling radar waveforms and signals.
Radar Receiver class for managing signal reception and response handling.
Defines the RotationPath class for handling rotational paths with different interpolation types.
Struct to hold simulation parameters.
Definition parameters.h:51
RealType rate
Rendering sample rate.
Definition parameters.h:69
double origin_longitude
Geodetic origin longitude.
Definition parameters.h:63
RealType start
Start time for the simulation.
Definition parameters.h:56
double origin_altitude
Geodetic origin altitude (in meters)
Definition parameters.h:64
CoordinateFrame coordinate_frame
Scenario coordinate frame.
Definition parameters.h:65
RealType end
End time for the simulation.
Definition parameters.h:57
int utm_zone
UTM zone (1-60), if applicable.
Definition parameters.h:67
unsigned oversample_ratio
Oversampling ratio.
Definition parameters.h:75
std::optional< unsigned > random_seed
Random seed for simulation.
Definition parameters.h:70
RealType sim_sampling_rate
Temporal sampling rate (Hz) that determines time-step resolution for radar pulse simulation.
Definition parameters.h:58
RotationAngleUnit rotation_angle_unit
External rotation angle unit.
Definition parameters.h:66
RealType c
Speed of light (modifiable)
Definition parameters.h:54
static constexpr RealType DEFAULT_C
Speed of light (m/s)
Definition parameters.h:52
unsigned adc_bits
ADC quantization bits.
Definition parameters.h:71
bool utm_north_hemisphere
UTM hemisphere, if applicable.
Definition parameters.h:68
double origin_latitude
Geodetic origin latitude.
Definition parameters.h:62
Defines classes for radar targets and their Radar Cross-Section (RCS) models.
Timing source for simulation objects.
Header file for the Transmitter class in the radar namespace.
Header file for the World class in the simulator.
Core utility layer for serializing FERS XML scenario files.