mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2024-12-10 18:24:11 +01:00
OP-1117 Rename Horizon to Rattitude, Anti Windup and dT additions
This commit is contained in:
parent
35f6caa360
commit
56b4d8647f
@ -697,7 +697,7 @@ static void updateStabilizationDesired(ManualControlCommandData *cmd, ManualCont
|
|||||||
(stab_settings[0] == STABILIZATIONDESIRED_STABILIZATIONMODE_ATTITUDE) ? cmd->Roll * stabSettings.RollMax :
|
(stab_settings[0] == STABILIZATIONDESIRED_STABILIZATIONMODE_ATTITUDE) ? cmd->Roll * stabSettings.RollMax :
|
||||||
(stab_settings[0] == STABILIZATIONDESIRED_STABILIZATIONMODE_AXISLOCK) ? cmd->Roll * stabSettings.ManualRate.Roll :
|
(stab_settings[0] == STABILIZATIONDESIRED_STABILIZATIONMODE_AXISLOCK) ? cmd->Roll * stabSettings.ManualRate.Roll :
|
||||||
(stab_settings[0] == STABILIZATIONDESIRED_STABILIZATIONMODE_VIRTUALBAR) ? cmd->Roll :
|
(stab_settings[0] == STABILIZATIONDESIRED_STABILIZATIONMODE_VIRTUALBAR) ? cmd->Roll :
|
||||||
(stab_settings[0] == STABILIZATIONDESIRED_STABILIZATIONMODE_MULTIWIIHORIZON) ? cmd->Roll :
|
(stab_settings[0] == STABILIZATIONDESIRED_STABILIZATIONMODE_RATTITUDE) ? cmd->Roll :
|
||||||
(stab_settings[0] == STABILIZATIONDESIRED_STABILIZATIONMODE_RELAYRATE) ? cmd->Roll * stabSettings.ManualRate.Roll :
|
(stab_settings[0] == STABILIZATIONDESIRED_STABILIZATIONMODE_RELAYRATE) ? cmd->Roll * stabSettings.ManualRate.Roll :
|
||||||
(stab_settings[0] == STABILIZATIONDESIRED_STABILIZATIONMODE_RELAYATTITUDE) ? cmd->Roll * stabSettings.RollMax :
|
(stab_settings[0] == STABILIZATIONDESIRED_STABILIZATIONMODE_RELAYATTITUDE) ? cmd->Roll * stabSettings.RollMax :
|
||||||
0; // this is an invalid mode
|
0; // this is an invalid mode
|
||||||
@ -709,7 +709,7 @@ static void updateStabilizationDesired(ManualControlCommandData *cmd, ManualCont
|
|||||||
(stab_settings[1] == STABILIZATIONDESIRED_STABILIZATIONMODE_ATTITUDE) ? cmd->Pitch * stabSettings.PitchMax :
|
(stab_settings[1] == STABILIZATIONDESIRED_STABILIZATIONMODE_ATTITUDE) ? cmd->Pitch * stabSettings.PitchMax :
|
||||||
(stab_settings[1] == STABILIZATIONDESIRED_STABILIZATIONMODE_AXISLOCK) ? cmd->Pitch * stabSettings.ManualRate.Pitch :
|
(stab_settings[1] == STABILIZATIONDESIRED_STABILIZATIONMODE_AXISLOCK) ? cmd->Pitch * stabSettings.ManualRate.Pitch :
|
||||||
(stab_settings[1] == STABILIZATIONDESIRED_STABILIZATIONMODE_VIRTUALBAR) ? cmd->Pitch :
|
(stab_settings[1] == STABILIZATIONDESIRED_STABILIZATIONMODE_VIRTUALBAR) ? cmd->Pitch :
|
||||||
(stab_settings[1] == STABILIZATIONDESIRED_STABILIZATIONMODE_MULTIWIIHORIZON) ? cmd->Pitch :
|
(stab_settings[1] == STABILIZATIONDESIRED_STABILIZATIONMODE_RATTITUDE) ? cmd->Pitch :
|
||||||
(stab_settings[1] == STABILIZATIONDESIRED_STABILIZATIONMODE_RELAYRATE) ? cmd->Pitch * stabSettings.ManualRate.Pitch :
|
(stab_settings[1] == STABILIZATIONDESIRED_STABILIZATIONMODE_RELAYRATE) ? cmd->Pitch * stabSettings.ManualRate.Pitch :
|
||||||
(stab_settings[1] == STABILIZATIONDESIRED_STABILIZATIONMODE_RELAYATTITUDE) ? cmd->Pitch * stabSettings.PitchMax :
|
(stab_settings[1] == STABILIZATIONDESIRED_STABILIZATIONMODE_RELAYATTITUDE) ? cmd->Pitch * stabSettings.PitchMax :
|
||||||
0; // this is an invalid mode
|
0; // this is an invalid mode
|
||||||
@ -717,9 +717,9 @@ static void updateStabilizationDesired(ManualControlCommandData *cmd, ManualCont
|
|||||||
// TOOD: Add assumption about order of stabilization desired and manual control stabilization mode fields having same order
|
// TOOD: Add assumption about order of stabilization desired and manual control stabilization mode fields having same order
|
||||||
stabilization.StabilizationMode.Roll = stab_settings[0];
|
stabilization.StabilizationMode.Roll = stab_settings[0];
|
||||||
stabilization.StabilizationMode.Pitch = stab_settings[1];
|
stabilization.StabilizationMode.Pitch = stab_settings[1];
|
||||||
// Other axes (yaw) cannot be Horizon, so use Rate
|
// Other axes (yaw) cannot be Rattitude, so use Rate
|
||||||
// Should really do this for Attitude mode as well?
|
// Should really do this for Attitude mode as well?
|
||||||
if (stab_settings[2] == STABILIZATIONDESIRED_STABILIZATIONMODE_MULTIWIIHORIZON) {
|
if (stab_settings[2] == STABILIZATIONDESIRED_STABILIZATIONMODE_RATTITUDE) {
|
||||||
stabilization.StabilizationMode.Yaw = STABILIZATIONDESIRED_STABILIZATIONMODE_RATE;
|
stabilization.StabilizationMode.Yaw = STABILIZATIONDESIRED_STABILIZATIONMODE_RATE;
|
||||||
stabilization.Yaw = cmd->Yaw * stabSettings.ManualRate.Yaw;
|
stabilization.Yaw = cmd->Yaw * stabSettings.ManualRate.Yaw;
|
||||||
}
|
}
|
||||||
@ -732,7 +732,7 @@ static void updateStabilizationDesired(ManualControlCommandData *cmd, ManualCont
|
|||||||
(stab_settings[2] == STABILIZATIONDESIRED_STABILIZATIONMODE_ATTITUDE) ? cmd->Yaw * stabSettings.YawMax :
|
(stab_settings[2] == STABILIZATIONDESIRED_STABILIZATIONMODE_ATTITUDE) ? cmd->Yaw * stabSettings.YawMax :
|
||||||
(stab_settings[2] == STABILIZATIONDESIRED_STABILIZATIONMODE_AXISLOCK) ? cmd->Yaw * stabSettings.ManualRate.Yaw :
|
(stab_settings[2] == STABILIZATIONDESIRED_STABILIZATIONMODE_AXISLOCK) ? cmd->Yaw * stabSettings.ManualRate.Yaw :
|
||||||
(stab_settings[2] == STABILIZATIONDESIRED_STABILIZATIONMODE_VIRTUALBAR) ? cmd->Yaw :
|
(stab_settings[2] == STABILIZATIONDESIRED_STABILIZATIONMODE_VIRTUALBAR) ? cmd->Yaw :
|
||||||
(stab_settings[2] == STABILIZATIONDESIRED_STABILIZATIONMODE_MULTIWIIHORIZON) ? cmd->Yaw :
|
(stab_settings[2] == STABILIZATIONDESIRED_STABILIZATIONMODE_RATTITUDE) ? cmd->Yaw :
|
||||||
(stab_settings[2] == STABILIZATIONDESIRED_STABILIZATIONMODE_RELAYRATE) ? cmd->Yaw * stabSettings.ManualRate.Yaw :
|
(stab_settings[2] == STABILIZATIONDESIRED_STABILIZATIONMODE_RELAYRATE) ? cmd->Yaw * stabSettings.ManualRate.Yaw :
|
||||||
(stab_settings[2] == STABILIZATIONDESIRED_STABILIZATIONMODE_RELAYATTITUDE) ? cmd->Yaw * stabSettings.YawMax :
|
(stab_settings[2] == STABILIZATIONDESIRED_STABILIZATIONMODE_RELAYATTITUDE) ? cmd->Yaw * stabSettings.YawMax :
|
||||||
0; // this is an invalid mode
|
0; // this is an invalid mode
|
||||||
|
@ -73,7 +73,7 @@
|
|||||||
|
|
||||||
// The PID_RATE_ROLL set is used by Rate mode and the rate portion of Attitude mode
|
// The PID_RATE_ROLL set is used by Rate mode and the rate portion of Attitude mode
|
||||||
// The PID_RATE set is used by the attitude portion of Attitude mode
|
// The PID_RATE set is used by the attitude portion of Attitude mode
|
||||||
// The PID_RATEA_ROLL set is used by MultiWiiHorizon mode because it needs to maintain
|
// The PID_RATEA_ROLL set is used by Rattitude mode because it needs to maintain
|
||||||
// - two independant rate PIDs because it does rate and attitude simultaneously
|
// - two independant rate PIDs because it does rate and attitude simultaneously
|
||||||
enum { PID_RATE_ROLL, PID_RATE_PITCH, PID_RATE_YAW, PID_ROLL, PID_PITCH, PID_YAW, PID_RATEA_ROLL, PID_RATEA_PITCH, PID_RATEA_YAW, PID_MAX };
|
enum { PID_RATE_ROLL, PID_RATE_PITCH, PID_RATE_YAW, PID_ROLL, PID_PITCH, PID_YAW, PID_RATEA_ROLL, PID_RATEA_PITCH, PID_RATEA_YAW, PID_MAX };
|
||||||
|
|
||||||
@ -91,6 +91,7 @@ bool lowThrottleZeroIntegral;
|
|||||||
bool lowThrottleZeroAxis[MAX_AXES];
|
bool lowThrottleZeroAxis[MAX_AXES];
|
||||||
float vbar_decay = 0.991f;
|
float vbar_decay = 0.991f;
|
||||||
struct pid pids[PID_MAX];
|
struct pid pids[PID_MAX];
|
||||||
|
float rattitude_anti_windup;
|
||||||
|
|
||||||
// Private functions
|
// Private functions
|
||||||
static void stabilizationTask(void *parameters);
|
static void stabilizationTask(void *parameters);
|
||||||
@ -178,7 +179,7 @@ static void stabilizationTask(__attribute__((unused)) void *parameters)
|
|||||||
PIOS_WDG_UpdateFlag(PIOS_WDG_STABILIZATION);
|
PIOS_WDG_UpdateFlag(PIOS_WDG_STABILIZATION);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Wait until the AttitudeRaw object is updated, if a timeout then go to failsafe
|
// Wait until the AttitudeRaw (wrong, it is Gyro) object is updated, if a timeout then go to failsafe
|
||||||
if (xQueueReceive(queue, &ev, FAILSAFE_TIMEOUT_MS / portTICK_RATE_MS) != pdTRUE) {
|
if (xQueueReceive(queue, &ev, FAILSAFE_TIMEOUT_MS / portTICK_RATE_MS) != pdTRUE) {
|
||||||
AlarmsSet(SYSTEMALARMS_ALARM_STABILIZATION, SYSTEMALARMS_ALARM_WARNING);
|
AlarmsSet(SYSTEMALARMS_ALARM_STABILIZATION, SYSTEMALARMS_ALARM_WARNING);
|
||||||
continue;
|
continue;
|
||||||
@ -317,7 +318,7 @@ static void stabilizationTask(__attribute__((unused)) void *parameters)
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STABILIZATIONDESIRED_STABILIZATIONMODE_MULTIWIIHORIZON:
|
case STABILIZATIONDESIRED_STABILIZATIONMODE_RATTITUDE:
|
||||||
// A parameterization from Attitude mode at center stick
|
// A parameterization from Attitude mode at center stick
|
||||||
// - to Rate mode at full stick
|
// - to Rate mode at full stick
|
||||||
// This is done by parameterizing to use the rotation rate that Attitude mode
|
// This is done by parameterizing to use the rotation rate that Attitude mode
|
||||||
@ -351,7 +352,8 @@ static void stabilizationTask(__attribute__((unused)) void *parameters)
|
|||||||
float rateDesiredAxisAttitude;
|
float rateDesiredAxisAttitude;
|
||||||
rateDesiredAxisAttitude = pid_apply(&pids[PID_ROLL + i], attitude_error, dT);
|
rateDesiredAxisAttitude = pid_apply(&pids[PID_ROLL + i], attitude_error, dT);
|
||||||
rateDesiredAxisAttitude = bound(rateDesiredAxisAttitude,
|
rateDesiredAxisAttitude = bound(rateDesiredAxisAttitude,
|
||||||
cast_struct_to_array(settings.MaximumRate, settings.MaximumRate.Roll)[i]);
|
cast_struct_to_array(settings.MaximumRate,
|
||||||
|
settings.MaximumRate.Roll)[i]);
|
||||||
|
|
||||||
// Compute the weighted average rate desired
|
// Compute the weighted average rate desired
|
||||||
// Using max() rather than sqrt() for cpu speed;
|
// Using max() rather than sqrt() for cpu speed;
|
||||||
@ -361,7 +363,8 @@ static void stabilizationTask(__attribute__((unused)) void *parameters)
|
|||||||
// magnitude = sqrt(stabDesired.Roll*stabDesired.Roll + stabDesired.Pitch*stabDesired.Pitch);
|
// magnitude = sqrt(stabDesired.Roll*stabDesired.Roll + stabDesired.Pitch*stabDesired.Pitch);
|
||||||
float magnitude;
|
float magnitude;
|
||||||
magnitude = fmaxf(fabsf(stabDesired.Roll), fabsf(stabDesired.Pitch));
|
magnitude = fmaxf(fabsf(stabDesired.Roll), fabsf(stabDesired.Pitch));
|
||||||
rateDesiredAxis[i] = (1.0f-magnitude) * rateDesiredAxisAttitude + magnitude * rateDesiredAxisRate;
|
rateDesiredAxis[i] = (1.0f-magnitude) * rateDesiredAxisAttitude
|
||||||
|
+ magnitude * rateDesiredAxisRate;
|
||||||
|
|
||||||
// Compute the inner loop for both Rate mode and Attitude mode
|
// Compute the inner loop for both Rate mode and Attitude mode
|
||||||
// actuatorDesiredAxis[i] is the weighted average of the two PIDs from the two rates
|
// actuatorDesiredAxis[i] is the weighted average of the two PIDs from the two rates
|
||||||
@ -370,19 +373,58 @@ static void stabilizationTask(__attribute__((unused)) void *parameters)
|
|||||||
+ magnitude * pid_apply_setpoint(&pids[PID_RATE_ROLL + i], speedScaleFactor, rateDesiredAxis[i], gyro_filtered[i], dT);
|
+ magnitude * pid_apply_setpoint(&pids[PID_RATE_ROLL + i], speedScaleFactor, rateDesiredAxis[i], gyro_filtered[i], dT);
|
||||||
actuatorDesiredAxis[i] = bound(actuatorDesiredAxis[i], 1.0f);
|
actuatorDesiredAxis[i] = bound(actuatorDesiredAxis[i], 1.0f);
|
||||||
|
|
||||||
// TODO: put a configurable scale factor in for the PID zeroing?
|
// settings.RattitudeAntiWindup controls the iAccumulator zeroing
|
||||||
// Do we need a setting for this to dial down the iAccumulator zeroing
|
// - so both iAccs don't wind up too far;
|
||||||
// - so both iAccumulators don't get held too close to zero at mid stick?
|
// - nor do both iAccs get held too close to zero at mid stick
|
||||||
|
|
||||||
// Not sure if this is the best way to do this but I suspect that there
|
// Not sure if this is the best way to do this but I suspect that there would
|
||||||
// - would be severe windup without it since they fight each other.
|
// - be windup without it since rate and attitude fight each other here
|
||||||
|
// - rate trying to pull it over the top and attitude trying to pull it back down
|
||||||
|
|
||||||
|
// Wind-up increases linearly with cycles for a fixed error.
|
||||||
|
// We need to cut it down faster than that to keep ahead of it.
|
||||||
|
// We must never increase the iAcc or we risk oscillation.
|
||||||
|
|
||||||
|
// Use the powf() function to make two anti-windup curves
|
||||||
|
// - one for zeroing rate close to center stick
|
||||||
|
// - the other for zeroing attitude close to max stick
|
||||||
|
|
||||||
|
// the bigger the dT the more anti windup needed
|
||||||
|
// the bigger the PID[].i the more anti windup needed
|
||||||
|
// more anti windup is achieved with a lower powf() power
|
||||||
|
|
||||||
|
// some quick napkin calculations say that 1/10th second, 50 cycles
|
||||||
|
// to reduce an iAcc by half we should have a factor of about .986
|
||||||
|
// this is so that at half stick, iAcc gets reduced to half in .1 second
|
||||||
|
// this sounds about right for a default anti windup
|
||||||
|
// so powf(.5, x) = .014
|
||||||
|
// .5^x = .014
|
||||||
|
// x about 6
|
||||||
|
// for rate 6 = 1 / (aw * .002 * .003), aw = 1 / (6 * .002 * .003) = 27777
|
||||||
|
// for attitude 6 = 1 / (aw * .002 * 1) , aw = 1 / (6 * .002 * 2.5) = 33
|
||||||
|
// multiply by 833 for rate, use as is for attitude
|
||||||
|
// hand testing showed that aw=10 reduced the windup by maybe half
|
||||||
|
|
||||||
|
// This may only be useful for aircraft with large Ki values and limits
|
||||||
|
if (dT > 0.0f && rattitude_anti_windup > 0.0f) {
|
||||||
|
float factor;
|
||||||
|
|
||||||
// At magnitudes close to one, the Attitude accumulators gets zeroed
|
// At magnitudes close to one, the Attitude accumulators gets zeroed
|
||||||
pids[PID_ROLL + i].iAccumulator *= (1.0f-magnitude); // * factor;
|
if (pids[PID_ROLL+i].i > 0.0f) {
|
||||||
pids[PID_RATEA_ROLL + i].iAccumulator *= (1.0f-magnitude); // * factor;
|
factor = 1.0f - powf(magnitude, 1.0f / (rattitude_anti_windup * dT * pids[PID_ROLL+i].i));
|
||||||
|
pids[PID_ROLL+i].iAccumulator *= factor;
|
||||||
|
}
|
||||||
|
if (pids[PID_RATEA_ROLL+i].i > 0.0f) {
|
||||||
|
factor = 1.0f - powf(magnitude, 1.0f / (rattitude_anti_windup * dT * pids[PID_RATEA_ROLL+i].i * 833.0f));
|
||||||
|
pids[PID_RATEA_ROLL+i].iAccumulator *= factor;
|
||||||
|
}
|
||||||
|
|
||||||
// At magnitudes close to zero, the Rate accumulator gets zeroed
|
// At magnitudes close to zero, the Rate accumulator gets zeroed
|
||||||
pids[PID_RATE_ROLL + i].iAccumulator *= magnitude; // * factor;
|
if (pids[PID_RATE_ROLL+i].i > 0.0f) {
|
||||||
|
factor = 1.0f - powf(1.0f-magnitude, 1.0f / (rattitude_anti_windup * dT * pids[PID_RATE_ROLL+i].i * 833.0f));
|
||||||
|
pids[PID_RATE_ROLL+i].iAccumulator *= factor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -403,6 +445,7 @@ static void stabilizationTask(__attribute__((unused)) void *parameters)
|
|||||||
// Weak Leveling Kp is off by a factor of 3 to 12 and may need a different default in GCS
|
// Weak Leveling Kp is off by a factor of 3 to 12 and may need a different default in GCS
|
||||||
// Changing Rate mode max rate currently requires a change to Kp
|
// Changing Rate mode max rate currently requires a change to Kp
|
||||||
// That would be changed to Attitude mode max angle affecting Kp
|
// That would be changed to Attitude mode max angle affecting Kp
|
||||||
|
// Also does not take dT into account
|
||||||
{
|
{
|
||||||
if (reinit) {
|
if (reinit) {
|
||||||
pids[PID_RATE_ROLL + i].iAccumulator = 0;
|
pids[PID_RATE_ROLL + i].iAccumulator = 0;
|
||||||
@ -609,21 +652,21 @@ static void SettingsUpdatedCb(__attribute__((unused)) UAVObjEvent *ev)
|
|||||||
0,
|
0,
|
||||||
settings.YawPI.ILimit);
|
settings.YawPI.ILimit);
|
||||||
|
|
||||||
// Set the MWHorizon roll rate PID constants
|
// Set the Rattitude roll rate PID constants
|
||||||
pid_configure(&pids[PID_RATEA_ROLL],
|
pid_configure(&pids[PID_RATEA_ROLL],
|
||||||
settings.RollRatePID.Kp,
|
settings.RollRatePID.Kp,
|
||||||
settings.RollRatePID.Ki,
|
settings.RollRatePID.Ki,
|
||||||
settings.RollRatePID.Kd,
|
settings.RollRatePID.Kd,
|
||||||
settings.RollRatePID.ILimit);
|
settings.RollRatePID.ILimit);
|
||||||
|
|
||||||
// Set the MWHorizon pitch rate PID constants
|
// Set the Rattitude pitch rate PID constants
|
||||||
pid_configure(&pids[PID_RATEA_PITCH],
|
pid_configure(&pids[PID_RATEA_PITCH],
|
||||||
settings.PitchRatePID.Kp,
|
settings.PitchRatePID.Kp,
|
||||||
settings.PitchRatePID.Ki,
|
settings.PitchRatePID.Ki,
|
||||||
settings.PitchRatePID.Kd,
|
settings.PitchRatePID.Kd,
|
||||||
settings.PitchRatePID.ILimit);
|
settings.PitchRatePID.ILimit);
|
||||||
|
|
||||||
// Set the MWHorizon yaw rate PID constants
|
// Set the Rattitude yaw rate PID constants
|
||||||
pid_configure(&pids[PID_RATEA_YAW],
|
pid_configure(&pids[PID_RATEA_YAW],
|
||||||
settings.YawRatePID.Kp,
|
settings.YawRatePID.Kp,
|
||||||
settings.YawRatePID.Ki,
|
settings.YawRatePID.Ki,
|
||||||
@ -663,6 +706,9 @@ static void SettingsUpdatedCb(__attribute__((unused)) UAVObjEvent *ev)
|
|||||||
|
|
||||||
// Compute time constant for vbar decay term based on a tau
|
// Compute time constant for vbar decay term based on a tau
|
||||||
vbar_decay = expf(-fakeDt / settings.VbarTau);
|
vbar_decay = expf(-fakeDt / settings.VbarTau);
|
||||||
|
|
||||||
|
// Rattitude flight mode anti-windup factor
|
||||||
|
rattitude_anti_windup = (float) settings.RattitudeAntiWindup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -507,7 +507,7 @@
|
|||||||
<enum>QTabWidget::Rounded</enum>
|
<enum>QTabWidget::Rounded</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>0</number>
|
<number>2</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="documentMode">
|
<property name="documentMode">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
@ -627,8 +627,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>778</width>
|
<width>798</width>
|
||||||
<height>659</height>
|
<height>656</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
@ -8867,9 +8867,9 @@ border-radius: 5;</string>
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>-117</y>
|
<y>0</y>
|
||||||
<width>778</width>
|
<width>784</width>
|
||||||
<height>762</height>
|
<height>711</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="autoFillBackground">
|
<property name="autoFillBackground">
|
||||||
@ -18908,8 +18908,8 @@ border-radius: 5;</string>
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>792</width>
|
<width>784</width>
|
||||||
<height>645</height>
|
<height>673</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_9">
|
<layout class="QVBoxLayout" name="verticalLayout_9">
|
||||||
@ -21554,6 +21554,198 @@ border-radius: 5;</string>
|
|||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="gridGroupBox">
|
||||||
|
<property name="title">
|
||||||
|
<string>Rattitude</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_24">
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>9</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>9</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>9</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>9</number>
|
||||||
|
</property>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<spacer name="horizontalSpacer_54">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QPushButton" name="pushButton_10">
|
||||||
|
<property name="text">
|
||||||
|
<string>Default</string>
|
||||||
|
</property>
|
||||||
|
<property name="objrelation" stdset="0">
|
||||||
|
<stringlist>
|
||||||
|
<string>objname:StabilizationSettings</string>
|
||||||
|
<string>button:default</string>
|
||||||
|
<string>buttongroup:15</string>
|
||||||
|
</stringlist>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" colspan="2">
|
||||||
|
<widget class="QGroupBox" name="gridGroupBox">
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">QGroupBox{border: 0px;}</string>
|
||||||
|
</property>
|
||||||
|
<property name="flat">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_26">
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>9</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<spacer name="horizontalSpacer_55">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeType">
|
||||||
|
<enum>QSizePolicy::Fixed</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>90</width>
|
||||||
|
<height>11</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QDoubleSpinBox" name="HorizonAntiWindup">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>5</width>
|
||||||
|
<height>22</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>175</width>
|
||||||
|
<height>22</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="focusPolicy">
|
||||||
|
<enum>Qt::StrongFocus</enum>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Higher values will keep larger Ki terms and limits from winding up at partial stick. Consider increasing this if you have high Ki values and limits and a sudden stick motion from one aircraft bank angle to another causes the aircraft to rotate and then slowly change rotation.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<double>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>255.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>10.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="objrelation" stdset="0">
|
||||||
|
<stringlist>
|
||||||
|
<string>objname:StabilizationSettings</string>
|
||||||
|
<string>fieldname:RattitudeAntiWindup</string>
|
||||||
|
<string>haslimits:no</string>
|
||||||
|
<string>scale:1</string>
|
||||||
|
<string>buttongroup:15</string>
|
||||||
|
</stringlist>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QLabel" name="label_3">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>144</width>
|
||||||
|
<height>16</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>175</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255));
|
||||||
|
color: rgb(255, 255, 255);
|
||||||
|
border-radius: 5;</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Anti-Windup</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<spacer name="horizontalSpacer_56">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>300</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="groupBox_5">
|
<widget class="QGroupBox" name="groupBox_5">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
@ -27021,8 +27213,8 @@ border-radius: 5;</string>
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>792</width>
|
<width>798</width>
|
||||||
<height>645</height>
|
<height>656</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_23">
|
<layout class="QGridLayout" name="gridLayout_23">
|
||||||
|
@ -22,17 +22,17 @@
|
|||||||
<!-- Note these options should be identical to those in StabilizationDesired.StabilizationMode -->
|
<!-- Note these options should be identical to those in StabilizationDesired.StabilizationMode -->
|
||||||
<field name="Stabilization1Settings" units="" type="enum"
|
<field name="Stabilization1Settings" units="" type="enum"
|
||||||
elementnames="Roll,Pitch,Yaw"
|
elementnames="Roll,Pitch,Yaw"
|
||||||
options="None,Rate,Attitude,AxisLock,WeakLeveling,VirtualBar,MultiWiiHorizon,RelayRate,RelayAttitude"
|
options="None,Rate,Attitude,AxisLock,WeakLeveling,VirtualBar,Rattitude,RelayRate,RelayAttitude"
|
||||||
defaultvalue="Attitude,Attitude,AxisLock"
|
defaultvalue="Attitude,Attitude,AxisLock"
|
||||||
limits="%NE:RelayRate:RelayAttitude; %NE:RelayRate:RelayAttitude; %NE:RelayRate:RelayAttitude;"/>
|
limits="%NE:RelayRate:RelayAttitude; %NE:RelayRate:RelayAttitude; %NE:RelayRate:RelayAttitude;"/>
|
||||||
<field name="Stabilization2Settings" units="" type="enum"
|
<field name="Stabilization2Settings" units="" type="enum"
|
||||||
elementnames="Roll,Pitch,Yaw"
|
elementnames="Roll,Pitch,Yaw"
|
||||||
options="None,Rate,Attitude,AxisLock,WeakLeveling,VirtualBar,MultiWiiHorizon,RelayRate,RelayAttitude"
|
options="None,Rate,Attitude,AxisLock,WeakLeveling,VirtualBar,Rattitude,RelayRate,RelayAttitude"
|
||||||
defaultvalue="Attitude,Attitude,Rate"
|
defaultvalue="Attitude,Attitude,Rate"
|
||||||
limits="%NE:RelayRate:RelayAttitude; %NE:RelayRate:RelayAttitude; %NE:RelayRate:RelayAttitude;"/>
|
limits="%NE:RelayRate:RelayAttitude; %NE:RelayRate:RelayAttitude; %NE:RelayRate:RelayAttitude;"/>
|
||||||
<field name="Stabilization3Settings" units="" type="enum"
|
<field name="Stabilization3Settings" units="" type="enum"
|
||||||
elementnames="Roll,Pitch,Yaw"
|
elementnames="Roll,Pitch,Yaw"
|
||||||
options="None,Rate,Attitude,AxisLock,WeakLeveling,VirtualBar,MultiWiiHorizon,RelayRate,RelayAttitude"
|
options="None,Rate,Attitude,AxisLock,WeakLeveling,VirtualBar,Rattitude,RelayRate,RelayAttitude"
|
||||||
defaultvalue="Rate,Rate,Rate"
|
defaultvalue="Rate,Rate,Rate"
|
||||||
limits="%NE:RelayRate:RelayAttitude; %NE:RelayRate:RelayAttitude; %NE:RelayRate:RelayAttitude;"/>
|
limits="%NE:RelayRate:RelayAttitude; %NE:RelayRate:RelayAttitude; %NE:RelayRate:RelayAttitude;"/>
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<field name="Yaw" units="degrees" type="float" elements="1"/>
|
<field name="Yaw" units="degrees" type="float" elements="1"/>
|
||||||
<field name="Throttle" units="%" type="float" elements="1"/>
|
<field name="Throttle" units="%" type="float" elements="1"/>
|
||||||
<!-- These values should match those in ManualControlCommand.Stabilization{1,2,3}Settings -->
|
<!-- These values should match those in ManualControlCommand.Stabilization{1,2,3}Settings -->
|
||||||
<field name="StabilizationMode" units="" type="enum" elementnames="Roll,Pitch,Yaw" options="None,Rate,Attitude,AxisLock,WeakLeveling,VirtualBar,MultiWiiHorizon,RelayRate,RelayAttitude"/>
|
<field name="StabilizationMode" units="" type="enum" elementnames="Roll,Pitch,Yaw" options="None,Rate,Attitude,AxisLock,WeakLeveling,VirtualBar,Rattitude,RelayRate,RelayAttitude"/>
|
||||||
<access gcs="readwrite" flight="readwrite"/>
|
<access gcs="readwrite" flight="readwrite"/>
|
||||||
<telemetrygcs acked="false" updatemode="manual" period="0"/>
|
<telemetrygcs acked="false" updatemode="manual" period="0"/>
|
||||||
<telemetryflight acked="false" updatemode="periodic" period="1000"/>
|
<telemetryflight acked="false" updatemode="periodic" period="1000"/>
|
||||||
|
@ -33,6 +33,8 @@
|
|||||||
<field name="WeakLevelingKp" units="(deg/s)/deg" type="float" elements="1" defaultvalue="0.1"/>
|
<field name="WeakLevelingKp" units="(deg/s)/deg" type="float" elements="1" defaultvalue="0.1"/>
|
||||||
<field name="MaxWeakLevelingRate" units="deg/s" type="uint8" elements="1" defaultvalue="5"/>
|
<field name="MaxWeakLevelingRate" units="deg/s" type="uint8" elements="1" defaultvalue="5"/>
|
||||||
|
|
||||||
|
<field name="RattitudeAntiWindup" units="" type="uint8" elements="1" defaultvalue="10"/>
|
||||||
|
|
||||||
<field name="LowThrottleZeroIntegral" units="" type="enum" elements="1" options="FALSE,TRUE" defaultvalue="TRUE"/>
|
<field name="LowThrottleZeroIntegral" units="" type="enum" elements="1" options="FALSE,TRUE" defaultvalue="TRUE"/>
|
||||||
|
|
||||||
<field name="LowThrottleZeroAxis" units="" type="enum" elementnames="Roll,Pitch,Yaw" options="FALSE,TRUE" defaultvalue="FALSE,FALSE,FALSE"/>
|
<field name="LowThrottleZeroAxis" units="" type="enum" elementnames="Roll,Pitch,Yaw" options="FALSE,TRUE" defaultvalue="FALSE,FALSE,FALSE"/>
|
||||||
|
Loading…
Reference in New Issue
Block a user