FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
AuvUndulateDiveControl.h
1#pragma once
2
171#include "SampleClock.h"
172
173#include <fhsim/simobject/SimObject.h>
174#include <string>
175
176class PrintDuringExec;
177
178class AuvUndulateDiveControl : public SimObject
179{
180public:
183 {
185 Dir_Up
186 };
187
189 struct Limits
190 {
191 double maxDepth = 80.0;
192 double minDepth = 5.0;
193 double minSeafloorDistance = 10.0;
194 double diveAngle = 0.349;
195 double depthHysteresis = 1.0;
196 };
197
199 struct Command
200 {
201 double pitchRef = 0.0;
202 double depthRef = 0.0;
204 bool waterTooThin = false;
205 };
206
212 AuvUndulateDiveControl(std::string simObjectName, ISimObjectCreator* creator);
213
224 AuvUndulateDiveControl(std::string simObjectName, const Limits& limits, double updatePeriod = 1.0);
225
237 static Command CommandOf(const Limits& limits, double depth, double altitude, EDir_t direction);
238
240 void OdeFcn(const double dT, const double* const adX, double* const adXDot) const override;
241
247 void AcceptedStep(const double dT, const double* const adX) override;
248
249#ifdef FH_VISUALIZATION
250 void RenderInit(Ogre::Root* const ogreRoot, ISimObjectCreator* const creator) override { }
251 void RenderUpdate(const double dT, const double* const adX) override { }
252#endif
253
259 void Update(double depth, double altitude);
260
262 const Command& HeldCommand() const { return m_command; }
263
265 int ThinWaterWarningCount() const { return m_thinWaterWarnings; }
266
267protected:
269 const double* OutPitchRef(const double dT, const double* const adX);
270
272 const double* OutDepthRef(const double dT, const double* const adX);
273
275 const double* OutDirection(const double dT, const double* const adX);
276
277private:
279 void WarnOnceAboutThinWater();
280
281 ISignalPort* m_inDepth = nullptr;
282 ISignalPort* m_inAltitude = nullptr;
283
284 PrintDuringExec* m_print = nullptr;
285
286 std::string m_name;
287 Limits m_limits;
288 SampleClock m_clock;
289
290 Command m_command;
291 double m_outDirection = 1.0;
292 bool m_thinWaterWarningGiven = false;
293 int m_thinWaterWarnings = 0;
294};
Definition AuvUndulateDiveControl.h:179
AuvUndulateDiveControl(std::string simObjectName, const Limits &limits, double updatePeriod=1.0)
static Command CommandOf(const Limits &limits, double depth, double altitude, EDir_t direction)
const Command & HeldCommand() const
The held command.
Definition AuvUndulateDiveControl.h:262
int ThinWaterWarningCount() const
The number of thin-water warnings emitted, which is never more than one.
Definition AuvUndulateDiveControl.h:265
EDir_t
Which way the vehicle is currently being flown.
Definition AuvUndulateDiveControl.h:183
@ Dir_Up
Ascending, that is a positive commanded pitch.
Definition AuvUndulateDiveControl.h:185
@ Dir_Down
Descending, that is a negative commanded pitch.
Definition AuvUndulateDiveControl.h:184
const double * OutDirection(const double dT, const double *const adX)
Plus one while descending, minus one while ascending.
AuvUndulateDiveControl(std::string simObjectName, ISimObjectCreator *creator)
void OdeFcn(const double dT, const double *const adX, double *const adXDot) const override
This SimObject has no states, so it has no derivatives.
const double * OutDepthRef(const double dT, const double *const adX)
The turning depth currently being flown towards, or the held depth in thin water, m.
void AcceptedStep(const double dT, const double *const adX) override
const double * OutPitchRef(const double dT, const double *const adX)
The commanded pitch angle, rad.
void Update(double depth, double altitude)
Definition SampleClock.h:40
One evaluation of the undulation law.
Definition AuvUndulateDiveControl.h:200
EDir_t direction
The direction being flown.
Definition AuvUndulateDiveControl.h:203
double pitchRef
The commanded pitch, rad. Negative is nose down.
Definition AuvUndulateDiveControl.h:201
bool waterTooThin
True when the water cannot hold an undulation.
Definition AuvUndulateDiveControl.h:204
double depthRef
The turning depth being flown towards, or the held depth in thin water, m.
Definition AuvUndulateDiveControl.h:202
The geometry the undulation law is evaluated against.
Definition AuvUndulateDiveControl.h:190
double maxDepth
The deepest turning depth allowed, m.
Definition AuvUndulateDiveControl.h:191
double diveAngle
The magnitude of the commanded pitch, rad.
Definition AuvUndulateDiveControl.h:194
double minSeafloorDistance
The smallest allowed height above the seabed, m.
Definition AuvUndulateDiveControl.h:193
double minDepth
The shallowest turning depth allowed, m.
Definition AuvUndulateDiveControl.h:192
double depthHysteresis
The band by which a reversal is brought forward, m.
Definition AuvUndulateDiveControl.h:195