Helios++
Helios software for LiDAR simulations
ScanningDevice.h
1 #pragma once
2 
3 #include <maths/Rotation.h>
4 #include <maths/Directions.h>
5 #include <assetloading/Asset.h>
6 #include <scanner/ScannerHead.h>
7 #include <scanner/FWFSettings.h>
8 #include <scanner/SimulatedPulse.h>
9 #include <scanner/beamDeflector/AbstractBeamDeflector.h>
10 class AbstractDetector;
11 #include <scene/RaySceneIntersection.h>
12 #include <noise/NoiseSource.h>
13 
14 #include <glm/glm.hpp>
15 
16 #include <string>
17 #include <list>
18 #include <unordered_map>
19 #include <map>
20 
21 class Scanner;
22 class SingleScanner;
23 class MultiScanner;
24 
25 
32 class ScanningDevice : public Asset {
33 protected:
34  // *** F R I E N D S *** //
35  // *********************** //
36  friend class Scanner;
37  friend class SingleScanner;
38  friend class MultiScanner;
39 
40  // *** DEVICE ATTRIBUTES *** //
41  // *************************** //
45  size_t devIdx;
49  std::string id = "";
53  glm::dvec3 headRelativeEmitterPosition = glm::dvec3(0, 0, 0);
62  double beamDivergence_rad = 0;
66  double pulseLength_ns = 0;
74  double beamQuality;
78  double efficiency;
86  double visibility_km;
90  double wavelength_m;
103  std::shared_ptr<ScannerHead> scannerHead;
108  std::shared_ptr<AbstractBeamDeflector> beamDeflector;
113  std::shared_ptr<AbstractDetector> detector;
123  int numRays = 0;
127  std::list<int> supportedPulseFreqs_Hz;
133  int maxNOR = 0;
142  int numTimeBins = -1;
153  std::vector<double> time_wave;
154 
155  // *** STATE ATTRIBUTES *** //
156  // ************************** //
161 
162 protected:
166  bool state_lastPulseWasHit = false;
167 public:
168 
169  // *** CACHED ATTRIBUTES *** //
170  // *************************** //
180  double cached_Dr2;
190  double cached_Bt2;
191 
192 public:
193  // *** CONSTRUCTION / DESTRUCTION *** //
194  // ************************************ //
199  size_t const devIdx,
200  std::string const id,
201  double const beamDiv_rad,
202  glm::dvec3 const beamOrigin,
203  Rotation const beamOrientation,
204  std::list<int> const &pulseFreqs,
205  double const pulseLength_ns,
206  double const averagePower,
207  double const beamQuality,
208  double const efficiency,
209  double const receiverDiameter_m,
210  double const atmosphericVisibility_km,
211  double const wavelength_m
212  );
217  ScanningDevice(ScanningDevice const &scdev);
218  virtual ~ScanningDevice() = default;
219 
220  // *** M E T H O D S *** //
221  // *********************** //
232  void configureBeam();
239  double calcAtmosphericAttenuation() const;
243  void calcRaysNumber();
253  void doSimStep(
254  unsigned int legIndex,
255  double const currentGpsTime,
256  int const simFreq_Hz,
257  bool const isActive,
258  glm::dvec3 const &platformPosition,
259  Rotation const &platformAttitude,
260  std::function<void(glm::dvec3 &, Rotation &)> handleSimStepNoise,
261  std::function<void(SimulatedPulse const &sp)> handlePulseComputation
262  );
271  Rotation calcAbsoluteBeamAttitude(Rotation platformAttitude);
272 
276  void computeSubrays(
277  std::function<void(
278  std::vector<double> const &_tMinMax,
279  int const circleStep,
280  double const circleStep_rad,
281  Rotation &r1,
282  double const divergenceAngle,
284  std::map<double, double> &reflections,
285  vector<RaySceneIntersection> &intersects
286  )> handleSubray,
287  std::vector<double> const &tMinMax,
289  std::map<double, double> &reflections,
290  std::vector<RaySceneIntersection> &intersects
291  );
296  double const minHitDist_m,
297  double const maxHitDist_m,
298  double &minHitTime_ns,
299  double &maxHitTime_ns,
300  double &nsPerBin,
301  double &distanceThreshold,
302  int &peakIntensityIndex,
303  int &numFullwaveBins
304  );
305 
353  double calcIntensity(
354  double const incidenceAngle,
355  double const targetRange,
356  double const targetReflectivity,
357  double const targetSpecularity,
358  double const targetSpecularExponent,
359  double const targetArea,
360  double const radius
361  ) const;
362 
368  double calcIntensity(
369  double const targetRange,
370  double const radius,
371  double const sigma
372  ) const;
373  int calcTimePropagation(
374  std::vector<double> &timeWave
375  );
376 
377 
378  // *** GETTERs and SETTERs *** //
379  // ***************************** //
390  inline bool lastPulseWasHit() const {return state_lastPulseWasHit;}
396  void setLastPulseWasHit(bool const value);
402  glm::dvec3 const & headRelativeEmitterPosition
403  )
404  {this->headRelativeEmitterPosition = headRelativeEmitterPosition;}
411  )
412  {this->headRelativeEmitterAttitude = headRelativeEmitterAttitude;}
417  inline FWFSettings const & getFWFSettings() {return FWF_settings;}
422  inline void setFWFSettings(std::shared_ptr<FWFSettings> FWF_settings)
423  {this->FWF_settings = *FWF_settings;}
424 
425 
426 };
Base abstract class for detectors.
Definition: AbstractDetector.h:20
Base class for all assets.
Definition: Asset.h:10
static const glm::dvec3 right
x : left-right direction
Definition: Directions.h:18
Full Waveform settings.
Definition: FWFSettings.h:12
Class representing a multi scanner. It is, a scanner that can emit more than one pulse per time insta...
Definition: MultiScanner.h:14
Definition: Rotation.h:80
Class representing a scanner asset.
Definition: Scanner.h:28
bool isActive() const
Check if scanner is active (true) or not (false)
Definition: Scanner.h:1063
void handleSimStepNoise(glm::dvec3 &absoluteBeamOrigin, Rotation &absoluteBeamAttitude)
Handle position and attitude noise.
Definition: Scanner.cpp:287
std::shared_ptr< UniformNoiseSource< double > > intersectionHandlingNoiseSource
Uniform noise source for single thread mode.
Definition: Scanner.h:171
Class representing a scanning device. Any scanner needs to be composed of at least one scanning devic...
Definition: ScanningDevice.h:32
int numRays
Number of rays computed by the calcRaysNumber function.
Definition: ScanningDevice.h:123
double beamDivergence_rad
Beam divergence (radians)
Definition: ScanningDevice.h:62
double pulseLength_ns
Pulse length (nanoseconds)
Definition: ScanningDevice.h:66
std::shared_ptr< AbstractDetector > detector
Detector composing the scanner.
Definition: ScanningDevice.h:113
void configureBeam()
Configure beam related attributes. It is recommended to reconfigure beam attributes always that beam ...
Definition: ScanningDevice.cpp:80
double cached_Dr2
understood as the square of receiver diameter
Definition: ScanningDevice.h:180
FWFSettings FWF_settings
Full wave form settings for the scanner.
Definition: ScanningDevice.h:118
std::shared_ptr< AbstractBeamDeflector > beamDeflector
Beam deflector composing the scanner.
Definition: ScanningDevice.h:108
size_t devIdx
The index of the scanning device in the MultiScanner context.
Definition: ScanningDevice.h:45
double wavelength_m
Wave length (meters)
Definition: ScanningDevice.h:90
double beamWaistRadius
Beam waist radius.
Definition: ScanningDevice.h:98
int numTimeBins
Number of bins defining the discretization size.
Definition: ScanningDevice.h:142
int maxNOR
Maximum number of returns per pulse. When 0, it means there is not maximum at all.
Definition: ScanningDevice.h:133
Rotation headRelativeEmitterAttitude
Head relative emitter attitude.
Definition: ScanningDevice.h:57
bool initializeFullWaveform(double const minHitDist_m, double const maxHitDist_m, double &minHitTime_ns, double &maxHitTime_ns, double &nsPerBin, double &distanceThreshold, int &peakIntensityIndex, int &numFullwaveBins)
Definition: ScanningDevice.cpp:233
bool state_lastPulseWasHit
Flag specifying if last pulse was hit (true) or not (false)
Definition: ScanningDevice.h:166
std::vector< double > time_wave
Time discretization vector.
Definition: ScanningDevice.h:153
double beamQuality
Beam quality.
Definition: ScanningDevice.h:74
void doSimStep(unsigned int legIndex, double const currentGpsTime, int const simFreq_Hz, bool const isActive, glm::dvec3 const &platformPosition, Rotation const &platformAttitude, std::function< void(glm::dvec3 &, Rotation &)> handleSimStepNoise, std::function< void(SimulatedPulse const &sp)> handlePulseComputation)
Do the simulation steps of the scanning device.
Definition: ScanningDevice.cpp:123
double averagePower_w
Average power (watts)
Definition: ScanningDevice.h:70
double atmosphericExtinction
Atmospheric extinction.
Definition: ScanningDevice.h:94
double calcIntensity(double const incidenceAngle, double const targetRange, double const targetReflectivity, double const targetSpecularity, double const targetSpecularExponent, double const targetArea, double const radius) const
Compute intensity. It is the strength of the laser going back to the detector considering the emitted...
Definition: ScanningDevice.cpp:284
int state_currentPulseNumber
Current pulse number.
Definition: ScanningDevice.h:160
std::list< int > supportedPulseFreqs_Hz
Pulse frequencies (hertz) supoported by the scanner.
Definition: ScanningDevice.h:127
Rotation calcAbsoluteBeamAttitude(Rotation platformAttitude)
Compute the absolute beam attitude of the scanning device with respect to given absolute platform att...
Definition: ScanningDevice.cpp:170
void computeSubrays(std::function< void(std::vector< double > const &_tMinMax, int const circleStep, double const circleStep_rad, Rotation &r1, double const divergenceAngle, NoiseSource< double > &intersectionHandlingNoiseSource, std::map< double, double > &reflections, vector< RaySceneIntersection > &intersects)> handleSubray, std::vector< double > const &tMinMax, NoiseSource< double > &intersectionHandlingNoiseSource, std::map< double, double > &reflections, std::vector< RaySceneIntersection > &intersects)
Definition: ScanningDevice.cpp:180
void setLastPulseWasHit(bool const value)
Specify if last pulse was hit (true) or not (false)
Definition: ScanningDevice.cpp:338
bool lastPulseWasHit() const
Check if last pulse was hit (true) or not (false) for the scanning device.
Definition: ScanningDevice.h:390
void calcRaysNumber()
Compute the number of rays depending on beam sample quality.
Definition: ScanningDevice.cpp:104
void setHeadRelativeEmitterPosition(glm::dvec3 const &headRelativeEmitterPosition)
Set the relative emitter position.
Definition: ScanningDevice.h:401
void setHeadRelativeEmitterAttitude(Rotation const &headRelativeEmitterAttitude)
Set the relative emitter attitude.
Definition: ScanningDevice.h:409
ScanningDevice(size_t const devIdx, std::string const id, double const beamDiv_rad, glm::dvec3 const beamOrigin, Rotation const beamOrientation, std::list< int > const &pulseFreqs, double const pulseLength_ns, double const averagePower, double const beamQuality, double const efficiency, double const receiverDiameter_m, double const atmosphericVisibility_km, double const wavelength_m)
ScanningDevice constructor from given values.
Definition: ScanningDevice.cpp:9
double efficiency
Device efficiency.
Definition: ScanningDevice.h:78
double receiverDiameter_m
Receiver diameter (meters)
Definition: ScanningDevice.h:82
void setFWFSettings(std::shared_ptr< FWFSettings > FWF_settings)
Set the Full Waveform settings of the scanning device.
Definition: ScanningDevice.h:422
double calcAtmosphericAttenuation() const
Compute the atmospheric attenuation to be used as the atmospheric extinction.
Definition: ScanningDevice.cpp:87
std::shared_ptr< ScannerHead > scannerHead
Scanner head composing the scanning device.
Definition: ScanningDevice.h:103
FWFSettings const & getFWFSettings()
Obtain the Full Waveform settings of the scanning device.
Definition: ScanningDevice.h:417
double visibility_km
Visibility (kilometers)
Definition: ScanningDevice.h:86
int peakIntensityIndex
Index of bin containing the intensity peak. It is computed through calcTimePropagation function.
Definition: ScanningDevice.h:149
glm::dvec3 headRelativeEmitterPosition
Head relative emitter position.
Definition: ScanningDevice.h:53
double cached_Bt2
understood as the square of beam divergence
Definition: ScanningDevice.h:190
Class representing a simulated laser pulse.
Definition: SimulatedPulse.h:10
Class representing a single scanner. It is, a scanner that can only emit one pulse per time instant.
Definition: SingleScanner.h:12