FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
SensorCtd.h
1#pragma once
2
191#include "SampleClock.h"
192#include "SensorFrame.h"
193#include "SensorNoise.h"
194
195#include <fhsim/simobject/SimObject.h>
196#include <string>
197
198namespace environment
199{
200class EnvironmentProvider;
201}
202
203class SensorCtd : public SimObject
204{
205public:
207 struct Channel
208 {
209 double timeConstant = 0.0;
210 double bias = 0.0;
211 double noiseStd = 0.0;
212 double resolution = 0.0;
213 };
214
216 struct Settings
217 {
218 Channel temperature = {0.07, 0.002, 0.0005, 0.0};
219 Channel salinity = {0.06, 0.005, 0.002, 0.0};
220 Channel depth = {0.02, 0.05, 0.02, 0.0};
221 double samplePeriod = 0.0625;
222 unsigned int noiseSeed = 0;
223 };
224
226 struct Reading
227 {
228 double temperature = 0.0;
229 double salinity = 0.0;
230 double depth = 0.0;
231 double pressure = 0.0;
232 double position[3] = {0.0, 0.0, 0.0};
233 };
234
240 SensorCtd(std::string simObjectName, ISimObjectCreator* creator);
241
253 SensorCtd(std::string simObjectName, const Settings& settings);
254
262 static double LagDerivative(double fieldValue, double lagState, double timeConstant);
263
271 static double MeasuredValueOf(double lagState, double fieldValue, double timeConstant);
272
279 static double Quantize(double value, double resolution);
280
286 static double PressureOf(double depth);
287
295 static double Perturb(double trueValue, const Channel& channel, SensorNoise& noise);
296
298 void OdeFcn(const double dT, const double* const adX, double* const adXDot) const override;
299
305 void AcceptedStep(const double dT, const double* const adX) override;
306
315 void InitialConditionSetup(const double dT, const double* const adCurrentIC,
316 double* const adUpdatedIC, ISimObjectCreator* const creator) override;
317
324 void FinalSetup(const double dT, const double* const adX, ISimObjectCreator* const creator) override;
325
326#ifdef FH_VISUALIZATION
327 void RenderInit(Ogre::Root* const ogreRoot, ISimObjectCreator* const creator) override { }
328 void RenderUpdate(const double dT, const double* const adX) override { }
329#endif
330
340 bool SampleIfDue(double t, double temperature, double salinity, double depth, const double position[3]);
341
349 void Update(double temperature, double salinity, double depth, const double position[3]);
350
352 const Reading& HeldReading() const { return m_reading; }
353
355 const Settings& GetSettings() const { return m_settings; }
356
358 double NextSampleTime() const { return m_clock.NextSampleTime(); }
359
360protected:
362 const double* OutTemperature(const double dT, const double* const adX);
363
365 const double* OutSalinity(const double dT, const double* const adX);
366
368 const double* OutDepth(const double dT, const double* const adX);
369
371 const double* OutPressure(const double dT, const double* const adX);
372
374 const double* OutMeasurement(const double dT, const double* const adX);
375
377 const double* OutPosition(const double dT, const double* const adX);
378
379private:
381 struct FieldValues
382 {
383 double temperature = 0.0;
384 double salinity = 0.0;
385 };
386
391 void ResolveEnvironment(ISimObjectCreator* const creator);
392
399 FieldValues FieldValuesAt(double dT, const double position[3]) const;
400
408 void StoreReading(double temperature, double salinity, double depth, const double position[3]);
409
415 void SeedHeldReading(double dT, const double* const adX);
416
424 static void SetInitialConditionIfUnset(const double* const adCurrentIC, double* const adUpdatedIC,
425 int stateIndex, double value);
426
427 SensorFrame m_frame;
428 SampleClock m_clock;
429 SensorNoise m_noise;
430 Settings m_settings;
431
432 std::string m_name;
433 std::string m_temperatureFieldName;
434 std::string m_salinityFieldName;
435
436 environment::EnvironmentProvider* m_environment = nullptr;
437 int m_temperatureHandle = -1;
438 int m_salinityHandle = -1;
439
440 bool m_hasPorts = false;
441
442 int m_IStateLagT = 0;
443 int m_IStateLagS = 0;
444 int m_IStateLagD = 0;
445
446 Reading m_reading;
447 double m_measurement[3] = {0.0, 0.0, 0.0};
448};
Definition SampleClock.h:40
double NextSampleTime() const
The time at which the next sample is due, s.
Definition SampleClock.h:76
Definition SensorCtd.h:204
const Settings & GetSettings() const
The settings the instrument was built with.
Definition SensorCtd.h:355
const double * OutDepth(const double dT, const double *const adX)
The measured depth of the sensor head, m.
static double Quantize(double value, double resolution)
const double * OutPressure(const double dT, const double *const adX)
The measured pressure, dbar.
void FinalSetup(const double dT, const double *const adX, ISimObjectCreator *const creator) override
double NextSampleTime() const
The time at which the next sample is due, s.
Definition SensorCtd.h:358
bool SampleIfDue(double t, double temperature, double salinity, double depth, const double position[3])
static double LagDerivative(double fieldValue, double lagState, double timeConstant)
const double * OutSalinity(const double dT, const double *const adX)
The measured salinity, PSU.
void InitialConditionSetup(const double dT, const double *const adCurrentIC, double *const adUpdatedIC, ISimObjectCreator *const creator) override
const double * OutTemperature(const double dT, const double *const adX)
The measured water temperature, degC.
const double * OutMeasurement(const double dT, const double *const adX)
The three measurements as [Salinity, Temperature, Depth].
void Update(double temperature, double salinity, double depth, const double position[3])
SensorCtd(std::string simObjectName, const Settings &settings)
static double Perturb(double trueValue, const Channel &channel, SensorNoise &noise)
const double * OutPosition(const double dT, const double *const adX)
The NED position the held sample was taken at, m.
static double MeasuredValueOf(double lagState, double fieldValue, double timeConstant)
static double PressureOf(double depth)
const Reading & HeldReading() const
The reading currently held on the output ports.
Definition SensorCtd.h:352
void AcceptedStep(const double dT, const double *const adX) override
void OdeFcn(const double dT, const double *const adX, double *const adXDot) const override
Writes the three lag derivatives and nothing else.
SensorCtd(std::string simObjectName, ISimObjectCreator *creator)
Definition SensorFrame.h:36
Definition SensorNoise.h:39
The instrument imperfections of one measured channel.
Definition SensorCtd.h:208
double noiseStd
The standard deviation of the Gaussian noise, in the channel's unit.
Definition SensorCtd.h:211
double resolution
The quantisation step, in the channel's unit. Zero means none.
Definition SensorCtd.h:212
double timeConstant
The first-order lag time constant, s. Zero means no lag.
Definition SensorCtd.h:209
double bias
The constant offset added at every sample, in the channel's unit.
Definition SensorCtd.h:210
One held instrument reading.
Definition SensorCtd.h:227
double pressure
The reported pressure, dbar.
Definition SensorCtd.h:231
double position[3]
The NED position the sample was taken at, m.
Definition SensorCtd.h:232
double salinity
The reported salinity, PSU.
Definition SensorCtd.h:229
double depth
The reported depth, m.
Definition SensorCtd.h:230
double temperature
The reported temperature, degC.
Definition SensorCtd.h:228
Everything that makes one instrument out of the shared sensor machinery.
Definition SensorCtd.h:217
Channel salinity
The salinity channel, PSU.
Definition SensorCtd.h:219
Channel depth
The depth channel, m.
Definition SensorCtd.h:220
unsigned int noiseSeed
The random seed; zero is deterministic and noise free.
Definition SensorCtd.h:222
double samplePeriod
The time between samples, s.
Definition SensorCtd.h:221
Channel temperature
The temperature channel, degC.
Definition SensorCtd.h:218