1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2024-11-29 07:24:13 +01:00

Stabilization: Changed to new switch format. Both position and rate modes work.

git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@1886 ebee16cc-31ac-478f-84a7-5cbb03baadba
This commit is contained in:
les 2010-10-05 14:51:33 +00:00 committed by les
parent 1e26ca11ee
commit 7ddb0f6f80
8 changed files with 164 additions and 137 deletions

View File

@ -142,15 +142,30 @@ static void stabilizationTask(void* parameters)
SystemSettingsGet(&systemSettings);
float *manualAxis = &manualControl.Roll;
float *attitudeDesiredAxis = &attitudeDesired.Roll;
float *attitudeActualAxis = &attitudeActual.Roll;
float *actuatorDesiredAxis = &actuatorDesired.Roll;
//Calculate desired rate
float rates[MAX_AXES]= {0,0,0};
rates[ROLL] = ApplyPid(&pids[PID_ROLL], attitudeDesired.Roll, attitudeActual.Roll ,false);
rates[PITCH] = ApplyPid(&pids[PID_PITCH], attitudeDesired.Pitch, attitudeActual.Pitch,false);
if(settings.YawMode == LESSTABILIZATIONSETTINGS_YAWMODE_RATE) { // rate stabilization on yaw
rates[YAW] = manualControl.Yaw * settings.ManualYawRate;
}else{
rates[YAW] = ApplyPid(&pids[PID_YAW], attitudeDesired.Yaw, attitudeActual.Yaw,true);
for(int ct=0; ct< MAX_AXES; ct++)
{
switch(manualControl.StabilizationSettings[ct])
{
case MANUALCONTROLCOMMAND_STABILIZATIONSETTINGS_RATE:
rates[ct] = manualAxis[ct] * settings.ManualRate[ct];
break;
case MANUALCONTROLCOMMAND_STABILIZATIONSETTINGS_POSITION:
rates[ct] = ApplyPid(&pids[PID_ROLL + ct], attitudeDesiredAxis[ct], attitudeActualAxis[ct], true);
break;
}
}
bool shouldUpdate = false;
ActuatorDesiredGet(&actuatorDesired);
//Calculate desired command
for(int ct=0; ct< MAX_AXES; ct++)
{
if(fabs(rates[ct]) > settings.MaximumRate[ct])
@ -164,39 +179,38 @@ static void stabilizationTask(void* parameters)
}
}
switch(manualControl.StabilizationSettings[ct])
{
case MANUALCONTROLCOMMAND_STABILIZATIONSETTINGS_RATE:
case MANUALCONTROLCOMMAND_STABILIZATIONSETTINGS_POSITION:
{
float command = ApplyPid(&pids[PID_RATE_ROLL + ct], rates[ct], attitudeRaw.gyros_filtered[ct], false);
actuatorDesiredAxis[ct] = bound(command);
shouldUpdate = true;
break;
}
}
}
if(manualControl.FlightMode == MANUALCONTROLCOMMAND_FLIGHTMODE_MANUAL)
{
shouldUpdate = false;
}
float commands[MAX_AXES];
commands[ROLL] = ApplyPid(&pids[PID_RATE_ROLL], attitudeRaw.gyros_filtered[ROLL], rates[ROLL],false);
commands[PITCH] = ApplyPid(&pids[PID_RATE_PITCH], attitudeRaw.gyros_filtered[PITCH], rates[PITCH],false);
commands[YAW] = ApplyPid(&pids[PID_RATE_YAW], attitudeRaw.gyros_filtered[YAW], rates[YAW],false);
// On fixed wing we don't try to stabilizew yaw
if ( systemSettings.AirframeType < SYSTEMSETTINGS_AIRFRAMETYPE_VTOL)
{
commands[YAW] = -manualControl.Yaw;
}
actuatorDesired.Pitch = bound(-commands[PITCH]);
actuatorDesired.Roll = bound(-commands[ROLL]);
actuatorDesired.Yaw = bound(-commands[YAW]);
// Setup throttle
actuatorDesired.Throttle = attitudeDesired.Throttle;
// Save dT
actuatorDesired.UpdateTime = dT * 1000;
// Write actuator desired (if not in manual mode)
if ( manualControl.FlightMode != MANUALCONTROLCOMMAND_FLIGHTMODE_MANUAL )
if(shouldUpdate)
{
actuatorDesired.Throttle = attitudeDesired.Throttle;
ActuatorDesiredSet(&actuatorDesired);
}
else
if(manualControl.Armed == MANUALCONTROLCOMMAND_ARMED_FALSE ||
!shouldUpdate)
{
ZeroPids();
}
// Save dT
actuatorDesired.UpdateTime = dT * 1000;
// Clear alarms
AlarmsClear(SYSTEMALARMS_ALARM_STABILIZATION);
}
@ -258,15 +272,9 @@ static void SettingsUpdatedCb(UAVObjEvent * ev)
{
memset(pids,0,sizeof (pid_type) * PID_MAX);
LesStabilizationSettingsGet(&settings);
pids[PID_RATE_ROLL].p = settings.RollRateP;
pids[PID_RATE_PITCH].p = settings.PitchRateP;
pids[PID_RATE_YAW].p = settings.YawRatePI[LESSTABILIZATIONSETTINGS_YAWRATEPI_KP];
pids[PID_RATE_YAW].i = settings.YawRatePI[LESSTABILIZATIONSETTINGS_YAWRATEPI_KI];
pids[PID_RATE_YAW].iLim = settings.YawRatePI[LESSTABILIZATIONSETTINGS_YAWRATEPI_ILIMIT];
float * data = settings.RollPI;
for(int pid=PID_ROLL; pid < PID_MAX; pid++)
float * data = settings.RollRatePI;
for(int pid=0; pid < PID_MAX; pid++)
{
pids[pid].p = *data++;
pids[pid].i = *data++;

View File

@ -41,7 +41,7 @@
#define LESSTABILIZATIONSETTINGS_H
// Object constants
#define LESSTABILIZATIONSETTINGS_OBJID 2839831188U
#define LESSTABILIZATIONSETTINGS_OBJID 3247121950U
#define LESSTABILIZATIONSETTINGS_NAME "LesStabilizationSettings"
#define LESSTABILIZATIONSETTINGS_METANAME "LesStabilizationSettingsMeta"
#define LESSTABILIZATIONSETTINGS_ISSINGLEINST 1
@ -75,11 +75,10 @@ typedef struct {
uint8_t RollMax;
uint8_t PitchMax;
uint8_t YawMax;
uint8_t YawMode;
float ManualYawRate;
float ManualRate[3];
float MaximumRate[3];
float RollRateP;
float PitchRateP;
float RollRatePI[3];
float PitchRatePI[3];
float YawRatePI[3];
float RollPI[3];
float PitchPI[3];
@ -92,17 +91,26 @@ typedef struct {
// Field RollMax information
// Field PitchMax information
// Field YawMax information
// Field YawMode information
/* Enumeration options for field YawMode */
typedef enum { LESSTABILIZATIONSETTINGS_YAWMODE_RATE=0, LESSTABILIZATIONSETTINGS_YAWMODE_HEADING=1 } LesStabilizationSettingsYawModeOptions;
// Field ManualYawRate information
// Field ManualRate information
/* Array element names for field ManualRate */
typedef enum { LESSTABILIZATIONSETTINGS_MANUALRATE_ROLL=0, LESSTABILIZATIONSETTINGS_MANUALRATE_PITCH=1, LESSTABILIZATIONSETTINGS_MANUALRATE_YAW=2 } LesStabilizationSettingsManualRateElem;
/* Number of elements for field ManualRate */
#define LESSTABILIZATIONSETTINGS_MANUALRATE_NUMELEM 3
// Field MaximumRate information
/* Array element names for field MaximumRate */
typedef enum { LESSTABILIZATIONSETTINGS_MAXIMUMRATE_ROLL=0, LESSTABILIZATIONSETTINGS_MAXIMUMRATE_PITCH=1, LESSTABILIZATIONSETTINGS_MAXIMUMRATE_YAW=2 } LesStabilizationSettingsMaximumRateElem;
/* Number of elements for field MaximumRate */
#define LESSTABILIZATIONSETTINGS_MAXIMUMRATE_NUMELEM 3
// Field RollRateP information
// Field PitchRateP information
// Field RollRatePI information
/* Array element names for field RollRatePI */
typedef enum { LESSTABILIZATIONSETTINGS_ROLLRATEPI_KP=0, LESSTABILIZATIONSETTINGS_ROLLRATEPI_KI=1, LESSTABILIZATIONSETTINGS_ROLLRATEPI_ILIMIT=2 } LesStabilizationSettingsRollRatePIElem;
/* Number of elements for field RollRatePI */
#define LESSTABILIZATIONSETTINGS_ROLLRATEPI_NUMELEM 3
// Field PitchRatePI information
/* Array element names for field PitchRatePI */
typedef enum { LESSTABILIZATIONSETTINGS_PITCHRATEPI_KP=0, LESSTABILIZATIONSETTINGS_PITCHRATEPI_KI=1, LESSTABILIZATIONSETTINGS_PITCHRATEPI_ILIMIT=2 } LesStabilizationSettingsPitchRatePIElem;
/* Number of elements for field PitchRatePI */
#define LESSTABILIZATIONSETTINGS_PITCHRATEPI_NUMELEM 3
// Field YawRatePI information
/* Array element names for field YawRatePI */
typedef enum { LESSTABILIZATIONSETTINGS_YAWRATEPI_KP=0, LESSTABILIZATIONSETTINGS_YAWRATEPI_KI=1, LESSTABILIZATIONSETTINGS_YAWRATEPI_ILIMIT=2 } LesStabilizationSettingsYawRatePIElem;

View File

@ -84,25 +84,30 @@ static void setDefaults(UAVObjHandle obj, uint16_t instId)
data.RollMax = 35;
data.PitchMax = 35;
data.YawMax = 35;
data.YawMode = 0;
data.ManualYawRate = 200;
data.ManualRate[0] = 150;
data.ManualRate[1] = 150;
data.ManualRate[2] = 150;
data.MaximumRate[0] = 300;
data.MaximumRate[1] = 300;
data.MaximumRate[2] = 300;
data.RollRateP = 0.0015;
data.PitchRateP = 0.0015;
data.RollRatePI[0] = 0.0015;
data.RollRatePI[1] = 0;
data.RollRatePI[2] = 0.5;
data.PitchRatePI[0] = 0.0015;
data.PitchRatePI[1] = 0;
data.PitchRatePI[2] = 0.5;
data.YawRatePI[0] = 0.003;
data.YawRatePI[1] = 0.003;
data.YawRatePI[2] = 0.003;
data.RollPI[0] = 0;
data.YawRatePI[1] = 0;
data.YawRatePI[2] = 0.5;
data.RollPI[0] = 2;
data.RollPI[1] = 0;
data.RollPI[2] = 0;
data.PitchPI[0] = 0;
data.RollPI[2] = 0.5;
data.PitchPI[0] = 2;
data.PitchPI[1] = 0;
data.PitchPI[2] = 0;
data.YawPI[0] = 0;
data.PitchPI[2] = 0.5;
data.YawPI[0] = 2;
data.YawPI[1] = 0;
data.YawPI[2] = 0;
data.YawPI[2] = 0.5;
UAVObjSetInstanceData(obj, instId, &data);

View File

@ -47,33 +47,33 @@ LesStabilizationSettings::LesStabilizationSettings(): UAVDataObject(OBJID, ISSIN
fields.append( new UAVObjectField(QString("UpdatePeriod"), QString("ms"), UAVObjectField::UINT8, UpdatePeriodElemNames, QStringList()) );
QStringList RollMaxElemNames;
RollMaxElemNames.append("0");
fields.append( new UAVObjectField(QString("RollMax"), QString("degrees"), UAVObjectField::UINT8, RollMaxElemNames, QStringList()) );
fields.append( new UAVObjectField(QString("RollMax"), QString("Degrees"), UAVObjectField::UINT8, RollMaxElemNames, QStringList()) );
QStringList PitchMaxElemNames;
PitchMaxElemNames.append("0");
fields.append( new UAVObjectField(QString("PitchMax"), QString("degrees"), UAVObjectField::UINT8, PitchMaxElemNames, QStringList()) );
fields.append( new UAVObjectField(QString("PitchMax"), QString("Degrees"), UAVObjectField::UINT8, PitchMaxElemNames, QStringList()) );
QStringList YawMaxElemNames;
YawMaxElemNames.append("0");
fields.append( new UAVObjectField(QString("YawMax"), QString("degrees"), UAVObjectField::UINT8, YawMaxElemNames, QStringList()) );
QStringList YawModeElemNames;
YawModeElemNames.append("0");
QStringList YawModeEnumOptions;
YawModeEnumOptions.append("rate");
YawModeEnumOptions.append("heading");
fields.append( new UAVObjectField(QString("YawMode"), QString(""), UAVObjectField::ENUM, YawModeElemNames, YawModeEnumOptions) );
QStringList ManualYawRateElemNames;
ManualYawRateElemNames.append("0");
fields.append( new UAVObjectField(QString("ManualYawRate"), QString("Degrees/sec"), UAVObjectField::FLOAT32, ManualYawRateElemNames, QStringList()) );
fields.append( new UAVObjectField(QString("YawMax"), QString("Degrees"), UAVObjectField::UINT8, YawMaxElemNames, QStringList()) );
QStringList ManualRateElemNames;
ManualRateElemNames.append("Roll");
ManualRateElemNames.append("Pitch");
ManualRateElemNames.append("Yaw");
fields.append( new UAVObjectField(QString("ManualRate"), QString("Degrees/sec"), UAVObjectField::FLOAT32, ManualRateElemNames, QStringList()) );
QStringList MaximumRateElemNames;
MaximumRateElemNames.append("Roll");
MaximumRateElemNames.append("Pitch");
MaximumRateElemNames.append("Yaw");
fields.append( new UAVObjectField(QString("MaximumRate"), QString("Degrees/sec"), UAVObjectField::FLOAT32, MaximumRateElemNames, QStringList()) );
QStringList RollRatePElemNames;
RollRatePElemNames.append("0");
fields.append( new UAVObjectField(QString("RollRateP"), QString(""), UAVObjectField::FLOAT32, RollRatePElemNames, QStringList()) );
QStringList PitchRatePElemNames;
PitchRatePElemNames.append("0");
fields.append( new UAVObjectField(QString("PitchRateP"), QString(""), UAVObjectField::FLOAT32, PitchRatePElemNames, QStringList()) );
QStringList RollRatePIElemNames;
RollRatePIElemNames.append("Kp");
RollRatePIElemNames.append("Ki");
RollRatePIElemNames.append("ILimit");
fields.append( new UAVObjectField(QString("RollRatePI"), QString(""), UAVObjectField::FLOAT32, RollRatePIElemNames, QStringList()) );
QStringList PitchRatePIElemNames;
PitchRatePIElemNames.append("Kp");
PitchRatePIElemNames.append("Ki");
PitchRatePIElemNames.append("ILimit");
fields.append( new UAVObjectField(QString("PitchRatePI"), QString(""), UAVObjectField::FLOAT32, PitchRatePIElemNames, QStringList()) );
QStringList YawRatePIElemNames;
YawRatePIElemNames.append("Kp");
YawRatePIElemNames.append("Ki");
@ -131,25 +131,30 @@ void LesStabilizationSettings::setDefaultFieldValues()
data.RollMax = 35;
data.PitchMax = 35;
data.YawMax = 35;
data.YawMode = 0;
data.ManualYawRate = 200;
data.ManualRate[0] = 150;
data.ManualRate[1] = 150;
data.ManualRate[2] = 150;
data.MaximumRate[0] = 300;
data.MaximumRate[1] = 300;
data.MaximumRate[2] = 300;
data.RollRateP = 0.0015;
data.PitchRateP = 0.0015;
data.RollRatePI[0] = 0.0015;
data.RollRatePI[1] = 0;
data.RollRatePI[2] = 0.5;
data.PitchRatePI[0] = 0.0015;
data.PitchRatePI[1] = 0;
data.PitchRatePI[2] = 0.5;
data.YawRatePI[0] = 0.003;
data.YawRatePI[1] = 0.003;
data.YawRatePI[2] = 0.003;
data.RollPI[0] = 0;
data.YawRatePI[1] = 0;
data.YawRatePI[2] = 0.5;
data.RollPI[0] = 2;
data.RollPI[1] = 0;
data.RollPI[2] = 0;
data.PitchPI[0] = 0;
data.RollPI[2] = 0.5;
data.PitchPI[0] = 2;
data.PitchPI[1] = 0;
data.PitchPI[2] = 0;
data.YawPI[0] = 0;
data.PitchPI[2] = 0.5;
data.YawPI[0] = 2;
data.YawPI[1] = 0;
data.YawPI[2] = 0;
data.YawPI[2] = 0.5;
}

View File

@ -47,11 +47,10 @@ public:
quint8 RollMax;
quint8 PitchMax;
quint8 YawMax;
quint8 YawMode;
float ManualYawRate;
float ManualRate[3];
float MaximumRate[3];
float RollRateP;
float PitchRateP;
float RollRatePI[3];
float PitchRatePI[3];
float YawRatePI[3];
float RollPI[3];
float PitchPI[3];
@ -64,17 +63,26 @@ public:
// Field RollMax information
// Field PitchMax information
// Field YawMax information
// Field YawMode information
/* Enumeration options for field YawMode */
typedef enum { YAWMODE_RATE=0, YAWMODE_HEADING=1 } YawModeOptions;
// Field ManualYawRate information
// Field ManualRate information
/* Array element names for field ManualRate */
typedef enum { MANUALRATE_ROLL=0, MANUALRATE_PITCH=1, MANUALRATE_YAW=2 } ManualRateElem;
/* Number of elements for field ManualRate */
static const quint32 MANUALRATE_NUMELEM = 3;
// Field MaximumRate information
/* Array element names for field MaximumRate */
typedef enum { MAXIMUMRATE_ROLL=0, MAXIMUMRATE_PITCH=1, MAXIMUMRATE_YAW=2 } MaximumRateElem;
/* Number of elements for field MaximumRate */
static const quint32 MAXIMUMRATE_NUMELEM = 3;
// Field RollRateP information
// Field PitchRateP information
// Field RollRatePI information
/* Array element names for field RollRatePI */
typedef enum { ROLLRATEPI_KP=0, ROLLRATEPI_KI=1, ROLLRATEPI_ILIMIT=2 } RollRatePIElem;
/* Number of elements for field RollRatePI */
static const quint32 ROLLRATEPI_NUMELEM = 3;
// Field PitchRatePI information
/* Array element names for field PitchRatePI */
typedef enum { PITCHRATEPI_KP=0, PITCHRATEPI_KI=1, PITCHRATEPI_ILIMIT=2 } PitchRatePIElem;
/* Number of elements for field PitchRatePI */
static const quint32 PITCHRATEPI_NUMELEM = 3;
// Field YawRatePI information
/* Array element names for field YawRatePI */
typedef enum { YAWRATEPI_KP=0, YAWRATEPI_KI=1, YAWRATEPI_ILIMIT=2 } YawRatePIElem;
@ -98,7 +106,7 @@ public:
// Constants
static const quint32 OBJID = 2839831188U;
static const quint32 OBJID = 3247121950U;
static const QString NAME;
static const bool ISSINGLEINST = 1;
static const bool ISSETTINGS = 1;

View File

@ -78,23 +78,13 @@ _fields = [ \
}
),
uavobject.UAVObjectField(
'YawMode',
'b',
1,
[
'0',
],
{
'0' : 'rate',
'1' : 'heading',
}
),
uavobject.UAVObjectField(
'ManualYawRate',
'ManualRate',
'f',
1,
3,
[
'0',
'Roll',
'Pitch',
'Yaw',
],
{
}
@ -112,21 +102,25 @@ _fields = [ \
}
),
uavobject.UAVObjectField(
'RollRateP',
'RollRatePI',
'f',
1,
3,
[
'0',
'Kp',
'Ki',
'ILimit',
],
{
}
),
uavobject.UAVObjectField(
'PitchRateP',
'PitchRatePI',
'f',
1,
3,
[
'0',
'Kp',
'Ki',
'ILimit',
],
{
}
@ -184,7 +178,7 @@ _fields = [ \
class LesStabilizationSettings(uavobject.UAVObject):
## Object constants
OBJID = 2839831188
OBJID = 3247121950
NAME = "LesStabilizationSettings"
METANAME = "LesStabilizationSettingsMeta"
ISSINGLEINST = 1

View File

@ -2,19 +2,18 @@
<object name="LesStabilizationSettings" singleinstance="true" settings="true">
<description>PID settings used by the Stabilization module to combine the @ref AttitudeActual and @ref AttitudeDesired to compute @ref ActuatorDesired</description>
<field name="UpdatePeriod" units="ms" type="uint8" elements="1" defaultvalue="10"/>
<field name="RollMax" units="degrees" type="uint8" elements="1" defaultvalue="35"/>
<field name="PitchMax" units="degrees" type="uint8" elements="1" defaultvalue="35"/>
<field name="YawMax" units="degrees" type="uint8" elements="1" defaultvalue="35"/>
<field name="YawMode" units="" type="enum" elements="1" options="rate,heading" defaultvalue="rate"/>
<field name="ManualYawRate" units="Degrees/sec" type="float" elements="1" defaultvalue="200"/>
<field name="MaximumRate" units="Degrees/sec" type="float" elements="3" elementnames="Roll,Pitch,Yaw" defaultvalue="300"/>
<field name="RollMax" units="Degrees" type="uint8" elements="1" defaultvalue="35"/>
<field name="PitchMax" units="Degrees" type="uint8" elements="1" defaultvalue="35"/>
<field name="YawMax" units="Degrees" type="uint8" elements="1" defaultvalue="35"/>
<field name="ManualRate" units="Degrees/sec" type="float" elements="3" elementnames="Roll,Pitch,Yaw" defaultvalue="150,150,150"/>
<field name="MaximumRate" units="Degrees/sec" type="float" elements="3" elementnames="Roll,Pitch,Yaw" defaultvalue="300,300,300"/>
<field name="RollRateP" units="" type="float" elements="1" defaultvalue="0.0015"/>
<field name="PitchRateP" units="" type="float" elements="1" defaultvalue="0.0015"/>
<field name="YawRatePI" units="" type="float" elements="2" elementnames="Kp,Ki,ILimit" defaultvalue="0.003"/>
<field name="RollPI" units="" type="float" elements="4" elementnames="Kp,Ki,ILimit" defaultvalue="0"/>
<field name="PitchPI" units="" type="float" elements="4" elementnames="Kp,Ki,ILimit" defaultvalue="0"/>
<field name="YawPI" units="" type="float" elements="4" elementnames="Kp,Ki,ILimit" defaultvalue="0"/>
<field name="RollRatePI" units="" type="float" elements="2" elementnames="Kp,Ki,ILimit" defaultvalue="0.0015,0,0.5"/>
<field name="PitchRatePI" units="" type="float" elements="2" elementnames="Kp,Ki,ILimit" defaultvalue="0.0015,0,0.5"/>
<field name="YawRatePI" units="" type="float" elements="2" elementnames="Kp,Ki,ILimit" defaultvalue="0.003,0,0.5"/>
<field name="RollPI" units="" type="float" elements="4" elementnames="Kp,Ki,ILimit" defaultvalue="2,0,0.5"/>
<field name="PitchPI" units="" type="float" elements="4" elementnames="Kp,Ki,ILimit" defaultvalue="2,0,0.5"/>
<field name="YawPI" units="" type="float" elements="4" elementnames="Kp,Ki,ILimit" defaultvalue="2,0,0.5"/>
<access gcs="readwrite" flight="readwrite"/>
<telemetrygcs acked="true" updatemode="onchange" period="0"/>

View File

@ -5,8 +5,8 @@
<field name="FeedForward" units="" type="float" elements="1" defaultvalue="0"/>
<field name="AccelTime" units="ms" type="float" elements="1" defaultvalue="0"/>
<field name="DecelTime" units="ms" type="float" elements="1" defaultvalue="0"/>
<field name="ThrottleCurve1" units="percent" type="float" elements="5" elementnames="0,25,50,75,100" defaultvalue="-10"/>
<field name="ThrottleCurve2" units="percent" type="float" elements="5" elementnames="0,25,50,75,100" defaultvalue="-10"/>
<field name="ThrottleCurve1" units="percent" type="float" elements="5" elementnames="0,25,50,75,100" defaultvalue="0,0.25,0.5,0.75,1"/>
<field name="ThrottleCurve2" units="percent" type="float" elements="5" elementnames="0,25,50,75,100" defaultvalue="0,0.25,0.5,0.75,1"/>
<field name="Mixer0Type" units="" type="enum" elements="1" options="Disabled,Motor,Servo" defaultvalue="Disabled"/>
<field name="Mixer0Vector" units="" type="int8" elements="5" elementnames="ThrottleCurve1,ThrottleCurve2,Roll,Pitch,Yaw" defaultvalue="0"/>
<field name="Mixer1Type" units="" type="enum" elements="1" options="Disabled,Motor,Servo" defaultvalue="Disabled"/>