Helios++
Helios software for LiDAR simulations
ScannerSettings.h
1 #pragma once
2 
3 #include "Asset.h"
4 
5 #include <string>
6 #include <memory>
7 #include <sstream>
8 #include <ostream>
9 #include <unordered_set>
10 #include <functional>
11 #include <cmath>
12 
16 class ScannerSettings : public Asset {
17 
18 public:
19  // *** ATTRIBUTES *** //
20  // ******************** //
26  std::string id = "#nullid#";
31  std::shared_ptr<ScannerSettings> baseTemplate = nullptr;
32 
38  bool active = true;
46  double headRotateStart_rad = 0;
50  double headRotateStop_rad = 0;
54  int pulseFreq_Hz = 0;
58  double scanAngle_rad = 0;
62  double verticalAngleMin_rad = NAN;
66  double verticalAngleMax_rad = NAN;
70  double scanFreq_Hz = 0;
74  double beamDivAngle = 0.003;
78  double trajectoryTimeInterval = 0.0; // In seconds
89  double verticalResolution_rad = 0.0;
95 
96  // *** CONSTRUCTION / DESTRUCTION *** //
97  // ************************************ //
101  ScannerSettings() = default;
102 
108  if (other == nullptr) return;
109 
110  this->id = other->id;
111  this->baseTemplate = other->baseTemplate;
112  this->active = other->active;
113  this->headRotatePerSec_rad = other->headRotatePerSec_rad;
114  this->headRotateStart_rad = other->headRotateStart_rad;
115  this->headRotateStop_rad = other->headRotateStop_rad;
116  this->pulseFreq_Hz = other->pulseFreq_Hz;
117  this->scanAngle_rad = other->scanAngle_rad;
118  this->verticalAngleMin_rad = other->verticalAngleMin_rad;
119  this->verticalAngleMax_rad = other->verticalAngleMax_rad;
120  this->scanFreq_Hz = other->scanFreq_Hz;
121  this->beamDivAngle = other->beamDivAngle;
122  this->trajectoryTimeInterval = other->trajectoryTimeInterval;
123  this->verticalResolution_rad = other->verticalResolution_rad;
124  this->horizontalResolution_rad = other->horizontalResolution_rad;
125  }
126 
127  // *** CHERRY PICKING *** //
128  // ************************ //
139  std::shared_ptr<ScannerSettings> cherryPick(
140  std::shared_ptr<ScannerSettings> cherries,
141  std::unordered_set<std::string> const &fields,
142  std::unordered_set<std::string> const *templateFields=nullptr
143  ){
144  // Prepare for cherry picking
145  std::shared_ptr<ScannerSettings> settings = \
146  std::make_shared<ScannerSettings>(this);
147  std::function<bool(std::string const&)> hasCherry = [&] (
148  std::string const &fieldName
149  ) -> bool {
150  return fields.find(fieldName) != fields.end();
151  };
152  // The cherry picking itself
153  if(hasCherry("baseTemplate") && cherries->baseTemplate != nullptr){
154  std::shared_ptr<ScannerSettings> tmpTemplate = \
155  cherries->baseTemplate->baseTemplate;
156  cherries->baseTemplate->baseTemplate = nullptr;
157  settings = cherryPick(cherries->baseTemplate, *templateFields);
158  cherries->baseTemplate->baseTemplate = tmpTemplate;
159  settings->baseTemplate = cherries->baseTemplate;
160  }
161  if(hasCherry("active")) settings->active = cherries->active;
162  if(hasCherry("headRotatePerSec_rad"))
163  settings->headRotatePerSec_rad = cherries->headRotatePerSec_rad;
164  if(hasCherry("headRotateStart_rad"))
165  settings->headRotateStart_rad = cherries->headRotateStart_rad;
166  if(hasCherry("headRotateStop_rad"))
167  settings->headRotateStop_rad = cherries->headRotateStop_rad;
168  if(hasCherry("pulseFreq_Hz"))
169  settings->pulseFreq_Hz = cherries->pulseFreq_Hz;
170  if(hasCherry("scanAngle_rad"))
171  settings->scanAngle_rad = cherries->scanAngle_rad;
172  if(hasCherry("verticalAngleMin_rad"))
173  settings->verticalAngleMin_rad = cherries->verticalAngleMin_rad;
174  if(hasCherry("verticalAngleMax_rad"))
175  settings->verticalAngleMax_rad = cherries->verticalAngleMax_rad;
176  if(hasCherry("scanFreq_Hz"))
177  settings->scanFreq_Hz = cherries->scanFreq_Hz;
178  if(hasCherry("beamDivAngle"))
179  settings->beamDivAngle = cherries->beamDivAngle;
180  if(hasCherry("trajectoryTimeInterval"))
181  settings->trajectoryTimeInterval=cherries->trajectoryTimeInterval;
182  if(hasCherry("verticalResolution_rad"))
183  settings->verticalResolution_rad=cherries->verticalResolution_rad;
184  if(hasCherry("horizontalResolution_rad")) {
185  settings->horizontalResolution_rad =
186  cherries->horizontalResolution_rad;
187  }
188 
189  // Return settings from cherry picking
190  return settings;
191  }
192 
193  // *** CONFIG METHODS *** //
194  // ************************ //
216  inline void fitToResolution(double const scanAngleMax_rad){
218  2.0*scanAngleMax_rad
219  );
221  }
222 
223  // *** GETTERS and SETTERS *** //
224  // ***************************** //
232  bool hasTemplate() {return this->baseTemplate != nullptr;}
240 
247  inline bool hasDefaultResolution(){
248  return verticalResolution_rad == 0 &&
250  }
251 
252  // *** TO STRING *** //
253  // ******************* //
258  virtual inline std::string toString() const{
259  std::stringstream ss;
260  ss << "ScannerSettings \"" << id << "\":\n";
261  if(baseTemplate != nullptr){
262  ss << "\ttemplate.id = \"" << baseTemplate->id << "\"\n"
263  << "\ttemplate.active = " << baseTemplate->active << "\n"
264  << "\ttemplate.headRotatePerSec_rad = "
265  << baseTemplate->headRotatePerSec_rad << "\n"
266  << "\ttemplate.headRotateStart_rad = "
267  << baseTemplate->headRotateStart_rad << "\n"
268  << "\ttemplate.headRotateStop_rad = "
269  << baseTemplate->headRotateStop_rad << "\n"
270  << "\ttemplate.pulseFreq_Hz = "
271  << baseTemplate->pulseFreq_Hz << "\n"
272  << "\ttemplate.scanAngle_rad = "
273  << baseTemplate->scanAngle_rad << "\n"
274  << "\ttemplate.verticalAngleMin_rad = "
275  << baseTemplate->verticalAngleMin_rad << "\n"
276  << "\ttemplate.verticalAngleMax_rad = "
277  << baseTemplate->verticalAngleMax_rad << "\n"
278  << "\ttemplate.scanFreq_Hz = "
279  << baseTemplate->scanFreq_Hz << "\n"
280  << "\ttemplate.beamDivAngle = "
281  << baseTemplate->beamDivAngle << "\n"
282  << "\ttemplate.trajectoryTimeInterval = "
283  << baseTemplate->trajectoryTimeInterval << "\n"
284  ;
285  }
286  ss << "active = " << active << "\n"
287  << "headRotatePerSec_rad = " << headRotatePerSec_rad << "\n"
288  << "headRotateStart_rad = " << headRotateStart_rad << "\n"
289  << "headRotateStop_rad = " << headRotateStop_rad << "\n"
290  << "pulseFreq_Hz = " << pulseFreq_Hz << "\n"
291  << "scanAngle_rad = " << scanAngle_rad << "\n"
292  << "verticalAngleMin_rad = " << verticalAngleMin_rad << "\n"
293  << "verticalAngleMax_rad = " << verticalAngleMax_rad << "\n"
294  << "scanFreq_Hz = " << scanFreq_Hz << "\n"
295  << "beamDivAngle = " << beamDivAngle << "\n"
296  << "trajectoryTimeInterval = " << trajectoryTimeInterval << "\n"
297  << "verticalResolution_rad = " << verticalResolution_rad << "\n"
298  << "horizontalResolution_rad = " << horizontalResolution_rad<<"\n"
299  ;
300  return ss.str();
301  }
305  friend std::ostream& operator<< (
306  std::ostream &out,
307  const ScannerSettings &settings
308  ){
309  out << settings.toString();
310  return out;
311  }
312 };
Base class for all assets.
Definition: Asset.h:10
Scanner settings class.
Definition: ScannerSettings.h:16
double scanAngle_rad
Scan angle (radians)
Definition: ScannerSettings.h:58
std::string id
The ID for this scanner settings. It does not make sense for all scanner settings,...
Definition: ScannerSettings.h:26
ScannerSettings & getTemplate()
Obtain template by reference.
Definition: ScannerSettings.h:239
double headRotateStop_rad
Ending angle (radians) for the scanner head.
Definition: ScannerSettings.h:50
double horizontalResolution_rad
Specify the horizontal resolution to be used.
Definition: ScannerSettings.h:94
virtual std::string toString() const
Obtain the string representation of the scanner settings.
Definition: ScannerSettings.h:258
int pulseFreq_Hz
Pulse frequency (hertz)
Definition: ScannerSettings.h:54
ScannerSettings(ScannerSettings *other)
Copy from pointer constructor.
Definition: ScannerSettings.h:107
void fitToResolution(double const scanAngleMax_rad)
Update the settings to fit the specified resolution.
Definition: ScannerSettings.h:216
double verticalAngleMax_rad
Maximum vertical angle (radians)
Definition: ScannerSettings.h:66
double headRotateStart_rad
Starting angle (radians) for the scanner head.
Definition: ScannerSettings.h:46
double beamDivAngle
Beam divergence angle (radians)
Definition: ScannerSettings.h:74
bool hasDefaultResolution()
Check whether the scanner settings' vertical and horizontal resolutions have the default values (disa...
Definition: ScannerSettings.h:247
double verticalAngleMin_rad
Minimum vertical angle (radians)
Definition: ScannerSettings.h:62
std::shared_ptr< ScannerSettings > cherryPick(std::shared_ptr< ScannerSettings > cherries, std::unordered_set< std::string > const &fields, std::unordered_set< std::string > const *templateFields=nullptr)
Build a new scanner settings which by default has the same values than caller scanner settings (this)...
Definition: ScannerSettings.h:139
bool active
Flag to specify if scanner is active (true) or not (false)
Definition: ScannerSettings.h:38
double headRotatePerSec_rad
Amount of rotation (radians) per second for the scanner head.
Definition: ScannerSettings.h:42
ScannerSettings()=default
Scanner settings default constructor.
friend std::ostream & operator<<(std::ostream &out, const ScannerSettings &settings)
Overload of << operator for output streams.
Definition: ScannerSettings.h:305
double verticalResolution_rad
Specify the vertical resolution to be used. By default, vertical and horizontal resolutions are whic...
Definition: ScannerSettings.h:89
std::shared_ptr< ScannerSettings > baseTemplate
Template defining default values which were used to build the ScannerSettings object.
Definition: ScannerSettings.h:31
double scanFreq_Hz
Scanning frequency (hertz)
Definition: ScannerSettings.h:70
double trajectoryTimeInterval
Time interval between trajectory recollections (seconds)
Definition: ScannerSettings.h:78
bool hasTemplate()
Check if this ScannerSettings has an associated template (true) or not (false)
Definition: ScannerSettings.h:232