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 #include "pid.h"
00019
00021
00022
00061
00062 class PositionVTOL : public Module
00063 {
00064 DECLARE_MODULE(PositionVTOL,Module)
00065
00066
00067
00068
00069 PositionVTOL()
00070 {
00071
00072
00073
00074
00075 AddSocket("Command.Pitch",&m_commands[PITCH]);
00076 AddSocket("Command.Roll",&m_commands[ROLL]);
00077 AddSocket("Command.Yaw",&m_commands[YAW]);
00078 AddSocket("Command.Throttle",&m_commands[THROTTLE]);
00079
00080 m_receiver[PITCH].Connect("Receiver.Pitch");
00081 m_receiver[ROLL].Connect("Receiver.Roll");
00082 m_receiver[YAW].Connect("Receiver.Yaw");
00083 m_receiver[THROTTLE].Connect("Receiver.Throttle");
00084
00085 AddSocket("Position.Yaw.P",&m_yawGain);
00086 AddSocket("Position.Yaw.MaxRate",&m_yawRate);
00087
00088 AddSocket("Position.Altitude.P",&m_altPid.p);
00089 AddSocket("Position.Altitude.I",&m_altPid.i);
00090 AddSocket("Position.Altitude.D",&m_altPid.d);
00091 AddSocket("Position.Altitude.ILimit",&m_altPid.iLim);
00092 AddSocket("Position.Altitude.HoverThrottle",&m_hoverThrottle);
00093 m_altPid.p = 0.0025;
00094 m_altPid.i = 0;
00095 m_altPid.d = 0.0006;
00096 m_altPid.iLim = 0.5;
00097
00098 AddSocket("Tst",&tst);
00099 }
00100
00101
00102
00103
00104 virtual void ParamChanged(Socket * param)
00105 {
00106 }
00107
00108
00109
00110 virtual void Init()
00111 {
00112
00113 SetInterval(20);
00114
00115 SetPriority (30);
00116 m_altitude.Connect("INS.Altitude");
00117 if(!m_altitude.IsConnected())
00118 {
00119 m_altitude.Connect("Altimeter.Altitude");
00120 }
00121 m_receiver[PITCH].Connect("Receiver.Pitch");
00122 m_receiver[ROLL].Connect("Receiver.Roll");
00123 m_receiver[YAW].Connect("Receiver.Yaw");
00124 m_receiver[THROTTLE].Connect("Receiver.Throttle");
00125
00126 m_accels[AXISX].Connect("Accel.X");
00127 m_accels[AXISY].Connect("Accel.Y");
00128 m_accels[AXISZ].Connect("Accel.Z");
00129
00130 m_flightMode.Connect("FlightMode.Status");
00131 m_heading.Connect("AHRS.Yaw");
00132 }
00133
00134
00135 virtual void Loop(const unsigned long& interval)
00136 {
00137
00138
00139 if (m_flightMode < FLIGHTMODE_HHOLD)
00140 {
00141 for(int ct=0; ct< MAX_COMMANDS; ct++)
00142 {
00143 m_commands[ct] = m_receiver[ct];
00144 }
00145 }
00146 else
00147 {
00148
00149 for(int ct=0; ct< MAX_COMMANDS; ct++)
00150 {
00151 m_commands[ct] = m_receiver[ct];
00152 }
00153
00154 if (m_lastMode != m_flightMode)
00155 {
00156 m_altPid.ResetIntegral();
00157 m_calcHeading = m_heading;
00158 m_startHeading = m_heading;
00159 m_startPitch = m_receiver[PITCH];
00160 m_startRoll = m_receiver[ROLL];
00161 }
00162
00163 m_calcHeading += (m_receiver[YAW] * 0.1);
00164 ClampAngle(m_calcHeading);
00165 tst = m_calcHeading;
00166
00167 float s,c;
00168 c = m_heading - m_startHeading;
00169 s = sin(c);
00170 c = cos(c);
00171
00172 float p = m_receiver[PITCH] - m_startPitch;
00173 float r = m_receiver[ROLL] - m_startRoll;
00174
00175 m_commands[PITCH] = ((c * p) - (s * r)) + m_startPitch;
00176 m_commands[ROLL] = ((s * p) + (c * r)) + m_startRoll;
00177
00178 float res = AngleDiff(m_calcHeading, m_heading) * m_yawGain;
00179 if(fabs(res) > m_yawRate)
00180 {
00181 if(res > 0)
00182 {
00183 res = m_yawRate;
00184 }else
00185 {
00186 res = -m_yawRate;
00187 }
00188 }
00189 m_commands[YAW] = res;
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199 }
00200
00201
00202 m_lastMode = m_flightMode;
00203 }
00204
00205 private:
00206
00207 inline float AngleDiff(const float ang1, const float ang2)
00208 {
00209 float d = ang1 - ang2;
00210 if(d > M_PI)
00211 {
00212 d -= M_PI * 2;
00213 }else if(d < -M_PI)
00214 {
00215 d += M_PI * 2;
00216 }
00217 return(d);
00218 }
00219
00220 inline void ClampAngle(float& a)
00221 {
00222 while(fabs(a) > M_PI)
00223 {
00224 if(a > 0)
00225 {
00226 a -= M_PI * 2;
00227 }else
00228 {
00229 a += M_PI * 2;
00230 }
00231 }
00232 }
00233
00234 PlugF m_altitude;
00235 ParameterF m_hoverThrottle;
00236 ParameterF m_yawGain;
00237 ParameterF m_yawRate;
00238 PID m_altPid;
00239 Plug8 m_flightMode;
00240 PlugF m_heading;
00241 float m_calcHeading;
00242 float m_startHeading;
00243 float m_startPitch;
00244 float m_startRoll;
00245
00246 SocketF tst;
00247
00248 SocketF m_commands[MAX_COMMANDS];
00249 PlugF m_receiver[MAX_COMMANDS];
00250
00251 PlugF m_accels[MAX_AXES];
00252 byte m_lastMode;
00253 float m_hhThrottle;
00254
00255 };
00256
00257 PositionVTOL g_PositionVTOL;
00258