Helios++
Helios software for LiDAR simulations
FullWaveformPulseRunnable.h
1 #pragma once
2 
3 
4 #include "AbstractDetector.h"
5 #include "AbstractPulseRunnable.h"
6 #include "FullWaveformPulseDetector.h"
7 #include "RaySceneIntersection.h"
8 #include "ScenePart.h"
9 #include <noise/RandomnessGenerator.h>
10 #include <vector>
11 #include <LadLut.h>
12 
20 public:
21  // *** CONSTANTS *** //
22  // ******************* //
27  static const double eps;
28 private:
29  // *** ATTRIBUTES *** //
30  // ******************** //
34  std::shared_ptr<FullWaveformPulseDetector> fwDetector;
39  std::vector<Measurement> * allMeasurements = nullptr;
43  std::mutex * allMeasurementsMutex = nullptr;
48  std::vector<Measurement> * cycleMeasurements = nullptr;
53  std::mutex * cycleMeasurementsMutex = nullptr;
62 
63 public:
78  unsigned int legIndex = 0;
79 
80  // *** CONSTRUCTION / DESTRUCTION *** //
81  // ************************************ //
95  std::shared_ptr<FullWaveformPulseDetector> detector,
96  glm::dvec3 absoluteBeamOrigin,
98  int currentPulseNum,
99  long currentGpsTime,
100  bool writeWaveform,
101  bool calcEchowidth,
102  std::vector<Measurement> * allMeasurements,
103  std::mutex * allMeasurementsMutex,
104  std::vector<Measurement> * cycleMeasurements,
105  std::mutex * cycleMeasurementsMutex,
106  unsigned int legIndex
107  ) :
109  detector,
110  absoluteBeamOrigin,
111  absoluteBeamAttitude,
112  currentPulseNum,
113  currentGpsTime
114  )
115  {
116  fwDetector = detector;
117  this->writeWaveform = writeWaveform;
118  this->calcEchowidth = calcEchowidth;
119  this->allMeasurements = allMeasurements;
120  this->allMeasurementsMutex = allMeasurementsMutex;
121  this->cycleMeasurements = cycleMeasurements;
122  this->cycleMeasurementsMutex = cycleMeasurementsMutex;
123  this->legIndex = legIndex;
124  }
125 
126  virtual ~FullWaveformPulseRunnable(){}
127 
128 private:
129  // *** OPERATOR METHODS *** //
130  // ************************** //
140  void computeSubrays(
141  Scene &scene,
142  NoiseSource<double> &intersectionHandlingNoiseSource,
143  std::map<double, double> &reflections,
144  vector<RaySceneIntersection> &intersects
145  );
155  void handleSubray(
156  int circleStep,
157  double circleStep_rad,
158  Rotation &r1,
159  Scene &scene,
160  double divergenceAngle,
161  NoiseSource<double> &intersectionHandlingNoiseSource,
162  std::map<double, double> &reflections,
163  vector<RaySceneIntersection> &intersects
164  );
179  void digestIntersections(
180  std::vector<std::vector<double>>& apMatrix,
182  RandomnessGenerator<double> &randGen2,
183  glm::dvec3 &beamDir,
184  std::map<double, double> &reflections,
185  vector<RaySceneIntersection> &intersects
186  );
194  std::map<double, double> &reflections,
195  double &minHitDist_m,
196  double &maxHitDist_m
197  );
212  double minHitDist_m,
213  double maxHitDist_m,
214  double &minHitTime_ns,
215  double &maxHitTime_ns,
216  double &nsPerBin,
217  double &distanceThreshold,
218  int &peakIntensityIndex,
219  int &numFullwaveBins
220  );
228  std::map<double, double> &reflections,
229  std::vector<double> &fullwave,
230  double distanceThreshold,
231  double minHitTime_ns,
232  double nsPerBin
233  );
245  void digestFullWaveform(
246  std::vector<Measurement> &pointsMeasurement,
247  int &numReturns,
248  std::vector<std::vector<double>>& apMatrix,
249  std::vector<double> &fullwave,
250  vector<RaySceneIntersection> &intersects,
251  glm::dvec3 &beamDir,
252  double nsPerBin,
253  int numFullwaveBins,
254  int peakIntensityIndex,
255  double minHitTime_ns
256  );
263  void exportOutput(
264  std::vector<double> &fullwave,
265  int &numReturns,
266  std::vector<Measurement> &pointsMeasurement,
267  glm::dvec3 &beamDir,
268  double minHitTime_ns,
269  double maxHitTime_ns,
272  );
273 
274  // *** ASSISTANCE METHODS *** //
275  // **************************** //
279  bool detectPeak(
280  int i,
281  int win_size,
282  vector<double> &fullwave
283  );
284 
289  double calcEmmitedPower(double radius, double targetRange);
304  void captureFullWave(
305  std::vector<double> & fullwave,
306  int fullwaveIndex,
307  double min_time,
308  double max_time,
309  glm::dvec3 & beamOrigin,
310  glm::dvec3 & beamDir,
311  long gpstime,
312  bool fullWaveNoise,
314  );
315 
316 public:
320  double calcIntensity(
321  double incidenceAngle,
322  double targetRange,
323  double targetReflectivity,
324  double targetSpecularity,
325  double targetSpecularExponent,
326  double targetArea,
327  double radius
328  );
329 
333  double calcIntensity(
334  double targetRange,
335  double radius,
336  double sigma
337  );
338 
339  // *** O P E R A T O R *** //
340  // ************************* //
346  void operator()() override {}
357  void operator()(
358  std::vector<std::vector<double>>& apMatrix,
360  RandomnessGenerator<double> &randGen2,
361  NoiseSource<double> &intersectionHandlingNoiseSource
362  );
363 };
bool initializeFullWaveform(double minHitDist_m, double maxHitDist_m, double &minHitTime_ns, double &maxHitTime_ns, double &nsPerBin, double &distanceThreshold, int &peakIntensityIndex, int &numFullwaveBins)
Initialize full waveform While the vector is not strictly initialized in this function, necessary variables are computed here.
Definition: FullWaveformPulseRunnable.cpp:328
std::mutex * allMeasurementsMutex
Mutex to handle concurrent access to vector of all measurements.
Definition: FullWaveformPulseRunnable.h:43
bool calcEchowidth
Flag to specify if calc echo width (true) or not (false)
Definition: FullWaveformPulseRunnable.h:61
Definition: Rotation.h:80
FullWaveformPulseRunnable(std::shared_ptr< FullWaveformPulseDetector > detector, glm::dvec3 absoluteBeamOrigin, Rotation absoluteBeamAttitude, int currentPulseNum, long currentGpsTime, bool writeWaveform, bool calcEchowidth, std::vector< Measurement > *allMeasurements, std::mutex *allMeasurementsMutex, std::vector< Measurement > *cycleMeasurements, std::mutex *cycleMeasurementsMutex, unsigned int legIndex)
Base constructor for full waveform pulse runnable.
Definition: FullWaveformPulseRunnable.h:94
std::mutex * cycleMeasurementsMutex
Mutex to handle concurrent access to vector of current cycle measurements.
Definition: FullWaveformPulseRunnable.h:53
void computeSubrays(Scene &scene, NoiseSource< double > &intersectionHandlingNoiseSource, std::map< double, double > &reflections, vector< RaySceneIntersection > &intersects)
Perform ray casting to find intersections.
Definition: FullWaveformPulseRunnable.cpp:73
long currentGpsTime
Current GPS time in milliseconds.
Definition: AbstractPulseRunnable.h:54
double calcIntensity(double incidenceAngle, double targetRange, double targetReflectivity, double targetSpecularity, double targetSpecularExponent, double targetArea, double radius)
Compute intensity.
Definition: FullWaveformPulseRunnable.cpp:550
void exportOutput(std::vector< double > &fullwave, int &numReturns, std::vector< Measurement > &pointsMeasurement, glm::dvec3 &beamDir, double minHitTime_ns, double maxHitTime_ns, RandomnessGenerator< double > &randGen, RandomnessGenerator< double > &randGen2)
Export measurements and full waveform data.
Definition: FullWaveformPulseRunnable.cpp:487
void findMaxMinHitDistances(std::map< double, double > &reflections, double &minHitDist_m, double &maxHitDist_m)
Find min and max hit distances in meters.
Definition: FullWaveformPulseRunnable.cpp:304
double calcEmmitedPower(double radius, double targetRange)
Compute the space distribution equation to calculate the beam energy decreasing the further away from...
Definition: FullWaveformPulseRunnable.cpp:534
void populateFullWaveform(std::map< double, double > &reflections, std::vector< double > &fullwave, double distanceThreshold, double minHitTime_ns, double nsPerBin)
Populate a previously initialized full waveform vector.
Definition: FullWaveformPulseRunnable.cpp:369
Base abstract class for pulse runnables.
Definition: AbstractPulseRunnable.h:29
Rotation absoluteBeamAttitude
Beam attitude.
Definition: AbstractPulseRunnable.h:45
void digestFullWaveform(std::vector< Measurement > &pointsMeasurement, int &numReturns, std::vector< std::vector< double >> &apMatrix, std::vector< double > &fullwave, vector< RaySceneIntersection > &intersects, glm::dvec3 &beamDir, double nsPerBin, int numFullwaveBins, int peakIntensityIndex, double minHitTime_ns)
Digest a previously populated full waveform vector, generating measurements.
Definition: FullWaveformPulseRunnable.cpp:392
void digestIntersections(std::vector< std::vector< double >> &apMatrix, RandomnessGenerator< double > &randGen, RandomnessGenerator< double > &randGen2, glm::dvec3 &beamDir, std::map< double, double > &reflections, vector< RaySceneIntersection > &intersects)
Digest intersections found through ray casting.
Definition: FullWaveformPulseRunnable.cpp:233
void handleSubray(int circleStep, double circleStep_rad, Rotation &r1, Scene &scene, double divergenceAngle, NoiseSource< double > &intersectionHandlingNoiseSource, std::map< double, double > &reflections, vector< RaySceneIntersection > &intersects)
Handle sub-rays along the circle.
Definition: FullWaveformPulseRunnable.cpp:116
bool writeWaveform
Flag to specify if write waveform (true) or not (false)
Definition: FullWaveformPulseRunnable.h:57
void captureFullWave(std::vector< double > &fullwave, int fullwaveIndex, double min_time, double max_time, glm::dvec3 &beamOrigin, glm::dvec3 &beamDir, long gpstime, bool fullWaveNoise, RandomnessGenerator< double > &rg2)
Capture full wave.
Definition: FullWaveformPulseRunnable.cpp:587
std::vector< Measurement > * allMeasurements
Vector of all measurements. It can be nullptr, since tracking historical of all measurements might no...
Definition: FullWaveformPulseRunnable.h:39
glm::dvec3 absoluteBeamOrigin
Beam origin in absolute coordinates.
Definition: AbstractPulseRunnable.h:41
Class representing a scene asset.
Definition: Scene.h:25
std::shared_ptr< AbstractDetector > detector
Detector used to simulate pulse.
Definition: AbstractPulseRunnable.h:36
std::shared_ptr< FullWaveformPulseDetector > fwDetector
Full wavevform pulse detector used to handle pulse computation.
Definition: FullWaveformPulseRunnable.h:34
bool detectPeak(int i, int win_size, vector< double > &fullwave)
Detect full waveform peaks.
Definition: FullWaveformPulseRunnable.cpp:618
void operator()() override
Full waveform pulse runnable void functor. It is necessary due to compatibility reasons.
Definition: FullWaveformPulseRunnable.h:346
int currentPulseNum
Number of current pulse.
Definition: AbstractPulseRunnable.h:50
Concrete implementation of abstract pulse runnable to compute full waveform pulses.
Definition: FullWaveformPulseRunnable.h:19
std::vector< Measurement > * cycleMeasurements
Vector of current cycle measurements. It can be nullptr, since tracking current cycle measurements mi...
Definition: FullWaveformPulseRunnable.h:48
static const double eps
Decimal precision constant for FullWaveformPulseRunnable computations.
Definition: FullWaveformPulseRunnable.h:27
unsigned int legIndex
Which leg the FullWaveformPulseRunnable belongs to.
Definition: FullWaveformPulseRunnable.h:78