Flair
Framework Libre Air
UavStateMachine.h
1 // %flair:license{
2 // This file is part of the Flair framework distributed under the
3 // CECILL-C License, Version 1.0.
4 // %flair:license}
5 // created: 2014/04/29
6 // filename: UavStateMachine.h
7 //
8 // author: Gildas Bayard, Guillaume Sanahuja
9 // Copyright Heudiasyc UMR UTC/CNRS 7253
10 //
11 // version: $Id: $
12 //
13 // purpose: state machine for UAV
14 //
15 //
16 /*********************************************************************/
17 
18 #ifndef UAVSTATEMACHINE_H
19 #define UAVSTATEMACHINE_H
20 
21 #include <Thread.h>
22 #include <Vector2D.h>
23 #include <Vector3D.h>
24 #include <Euler.h>
25 #include <Quaternion.h>
26 
27 namespace flair {
28  namespace core {
29  class FrameworkManager;
30  class AhrsData;
31  class io_data;
32  }
33  namespace gui {
34  class PushButton;
35  class GridLayout;
36  class Tab;
37  class DoubleSpinBox;
38  }
39  namespace filter {
40  class ControlLaw;
41  class NestedSat;
42  class Pid;
43  class PidThrust;
44  class TrajectoryGenerator1D;
45  }
46  namespace sensor {
47  class TargetController;
48  class AltitudeSensor;
49  }
50  namespace meta {
51  class MetaDualShock3;
52  class Uav;
53  }
54 }
55 
56 namespace flair {
57 namespace meta {
58 
68 class UavStateMachine : public core::Thread {
69 protected:
70  enum class AltitudeMode_t { Manual, Custom };
71  const AltitudeMode_t &GetAltitudeMode(void) const { return altitudeMode; }
72  bool SetAltitudeMode(const AltitudeMode_t &altitudeMode);
73 
74  // uses TrajectoryGenerator1D *altitudeTrajectory to go to desiredAltitude
75  // available in mode AltitudeMode_t::Manual
76  // return true if goto is possible
77  bool GotoAltitude(float desiredAltitude);
78 
79  enum class OrientationMode_t { Manual, Custom };
80  const OrientationMode_t &GetOrientationMode(void) const {
81  return orientationMode;
82  }
83  bool SetOrientationMode(const OrientationMode_t &orientationMode);
84 
85  enum class ThrustMode_t { Default, Custom };
86  const ThrustMode_t &GetThrustMode() const { return thrustMode; }
87  bool SetThrustMode(const ThrustMode_t &thrustMode);
88 
89  enum class TorqueMode_t { Default, Custom };
90  const TorqueMode_t &GetTorqueMode(void) const { return torqueMode; }
91  bool SetTorqueMode(const TorqueMode_t &torqueMode);
92 
93  enum class Event_t {
94  EnteringFailSafeMode,
95  EnteringControlLoop,
96  StartLanding,
97  FinishLanding,
98  Stopped,
99  TakingOff,
100  EmergencyStop,
101  Stabilized, // as soon as uav is 3cm far from the ground
102  ZTrajectoryFinished,
103  StartLog,
104  StopLog,
105  };
106 
108  ~UavStateMachine();
109 
110  const core::Quaternion &GetCurrentQuaternion(void) const;
111 
112  const core::Vector3Df &GetCurrentAngularSpeed(void) const;
113 
114  void Land(void);
115  void EmergencyLand(void);
116  void TakeOff(void);
117  void EmergencyStop(void);
119 
122  virtual void SignalEvent(Event_t event);
123 
124  virtual const core::AhrsData *GetOrientation(void) const;
125  const core::AhrsData *GetDefaultOrientation(void) const;
126 
127  virtual void AltitudeValues(float &z, float &dz) const; // in uav coordinate!
128  void EnterFailSafeMode(void);
129  bool ExitFailSafeMode(void);
130  void FailSafeAltitudeValues(float &z, float &dz) const; // in uav coordinate!
131 
142 
143  gui::GridLayout *GetButtonsLayout(void) const;
144  virtual void ExtraSecurityCheck(void){};
145  virtual void ExtraCheckJoystick(void){};
146  virtual void ExtraCheckPushButton(void){};
147 
148  void GetDefaultReferenceAltitude(float &refAltitude,
149  float &refVerticalVelocity);
150  virtual void GetReferenceAltitude(float &refAltitude,
151  float &refVerticalVelocity);
152  // float GetDefaultThrustOffset(void);
153  const core::AhrsData *GetDefaultReferenceOrientation(void) const;
154  virtual const core::AhrsData *GetReferenceOrientation(void);
155 
165  virtual void ComputeCustomTorques(core::Euler &torques);
166 
175  void ComputeDefaultTorques(core::Euler &torques);
176 
182  // const core::Euler &GetTorques() const;
183 
193  virtual float ComputeCustomThrust(void);
194 
203  float ComputeDefaultThrust(void);
204 
210  // float GetThrust() const;
211 
221  void AddDeviceToControlLawLog(const core::IODevice *device);
222 
232  void AddDataToControlLawLog(const core::io_data *data);
233 
241  virtual void LowBatteryAction(void);
242 
249  void LowBatteryDefaultAction(void);
250 
251  sensor::TargetController *GetTargetController(void) const;
252  MetaDualShock3 *GetJoystick(void) const;
253 
254  filter::NestedSat *GetURoll(void);
255  filter::NestedSat *GetUPitch(void);
256  filter::Pid *GetUYaw(void);
257  filter::PidThrust *GetUZ(void);
258  filter::TrajectoryGenerator1D *GetAltitudeTrajectory(void);
259 
260  gui::Tab *uavTab,*setupLawTab, *graphLawTab;
261 
262 private:
267  enum class AltitudeState_t {
268  Stopped,
269  TakingOff,
271  Stabilized,
272  StartLanding,
275  };
276  AltitudeState_t altitudeState;
277  void ProcessAltitudeFiniteStateMachine();
278  void ComputeReferenceAltitude(float &refAltitude, float &refVerticalVelocity);
279 
280  float groundAltitude; // effective altitude when the uav leaves the ground
281  float currentAltitude, currentVerticalSpeed;
282 
283  bool failSafeMode;
284  void SecurityCheck(void);
285  void MandatorySecurityCheck(void);
286  void CheckJoystick();
287  void GenericCheckJoystick();
288  void CheckPushButton(void);
289  void GenericCheckPushButton(void);
290  void Run(void) override;
291  void StopMotors(void);
292  bool IsValuePossible(float value,std::string desc);
293 
294  Uav *uav;
295  MetaDualShock3 *joy;
296  sensor::TargetController *controller;
297 
298  core::Quaternion currentQuaternion;
299  core::Vector3Df currentAngularSpeed;
300 
301  const core::AhrsData *ComputeReferenceOrientation(void);
302 
303  void ComputeOrientation(void);
304  void ComputeAltitude(void);
305 
306  void ComputeTorques(void);
307  core::Euler currentTorques, savedDefaultTorques;
308  bool needToComputeDefaultTorques;
309 
310  void ComputeThrust(void);
311  float currentThrust, savedDefaultThrust;
312  bool needToComputeDefaultThrust;
313 
314  gui::PushButton *button_quit, *button_take_off, *button_land,
315  *button_start_log, *button_stop_log;
316  gui::GridLayout *buttonslayout;
317  gui::DoubleSpinBox *desiredTakeoffAltitude, *desiredLandingAltitude;
318  AltitudeMode_t altitudeMode;
319  OrientationMode_t orientationMode;
320  ThrustMode_t thrustMode;
321  TorqueMode_t torqueMode;
322  bool flagBatteryLow;
323  bool flagConnectionLost;
324  bool flagCriticalSensorLost;
325  bool flagZTrajectoryFinished;
326  bool safeToFly;
327  filter::NestedSat *uRoll, *uPitch;
328  filter::Pid *uYaw;
329  filter::PidThrust *uZ;
330  filter::TrajectoryGenerator1D *altitudeTrajectory;
331  sensor::AltitudeSensor *failSafeAltitudeSensor;
332 };
333 }; // end namespace meta
334 }; // end namespace flair
335 #endif // UAVSTATEMACHINE_H
Abstract class for data types.
Definition: io_data.h:94
virtual void SignalEvent(Event_t event)
Used to signal an event.
Classe intégrant la manette MetaDualShock3.
Definition: MetaDualShock3.h:38
Abstract class for input/ouput system.
Definition: IODevice.h:45
namespace of the flair Framework
Definition: Ahrs.h:19
void LowBatteryDefaultAction(void)
Low Battery Default Action.
Class defining euler angles.
Definition: Euler.h:27
float ComputeDefaultThrust(void)
Compute Default Thrust.
Class defining a 2D vector.
Class displaying a QGridLayout on the ground station.
Definition: GridLayout.h:27
Class defining a Pid for Thrust. This Pid as an extra offset for compensating gravity.
Definition: PidThrust.h:33
virtual void LowBatteryAction(void)
Low Battery Action.
Class defining AHRS datas.
Definition: AhrsData.h:30
Class defining a 3D vector.
State machine for UAV The Thread is created with the FrameworkManager as parent. FrameworkManager mus...
Definition: UavStateMachine.h:68
Abstract class for altitude sensor.
Definition: AltitudeSensor.h:31
Base Class for target side remote controls.
Definition: TargetController.h:48
Class generating a trajectory in 1D.
Definition: TrajectoryGenerator1D.h:47
virtual float ComputeCustomThrust(void)
Get Torques.
void AddDeviceToControlLawLog(const core::IODevice *device)
Get Thrust.
Class displaying a QPushButton on the ground station.
Definition: PushButton.h:28
virtual void ComputeCustomTorques(core::Euler &torques)
Compute Custom Torques.
Class defining a PID.
Definition: Pid.h:32
Abstract class for a thread.
Class defining a quaternion.
Class defining a PID with saturations.
Definition: NestedSat.h:43
Abstract class for a thread.
Definition: Thread.h:37
Class displaying a QDoubleSpinBox on the ground station.
Definition: DoubleSpinBox.h:28
Base class to construct sensors/actuators depending on uav type. The Object is created with the Frame...
Definition: Uav.h:48
void SetFailSafeAltitudeSensor(sensor::AltitudeSensor *altitudeSensor)
Set the FailSafe AltitudeSensor.
void AddDataToControlLawLog(const core::io_data *data)
Add an io_data to the control law logs.
void ComputeDefaultTorques(core::Euler &torques)
Compute Default Torques.
Class defining a quaternion.
Definition: Quaternion.h:26
Class displaying a QTab on the ground station.
Definition: Tab.h:29
Class defining euler angles.