Helios++
Helios software for LiDAR simulations
AbstractPulseRunnable.h
1 #pragma once
2 
3 #include "AbstractDetector.h"
4 #include <noise/RandomnessGenerator.h>
5 class Measurement;
6 #include "LasSpecification.h"
7 #include <mutex>
8 
9 // ############## BEGIN Static variables ###############
13 static const double speedOfLight_mPerSec = 299792458;
14 
18 static const double cfg_speedOfLight_mPerNanosec = 0.299792458;
19 
23 static const double speedOfLight_mPerPicosec = 0.000299792458;
24 // ############## END Static variables ###############
25 
30 public:
31  // *** ATTRIBUTES *** //
32  // ******************** //
36  std::shared_ptr<AbstractDetector> detector = nullptr;
37 
41  glm::dvec3 absoluteBeamOrigin;
46 
54  long currentGpsTime; // In milliseconds
55 
60  bool writeGround = true;
61 
62  // *** CONSTRUCTION / DESTRUCTION *** //
63  // ************************************ //
73  std::shared_ptr<AbstractDetector> detector,
74  glm::dvec3 absoluteBeamOrigin,
75  Rotation absoluteBeamAttitude,
76  int pulseNumber,
77  long gpsTime
78  ){
79  this->detector = detector;
80  this->absoluteBeamAttitude = absoluteBeamAttitude;
81  this->absoluteBeamOrigin = absoluteBeamOrigin;
82  this->currentPulseNum = pulseNumber;
83  this->currentGpsTime = gpsTime;
84  }
85 
86  // *** M E T H O D S *** //
87  // *********************** //
100  double calcCrossSection(double f, double Alf, double theta);
110  double phongBDRF(
111  double incidenceAngle,
112  double targetSpecularity,
113  double targetSpecularExponent
114  );
127  inline double calcAtmosphericFactor(double targetRange);
137  double calcReceivedPower(
138  double emittedPower,
139  double targetRange,
140  double incidenceAngle,
141  double targetReflectivity,
142  double targetSpecularity,
143  double targetSpecularExponent,
144  double targetArea
145  );
159  double calcReceivedPower(
160  double emittedPower,
161  double targetRange,
162  double sigma
163  );
172  static inline double _calcReceivedPower(
173  double Pt,
174  double Dr2,
175  double R,
176  double Bt2,
177  double etaSys,
178  double etaAtm,
179  double sigma
180  );
194  void capturePoint(
195  Measurement & m,
197  std::vector<Measurement> *allMeasurements,
198  std::mutex *allMeasurementsMutex,
199  std::vector<Measurement> *cycleMeasurements,
200  std::mutex *cycleMeasurementsMutex
201  );
214  double &distance,
215  glm::dvec3 &beamOrigin,
216  glm::dvec3 &beamDirection
217  );
218 
223  virtual void operator()() = 0;
224 };
double calcAtmosphericFactor(double targetRange)
Compute atmospheric factor , understood as the energy left after attenuation by air particles in rang...
Definition: AbstractPulseRunnable.cpp:32
bool writeGround
Flag to specify if ground points must be captured (true) or not (false)
Definition: AbstractPulseRunnable.h:60
Definition: Rotation.h:80
long currentGpsTime
Current GPS time in milliseconds.
Definition: AbstractPulseRunnable.h:54
static double _calcReceivedPower(double Pt, double Dr2, double R, double Bt2, double etaSys, double etaAtm, double sigma)
Compute received power .
Definition: AbstractPulseRunnable.cpp:81
Class representing a measurement.
Definition: Measurement.h:12
Base abstract class for pulse runnables.
Definition: AbstractPulseRunnable.h:29
Rotation absoluteBeamAttitude
Beam attitude.
Definition: AbstractPulseRunnable.h:45
double calcReceivedPower(double emittedPower, double targetRange, double incidenceAngle, double targetReflectivity, double targetSpecularity, double targetSpecularExponent, double targetArea)
Solve the laser radar equation.
Definition: AbstractPulseRunnable.cpp:39
virtual void operator()()=0
Abstract operator. It must be overridden by any implementation which concretes AbstractPulseRunnable...
double calcCrossSection(double f, double Alf, double theta)
Compute cross section.
Definition: AbstractPulseRunnable.cpp:12
double phongBDRF(double incidenceAngle, double targetSpecularity, double targetSpecularExponent)
Compute the phong model.
Definition: AbstractPulseRunnable.cpp:17
void capturePoint(Measurement &m, RandomnessGenerator< double > &rg, std::vector< Measurement > *allMeasurements, std::mutex *allMeasurementsMutex, std::vector< Measurement > *cycleMeasurements, std::mutex *cycleMeasurementsMutex)
Capture point if proceed and write it.
Definition: AbstractPulseRunnable.cpp:93
glm::dvec3 absoluteBeamOrigin
Beam origin in absolute coordinates.
Definition: AbstractPulseRunnable.h:41
std::shared_ptr< AbstractDetector > detector
Detector used to simulate pulse.
Definition: AbstractPulseRunnable.h:36
AbstractPulseRunnable(std::shared_ptr< AbstractDetector > detector, glm::dvec3 absoluteBeamOrigin, Rotation absoluteBeamAttitude, int pulseNumber, long gpsTime)
Base constructor for pulse runnables.
Definition: AbstractPulseRunnable.h:72
int currentPulseNum
Number of current pulse.
Definition: AbstractPulseRunnable.h:50
void applyMeasurementError(RandomnessGenerator< double > &rg, double &distance, glm::dvec3 &beamOrigin, glm::dvec3 &beamDirection)
Apply error to received measurement.
Definition: AbstractPulseRunnable.cpp:131