9#include <GeographicLib/Geodesic.hpp>
38 double sincAntennaGain(
const double theta,
const double alpha,
const double beta,
const double gamma)
44 const double gain = alpha * std::pow(std::sin(beta * theta) / (beta * theta), gamma);
50 constexpr std::size_t num_points = 1000;
51 const auto midpoint =
static_cast<std::ptrdiff_t
>(num_points / 2);
52 std::vector<double> theta(num_points);
53 std::vector<double> gain(num_points);
54 for (std::size_t i = 0; i < num_points; ++i)
56 theta[i] = -
PI + 2.0 *
PI *
static_cast<double>(i) /
static_cast<double>(num_points - 1);
59 const auto search_begin = gain.begin() + midpoint;
60 const double max_gain = *std::max_element(search_begin, gain.end());
61 const double max_gain_db = 10.0 * std::log10(max_gain);
62 const double target_gain_db = max_gain_db - 3.0;
63 const double target_gain = std::pow(10.0, target_gain_db / 10.0);
64 const auto min_gain = std::min_element(search_begin, gain.end(), [target_gain](
const double a,
const double b)
65 { return std::abs(a - target_gain) < std::abs(b - target_gain); });
66 const auto idx =
static_cast<std::size_t
>(std::distance(search_begin, min_gain));
67 const double angle_3db_drop = theta[
static_cast<std::size_t
>(midpoint) + idx];
68 return angle_3db_drop * 180.0 /
PI;
76 "Gaussian antenna '{}' has a non-positive azimuth scale ({}). 3dB beamwidth is undefined. KML will "
77 "only show boresight.",
81 const double half_angle_rad = std::sqrt(std::log(2.0) / gaussianAnt->
getAzimuthScale());
82 return half_angle_rad * 180.0 /
PI;
90 "Parabolic antenna '{}' has a non-positive diameter ({}). This is physically impossible. KML will only "
95 const double arg = 1.6 * wavelength / (
PI * parabolicAnt->
getDiameter());
99 "Parabolic antenna '{}': The operating wavelength ({:.4f}m) is very large compared to its diameter "
100 "({:.4f}m), resulting in a nearly omnidirectional pattern. KML visualization will cap the 3dB "
101 "half-angle at 90 degrees.",
105 const double half_angle_rad = std::asin(arg);
106 return half_angle_rad * 180.0 /
PI;
114 "SquareHorn antenna '{}' has a non-positive dimension ({}). This is physically impossible. KML will "
115 "only show boresight.",
119 const double arg = 1.39155 * wavelength / (
PI * squarehornAnt->
getDimension());
123 "SquareHorn antenna '{}': The operating wavelength ({:.4f}m) is very large compared to its dimension "
124 "({:.4f}m), resulting in a nearly omnidirectional pattern. KML visualization will cap the 3dB "
125 "half-angle at 90 degrees.",
129 const double half_angle_rad = std::asin(arg);
130 return half_angle_rad * 180.0 /
PI;
135 std::stringstream ss;
136 ss << std::fixed << std::setprecision(6) << lon <<
"," << lat <<
"," << alt;
141 const double distance,
double& destLatitude,
double& destLongitude)
143 const GeographicLib::Geodesic& geod = GeographicLib::Geodesic::WGS84();
144 geod.Direct(startLatitude, startLongitude, angle, distance, destLatitude, destLongitude);
148 const double radius_km)
150 std::vector<std::pair<double, double>> circle_coordinates;
154 double new_lat, new_lon;
156 circle_coordinates.emplace_back(new_lat, new_lon);
158 return circle_coordinates;
163 out <<
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
164 out <<
"<kml xmlns=\"http://www.opengis.net/kml/2.2\" xmlns:gx=\"http://www.google.com/kml/ext/2.2\">\n";
165 out <<
"<Document>\n";
169 out <<
"FERS Simulation Visualization";
177 "id=\"receiver\"><IconStyle><Icon><href>https://cdn-icons-png.flaticon.com/512/645/645436.png</href></"
178 "Icon></IconStyle></Style>\n";
180 "id=\"transmitter\"><IconStyle><Icon><href>https://cdn-icons-png.flaticon.com/128/224/224666.png</"
181 "href></Icon></IconStyle></Style>\n";
183 "id=\"target\"><IconStyle><Icon><href>https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/"
184 "Target_red_dot1.svg/1200px-Target_red_dot1.svg.png</href></Icon></IconStyle><LineStyle><width>2</"
185 "width></LineStyle></Style>\n";
187 "id=\"translucentPolygon\"><LineStyle><color>ff0000ff</color><width>2</width></"
188 "LineStyle><PolyStyle><color>00ffffff</color></PolyStyle></Style>\n";
190 "id=\"arrowStyle\"><IconStyle><Icon><href>http://maps.google.com/mapfiles/kml/shapes/arrow.png</href></"
191 "Icon><scale>0.5</scale></IconStyle></Style>\n";
192 out <<
" <Style id=\"lineStyle\"><LineStyle><color>ff0000ff</color><width>2</width></LineStyle></Style>\n";
193 out <<
" <Style id=\"lineStyleBlue\"><LineStyle><color>ffff0000</color><width>2</width></LineStyle></Style>\n";
196 void writePoint(std::ostream& out,
const std::string& indent,
const std::string& name,
const std::string& styleUrl,
197 const std::string& coordinates,
const double objectAltitude,
const double referenceAltitude)
199 out << indent <<
"<Placemark>\n";
200 out << indent <<
" <name>" << name <<
"</name>\n";
201 out << indent <<
" <styleUrl>" << styleUrl <<
"</styleUrl>\n";
202 out << indent <<
" <Point>\n";
203 out << indent <<
" <coordinates>" << coordinates <<
"</coordinates>\n";
204 out << indent <<
" <altitudeMode>absolute</altitudeMode>\n";
205 if (objectAltitude > referenceAltitude)
207 out << indent <<
" <extrude>1</extrude>\n";
209 out << indent <<
" </Point>\n";
210 out << indent <<
"</Placemark>\n";
214 const std::string& style,
const std::string& startCoords,
const std::string& endCoords)
216 out << indent <<
"<Placemark>\n";
217 out << indent <<
" <name>" << name <<
"</name>\n";
218 out << indent <<
" <styleUrl>" << style <<
"</styleUrl>\n";
219 out << indent <<
" <LineString>\n";
220 out << indent <<
" <altitudeMode>absolute</altitudeMode>\n";
221 out << indent <<
" <tessellate>1</tessellate>\n";
222 out << indent <<
" <coordinates>" << startCoords <<
" " << endCoords <<
"</coordinates>\n";
223 out << indent <<
" </LineString>\n";
224 out << indent <<
"</Placemark>\n";
229 bool has_receiver =
false;
230 bool has_transmitter =
false;
231 for (
const auto* obj : objects)
239 has_transmitter =
true;
249 return "#transmitter";
256 for (
const auto* obj : objects)
258 if (
const auto*
const r =
dynamic_cast<const radar::Radar*
>(obj))
267 const std::string& indent)
269 double lat, lon, alt_abs;
270 ctx.
converter(position, lat, lon, alt_abs);
274 out << indent <<
"<Placemark>\n";
275 out << indent <<
" <name>Isotropic pattern range</name>\n";
276 out << indent <<
" <styleUrl>#translucentPolygon</styleUrl>\n";
277 out << indent <<
" <Polygon>\n";
278 out << indent <<
" <extrude>1</extrude>\n";
279 out << indent <<
" <altitudeMode>absolute</altitudeMode>\n";
280 out << indent <<
" <outerBoundaryIs><LinearRing><coordinates>\n";
281 for (
const auto& [pt_lat, pt_lon] : circle_coordinates)
286 <<
formatCoordinates(circle_coordinates[0].second, circle_coordinates[0].first, alt_abs) <<
"\n";
287 out << indent <<
" </coordinates></LinearRing></outerBoundaryIs>\n";
288 out << indent <<
" </Polygon>\n";
289 out << indent <<
"</Placemark>\n";
293 const std::optional<double>& angle3DbDropDeg,
const std::string& indent)
296 double start_lat, start_lon, start_alt;
297 ctx.
converter(first_wp_pos, start_lat, start_lon, start_alt);
298 const std::string start_coords_str =
formatCoordinates(start_lon, start_lat, start_alt);
306 const double fers_azimuth_deg = initial_rotation.
azimuth * 180.0 /
PI;
307 double start_azimuth_deg_kml = 90.0 - fers_azimuth_deg;
308 start_azimuth_deg_kml = std::fmod(start_azimuth_deg_kml, 360.0);
309 if (start_azimuth_deg_kml < 0.0)
311 start_azimuth_deg_kml += 360.0;
316 const double end_alt = start_alt + delta_altitude;
318 double dest_lat, dest_lon;
321 const std::string end_coords_str =
formatCoordinates(dest_lon, dest_lat, end_alt);
322 out << indent <<
"<Placemark>\n";
323 out << indent <<
" <name>Antenna Boresight</name>\n";
324 out << indent <<
" <ExtendedData>\n";
325 out << indent <<
" <Data name=\"rotationangleunit\"><value>"
327 out << indent <<
" <Data name=\"azimuth\"><value>" << display_azimuth <<
"</value></Data>\n";
328 out << indent <<
" <Data name=\"elevation\"><value>" << display_elevation <<
"</value></Data>\n";
329 out << indent <<
" </ExtendedData>\n";
330 out << indent <<
" <styleUrl>#lineStyle</styleUrl>\n";
331 out << indent <<
" <LineString>\n";
332 out << indent <<
" <altitudeMode>absolute</altitudeMode>\n";
333 out << indent <<
" <tessellate>1</tessellate>\n";
334 out << indent <<
" <coordinates>" << start_coords_str <<
" " << end_coords_str <<
"</coordinates>\n";
335 out << indent <<
" </LineString>\n";
336 out << indent <<
"</Placemark>\n";
338 if (angle3DbDropDeg.has_value() && *angle3DbDropDeg >
EPSILON)
340 double side1_lat, side1_lon;
342 horizontal_distance, side1_lat, side1_lon);
343 const std::string side1_coords_str =
formatCoordinates(side1_lon, side1_lat, end_alt);
347 double side2_lat, side2_lon;
349 horizontal_distance, side2_lat, side2_lon);
350 const std::string side2_coords_str =
formatCoordinates(side2_lon, side2_lat, end_alt);
355 const double arrow_heading = std::fmod(start_azimuth_deg_kml + 180.0, 360.0);
356 out << indent <<
"<Placemark>\n";
357 out << indent <<
" <name>Antenna Arrow</name>\n";
358 out << indent <<
" <styleUrl>#arrowStyle</styleUrl>\n";
359 out << indent <<
" <Point><coordinates>" << end_coords_str
360 <<
"</coordinates><altitudeMode>absolute</altitudeMode></Point>\n";
361 out << indent <<
" <Style>\n";
362 out << indent <<
" <IconStyle><heading>" << arrow_heading <<
"</heading></IconStyle>\n";
363 out << indent <<
" </Style>\n";
364 out << indent <<
"</Placemark>\n";
368 const KmlContext& ctx,
const std::string& indent)
383 std::optional<double> angle_3db_drop_deg;
385 std::optional<double> wavelength;
388 if (tx->getSignal() !=
nullptr)
390 wavelength = ctx.
parameters.
c / tx->getSignal()->getCarrier();
395 if (
const auto* attached_tx =
dynamic_cast<const radar::Transmitter*
>(rx->getAttached()))
397 if (attached_tx->getSignal() !=
nullptr)
399 wavelength = ctx.
parameters.
c / attached_tx->getSignal()->getCarrier();
404 if (
const auto* sinc_ant =
dynamic_cast<const antenna::Sinc*
>(ant))
406 angle_3db_drop_deg =
find3DbDropAngle(sinc_ant->getAlpha(), sinc_ant->getBeta(), sinc_ant->getGamma());
430 "KML visualization for antenna '{}' ('{}') is symbolic. "
431 "Only the boresight direction is shown, as a 3dB beamwidth is not calculated from file-based "
441 const double refAlt,
const KmlContext& ctx,
const std::string& indent)
444 const auto& waypoints = path->
getCoords();
446 double first_alt_abs;
449 ctx.
converter(waypoints.front().pos, lat, lon, first_alt_abs);
452 out << indent <<
"<Placemark>\n";
453 out << indent <<
" <name>" << platform->
getName() <<
" Path</name>\n";
454 out << indent <<
" <styleUrl>" << styleUrl <<
"</styleUrl>\n";
455 out << indent <<
" <gx:Track>\n";
456 out << indent <<
" <altitudeMode>absolute</altitudeMode>\n";
457 if (first_alt_abs > refAlt)
459 out << indent <<
" <extrude>1</extrude>\n";
462 const double start_time = waypoints.front().t;
463 const double end_time = waypoints.back().t;
465 if (
const double time_diff = end_time - start_time; time_diff <= 0.0)
468 double p_lon, p_lat, p_alt_abs;
469 ctx.
converter(p_pos, p_lat, p_lon, p_alt_abs);
470 out << indent <<
" <when>" << start_time <<
"</when>\n";
471 out << indent <<
" <gx:coord>" << p_lon <<
" " << p_lat <<
" " << p_alt_abs <<
"</gx:coord>\n";
478 const double current_time = start_time + i * time_step;
480 double p_lon, p_lat, p_alt_abs;
481 ctx.
converter(p_pos, p_lat, p_lon, p_alt_abs);
482 out << indent <<
" <when>" << current_time <<
"</when>\n";
483 out << indent <<
" <gx:coord>" << p_lon <<
" " << p_lat <<
" " << p_alt_abs <<
"</gx:coord>\n";
487 out << indent <<
" </gx:Track>\n";
488 out << indent <<
"</Placemark>\n";
492 const KmlContext& ctx,
const std::string& indent)
500 const auto& [start_wp_pos, start_wp_t] = path->
getCoords().front();
501 const auto& [end_wp_pos, end_wp_t] = path->
getCoords().back();
503 double start_lat, start_lon, start_alt_abs;
504 ctx.
converter(start_wp_pos, start_lat, start_lon, start_alt_abs);
505 const std::string start_coordinates =
formatCoordinates(start_lon, start_lat, start_alt_abs);
507 double end_lat, end_lon, end_alt_abs;
508 ctx.
converter(end_wp_pos, end_lat, end_lon, end_alt_abs);
509 const std::string end_coordinates =
formatCoordinates(end_lon, end_lat, end_alt_abs);
511 writePoint(out, indent,
"Start: " + platform->
getName(),
"#target", start_coordinates, start_alt_abs, refAlt);
512 writePoint(out, indent,
"End: " + platform->
getName(),
"#target", end_coordinates, end_alt_abs, refAlt);
516 const double refAlt,
const KmlContext& ctx,
const std::string& indent)
519 double lat, lon, alt_abs;
520 ctx.
converter(first_wp_pos, lat, lon, alt_abs);
523 out << indent <<
"<Placemark>\n";
524 out << indent <<
" <name>" << platform->
getName() <<
"</name>\n";
525 out << indent <<
" <styleUrl>" << styleUrl <<
"</styleUrl>\n";
526 out << indent <<
" <LookAt>\n";
527 out << indent <<
" <longitude>" << lon <<
"</longitude>\n";
528 out << indent <<
" <latitude>" << lat <<
"</latitude>\n";
529 out << indent <<
" <altitude>" << alt_abs <<
"</altitude>\n";
530 out << indent <<
" <heading>-148.41</heading><tilt>40.55</tilt><range>500.65</range>\n";
531 out << indent <<
" </LookAt>\n";
532 out << indent <<
" <Point>\n";
533 out << indent <<
" <coordinates>" << coordinates <<
"</coordinates>\n";
534 out << indent <<
" <altitudeMode>absolute</altitudeMode>\n";
535 if (alt_abs > refAlt)
537 out << indent <<
" <extrude>1</extrude>\n";
539 out << indent <<
" </Point>\n";
540 out << indent <<
"</Placemark>\n";
544 const double refAlt,
const KmlContext& ctx,
const std::string& indent)
547 const bool is_dynamic =
562 const std::vector<const radar::Object*>& objects,
const KmlContext& ctx,
563 const double referenceAltitude,
const std::string& indent)
570 out << indent <<
"<Folder>\n";
571 out << indent <<
" <name>" << platform->
getName() <<
"</name>\n";
573 const std::string inner_indent = indent +
" ";
583 out << indent <<
"</Folder>\n";
588 std::map<const radar::Platform*, std::vector<const radar::Object*>> platform_to_objects;
589 const auto group_objects = [&](
const auto& objectCollection)
591 for (
const auto& obj_ptr : objectCollection)
593 platform_to_objects[obj_ptr->getPlatform()].push_back(obj_ptr.get());
607 bool ref_set =
false;
608 for (
const auto& platform : platform_to_objects | std::views::keys)
610 if (!platform->getMotionPath()->getCoords().empty())
612 const math::Vec3& first_pos = platform->getMotionPath()->getCoords().front().pos;
613 ctx.
converter(first_pos, reference_latitude, reference_longitude, reference_altitude);
628 out <<
" <Folder>\n";
629 out <<
" <name>Reference Coordinate</name>\n";
630 out <<
" <description>Placemarks for various elements in the FERSXML file. All Placemarks are "
631 "situated relative to this reference point.</description>\n";
632 out <<
" <LookAt>\n";
633 out <<
" <longitude>" << reference_longitude <<
"</longitude>\n";
634 out <<
" <latitude>" << reference_latitude <<
"</latitude>\n";
635 out <<
" <altitude>" << reference_altitude <<
"</altitude>\n";
636 out <<
" <heading>-148.41</heading><tilt>40.55</tilt><range>10000</range>\n";
637 out <<
" </LookAt>\n";
639 const std::string platform_indent =
" ";
640 for (
const auto& [platform, objects] : platform_to_objects)
642 processPlatform(out, platform, objects, ctx, reference_altitude, platform_indent);
645 out <<
" </Folder>\n";
646 out <<
"</Document>\n";
Header file defining various types of antennas and their gain patterns.
Abstract base class representing an antenna.
std::string getName() const noexcept
Retrieves the name of the antenna.
Represents a Gaussian-shaped antenna gain pattern.
RealType getAzimuthScale() const noexcept
Gets the azimuth scale factor.
Represents an antenna whose gain pattern is loaded from a HDF5 file.
Represents an isotropic antenna with uniform gain in all directions.
Represents a parabolic reflector antenna.
RealType getDiameter() const noexcept
Gets the diameter of the parabolic reflector.
Represents a sinc function-based antenna gain pattern.
Represents a square horn antenna.
RealType getDimension() const noexcept
Gets the dimension of the square horn.
Represents an antenna whose gain pattern is defined by an XML file.
The World class manages the simulator environment.
const std::vector< std::unique_ptr< radar::Target > > & getTargets() const noexcept
Retrieves the list of radar targets.
const std::vector< std::unique_ptr< radar::Transmitter > > & getTransmitters() const noexcept
Retrieves the list of radar transmitters.
const std::vector< std::unique_ptr< radar::Receiver > > & getReceivers() const noexcept
Retrieves the list of radar receivers.
Represents a path with coordinates and allows for various interpolation methods.
Vec3 getPosition(RealType t) const
Retrieves the position at a given time along the path.
const std::vector< Coord > & getCoords() const noexcept
Gets the list of coordinates in the path.
InterpType getType() const noexcept
Retrieves the current interpolation type of the path.
SVec3 getPosition(RealType t) const
Gets the rotational position at a given time.
A class representing a vector in spherical coordinates.
RealType elevation
The elevation angle of the vector.
RealType azimuth
The azimuth angle of the vector.
A class representing a vector in rectangular coordinates.
Represents a radar system on a platform.
Manages radar signal reception and response processing.
Represents a radar transmitter system.
constexpr RealType EPSILON
Machine epsilon for real numbers.
constexpr RealType PI
Mathematical constant π (pi).
Coordinate and rotation structure operations.
Utility definitions and functions for generating KML files from simulation scenarios.
Header file for the logging system.
@ WARNING
Warning level for potentially harmful situations.
@ INFO
Info level for informational messages.
@ ENU
East-North-Up local tangent plane (default)
constexpr std::string_view rotationAngleUnitToken(const RotationAngleUnit unit) noexcept
void generateTrackEndpointsKml(std::ostream &out, const radar::Platform *platform, const double refAlt, const KmlContext &ctx, const std::string &indent)
Generates KML rendering start and end pushpins for a moving platform's track.
void writePoint(std::ostream &out, const std::string &indent, const std::string &name, const std::string &styleUrl, const std::string &coordinates, const double objectAltitude, const double referenceAltitude)
Writes a KML <Point> placemark to the output stream.
std::string formatCoordinates(const double lon, const double lat, const double alt)
Formats coordinates into a comma-separated string suitable for KML <coordinates>.
std::vector< std::pair< double, double > > generateCircleCoordinates(const double lat, const double lon, const double radius_km)
Generates a collection of points tracing a circle around a center coordinate.
constexpr double ISOTROPIC_PATTERN_RADIUS_KM
double findSquareHorn3DbDropAngle(const antenna::SquareHorn *squarehornAnt, const double wavelength)
Calculates the 3dB drop angle for a Square Horn antenna.
void generateDirectionalAntennaKml(std::ostream &out, const radar::Platform *platform, const KmlContext &ctx, const std::optional< double > &angle3DbDropDeg, const std::string &indent)
Renders the visual pointing representation for a directional (beam) antenna.
double findParabolic3DbDropAngle(const antenna::Parabolic *parabolicAnt, const double wavelength)
Calculates the 3dB drop angle for a Parabolic antenna.
std::string getPlacemarkStyleForPlatform(const std::vector< const radar::Object * > &objects)
Determines the proper KML style definition ID to use based on the platform's attached objects.
double sincAntennaGain(const double theta, const double alpha, const double beta, const double gamma)
Calculates a normalized sinc-based antenna gain mapping.
double findGaussian3DbDropAngle(const antenna::Gaussian *gaussianAnt)
Calculates the 3dB drop angle for a Gaussian antenna.
void generateKmlToStream(std::ostream &out, const core::World &world, const KmlContext &ctx)
Master entry point designed to convert the comprehensive simulation world state into a valid KML docu...
double find3DbDropAngle(const double alpha, const double beta, const double gamma)
Numerically determines the 3dB drop angle for a parameterized generic antenna.
constexpr int TRACK_NUM_DIVISIONS
void generateDynamicPathKml(std::ostream &out, const radar::Platform *platform, const std::string &styleUrl, const double refAlt, const KmlContext &ctx, const std::string &indent)
Generates KML for a continuously moving dynamic platform path.
void generateAntennaKml(std::ostream &out, const radar::Platform *platform, const radar::Radar *radar, const KmlContext &ctx, const std::string &indent)
Dispatch function that selects and generates the appropriate KML for a given radar's antenna.
const radar::Radar * getPrimaryRadar(const std::vector< const radar::Object * > &objects)
Identifies the primary radar object within a platform for styling and direction tracking.
void processPlatform(std::ostream &out, const radar::Platform *platform, const std::vector< const radar::Object * > &objects, const KmlContext &ctx, const double referenceAltitude, const std::string &indent)
Orchestrates full processing and rendering of an individual platform into the KML stream.
void calculateDestinationCoordinate(const double startLatitude, const double startLongitude, const double angle, const double distance, double &destLatitude, double &destLongitude)
Calculates a destination coordinate given a starting position, bearing, and distance.
constexpr int ISOTROPIC_PATTERN_POINTS
void writeKmlHeaderAndStyles(std::ostream &out, const KmlContext &ctx)
Writes the standard KML preamble and style definitions to the output stream.
void generateStaticPlacemarkKml(std::ostream &out, const radar::Platform *platform, const std::string &styleUrl, const double refAlt, const KmlContext &ctx, const std::string &indent)
Generates a simple static placemark KML for a non-moving platform.
void generatePlatformPathKml(std::ostream &out, const radar::Platform *platform, const std::string &style, const double refAlt, const KmlContext &ctx, const std::string &indent)
Dispatches the generation of a platform's path representation (static vs dynamic).
void writeAntennaBeamLine(std::ostream &out, const std::string &indent, const std::string &name, const std::string &style, const std::string &startCoords, const std::string &endCoords)
Writes a visual cone/beam line representing the antenna look direction.
constexpr double DIRECTIONAL_ANTENNA_ARROW_LENGTH_M
void generateIsotropicAntennaKml(std::ostream &out, const math::Vec3 &position, const KmlContext &ctx, const std::string &indent)
Renders the visual representation for an isotropic antenna into the output stream.
RealType internal_elevation_to_external(const RealType elevation, const params::RotationAngleUnit unit) noexcept
RealType internal_azimuth_to_external(const RealType azimuth, const params::RotationAngleUnit unit) noexcept
Provides the definition and functionality of the Path class for handling coordinate-based paths with ...
Defines the Radar class and associated functionality.
Classes for handling radar waveforms and signals.
Radar Receiver class for managing signal reception and response handling.
double origin_longitude
Geodetic origin longitude.
RealType start
Start time for the simulation.
double origin_altitude
Geodetic origin altitude (in meters)
CoordinateFrame coordinate_frame
Scenario coordinate frame.
std::string simulation_name
The name of the simulation, from the XML.
RotationAngleUnit rotation_angle_unit
External rotation angle unit.
RealType c
Speed of light (modifiable)
double origin_latitude
Geodetic origin latitude.
Context data required during KML generation.
params::Parameters parameters
A copy of the global simulation parameters.
ConverterFunc converter
Function used to translate simulation Cartesian space into geographic coords.
Defines classes for radar targets and their Radar Cross-Section (RCS) models.
Header file for the Transmitter class in the radar namespace.
Header file for the World class in the simulator.