Helios++
Helios software for LiDAR simulations
SingleScanner.h
1 #pragma once
2 
3 #include <scanner/Scanner.h>
4 #include <scanner/ScanningDevice.h>
5 
12 class SingleScanner : public Scanner{
13 protected:
14  // *** ATTRIBUTES *** //
15  // ******************** //
20 
21 public:
22  // *** CONSTRUCTION / DESTRUCTION *** //
23  // ************************************ //
30  double const beamDiv_rad,
31  glm::dvec3 const beamOrigin,
32  Rotation const beamOrientation,
33  std::list<int> const &pulseFreqs,
34  double const pulseLength_ns,
35  std::string const id,
36  double const averagePower,
37  double const beamQuality,
38  double const efficiency,
39  double const receiverDiameter,
40  double const atmosphericVisibility,
41  int const wavelength,
42  bool const writeWaveform = false,
43  bool const calcEchowidth = false,
44  bool const fullWaveNoise = false,
45  bool const platformNoiseDisabled = false
46  );
51  SingleScanner(SingleScanner &scanner);
52  virtual ~SingleScanner() = default;
53 
54  // *** C L O N E *** //
55  // ********************* //
59  std::shared_ptr<Scanner> clone() override;
63  void _clone(Scanner &sc) const override;
64 
65  // *** SIM STEP UTILS *** //
66  // ************************ //
72  void onLegComplete() override;
73 
74  // *** M E T H O D S *** //
75  // ************************* //
79  void applySettings(
80  std::shared_ptr<ScannerSettings> settings, size_t const idx
81  ) override;
85  void doSimStep(
86  unsigned int legIndex, double const currentGpsTime
87  ) override;
91  void calcRaysNumber(size_t const idx) override
96  void prepareDiscretization(size_t const idx) override;
100  double calcFootprintArea(
101  double const distance, size_t const idx
102  ) const override;
106  double calcTargetArea(
107  double const distance, size_t const idx
108  ) const override;
112  Rotation calcAbsoluteBeamAttitude(size_t const idx) override;
116  double calcAtmosphericAttenuation(size_t const idx) const override
121  bool checkMaxNOR(int const nor, size_t const idx) override
122  {return scanDev.maxNOR==0 || nor < scanDev.maxNOR;}
126  void computeSubrays(
127  std::function<void(
128  vector<double> const &_tMinMax,
129  int const circleStep,
130  double const circleStep_rad,
131  Rotation &r1,
132  double const divergenceAngle,
134  std::map<double, double> &reflections,
135  vector<RaySceneIntersection> &intersects
136  )> handleSubray,
137  vector<double> const &tMinMax,
139  std::map<double, double> &reflections,
140  vector<RaySceneIntersection> &intersects,
141  size_t const idx
142  ) override;
147  double const minHitDist_m,
148  double const maxHitDist_m,
149  double &minHitTime_ns,
150  double &maxHitTime_ns,
151  double &nsPerBin,
152  double &distanceThreshold,
153  int &peakIntensityIndex,
154  int &numFullwaveBins,
155  size_t const idx
156  ) override;
160  double calcIntensity(
161  double const incidenceAngle,
162  double const targetRange,
163  double const targetReflectivity,
164  double const targetSpecularity,
165  double const targetSpecularExponent,
166  double const targetArea,
167  double const radius,
168  size_t const idx
169  ) const override;
173  double calcIntensity(
174  double const targetRange,
175  double const radius,
176  double const sigma,
177  size_t const idx
178  ) const override;
179 
180 
181  // *** GETTERs and SETTERs *** //
182  // ***************************** //
186  void setDeviceIndex(size_t const newIdx, size_t const oldIdx) override
187  {scanDev.devIdx = newIdx;}
191  std::string getDeviceId(size_t const idx) const override
192  {return scanDev.id;}
196  void setDeviceId(std::string const deviceId, size_t const idx) override
197  {scanDev.id = deviceId;}
201  size_t getNumDevices() const override {return 1;}
205  int getNumRays(size_t const idx) const override {return scanDev.numRays;}
209  void setNumRays(int const numRays, size_t const idx)
210  {scanDev.numRays = numRays;}
214  double getPulseLength_ns(size_t const idx) const override
215  {return scanDev.pulseLength_ns;}
220  double const pulseLength_ns, size_t const idx
221  ) override
222  {scanDev.pulseLength_ns = pulseLength_ns;}
226  double getBeamDivergence(size_t const idx) const override
227  {return scanDev.beamDivergence_rad;}
232  double const beamDivergence, size_t const idx
233  ) override
234  {scanDev.beamDivergence_rad = beamDivergence;}
238  double getAveragePower(size_t const idx) const override
239  {return scanDev.averagePower_w;}
244  double const averagePower, size_t const idx
245  ) override
246  {scanDev.averagePower_w = averagePower;}
250  double getBeamQuality(size_t const idx) const override
251  {return scanDev.beamQuality;}
255  void setBeamQuality(double const beamQuality, size_t const idx) override
256  {scanDev.beamQuality = beamQuality;}
260  double getEfficiency(size_t const idx) const override
261  {return scanDev.efficiency;}
265  void setEfficiency(double const efficiency, size_t const idx) override
266  {scanDev.efficiency = efficiency;}
270  double getReceiverDiameter(size_t const idx) const override
271  {return scanDev.receiverDiameter_m;}
276  double const receiverDiameter, size_t const idx
277  ) override
278  {scanDev.receiverDiameter_m = receiverDiameter;}
282  double getVisibility(size_t const idx) const override
283  {return scanDev.visibility_km;}
287  void setVisibility(double const visibility, size_t const idx) override
288  {scanDev.visibility_km = visibility;}
292  double getWavelength(size_t const idx) const override
293  {return scanDev.wavelength_m;}
297  void setWavelength(double const wavelength, size_t const idx) override
298  {scanDev.wavelength_m = wavelength;}
302  double getAtmosphericExtinction(size_t const idx) const override
308  double const atmosphericExtinction,
309  size_t const idx
310  ) override
311  {scanDev.atmosphericExtinction = atmosphericExtinction;}
315  double getBeamWaistRadius(size_t const idx) const override
316  {return scanDev.beamWaistRadius;}
321  double const beamWaistRadius, size_t const idx
322  ) override
323  {scanDev.beamWaistRadius = beamWaistRadius;}
328  size_t const idx
329  ) const override
335  glm::dvec3 const &pos, size_t const idx
336  ) override
342  size_t const idx=0
343  ) override
348  Rotation getHeadRelativeEmitterAttitude(size_t const idx) const override
354  Rotation const &attitude, size_t const idx
355  ) override
361  size_t const idx=0
362  ) override
367  double getBt2(size_t const idx) const override
368  {return scanDev.cached_Bt2;}
372  void setBt2(double const bt2, size_t const idx) override
373  {scanDev.cached_Bt2 = bt2;}
377  double getDr2(size_t const idx) const override
378  {return scanDev.cached_Dr2;}
382  void setDr2(double const dr2, size_t const idx) override
383  {scanDev.cached_Dr2 = dr2;}
384 
388  std::shared_ptr<ScannerHead> getScannerHead(size_t const idx) override
389  {return scanDev.scannerHead;}
394  std::shared_ptr<ScannerHead> scannerHead,
395  size_t const idx
396  ) override
397  {scanDev.scannerHead = scannerHead;}
401  std::shared_ptr<AbstractBeamDeflector> getBeamDeflector(
402  size_t const idx
403  ) override
404  {return scanDev.beamDeflector;}
409  std::shared_ptr<AbstractBeamDeflector> beamDeflector,
410  size_t const idx
411  ) override
412  {scanDev.beamDeflector = beamDeflector;}
416  std::shared_ptr<AbstractDetector> getDetector(size_t const idx) override
417  {return scanDev.detector;}
422  std::shared_ptr<AbstractDetector> detector, size_t const idx
423  ) override
424  {scanDev.detector = detector;}
428  FWFSettings & getFWFSettings(size_t const idx)
429  {return scanDev.FWF_settings;}
434  FWFSettings const &fwfSettings, size_t const idx
435  ) override
436  {scanDev.FWF_settings = fwfSettings;}
440  std::list<int>& getSupportedPulseFreqs_Hz(size_t const idx) override
446  std::list<int> &pulseFreqs_Hz, size_t const idx
447  ){
448  scanDev.supportedPulseFreqs_Hz = pulseFreqs_Hz;
449  }
453  int getMaxNOR(size_t const idx) const override {return scanDev.maxNOR;}
457  void setMaxNOR(int const maxNOR, size_t const idx) override
458  {scanDev.maxNOR = maxNOR;}
462  int getNumTimeBins(size_t const idx) const {return scanDev.numTimeBins;}
466  void setNumTimeBins(int const numTimeBins, size_t const idx)
467  {scanDev.numTimeBins = numTimeBins;}
471  int getPeakIntensityIndex(size_t const idx) const override
472  {return scanDev.peakIntensityIndex;}
476  void setPeakIntensityIndex(int const pii, size_t const idx) override
477  {scanDev.peakIntensityIndex = pii;}
481  std::vector<double>& getTimeWave(size_t const idx) override
482  {return scanDev.time_wave;}
486  void setTimeWave(std::vector<double> &timewave, size_t const idx)
487  {scanDev.time_wave = timewave;}
492  std::vector<double> &&timewave, size_t const idx
493  ) override
494  {scanDev.time_wave = timewave;}
498  int getCurrentPulseNumber(size_t const idx) const override
503  bool lastPulseWasHit(size_t const idx) const override
504  {return scanDev.lastPulseWasHit();}
509  bool const lastPulseWasHit, size_t const idx
510  ) override
512 
513 
514 
515 };
Full Waveform settings.
Definition: FWFSettings.h:12
Definition: Rotation.h:80
Class representing a scanner asset.
Definition: Scanner.h:28
bool lastPulseWasHit() const
Non index version of the Scanner::lastPulseWasHit method.
Definition: Scanner.h:656
Rotation calcAbsoluteBeamAttitude()
Non index version of the Scanner::calcAbsoluteBeamAttitude function.
Definition: Scanner.h:404
bool fullWaveNoise
Flag specifying if compute full wave noise (true) or not (false)
Definition: Scanner.h:47
bool platformNoiseDisabled
Flag specifying if disable platform noise (true) or not (false)
Definition: Scanner.h:51
void prepareDiscretization()
Non index version of the Scanner::prepareDiscretization method.
Definition: Scanner.h:325
bool writeWaveform
Flag specifying if write waveform (true) or not (false)
Definition: Scanner.h:39
std::shared_ptr< UniformNoiseSource< double > > intersectionHandlingNoiseSource
Uniform noise source for single thread mode.
Definition: Scanner.h:171
bool calcEchowidth
Flag specifying if calculate echo width (true) or not (false)
Definition: Scanner.h:43
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
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
std::vector< double > time_wave
Time discretization vector.
Definition: ScanningDevice.h:153
double beamQuality
Beam quality.
Definition: ScanningDevice.h:74
double averagePower_w
Average power (watts)
Definition: ScanningDevice.h:70
double atmosphericExtinction
Atmospheric extinction.
Definition: ScanningDevice.h:94
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
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
std::string id
Device identifier.
Definition: ScanningDevice.h:49
void calcRaysNumber()
Compute the number of rays depending on beam sample quality.
Definition: ScanningDevice.cpp:104
double efficiency
Device efficiency.
Definition: ScanningDevice.h:78
double receiverDiameter_m
Receiver diameter (meters)
Definition: ScanningDevice.h:82
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
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 single scanner. It is, a scanner that can only emit one pulse per time instant.
Definition: SingleScanner.h:12
double getBeamQuality(size_t const idx) const override
Definition: SingleScanner.h:250
void setDeviceIndex(size_t const newIdx, size_t const oldIdx) override
Definition: SingleScanner.h:186
void setFWFSettings(FWFSettings const &fwfSettings, size_t const idx) override
Definition: SingleScanner.h:433
int getNumTimeBins(size_t const idx) const
Definition: SingleScanner.h:462
double calcTargetArea(double const distance, size_t const idx) const override
Definition: SingleScanner.cpp:157
void setLastPulseWasHit(bool const lastPulseWasHit, size_t const idx) override
Definition: SingleScanner.h:508
void calcRaysNumber(size_t const idx) override
Definition: SingleScanner.h:91
void setAtmosphericExtinction(double const atmosphericExtinction, size_t const idx) override
Definition: SingleScanner.h:307
void setVisibility(double const visibility, size_t const idx) override
Definition: SingleScanner.h:287
void setNumTimeBins(int const numTimeBins, size_t const idx)
Definition: SingleScanner.h:466
void setPulseLength_ns(double const pulseLength_ns, size_t const idx) override
Definition: SingleScanner.h:219
double getPulseLength_ns(size_t const idx) const override
Definition: SingleScanner.h:214
void setHeadRelativeEmitterPosition(glm::dvec3 const &pos, size_t const idx) override
Definition: SingleScanner.h:334
double calcFootprintArea(double const distance, size_t const idx) const override
Definition: SingleScanner.cpp:151
Rotation & getHeadRelativeEmitterAttitudeByRef(size_t const idx=0) override
Definition: SingleScanner.h:360
double getWavelength(size_t const idx) const override
Definition: SingleScanner.h:292
double getDr2(size_t const idx) const override
Definition: SingleScanner.h:377
double getBeamDivergence(size_t const idx) const override
Definition: SingleScanner.h:226
Rotation getHeadRelativeEmitterAttitude(size_t const idx) const override
Definition: SingleScanner.h:348
void setEfficiency(double const efficiency, size_t const idx) override
Definition: SingleScanner.h:265
void computeSubrays(std::function< void(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, vector< double > const &tMinMax, NoiseSource< double > &intersectionHandlingNoiseSource, std::map< double, double > &reflections, vector< RaySceneIntersection > &intersects, size_t const idx) override
Definition: SingleScanner.cpp:168
void _clone(Scanner &sc) const override
Definition: SingleScanner.cpp:70
void setBeamQuality(double const beamQuality, size_t const idx) override
Definition: SingleScanner.h:255
glm::dvec3 & getHeadRelativeEmitterPositionByRef(size_t const idx=0) override
Definition: SingleScanner.h:341
FWFSettings & getFWFSettings(size_t const idx)
Definition: SingleScanner.h:428
void applySettings(std::shared_ptr< ScannerSettings > settings, size_t const idx) override
Definition: SingleScanner.cpp:90
int getCurrentPulseNumber(size_t const idx) const override
Definition: SingleScanner.h:498
void setAveragePower(double const averagePower, size_t const idx) override
Definition: SingleScanner.h:243
double getEfficiency(size_t const idx) const override
Definition: SingleScanner.h:260
SingleScanner(double const beamDiv_rad, glm::dvec3 const beamOrigin, Rotation const beamOrientation, std::list< int > const &pulseFreqs, double const pulseLength_ns, std::string const id, double const averagePower, double const beamQuality, double const efficiency, double const receiverDiameter, double const atmosphericVisibility, int const wavelength, bool const writeWaveform=false, bool const calcEchowidth=false, bool const fullWaveNoise=false, bool const platformNoiseDisabled=false)
SingleScanner constructor from given values.
Definition: SingleScanner.cpp:11
void setWavelength(double const wavelength, size_t const idx) override
Definition: SingleScanner.h:297
bool lastPulseWasHit(size_t const idx) const override
Definition: SingleScanner.h:503
void setDetector(std::shared_ptr< AbstractDetector > detector, size_t const idx) override
Definition: SingleScanner.h:421
glm::dvec3 getHeadRelativeEmitterPosition(size_t const idx) const override
Definition: SingleScanner.h:327
std::shared_ptr< Scanner > clone() override
Definition: SingleScanner.cpp:64
void setScannerHead(std::shared_ptr< ScannerHead > scannerHead, size_t const idx) override
Definition: SingleScanner.h:393
double getAveragePower(size_t const idx) const override
Definition: SingleScanner.h:238
void setBeamDivergence(double const beamDivergence, size_t const idx) override
Definition: SingleScanner.h:231
void setTimeWave(std::vector< double > &&timewave, size_t const idx) override
Definition: SingleScanner.h:491
int getPeakIntensityIndex(size_t const idx) const override
Definition: SingleScanner.h:471
void setDeviceId(std::string const deviceId, size_t const idx) override
Definition: SingleScanner.h:196
void setBt2(double const bt2, size_t const idx) override
Definition: SingleScanner.h:372
double getReceiverDiameter(size_t const idx) const override
Definition: SingleScanner.h:270
ScanningDevice scanDev
The only scanning device composing the SingleScanner.
Definition: SingleScanner.h:19
double getAtmosphericExtinction(size_t const idx) const override
Definition: SingleScanner.h:302
void setSupportedPulseFreqs_Hz(std::list< int > &pulseFreqs_Hz, size_t const idx)
Definition: SingleScanner.h:445
void doSimStep(unsigned int legIndex, double const currentGpsTime) override
Definition: SingleScanner.cpp:106
double getVisibility(size_t const idx) const override
Definition: SingleScanner.h:282
std::string getDeviceId(size_t const idx) const override
Definition: SingleScanner.h:191
size_t getNumDevices() const override
Definition: SingleScanner.h:201
void setBeamDeflector(std::shared_ptr< AbstractBeamDeflector > beamDeflector, size_t const idx) override
Definition: SingleScanner.h:408
int getNumRays(size_t const idx) const override
Definition: SingleScanner.h:205
void setBeamWaistRadius(double const beamWaistRadius, size_t const idx) override
Definition: SingleScanner.h:320
void setMaxNOR(int const maxNOR, size_t const idx) override
Definition: SingleScanner.h:457
bool initializeFullWaveform(double const minHitDist_m, double const maxHitDist_m, double &minHitTime_ns, double &maxHitTime_ns, double &nsPerBin, double &distanceThreshold, int &peakIntensityIndex, int &numFullwaveBins, size_t const idx) override
Definition: SingleScanner.cpp:194
void onLegComplete() override
Extend Scanner::onLegComplete behavior by handling onLegComplete events for the case of a single dete...
Definition: SingleScanner.cpp:81
std::shared_ptr< ScannerHead > getScannerHead(size_t const idx) override
Definition: SingleScanner.h:388
std::shared_ptr< AbstractDetector > getDetector(size_t const idx) override
Definition: SingleScanner.h:416
void setPeakIntensityIndex(int const pii, size_t const idx) override
Definition: SingleScanner.h:476
void setTimeWave(std::vector< double > &timewave, size_t const idx)
Definition: SingleScanner.h:486
void setDr2(double const dr2, size_t const idx) override
Definition: SingleScanner.h:382
double calcAtmosphericAttenuation(size_t const idx) const override
Definition: SingleScanner.h:116
void setNumRays(int const numRays, size_t const idx)
Definition: SingleScanner.h:209
double calcIntensity(double const incidenceAngle, double const targetRange, double const targetReflectivity, double const targetSpecularity, double const targetSpecularExponent, double const targetArea, double const radius, size_t const idx) const override
Definition: SingleScanner.cpp:217
std::shared_ptr< AbstractBeamDeflector > getBeamDeflector(size_t const idx) override
Definition: SingleScanner.h:401
void setHeadRelativeEmitterAttitude(Rotation const &attitude, size_t const idx) override
Definition: SingleScanner.h:353
std::list< int > & getSupportedPulseFreqs_Hz(size_t const idx) override
Definition: SingleScanner.h:440
bool checkMaxNOR(int const nor, size_t const idx) override
Definition: SingleScanner.h:121
double getBt2(size_t const idx) const override
Definition: SingleScanner.h:367
int getMaxNOR(size_t const idx) const override
Definition: SingleScanner.h:453
double getBeamWaistRadius(size_t const idx) const override
Definition: SingleScanner.h:315
std::vector< double > & getTimeWave(size_t const idx) override
Definition: SingleScanner.h:481
void setReceiverDiameter(double const receiverDiameter, size_t const idx) override
Definition: SingleScanner.h:275