Helios++
Helios software for LiDAR simulations
Scanner.h
1 #pragma once
2 
3 #include <memory>
4 
5 #include <boost/asio/thread_pool.hpp>
6 #include <boost/asio/post.hpp>
7 
8 #include "Asset.h"
9 #include "ScannerHead.h"
10 #include "AbstractBeamDeflector.h"
11 class AbstractDetector;
12 #include "FWFSettings.h"
13 #include "Platform.h"
14 #include "maths/Directions.h"
15 #include "maths/Rotation.h"
16 #include "ThreadPool.h"
17 #include "SyncFileWriter.h"
18 #ifdef PYTHON_BINDING
19 #include <PyBeamDeflectorWrapper.h>
20 class PyDetectorWrapper;
21 #include <PyIntegerList.h>
22 #include <PyNoiseSourceWrapper.h>
23 #include <PyRandomnessGeneratorWrapper.h>
24 #include <PyDoubleVector.h>
25 #endif
26 #include <Measurement.h>
27 
31 class Scanner : public Asset {
32 private:
33  // *** ATTRIBUTES *** //
34  // ******************** //
38  bool writeWaveform = false;
42  bool calcEchowidth = false;
46  bool fullWaveNoise = false;
50  bool platformNoiseDisabled = false;
55  int numRays = 0;
60  bool fixedIncidenceAngle = false;
61 
77  std::string cfg_device_id = "";
102 
111  // ########## END Emitter ###########
112 
113  // State variables:
121  bool state_lastPulseWasHit = false;
127  bool state_isActive = true;
128 
129  // Cached variables
139  double cached_Dr2;
149  double cached_Bt2;
150 
151  // Trajectory writer
155  std::shared_ptr<SyncFileWriter> tfw = nullptr;
156 
157 public:
162  std::shared_ptr<ScannerHead> scannerHead;
167  std::shared_ptr<AbstractBeamDeflector> beamDeflector;
172  std::shared_ptr<Platform> platform;
177  std::shared_ptr<AbstractDetector> detector;
184  std::shared_ptr<std::vector<Measurement>> allMeasurements = nullptr;
191  std::shared_ptr<std::vector<Trajectory>> allTrajectories = nullptr;
199  std::shared_ptr<std::mutex> allMeasurementsMutex = nullptr;
205  std::shared_ptr<std::vector<Measurement>> cycleMeasurements = nullptr;
212  std::shared_ptr<std::vector<Trajectory>> cycleTrajectories = nullptr;
220  std::shared_ptr<std::mutex> cycleMeasurementsMutex = nullptr;
221 
222  // Trajectory output processing interval
233 
234  // FWF settings
240 
241  // Pulse discretization
250  int numTimeBins = -1;
261  std::vector<double> time_wave;
262 
263  // Randomness generators for single thread mode only
267  std::shared_ptr<RandomnessGenerator<double>> randGen1 = nullptr;
271  std::shared_ptr<RandomnessGenerator<double>> randGen2 = nullptr;
275  std::shared_ptr<UniformNoiseSource<double>>
277 
278  // ########## BEGIN Emitter ###########
282  glm::dvec3 cfg_device_headRelativeEmitterPosition = glm::dvec3(0, 0, 0);
292 
293 public:
294  // *** CONSTRUCTION / DESTRUCTION *** //
295  // ************************************ //
319  Scanner(
320  double beamDiv_rad,
321  glm::dvec3 beamOrigin,
322  Rotation beamOrientation,
323  std::list<int> pulseFreqs,
324  double pulseLength_ns,
325  std::string id,
326  double averagePower,
327  double beamQuality,
328  double efficiency,
329  double receiverDiameter,
330  double atmosphericVisibility,
331  int wavelength,
332  bool writeWaveform = false,
333  bool calcEchowidth = false,
334  bool fullWaveNoise = false,
335  bool platformNoiseDisabled = false
336  );
337  Scanner(Scanner &scanner);
338 
339  // *** M E T H O D S *** //
340  // *********************** //
346  void applySettings(std::shared_ptr<ScannerSettings> settings);
352  void applySettingsFWF(FWFSettings settings);
358  void doSimStep(thread_pool& pool, unsigned int legIndex);
363  std::string toString();
367  void calcRaysNumber();
374  void prepareDiscretization();
383  int calcTimePropagation(std::vector<double> & timeWave, int numBins);
395  double calcFootprintArea(double distance);
407  double calcFootprintRadius(double distance);
426  long calcCurrentGpsTime();
427 
428  // *** SIM STEP UTILS *** //
429  // ************************ //
436  void handleSimStepNoise(
437  glm::dvec3 & absoluteBeamOrigin,
438  Rotation & absoluteBeamAttitude
439  );
451  thread_pool& pool,
452  unsigned int const legIndex,
453  glm::dvec3 &absoluteBeamOrigin,
454  Rotation &absoluteBeamAttitude,
455  long currentGpsTime
456  );
464  void handleTrajectoryOutput(long currentGpsTime);
465 
466  // *** GETTERs and SETTERs *** //
467  // *************************** //
473  inline int getNumRays() {return this->numRays;}
479  inline void setNumRays(int numRays) {this->numRays = numRays;}
480 
486  inline int getPulseFreq_Hz() {return this->cfg_setting_pulseFreq_Hz;}
492  void setPulseFreq_Hz(int pulseFreq_Hz);
493 
499  inline double getPulseLength_ns()
500  {return this->cfg_device_pulseLength_ns;}
506  inline void setPulseLength_ns(double pulseLength_ns)
507  {this->cfg_device_pulseLength_ns = pulseLength_ns;}
508 
514  inline bool lastPulseWasHit() {return this->state_lastPulseWasHit;}
521 
527  inline double getBeamDivergence()
528  {return this->cfg_device_beamDivergence_rad;}
534  inline void setBeamDivergence(double beamDivergence)
535  {this->cfg_device_beamDivergence_rad = beamDivergence;}
536 
542  inline double getAveragePower() {return this->cfg_device_averagePower_w;}
548  inline void setAveragePower(double averagePower)
549  {this->cfg_device_averagePower_w = averagePower;}
550 
556  inline double getBeamQuality() {return this->cfg_device_beamQuality;}
562  inline void setBeamQuality(double beamQuality)
563  {this->cfg_device_beamQuality = beamQuality;}
564 
570  inline double getEfficiency() {return this->cfg_device_efficiency;}
576  inline void setEfficiency(double efficiency)
577  {this->cfg_device_efficiency = efficiency;}
578 
584  inline double getReceiverDiameter()
585  {return this->cfg_device_receiverDiameter_m;}
591  inline void setReceiverDiameter(double receiverDiameter)
592  {this->cfg_device_receiverDiameter_m = receiverDiameter;}
593 
599  inline double getVisibility() {return this->cfg_device_visibility_km;}
605  inline void setVisibility(double visibility)
606  {this->cfg_device_visibility_km = visibility;}
607 
613  inline double getWavelength() {return this->cfg_device_wavelength_m;}
619  inline void setWavelength(double wavelength)
620  {this->cfg_device_wavelength_m = wavelength;}
621 
627  inline double getAtmosphericExtinction()
628  {return this->atmosphericExtinction;}
634  inline void setAtmosphericExtinction(double atmosphericExtinction)
635  {this->atmosphericExtinction = atmosphericExtinction;}
636 
642  inline double getBeamWaistRadius() {return this->beamWaistRadius;}
648  inline void setBeamWaistRadius(double beamWaistRadius)
649  {this->beamWaistRadius = beamWaistRadius;}
650 
656  inline double getBt2() {return this->cached_Bt2;}
662  inline void setBt2(double bt2) {this->cached_Bt2 = bt2;}
663 
669  inline double getDr2() {return this->cached_Dr2;}
675  inline void setDr2(double dr2) {this->cached_Dr2 = dr2;}
676 
682  inline bool isActive() {return this->state_isActive;}
689  inline void setActive(bool active) {this->state_isActive = active;}
690 
698  inline bool isWriteWaveform() {return this->writeWaveform;}
705  inline void setWriteWaveform(bool writeWaveform)
706  {this->writeWaveform = writeWaveform;}
714  inline bool isCalcEchowidth() {return this->calcEchowidth;}
721  inline void setCalcEchowidth(bool calcEchowidth)
722  {this->calcEchowidth = calcEchowidth;}
723 
731  inline bool isFullWaveNoise() {return this->fullWaveNoise;}
738  inline void setFullWaveNoise(bool fullWaveNoise)
739  {this->fullWaveNoise = fullWaveNoise;}
740 
746  inline bool isPlatformNoiseDisabled() {return this->platformNoiseDisabled;}
753  inline void setPlatformNoiseDisabled(bool platformNoiseDisabled)
754  {this->platformNoiseDisabled = platformNoiseDisabled;}
755 
761  inline bool isFixedIncidenceAngle() {return this->fixedIncidenceAngle;}
768  inline void setFixedIncidenceAngle(bool fixedIncidenceAngle)
769  {this->fixedIncidenceAngle = fixedIncidenceAngle;}
770 
776  inline void setTrajectoryFileWriter(std::shared_ptr<SyncFileWriter> tfw){
777  this->tfw = tfw;
778  }
779 
785  inline std::string getDeviceId() {return this->cfg_device_id;}
791  inline void setDeviceId(std::string const deviceId)
792  {this->cfg_device_id = deviceId;}
793 
794 #ifdef PYTHON_BINDING
795 
807  {return new PyBeamDeflectorWrapper(beamDeflector);}
820  {return new PyIntegerList(cfg_device_supportedPulseFreqs_Hz);}
834  {return new PythonDVec3(&cfg_device_headRelativeEmitterPosition);}
841  if(intersectionHandlingNoiseSource == nullptr) return nullptr;
843  }
850  if(randGen1 == nullptr) return nullptr;
851  return new PyRandomnessGeneratorWrapper(*randGen1);
852  }
859  if(randGen2 == nullptr) return nullptr;
860  return new PyRandomnessGeneratorWrapper(*randGen2);
861  }
868  return new PyDoubleVector(time_wave);
869  }
870 #endif
871 
872 };
std::shared_ptr< std::vector< Measurement > > cycleMeasurements
Vector of measurements performed by the scanner at current cycle.
Definition: Scanner.h:205
double getBeamWaistRadius()
Obtain beam waist radius.
Definition: Scanner.h:642
std::shared_ptr< std::vector< Measurement > > allMeasurements
Historical vector of all measurements performed by the scanner.
Definition: Scanner.h:184
void setVisibility(double visibility)
Set device visibility.
Definition: Scanner.h:605
bool platformNoiseDisabled
Flag specifying if disable platform noise (true) or not (false)
Definition: Scanner.h:50
bool isCalcEchowidth()
Check if scanner is configured to compute echo width (true) or not (false)
Definition: Scanner.h:714
double calcAtmosphericAttenuation()
Compute the atmospheric attenuation to be used as the atmospheric attenuation.
Definition: Scanner.cpp:285
void handleSimStepNoise(glm::dvec3 &absoluteBeamOrigin, Rotation &absoluteBeamAttitude)
Handle position and attitude noise.
Definition: Scanner.cpp:349
void setLastPulseWasHit(bool lastPulseWasHit)
Specify if last pulse was hit (true) or not (false)
Definition: Scanner.cpp:341
std::list< int > cfg_device_supportedPulseFreqs_Hz
Pulse frequencies (hertz) supoported by the scanner.
Definition: Scanner.h:291
void setWriteWaveform(bool writeWaveform)
Set scanner write wave form configuration.
Definition: Scanner.h:705
void handleTrajectoryOutput(long currentGpsTime)
Handle trajectory output whatever it is to output file, to all trajectories vector or to cycle trajec...
Definition: Scanner.cpp:474
bool fixedIncidenceAngle
Flag specifying if use fixed incidence angle (true) or not (false)
Definition: Scanner.h:60
double getEfficiency()
Obtain device efficiency.
Definition: Scanner.h:570
std::shared_ptr< UniformNoiseSource< double > > intersectionHandlingNoiseSource
Uniform noise source for single thread mode.
Definition: Scanner.h:276
int numRays
Number of rays computed by the calcRaysNumber function.
Definition: Scanner.h:55
PyDoubleVector * getTimeWave()
Python wrapper for time wave vector.
Definition: Scanner.h:867
Rotation & getRelativeAttitudeByReference()
Python wrapper for head relative emitter attitude access.
Definition: Scanner.h:826
double getDr2()
Obtain .
Definition: Scanner.h:669
Wrapper for AbstractBeamDeflector class.
Definition: PyBeamDeflectorWrapper.h:15
long calcCurrentGpsTime()
Compute the current GPS time (milliseconds)
Definition: Scanner.cpp:396
int getPulseFreq_Hz()
Obtain the pulse frequency.
Definition: Scanner.h:486
std::shared_ptr< AbstractBeamDeflector > beamDeflector
Beam deflector composing the scanner.
Definition: Scanner.h:167
double calcFootprintArea(double distance)
Compute the footprint area .
Definition: Scanner.cpp:273
Base class for all assets.
Definition: Asset.h:10
Definition: Rotation.h:80
void setFullWaveNoise(bool fullWaveNoise)
Set scanner full wave noise policy.
Definition: Scanner.h:738
PyDetectorWrapper * getPyDetectorWrapper()
Python wrapper for detector access.
Definition: Scanner.cpp:336
double getBt2()
Obtain .
Definition: Scanner.h:656
double getAtmosphericExtinction()
Obtain atmospheric extinction.
Definition: Scanner.h:627
void setPulseLength_ns(double pulseLength_ns)
Set the pulse length.
Definition: Scanner.h:506
std::vector< double > time_wave
Discretization vector.
Definition: Scanner.h:261
PyRandomnessGeneratorWrapper * getRandGen2()
Python wrapper for second randomness generator.
Definition: Scanner.h:858
int getNumRays()
Obtain the number of rays.
Definition: Scanner.h:473
double cfg_device_efficiency
Device efficiency.
Definition: Scanner.h:89
int state_currentPulseNumber
Current pulse number.
Definition: Scanner.h:117
int numTimeBins
Number if bins defining discretization size.
Definition: Scanner.h:250
bool isActive()
Check if scanner is active (true) or not (false)
Definition: Scanner.h:682
bool isFullWaveNoise()
Check if scanner is configured to add noise to full wave (true) or not (false)
Definition: Scanner.h:731
double getBeamDivergence()
Obtain beam divergence.
Definition: Scanner.h:527
bool isFixedIncidenceAngle()
Check if incidence angle is fixed (true) or not (false)
Definition: Scanner.h:761
Wrapper for RandomnessGenerator class.
Definition: PyRandomnessGeneratorWrapper.h:10
bool writeWaveform
Flag specifying if write waveform (true) or not (false)
Definition: Scanner.h:38
double cached_Bt2
understood as the square of beam divergence
Definition: Scanner.h:149
double cfg_device_averagePower_w
Average power (watts)
Definition: Scanner.h:81
Base abstract class for detectors.
Definition: AbstractDetector.h:20
PyIntegerList * getSupportedPulseFrequencies()
Python wrapper for supported pulse frequencies list.
Definition: Scanner.h:819
Class representing a thread pool to deal with multi threading tasks.
Definition: ThreadPool.h:14
void applySettings(std::shared_ptr< ScannerSettings > settings)
Apply scanner settings.
Definition: Scanner.cpp:159
Full Waveform settings.
Definition: FWFSettings.h:8
void setReceiverDiameter(double receiverDiameter)
Set receiver diameter.
Definition: Scanner.h:591
bool state_isActive
Flag specifying if scanner is active (true) or not (false)
Definition: Scanner.h:127
double getPulseLength_ns()
Get the pulse length.
Definition: Scanner.h:499
void setBeamDivergence(double beamDivergence)
Set beam divergence.
Definition: Scanner.h:534
PythonDVec3 * getRelativePosition()
Python wrapper for head relative emitter position.
Definition: Scanner.h:833
double cfg_device_pulseLength_ns
Pulse length (nanoseconds)
Definition: Scanner.h:69
int calcTimePropagation(std::vector< double > &timeWave, int numBins)
Compute propagation time, which means obtaining the intensity peak index.
Definition: Scanner.cpp:250
void setAveragePower(double averagePower)
Set average power.
Definition: Scanner.h:548
std::shared_ptr< ScannerHead > scannerHead
Scanner head composing the scanner.
Definition: Scanner.h:162
Class representing a scanner asset.
Definition: Scanner.h:31
bool isPlatformNoiseDisabled()
Check if platform noise is disabled (true) or not (false)
Definition: Scanner.h:746
double cached_Dr2
understood as the square of receiver diameter
Definition: Scanner.h:139
std::string toString()
Build a string representation of the scanner.
Definition: Scanner.cpp:176
bool lastPulseWasHit()
Check if last pulse was hit (true) or not (false)
Definition: Scanner.h:514
double cfg_device_receiverDiameter_m
Receiver diamater (meters)
Definition: Scanner.h:93
int cfg_setting_pulseFreq_Hz
Pulse frequency (hertz)
Definition: Scanner.h:73
void setTrajectoryFileWriter(std::shared_ptr< SyncFileWriter > tfw)
Set synchronous file writer for trajectory.
Definition: Scanner.h:776
void applySettingsFWF(FWFSettings settings)
Apply full wave form settings.
Definition: Scanner.cpp:170
std::shared_ptr< RandomnessGenerator< double > > randGen1
First randomness generator for single thread mode.
Definition: Scanner.h:267
double getVisibility()
Get device visibility.
Definition: Scanner.h:599
std::shared_ptr< SyncFileWriter > tfw
Synchronous file writer.
Definition: Scanner.h:155
double cfg_device_wavelength_m
Wave length (meters)
Definition: Scanner.h:101
double getBeamQuality()
Get beam quality.
Definition: Scanner.h:556
glm::dvec3 cfg_device_headRelativeEmitterPosition
Head relative emitter position.
Definition: Scanner.h:282
void prepareDiscretization()
Prepare wave discretization.
Definition: Scanner.cpp:244
Wrapper for std::vector<double> class.
Definition: PyDoubleVector.h:15
double beamWaistRadius
Beam waist radius.
Definition: Scanner.h:110
void setAtmosphericExtinction(double atmosphericExtinction)
Set atmospheric extinction.
Definition: Scanner.h:634
Rotation calcAbsoluteBeamAttitude()
Compute the absolute beam attitude considering the mount relative attitude and the deflector relative...
Definition: Scanner.cpp:387
FWFSettings FWF_settings
Full wave form settings for the scanner.
Definition: Scanner.h:239
Rotation cfg_device_headRelativeEmitterAttitude
Head relative emitter attitude.
Definition: Scanner.h:286
bool isWriteWaveform()
Check if scanner is configured to write wave form (true) or not (false)
Definition: Scanner.h:698
bool state_lastPulseWasHit
Flag specifying if last pulse was hit (true) or not (false)
Definition: Scanner.h:121
long lastTrajectoryTime
GPS time (milliseconds) corresponding to last recorded trajectory point.
Definition: Scanner.h:232
PyRandomnessGeneratorWrapper * getRandGen1()
Python wrapper for first randomness generator.
Definition: Scanner.h:849
Wrapper for NoiseSource abstract class.
Definition: PyNoiseSourceWrapper.h:14
bool calcEchowidth
Flag specifying if calculate echo width (true) or not (false)
Definition: Scanner.h:42
bool fullWaveNoise
Flag specifying if compute full wave noise (true) or not (false)
Definition: Scanner.h:46
double getWavelength()
Obtain wave length.
Definition: Scanner.h:613
void handlePulseComputation(thread_pool &pool, unsigned int const legIndex, glm::dvec3 &absoluteBeamOrigin, Rotation &absoluteBeamAttitude, long currentGpsTime)
Handle pulse computation whatever it is single thread based or thread pool based. ...
Definition: Scanner.cpp:403
void setBeamQuality(double beamQuality)
Set beam quality.
Definition: Scanner.h:562
void setPulseFreq_Hz(int pulseFreq_Hz)
Set the pulse frequency.
Definition: Scanner.cpp:304
std::shared_ptr< RandomnessGenerator< double > > randGen2
Second randomness generator for single thread mode.
Definition: Scanner.h:271
void setCalcEchowidth(bool calcEchowidth)
Set scanner echo width configuration.
Definition: Scanner.h:721
Wrapper for std::list<int> class.
Definition: PyIntegerList.h:15
void doSimStep(thread_pool &pool, unsigned int legIndex)
Perform computations for current simulation step.
Definition: Scanner.cpp:187
std::shared_ptr< std::mutex > allMeasurementsMutex
Mutex to handle concurrent access to historical vector of all measurements and historical vector of a...
Definition: Scanner.h:199
void setFixedIncidenceAngle(bool fixedIncidenceAngle)
Set fixed incidence angle flag.
Definition: Scanner.h:768
double atmosphericExtinction
Atmospheric extinction.
Definition: Scanner.h:106
std::string getDeviceId()
Obtain scanner device identifier.
Definition: Scanner.h:785
PyBeamDeflectorWrapper * getPyBeamDeflector()
Python wrapper for beam deflector access.
Definition: Scanner.h:806
std::shared_ptr< std::vector< Trajectory > > allTrajectories
Historical vector of all trajectory points recorded by the scanner.
Definition: Scanner.h:191
double calcFootprintRadius(double distance)
Compute the footprint radius .
Definition: Scanner.cpp:279
Scanner(double beamDiv_rad, glm::dvec3 beamOrigin, Rotation beamOrientation, std::list< int > pulseFreqs, double pulseLength_ns, std::string id, double averagePower, double beamQuality, double efficiency, double receiverDiameter, double atmosphericVisibility, int wavelength, bool writeWaveform=false, bool calcEchowidth=false, bool fullWaveNoise=false, bool platformNoiseDisabled=false)
Scanner constructor.
Definition: Scanner.cpp:24
PyNoiseSourceWrapper * getIntersectionHandlingNoiseSource()
Python wrapper for intersection handling noise source.
Definition: Scanner.h:840
void setDr2(double dr2)
Set .
Definition: Scanner.h:675
std::shared_ptr< std::mutex > cycleMeasurementsMutex
Mutex to handle concurrent access to vector of measurements and vector of trajectory points by cycle...
Definition: Scanner.h:220
Wrapper for AbstractDetector class.
Definition: PyDetectorWrapper.h:16
double trajectoryTimeInterval
Time interval between record of trajectory points. When it is exactly 0, then no trajectory points wi...
Definition: Scanner.h:227
double cfg_device_beamQuality
Beam quality.
Definition: Scanner.h:85
void setBeamWaistRadius(double beamWaistRadius)
Set beam waist radius.
Definition: Scanner.h:648
static const glm::dvec3 right
x : left-right direction
Definition: Directions.h:17
double cfg_device_visibility_km
Visibility (kilometers)
Definition: Scanner.h:97
void setDeviceId(std::string const deviceId)
Set the scanner device identifier.
Definition: Scanner.h:791
void setNumRays(int numRays)
Set the number of rays.
Definition: Scanner.h:479
double cfg_device_beamDivergence_rad
Beam divergence (radians)
Definition: Scanner.h:65
std::shared_ptr< Platform > platform
Platform carrying the scanner.
Definition: Scanner.h:172
void setPlatformNoiseDisabled(bool platformNoiseDisabled)
Set platform noise disabled flag.
Definition: Scanner.h:753
ScannerHead & getScannerHead()
Python wrapper for scanner head access.
Definition: Scanner.h:800
int peakIntensityIndex
Index of bin containing the intensity peak. It is computed through calcTimePropagation function...
Definition: Scanner.h:257
double getAveragePower()
Obtain average power.
Definition: Scanner.h:542
void setWavelength(double wavelength)
Set wave length.
Definition: Scanner.h:619
void setEfficiency(double efficiency)
Set device efficiency.
Definition: Scanner.h:576
void setBt2(double bt2)
Set .
Definition: Scanner.h:662
void setActive(bool active)
Set scanner active status. True to make it active, false to make it inactive.
Definition: Scanner.h:689
void calcRaysNumber()
Compute the number of rays depending on beam sample quality.
Definition: Scanner.cpp:230
Wrapper to communicate glm::dvec3 with python.
Definition: PythonDVec3.h:14
double getReceiverDiameter()
Get receiver diamater.
Definition: Scanner.h:584
std::string cfg_device_id
Device identifier.
Definition: Scanner.h:77
std::shared_ptr< AbstractDetector > detector
Detector composing the scanner.
Definition: Scanner.h:177
std::shared_ptr< std::vector< Trajectory > > cycleTrajectories
Vector of trajectory points recorded by the scanner.
Definition: Scanner.h:212
Definition: ScannerHead.h:13