Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "flightcontrol.h"
00020 #include "pid.h"
00021
00023
00068 class RotaryWing : public FlightControl
00069 {
00070 DECLARE_MODULE(RotaryWing,FlightControl);
00071 public:
00072
00073 RotaryWing()
00074 {
00075
00076 AddSocket("RotaryWing.Pitch.P",&m_pids[PITCH].p);
00077 AddSocket("RotaryWing.Pitch.I",&m_pids[PITCH].i);
00078 AddSocket("RotaryWing.Pitch.ILimit",&m_pids[PITCH].iLim);
00079 AddSocket("RotaryWing.Pitch.D",&m_pids[PITCH].d);
00080 AddSocket("RotaryWing.Roll.P",&m_pids[ROLL].p);
00081 AddSocket("RotaryWing.Roll.I",&m_pids[ROLL].i);
00082 AddSocket("RotaryWing.Roll.ILimit",&m_pids[ROLL].iLim);
00083 AddSocket("RotaryWing.Roll.D",&m_pids[ROLL].d);
00084 AddSocket("RotaryWing.Yaw.P",&m_pids[YAW].p);
00085 AddSocket("RotaryWing.Yaw.I",&m_pids[YAW].i);
00086 AddSocket("RotaryWing.Yaw.ILimit",&m_pids[YAW].iLim);
00087 AddSocket("RotaryWing.Yaw.D",&m_pids[YAW].d);
00088
00089 AddSocket("RotaryWing.Stable.P.P", &m_stablePids[PITCH].p);
00090 AddSocket("RotaryWing.Stable.P.I", &m_stablePids[PITCH].i);
00091 AddSocket("RotaryWing.Stable.P.D", &m_stablePids[PITCH].d);
00092 AddSocket("RotaryWing.Stable.R.P", &m_stablePids[ROLL].p);
00093 AddSocket("RotaryWing.Stable.R.I", &m_stablePids[ROLL].i);
00094 AddSocket("RotaryWing.Stable.R.D", &m_stablePids[ROLL].d);
00095
00096
00097 AddSocket("RotaryWing.BankComp",&m_zBoost);
00098 AddSocket("RotaryWing.CommandComp",&m_cmdBoost);
00099
00100 for (int ct=0; ct< MAX_AXES; ct++)
00101 {
00102 m_pids[ct].p = 0.8;
00103 m_pids[ct].i = 0;
00104 m_pids[ct].d = 0.03;
00105 }
00106 }
00107
00108 virtual void ParamChanged(Socket * param)
00109 {
00110 }
00111
00112 virtual void Init()
00113 {
00114 FlightControl::Init();
00115
00116 m_gyros[PITCH].Connect("Gyro.Pitch");
00117 m_gyros[ROLL].Connect("Gyro.Roll");
00118 m_gyros[YAW].Connect("Gyro.Yaw");
00119 m_commands[THROTTLE].Connect("Command.Throttle");
00120 m_commands[ROLL].Connect("Command.Roll");
00121 m_commands[PITCH].Connect("Command.Pitch");
00122 m_commands[YAW].Connect("Command.Yaw");
00123 m_Ahrs[PITCH].Connect("AHRS.Pitch");
00124 m_Ahrs[ROLL].Connect("AHRS.Roll");
00125 m_Ahrs[YAW].Connect("AHRS.Yaw");
00126 m_zAccel.Connect("Accel.X");
00127 m_acceleration.Connect("AHRS.Acceleration");
00128
00129 SetInterval(5);
00130 SetPriority(40);
00131 }
00132
00133 virtual void Reference()
00134 {
00135 for (int ct=0; ct< MAX_AXES; ct++)
00136 {
00137 m_pids[ct].ResetIntegral();
00138 }
00139 }
00140
00141 virtual void Loop(const unsigned long& interval)
00142 {
00143 float bankCmd;
00144
00145 if(m_zAccel < -0.5)
00146 {
00147 bankCmd = (-1 - m_acceleration / m_zAccel) * m_zBoost;
00148 bankCmd += (fabs(m_axes.filtered[PITCH]) + fabs(m_axes.filtered[ROLL])) * m_cmdBoost;
00149 }else
00150 {
00151 bankCmd = 0;
00152 }
00153
00154 float values[MAX_COMMANDS];
00155 if (m_flightMode < FLIGHTMODE_ACRO)
00156 {
00157 for (int ct=0; ct< MAX_AXES; ct++)
00158 {
00159 m_pids[ct].ResetIntegral();
00160 }
00161 }
00162
00163 if(false)
00164 {
00165 for (int ct=0; ct< YAW; ct++)
00166 {
00167 values[ct] = m_commands[ct];
00168 }
00169 }else
00170 {
00171 for (int ct=0; ct< YAW; ct++)
00172 {
00173 values[ct] = m_commands[ct] + m_stablePids[ct].Apply(m_commands[ct],m_Ahrs[ct] * 2);
00174 }
00175 }
00176
00177
00178 for (int ct=0; ct< YAW; ct++)
00179 {
00180 values[ct] = values[ct] + m_pids[ct].Apply(values[ct],m_gyros[ct]);
00181 }
00182
00183 values[YAW] = m_commands[YAW] + m_pids[YAW].Apply(m_commands[YAW], m_gyros[YAW] * 0.2);
00184 values[THROTTLE] = m_commands[THROTTLE];
00185
00186 m_axes.Update(values);
00187 }
00188
00189 private:
00190
00191 PID m_pids[MAX_AXES];
00192 PID m_stablePids[2];
00193 ParameterF m_zBoost;
00194 ParameterF m_cmdBoost;
00195 PlugF m_acceleration;
00196 PlugF m_zAccel;
00197 PlugF m_Ahrs[MAX_AXES];
00198 PlugF m_gyros[MAX_AXES];
00199 PlugF m_commands[MAX_COMMANDS];
00200 };
00201
00202 RotaryWing g_RotaryWing;