Helios++
Helios software for LiDAR simulations
MultiScanner.h
1 #pragma once
2 
3 #include <scanner/Scanner.h>
4 #include <scanner/ScanningDevice.h>
5 
6 #include <vector>
7 
14 class MultiScanner : public Scanner{
15 protected:
16  // *** ATTRIBUTES *** //
17  // ******************** //
21  std::vector<ScanningDevice> scanDevs;
22 
23 
24 public:
25  // *** CONSTRUCTION / DESTRUCTION *** //
26  // ************************************ //
33  std::vector<ScanningDevice> && scanDevs,
34  std::string const id,
35  std::list<int> const &pulseFreqs,
36  bool const writeWaveform=false,
37  bool const calcEchowidth=false,
38  bool const fullWaveNoise=false,
39  bool const platformNoiseDisabled=false
40  ) :
41  Scanner(
42  id,
43  pulseFreqs,
48  ),
49  scanDevs(std::move(scanDevs))
50  {}
56  std::string const id,
57  std::list<int> const &pulseFreqs,
58  bool const writeWaveform=false,
59  bool const calcEchowdith=false,
60  bool const fullWaveNoise=false,
61  bool const platformNoiseDisabled=false
62  ) :
63  Scanner(
64  id,
65  pulseFreqs,
70  ),
71  scanDevs()
72  {}
77  MultiScanner(MultiScanner &scanner);
78  virtual ~MultiScanner() = default;
79 
80 
81  // *** C L O N E *** //
82  // ********************* //
86  std::shared_ptr<Scanner> clone() override;
90  void _clone(Scanner &sc) const override;
91 
92  // *** SIM STEP UTILS *** //
93  // ************************ //
99  void onLegComplete() override;
100 
101 
102  // *** M E T H O D S *** //
103  // ************************* //
107  void applySettings(
108  std::shared_ptr<ScannerSettings> settings, size_t const idx
109  ) override;
113  void doSimStep(
114  unsigned int legIndex, double const currentGpsTime
115  ) override;
119  void calcRaysNumber(size_t const idx) override
120  {scanDevs[idx].calcRaysNumber();}
124  void prepareDiscretization(size_t const idx) override;
128  double calcFootprintArea(
129  double const distance, size_t const idx
130  ) const override;
134  double calcTargetArea(
135  double const distance, size_t const idx
136  ) const override;
140  Rotation calcAbsoluteBeamAttitude(size_t const idx) override;
144  double calcAtmosphericAttenuation(size_t const idx) const override
145  {return scanDevs[idx].calcAtmosphericAttenuation();}
149  bool checkMaxNOR(int const nor, size_t const idx) override
150  {return scanDevs[idx].maxNOR==0 || nor < scanDevs[idx].maxNOR;}
154  void computeSubrays(
155  std::function<void(
156  vector<double> const &_tMinMax,
157  int const circleStep,
158  double const circleStep_rad,
159  Rotation &r1,
160  double const divergenceAngle,
162  std::map<double, double> &reflections,
163  vector<RaySceneIntersection> &intersects
164  )> handleSubray,
165  vector<double> const &tMinMax,
167  std::map<double, double> &reflections,
168  vector<RaySceneIntersection> &intersects,
169  size_t const idx
170  ) override;
175  double const minHitDist_m,
176  double const maxHitDist_m,
177  double &minHitTime_ns,
178  double &maxHitTime_ns,
179  double &nsPerBin,
180  double &distanceThreshold,
181  int &peakIntensityIndex,
182  int &numFullwaveBins,
183  size_t const idx
184  ) override;
188  double calcIntensity(
189  double const incidenceAngle,
190  double const targetRange,
191  double const targetReflectivity,
192  double const targetSpecularity,
193  double const targetSpecularExponent,
194  double const targetArea,
195  double const radius,
196  size_t const idx
197  ) const override;
201  double calcIntensity(
202  double const targetRange,
203  double const radius,
204  double const sigma,
205  size_t const idx
206  ) const override;
207 
208 
209  // *** GETTERs and SETTERs *** //
210  // ***************************** //
214  void setDeviceIndex(size_t const newIdx, size_t const oldIdx) override
215  {scanDevs[oldIdx].devIdx = newIdx;}
219  std::string getDeviceId(size_t const idx) const override
220  {return scanDevs[idx].id;}
224  void setDeviceId(std::string const deviceId, size_t const idx) override
225  {scanDevs[idx].id = deviceId;}
229  size_t getNumDevices() const override {return scanDevs.size();}
233  double getPulseLength_ns(size_t const idx) const override
234  {return scanDevs[idx].pulseLength_ns;}
239  double const pulseLength_ns, size_t const idx
240  ) override
241  {scanDevs[idx].pulseLength_ns = pulseLength_ns;}
245  double getBeamDivergence(size_t const idx) const override
246  {return scanDevs[idx].beamDivergence_rad;}
251  double const beamDivergence, size_t const idx
252  ) override
253  {scanDevs[idx].beamDivergence_rad = beamDivergence;}
257  double getAveragePower(size_t const idx) const override
258  {return scanDevs[idx].averagePower_w;}
263  double const averagePower, size_t const idx
264  ) override
265  {scanDevs[idx].averagePower_w = averagePower;}
269  double getBeamQuality(size_t const idx) const override
270  {return scanDevs[idx].beamQuality;}
274  void setBeamQuality(double const beamQuality, size_t const idx) override
275  {scanDevs[idx].beamQuality = beamQuality;}
279  double getEfficiency(size_t const idx) const override
280  {return scanDevs[idx].efficiency;}
284  void setEfficiency(double const efficiency, size_t const idx) override
285  {scanDevs[idx].efficiency = efficiency;}
289  double getReceiverDiameter(size_t const idx) const override
290  {return scanDevs[idx].receiverDiameter_m;}
295  double const receiverDiameter, size_t const idx
296  ) override
297  {scanDevs[idx].receiverDiameter_m = receiverDiameter;}
301  double getVisibility(size_t const idx) const override
302  {return scanDevs[idx].visibility_km;}
306  void setVisibility(double const visibility, size_t const idx) override
307  {scanDevs[idx].visibility_km = visibility;}
311  double getWavelength(size_t const idx) const override
312  {return scanDevs[idx].wavelength_m;}
316  void setWavelength(double const wavelength, size_t const idx) override
317  {scanDevs[idx].wavelength_m = wavelength;}
321  double getAtmosphericExtinction(size_t const idx) const override
322  {return scanDevs[idx].atmosphericExtinction;}
327  double const atmosphericExtinction,
328  size_t const idx
329  ) override
330  {scanDevs[idx].atmosphericExtinction = atmosphericExtinction;}
334  double getBeamWaistRadius(size_t const idx) const override
335  {return scanDevs[idx].beamWaistRadius;}
340  double const beamWaistRadius, size_t const idx
341  ) override
342  {scanDevs[idx].beamWaistRadius = beamWaistRadius;}
347  size_t const idx
348  ) const override
349  {return scanDevs[idx].headRelativeEmitterPosition;}
354  glm::dvec3 const &pos, size_t const idx
355  ) override
356  {scanDevs[idx].headRelativeEmitterPosition = pos;}
361  size_t const idx=0
362  ) override
363  {return scanDevs[idx].headRelativeEmitterPosition;}
367  Rotation getHeadRelativeEmitterAttitude(size_t const idx) const override
368  {return scanDevs[idx].headRelativeEmitterAttitude;}
373  Rotation const &attitude, size_t const idx
374  ) override
375  {scanDevs[idx].headRelativeEmitterAttitude = attitude;}
380  size_t const idx=0
381  ) override
382  {return scanDevs[idx].headRelativeEmitterAttitude;}
386  double getBt2(size_t const idx) const override
387  {return scanDevs[idx].cached_Bt2;}
391  void setBt2(double const bt2, size_t const idx) override
392  {scanDevs[idx].cached_Bt2 = bt2;}
396  double getDr2(size_t const idx) const override
397  {return scanDevs[idx].cached_Dr2;}
401  void setDr2(double const dr2, size_t const idx) override
402  {scanDevs[idx].cached_Dr2 = dr2;}
406  int getCurrentPulseNumber(size_t const idx) const override
407  {return scanDevs[idx].state_currentPulseNumber;}
411  int getNumRays(size_t const idx) const override
412  {return scanDevs[idx].numRays;}
416  void setNumRays(int const numRays, size_t const idx)
417  {scanDevs[idx].numRays = numRays;}
421  bool lastPulseWasHit(size_t const idx) const override
422  {return scanDevs[idx].lastPulseWasHit();}
427  bool const lastPulseWasHit, size_t const idx
428  ) override
429  {scanDevs[idx].setLastPulseWasHit(lastPulseWasHit);}
433  std::shared_ptr<ScannerHead> getScannerHead(size_t const idx) override
434  {return scanDevs[idx].scannerHead;}
439  std::shared_ptr<ScannerHead> scannerHead,
440  size_t const idx
441  ) override
442  {scanDevs[idx].scannerHead = scannerHead;}
446  std::shared_ptr<AbstractBeamDeflector> getBeamDeflector(
447  size_t const idx
448  ) override
449  {return scanDevs[idx].beamDeflector;}
454  std::shared_ptr<AbstractBeamDeflector> beamDeflector,
455  size_t const idx
456  ) override
457  {scanDevs[idx].beamDeflector = beamDeflector;}
461  std::shared_ptr<AbstractDetector> getDetector(size_t const idx) override
462  {return scanDevs[idx].detector;}
467  std::shared_ptr<AbstractDetector> detector, size_t const idx
468  ) override
469  {scanDevs[idx].detector = detector;}
473  FWFSettings & getFWFSettings(size_t const idx)
474  {return scanDevs[idx].FWF_settings;}
479  FWFSettings const &fwfSettings, size_t const idx
480  ) override
481  {scanDevs[idx].FWF_settings = fwfSettings;}
485  std::list<int>& getSupportedPulseFreqs_Hz(size_t const idx) override
486  {return scanDevs[idx].supportedPulseFreqs_Hz;}
491  std::list<int> &pulseFreqs_Hz, size_t const idx
492  ){
493  scanDevs[idx].supportedPulseFreqs_Hz = pulseFreqs_Hz;
494  }
498  int getMaxNOR(size_t const idx) const override
499  {return scanDevs[idx].maxNOR;}
503  void setMaxNOR(int const maxNOR, size_t const idx) override
504  {scanDevs[idx].maxNOR = maxNOR;}
508  int getNumTimeBins(size_t const idx) const
509  {return scanDevs[idx].numTimeBins;}
513  void setNumTimeBins(int const numTimeBins, size_t const idx)
514  {scanDevs[idx].numTimeBins = numTimeBins;}
518  int getPeakIntensityIndex(size_t const idx) const override
519  {return scanDevs[idx].peakIntensityIndex;}
523  void setPeakIntensityIndex(int const pii, size_t const idx) override
524  {scanDevs[idx].peakIntensityIndex = pii;}
528  std::vector<double>& getTimeWave(size_t const idx) override
529  {return scanDevs[idx].time_wave;}
533  void setTimeWave(std::vector<double> &timewave, size_t const idx)
534  {scanDevs[idx].time_wave = timewave;}
539  std::vector<double> &&timewave, size_t const idx
540  ) override
541  {scanDevs[idx].time_wave = timewave;}
542 
543 };
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
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: MultiScanner.cpp:179
void setReceiverDiameter(double const receiverDiameter, size_t const idx) override
Definition: MultiScanner.h:294
std::list< int > & getSupportedPulseFreqs_Hz(size_t const idx) override
Definition: MultiScanner.h:485
std::shared_ptr< AbstractDetector > getDetector(size_t const idx) override
Definition: MultiScanner.h:461
void setHeadRelativeEmitterAttitude(Rotation const &attitude, size_t const idx) override
Definition: MultiScanner.h:372
double calcTargetArea(double const distance, size_t const idx) const override
Definition: MultiScanner.cpp:119
double calcAtmosphericAttenuation(size_t const idx) const override
Definition: MultiScanner.h:144
void setPulseLength_ns(double const pulseLength_ns, size_t const idx) override
Definition: MultiScanner.h:238
void setSupportedPulseFreqs_Hz(std::list< int > &pulseFreqs_Hz, size_t const idx)
Definition: MultiScanner.h:490
std::shared_ptr< AbstractBeamDeflector > getBeamDeflector(size_t const idx) override
Definition: MultiScanner.h:446
std::vector< double > & getTimeWave(size_t const idx) override
Definition: MultiScanner.h:528
std::shared_ptr< ScannerHead > getScannerHead(size_t const idx) override
Definition: MultiScanner.h:433
double getAveragePower(size_t const idx) const override
Definition: MultiScanner.h:257
double getPulseLength_ns(size_t const idx) const override
Definition: MultiScanner.h:233
MultiScanner(std::vector< ScanningDevice > &&scanDevs, std::string const id, std::list< int > const &pulseFreqs, bool const writeWaveform=false, bool const calcEchowidth=false, bool const fullWaveNoise=false, bool const platformNoiseDisabled=false)
Definition: MultiScanner.h:32
int getPeakIntensityIndex(size_t const idx) const override
Definition: MultiScanner.h:518
size_t getNumDevices() const override
Definition: MultiScanner.h:229
double getDr2(size_t const idx) const override
Definition: MultiScanner.h:396
void doSimStep(unsigned int legIndex, double const currentGpsTime) override
Definition: MultiScanner.cpp:62
void setPeakIntensityIndex(int const pii, size_t const idx) override
Definition: MultiScanner.h:523
void setBeamWaistRadius(double const beamWaistRadius, size_t const idx) override
Definition: MultiScanner.h:339
void setScannerHead(std::shared_ptr< ScannerHead > scannerHead, size_t const idx) override
Definition: MultiScanner.h:438
void setNumRays(int const numRays, size_t const idx)
Definition: MultiScanner.h:416
void setBeamDivergence(double const beamDivergence, size_t const idx) override
Definition: MultiScanner.h:250
void setBeamDeflector(std::shared_ptr< AbstractBeamDeflector > beamDeflector, size_t const idx) override
Definition: MultiScanner.h:453
std::shared_ptr< Scanner > clone() override
Definition: MultiScanner.cpp:15
void setDetector(std::shared_ptr< AbstractDetector > detector, size_t const idx) override
Definition: MultiScanner.h:466
void setDeviceId(std::string const deviceId, size_t const idx) override
Definition: MultiScanner.h:224
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: MultiScanner.cpp:130
FWFSettings & getFWFSettings(size_t const idx)
Definition: MultiScanner.h:473
void setDeviceIndex(size_t const newIdx, size_t const oldIdx) override
Definition: MultiScanner.h:214
double calcFootprintArea(double const distance, size_t const idx) const override
Definition: MultiScanner.cpp:113
glm::dvec3 & getHeadRelativeEmitterPositionByRef(size_t const idx=0) override
Definition: MultiScanner.h:360
double getBeamDivergence(size_t const idx) const override
Definition: MultiScanner.h:245
bool checkMaxNOR(int const nor, size_t const idx) override
Definition: MultiScanner.h:149
glm::dvec3 getHeadRelativeEmitterPosition(size_t const idx) const override
Definition: MultiScanner.h:346
std::string getDeviceId(size_t const idx) const override
Definition: MultiScanner.h:219
void setEfficiency(double const efficiency, size_t const idx) override
Definition: MultiScanner.h:284
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: MultiScanner.cpp:156
void setMaxNOR(int const maxNOR, size_t const idx) override
Definition: MultiScanner.h:503
void calcRaysNumber(size_t const idx) override
Definition: MultiScanner.h:119
void setBeamQuality(double const beamQuality, size_t const idx) override
Definition: MultiScanner.h:274
bool lastPulseWasHit(size_t const idx) const override
Definition: MultiScanner.h:421
void setAveragePower(double const averagePower, size_t const idx) override
Definition: MultiScanner.h:262
double getVisibility(size_t const idx) const override
Definition: MultiScanner.h:301
Rotation & getHeadRelativeEmitterAttitudeByRef(size_t const idx=0) override
Definition: MultiScanner.h:379
void setWavelength(double const wavelength, size_t const idx) override
Definition: MultiScanner.h:316
void setFWFSettings(FWFSettings const &fwfSettings, size_t const idx) override
Definition: MultiScanner.h:478
void setBt2(double const bt2, size_t const idx) override
Definition: MultiScanner.h:391
double getWavelength(size_t const idx) const override
Definition: MultiScanner.h:311
double getBeamQuality(size_t const idx) const override
Definition: MultiScanner.h:269
void setHeadRelativeEmitterPosition(glm::dvec3 const &pos, size_t const idx) override
Definition: MultiScanner.h:353
void applySettings(std::shared_ptr< ScannerSettings > settings, size_t const idx) override
Definition: MultiScanner.cpp:43
void setLastPulseWasHit(bool const lastPulseWasHit, size_t const idx) override
Definition: MultiScanner.h:426
int getMaxNOR(size_t const idx) const override
Definition: MultiScanner.h:498
int getCurrentPulseNumber(size_t const idx) const override
Definition: MultiScanner.h:406
double getEfficiency(size_t const idx) const override
Definition: MultiScanner.h:279
double getReceiverDiameter(size_t const idx) const override
Definition: MultiScanner.h:289
void onLegComplete() override
Extend Scanner::onLegComplete behavior by handling onLegComplete events for the case of a multiple de...
Definition: MultiScanner.cpp:31
void setAtmosphericExtinction(double const atmosphericExtinction, size_t const idx) override
Definition: MultiScanner.h:326
MultiScanner(std::string const id, std::list< int > const &pulseFreqs, bool const writeWaveform=false, bool const calcEchowdith=false, bool const fullWaveNoise=false, bool const platformNoiseDisabled=false)
MultiScanner default constructor.
Definition: MultiScanner.h:55
void _clone(Scanner &sc) const override
Definition: MultiScanner.cpp:21
int getNumRays(size_t const idx) const override
Definition: MultiScanner.h:411
void setDr2(double const dr2, size_t const idx) override
Definition: MultiScanner.h:401
void setTimeWave(std::vector< double > &&timewave, size_t const idx) override
Definition: MultiScanner.h:538
double getBt2(size_t const idx) const override
Definition: MultiScanner.h:386
void setNumTimeBins(int const numTimeBins, size_t const idx)
Definition: MultiScanner.h:513
void setVisibility(double const visibility, size_t const idx) override
Definition: MultiScanner.h:306
Rotation getHeadRelativeEmitterAttitude(size_t const idx) const override
Definition: MultiScanner.h:367
double getBeamWaistRadius(size_t const idx) const override
Definition: MultiScanner.h:334
int getNumTimeBins(size_t const idx) const
Definition: MultiScanner.h:508
double getAtmosphericExtinction(size_t const idx) const override
Definition: MultiScanner.h:321
std::vector< ScanningDevice > scanDevs
The scanning devices composing the MultiScanner.
Definition: MultiScanner.h:21
void setTimeWave(std::vector< double > &timewave, size_t const idx)
Definition: MultiScanner.h:533
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
std::string id
The scanner's identifier.
Definition: Scanner.h:35
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