1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-02-20 10:54:14 +01:00

Bug fixes and showcase UI setup (partial).

This commit is contained in:
zedamota 2012-02-07 20:29:32 +00:00
parent e2c6a9d58a
commit 5cfd763f2a
5 changed files with 310 additions and 41 deletions

View File

@ -3367,8 +3367,11 @@ border-radius: 5;</string>
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>51</number>
</property>
<property name="sliderPosition">
<number>50</number>
<number>51</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
@ -3410,6 +3413,15 @@ border-radius: 5;</string>
<property name="text">
<string>50</string>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:RollRatePID</string>
<string>element:Kp</string>
<string>haslimits:yes</string>
<string>scale:0.0001</string>
</stringlist>
</property>
</widget>
</item>
<item row="1" column="3">
@ -3444,6 +3456,15 @@ border-radius: 5;</string>
<property name="tickInterval">
<number>25</number>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:PitchRatePID</string>
<string>element:Kp</string>
<string>haslimits:yes</string>
<string>scale:0.0001</string>
</stringlist>
</property>
</widget>
</item>
<item row="1" column="4">
@ -3466,6 +3487,15 @@ border-radius: 5;</string>
<property name="text">
<string>50</string>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:PitchRatePID</string>
<string>element:Kp</string>
<string>haslimits:yes</string>
<string>scale:0.0001</string>
</stringlist>
</property>
</widget>
</item>
<item row="1" column="5">
@ -3500,6 +3530,15 @@ border-radius: 5;</string>
<property name="tickInterval">
<number>25</number>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:YawRatePID</string>
<string>element:Kp</string>
<string>haslimits:yes</string>
<string>scale:0.0001</string>
</stringlist>
</property>
</widget>
</item>
<item row="1" column="6">
@ -3522,6 +3561,15 @@ border-radius: 5;</string>
<property name="text">
<string>50</string>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:YawRatePID</string>
<string>element:Kp</string>
<string>haslimits:yes</string>
<string>scale:0.0001</string>
</stringlist>
</property>
</widget>
</item>
<item row="2" column="0">
@ -3575,6 +3623,15 @@ border-radius: 5;</string>
<property name="tickInterval">
<number>25</number>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:RollRatePID</string>
<string>element:Ki</string>
<string>haslimits:yes</string>
<string>scale:0.0001</string>
</stringlist>
</property>
</widget>
</item>
<item row="2" column="2">
@ -3597,6 +3654,15 @@ border-radius: 5;</string>
<property name="text">
<string>50</string>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:RollRatePID</string>
<string>element:Ki</string>
<string>haslimits:yes</string>
<string>scale:0.0001</string>
</stringlist>
</property>
</widget>
</item>
<item row="2" column="3">
@ -3631,6 +3697,15 @@ border-radius: 5;</string>
<property name="tickInterval">
<number>25</number>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:PitchRatePID</string>
<string>element:Ki</string>
<string>haslimits:yes</string>
<string>scale:0.0001</string>
</stringlist>
</property>
</widget>
</item>
<item row="2" column="4">
@ -3653,6 +3728,15 @@ border-radius: 5;</string>
<property name="text">
<string>50</string>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:PitchRatePID</string>
<string>element:Ki</string>
<string>haslimits:yes</string>
<string>scale:0.0001</string>
</stringlist>
</property>
</widget>
</item>
<item row="2" column="5">
@ -3687,6 +3771,15 @@ border-radius: 5;</string>
<property name="tickInterval">
<number>25</number>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:YawRatePID</string>
<string>element:Ki</string>
<string>haslimits:yes</string>
<string>scale:0.0001</string>
</stringlist>
</property>
</widget>
</item>
<item row="2" column="6">
@ -3709,6 +3802,15 @@ border-radius: 5;</string>
<property name="text">
<string>50</string>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:YawRatePID</string>
<string>element:Ki</string>
<string>haslimits:yes</string>
<string>scale:0.0001</string>
</stringlist>
</property>
</widget>
</item>
</layout>
@ -6575,6 +6677,16 @@ border-radius: 5;</string>
<property name="text">
<string>50</string>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:RollPI</string>
<string>element:Kp</string>
<string>scale:0.1</string>
<string>haslimits:yes</string>
<string>buttongroup:2</string>
</stringlist>
</property>
</widget>
</item>
<item row="1" column="3">
@ -6609,6 +6721,16 @@ border-radius: 5;</string>
<property name="tickInterval">
<number>25</number>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:PitchPI</string>
<string>element:Kp</string>
<string>scale:0.1</string>
<string>haslimits:yes</string>
<string>buttongroup:2</string>
</stringlist>
</property>
</widget>
</item>
<item row="1" column="4">
@ -6631,6 +6753,16 @@ border-radius: 5;</string>
<property name="text">
<string>50</string>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:PitchPI</string>
<string>element:Kp</string>
<string>scale:0.1</string>
<string>haslimits:yes</string>
<string>buttongroup:2</string>
</stringlist>
</property>
</widget>
</item>
<item row="1" column="5">
@ -6665,6 +6797,16 @@ border-radius: 5;</string>
<property name="tickInterval">
<number>25</number>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:YawPI</string>
<string>element:Kp</string>
<string>scale:0.1</string>
<string>haslimits:yes</string>
<string>buttongroup:2</string>
</stringlist>
</property>
</widget>
</item>
<item row="1" column="6">
@ -6687,6 +6829,16 @@ border-radius: 5;</string>
<property name="text">
<string>50</string>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:YawPI</string>
<string>element:Kp</string>
<string>scale:0.1</string>
<string>haslimits:yes</string>
<string>buttongroup:2</string>
</stringlist>
</property>
</widget>
</item>
<item row="2" column="0">
@ -6740,6 +6892,16 @@ border-radius: 5;</string>
<property name="tickInterval">
<number>25</number>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:RollPI</string>
<string>element:Ki</string>
<string>scale:0.1</string>
<string>haslimits:yes</string>
<string>buttongroup:2</string>
</stringlist>
</property>
</widget>
</item>
<item row="2" column="2">
@ -6762,6 +6924,16 @@ border-radius: 5;</string>
<property name="text">
<string>50</string>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:RollPI</string>
<string>element:Ki</string>
<string>scale:0.1</string>
<string>haslimits:yes</string>
<string>buttongroup:2</string>
</stringlist>
</property>
</widget>
</item>
<item row="2" column="3">
@ -6796,6 +6968,16 @@ border-radius: 5;</string>
<property name="tickInterval">
<number>25</number>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:PitchPI</string>
<string>element:Ki</string>
<string>scale:0.1</string>
<string>haslimits:yes</string>
<string>buttongroup:2</string>
</stringlist>
</property>
</widget>
</item>
<item row="2" column="4">
@ -6818,6 +7000,16 @@ border-radius: 5;</string>
<property name="text">
<string>50</string>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:PitchPI</string>
<string>element:Ki</string>
<string>scale:0.1</string>
<string>haslimits:yes</string>
<string>buttongroup:2</string>
</stringlist>
</property>
</widget>
</item>
<item row="2" column="5">
@ -6852,6 +7044,16 @@ border-radius: 5;</string>
<property name="tickInterval">
<number>25</number>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:YawPI</string>
<string>element:Ki</string>
<string>scale:0.1</string>
<string>haslimits:yes</string>
<string>buttongroup:2</string>
</stringlist>
</property>
</widget>
</item>
<item row="2" column="6">
@ -6874,6 +7076,16 @@ border-radius: 5;</string>
<property name="text">
<string>50</string>
</property>
<property name="objrelation" stdset="0">
<stringlist>
<string>objname:StabilizationSettings</string>
<string>fieldname:YawPI</string>
<string>element:Ki</string>
<string>scale:0.1</string>
<string>haslimits:yes</string>
<string>buttongroup:2</string>
</stringlist>
</property>
</widget>
</item>
</layout>
@ -11222,7 +11434,7 @@ border-radius: 4;
<rect>
<x>0</x>
<y>0</y>
<width>626</width>
<width>431</width>
<height>828</height>
</rect>
</property>

View File

@ -102,7 +102,7 @@ void UAVObjectField::limitsInitialize(const QString &limits)
/// (VALX)->value
/// %TY:VAL1:VAL2:VAL3,%TY,VAL1,VAL2,VAL3
/// example: first element bigger than 3 and second element inside [2.3,5]
/// "%0BI:3,%1BE:2.3:5"
/// "0BI:3,%1BE:2.3:5"
if(limits.isEmpty())
return;
QStringList stringPerElement=limits.split(",");
@ -160,9 +160,9 @@ void UAVObjectField::limitsInitialize(const QString &limits)
}
else
{
if(!valuesPerElement.at(0).startsWith("%"))
if(!valuesPerElement.at(0).isEmpty() && !b1)
qDebug()<<"limits parsing failed (property doesn't start with %) on UAVObjectField"<<name;
else if(index>=numElements)
else if(!b2)
qDebug()<<"limits parsing failed (index>numelements) on UAVObjectField"<<name<<"index"<<index<<"numElements"<<numElements;
}
}

View File

@ -61,9 +61,12 @@ void ConfigTaskWidget::addUAVObjectToWidgetRelation(QString object, QString fiel
UAVObject *obj=objManager->getObject(QString(object));
Q_ASSERT(obj);
UAVObjectField *_field;
int index=0;
if(!field.isEmpty() && obj)
{
_field = obj->getField(QString(field));
int index=_field->getElementNames().indexOf(QString(element));
index=_field->getElementNames().indexOf(QString(element));
}
addUAVObjectToWidgetRelation(object, field, widget,index,scale,isLimited,defaultReloadGroups);
}
void ConfigTaskWidget::addUAVObjectToWidgetRelation(QString object, QString field, QWidget * widget, int index,double scale,bool isLimited,QList<int>* defaultReloadGroups)
@ -287,14 +290,16 @@ void ConfigTaskWidget::widgetsContentsChanged()
if(oTw->widget!=(QWidget *)sender())
{
checkWidgetsLimits(oTw->widget,oTw->field,oTw->index,oTw->isLimited,getVariantFromWidget((QWidget*)sender(),scale),oTw->scale);
setWidgetFromVariant(oTw->widget,getVariantFromWidget((QWidget*)sender(),scale),oTw->scale);
setWidgetFromVariant(oTw->widget,getVariantFromWidget((QWidget*)sender(),scale),oTw->scale);
}
foreach (shadow * sh, oTw->shadowsList)
{
if(sh->widget!=(QWidget*)sender())
{
checkWidgetsLimits(sh->widget,oTw->field,oTw->index,sh->isLimited,getVariantFromWidget((QWidget*)sender(),scale),oTw->scale);
disconnectWidgetUpdatesToSlot((QWidget*)sender(),SLOT(widgetsContentsChanged()));
setWidgetFromVariant(sh->widget,getVariantFromWidget((QWidget*)sender(),scale),sh->scale);
connectWidgetUpdatesToSlot((QWidget*)sender(),SLOT(widgetsContentsChanged()));
}
}
}
@ -402,12 +407,26 @@ bool ConfigTaskWidget::addShadowWidget(QString object, QString field, QWidget *w
continue;
if(oTw->object->getName()==object && oTw->field->getName()==field && oTw->index==index)
{
shadow * sh=new shadow;
sh->isLimited=isLimited;
sh->scale=scale;
sh->widget=widget;
shadow * sh=NULL;
if(qobject_cast<QLabel *>(oTw->widget) && !qobject_cast<QLabel *>(widget))
{
sh=new shadow;
sh->isLimited=oTw->isLimited;
sh->scale=oTw->scale;
sh->widget=oTw->widget;
oTw->isLimited=isLimited;
oTw->scale=scale;
oTw->widget=widget;
}
else
{
sh=new shadow;
sh->isLimited=isLimited;
sh->scale=scale;
sh->widget=widget;
}
oTw->shadowsList.append(sh);
shadowsList.insert(widget,oTw);
shadowsList.insert(sh->widget,oTw);
connectWidgetUpdatesToSlot(widget,SLOT(widgetsContentsChanged()));
if(defaultReloadGroups)
addWidgetToDefaultReloadGroups(widget,defaultReloadGroups);
@ -516,6 +535,7 @@ void ConfigTaskWidget::autoLoadWidgets()
}
if(saveButtonWidget && applyButtonWidget)
addApplySaveButtons(applyButtonWidget,saveButtonWidget);
refreshWidgetsValues();
}
void ConfigTaskWidget::addWidgetToDefaultReloadGroups(QWidget *widget, QList<int> * groups)
@ -616,7 +636,7 @@ void ConfigTaskWidget::connectWidgetUpdatesToSlot(QWidget * widget,const char* f
}
else if(QSlider * cb=qobject_cast<QSlider *>(widget))
{
connect(cb,SIGNAL(sliderMoved(int)),this,function);
connect(cb,SIGNAL(valueChanged(int)),this,function);
}
else if(MixerCurveWidget * cb=qobject_cast<MixerCurveWidget *>(widget))
{
@ -646,7 +666,46 @@ void ConfigTaskWidget::connectWidgetUpdatesToSlot(QWidget * widget,const char* f
qDebug()<<__FUNCTION__<<"widget to uavobject relation not implemented"<<widget->metaObject()->className();
}
void ConfigTaskWidget::disconnectWidgetUpdatesToSlot(QWidget * widget,const char* function)
{
if(!widget)
return;
if(QComboBox * cb=qobject_cast<QComboBox *>(widget))
{
disconnect(cb,SIGNAL(currentIndexChanged(int)),this,function);
}
else if(QSlider * cb=qobject_cast<QSlider *>(widget))
{
disconnect(cb,SIGNAL(valueChanged(int)),this,function);
}
else if(MixerCurveWidget * cb=qobject_cast<MixerCurveWidget *>(widget))
{
disconnect(cb,SIGNAL(curveUpdated(QList<double>,double)),this,function);
}
else if(QTableWidget * cb=qobject_cast<QTableWidget *>(widget))
{
disconnect(cb,SIGNAL(cellChanged(int,int)),this,function);
}
else if(QSpinBox * cb=qobject_cast<QSpinBox *>(widget))
{
disconnect(cb,SIGNAL(valueChanged(int)),this,function);
}
else if(QDoubleSpinBox * cb=qobject_cast<QDoubleSpinBox *>(widget))
{
disconnect(cb,SIGNAL(valueChanged(double)),this,function);
}
else if(QCheckBox * cb=qobject_cast<QCheckBox *>(widget))
{
disconnect(cb,SIGNAL(clicked()),this,function);
}
else if(QPushButton * cb=qobject_cast<QPushButton *>(widget))
{
disconnect(cb,SIGNAL(clicked()),this,function);
}
else
qDebug()<<__FUNCTION__<<"widget to uavobject relation not implemented"<<widget->metaObject()->className();
}
bool ConfigTaskWidget::setFieldFromWidget(QWidget * widget,UAVObjectField * field,int index,double scale)
{
if(!widget || !field)
@ -668,10 +727,6 @@ QVariant ConfigTaskWidget::getVariantFromWidget(QWidget * widget,double scale)
{
return (QString)cb->currentText();
}
else if(QLabel * cb=qobject_cast<QLabel *>(widget))
{
return (QString)cb->text();
}
else if(QDoubleSpinBox * cb=qobject_cast<QDoubleSpinBox *>(widget))
{
return (double)(cb->value()* scale);
@ -701,7 +756,11 @@ bool ConfigTaskWidget::setWidgetFromVariant(QWidget *widget, QVariant value, dou
}
else if(QLabel * cb=qobject_cast<QLabel *>(widget))
{
cb->setText(value.toString());
qDebug()<<"SETLABEL "<<value.toDouble()<<scale;
if(scale==0)
cb->setText(value.toString());
else
cb->setText(QString::number((value.toDouble()/scale)));
return true;
}
else if(QDoubleSpinBox * cb=qobject_cast<QDoubleSpinBox *>(widget))
@ -711,13 +770,13 @@ bool ConfigTaskWidget::setWidgetFromVariant(QWidget *widget, QVariant value, dou
}
else if(QSpinBox * cb=qobject_cast<QSpinBox *>(widget))
{
cb->setValue((int)(value.toDouble()/scale));
cb->setValue((int)qRound(value.toDouble()/scale));
return true;
}
else if(QSlider * cb=qobject_cast<QSlider *>(widget))
{
cb->setValue((int)(value.toDouble()/scale));
qDebug()<<"SETVALUE widgetfromvariant"<<value.toDouble()<<"/"<<scale<<"="<<(int)(value.toDouble()/scale)<<"object"<<(quint32)cb;
cb->setValue((int)qRound(value.toDouble()/scale));
qDebug()<<"SETVALUE widgetfromvariant"<<value.toDouble()<<"/"<<scale<<"="<<(int)qRound(value.toDouble()/scale)<<"object"<<(quint32)cb;
return true;
}
else if(QCheckBox * cb=qobject_cast<QCheckBox *>(widget))
@ -779,46 +838,43 @@ void ConfigTaskWidget::checkWidgetsLimits(QWidget * widget,UAVObjectField * fiel
}
else if(QSpinBox * cb=qobject_cast<QSpinBox *>(widget))
{
if((int)(value.toDouble()/scale)>cb->maximum())
if((int)qRound(value.toDouble()/scale)>cb->maximum())
{
cb->setMaximum((int)(value.toDouble()/scale));
cb->setMaximum((int)qRound(value.toDouble()/scale));
}
else if((int)(value.toDouble()/scale)<cb->minimum())
else if((int)qRound(value.toDouble()/scale)<cb->minimum())
{
cb->setMinimum((int)(value.toDouble()/scale));
cb->setMinimum((int)qRound(value.toDouble()/scale));
}
}
else if(QSlider * cb=qobject_cast<QSlider *>(widget))
{
if((int)(value.toDouble()/scale)>cb->maximum())
if((int)qRound(value.toDouble()/scale)>cb->maximum())
{
cb->setMaximum((int)(value.toDouble()/scale));
cb->setMaximum((int)qRound(value.toDouble()/scale));
}
else if((int)(value.toDouble()/scale)<cb->minimum())
else if((int)qRound(value.toDouble()/scale)<cb->minimum())
{
cb->setMinimum((int)(value.toDouble()/scale));
cb->setMinimum((int)qRound(value.toDouble()/scale));
}
}
}
else if(widget->property("wasOverLimits").isValid())
{
qDebug()<<"1wasOverLimits";
if(widget->property("wasOverLimits").toBool())
{
qDebug()<<"2";
widget->setProperty("wasOverLimits",(bool)false);
if(widget->property("styleBackup").isValid())
{
qDebug()<<"3";
QString style=widget->property("styleBackup").toString();
qDebug()<<"STYLE"<<style;
widget->setStyleSheet(style);
}
loadWidgetLimits(widget,field,index,hasLimits,scale);
}
}
}
void ConfigTaskWidget::loadWidgetLimits(QWidget * widget,UAVObjectField * field,int index,bool hasLimits,double scale)
{
if(!widget || !field)
@ -855,24 +911,24 @@ void ConfigTaskWidget::loadWidgetLimits(QWidget * widget,UAVObjectField * field,
{
if(field->getMaxLimit(index).isValid())
{
cb->setMaximum((int)(field->getMaxLimit(index).toDouble()/scale));
cb->setMaximum((int)qRound(field->getMaxLimit(index).toDouble()/scale));
}
if(field->getMinLimit(index).isValid())
{
cb->setMinimum((int)(field->getMinLimit(index).toDouble()/scale));
cb->setMinimum((int)qRound(field->getMinLimit(index).toDouble()/scale));
}
}
else if(QSlider * cb=qobject_cast<QSlider *>(widget))
{
if(field->getMaxLimit(index).isValid())
{
cb->setMaximum((int)(field->getMaxLimit(index).toDouble()/scale));
qDebug()<<"MAX="<<field->getMaxLimit(index).toDouble()<<"/"<<scale<<"="<<cb->maximum();
cb->setMaximum((int)qRound(field->getMaxLimit(index).toDouble()/scale));
qDebug()<<"set MAX="<<field->getMaxLimit(index).toDouble()<<"/"<<scale<<"="<<cb->maximum();
}
if(field->getMinLimit(index).isValid())
{
cb->setMinimum((int)(field->getMinLimit(index).toDouble()/scale));
qDebug()<<"MIN="<<field->getMinLimit(index).toDouble()<<"/"<<scale<<"="<<cb->minimum();
qDebug()<< "set MIN="<<field->getMinLimit(index).toDouble()<<"/"<<scale<<"="<<cb->minimum();
}
}
}

View File

@ -145,6 +145,7 @@ private:
QVariant getVariantFromWidget(QWidget *widget, double scale);
bool setWidgetFromVariant(QWidget *widget,QVariant value,double scale);
void connectWidgetUpdatesToSlot(QWidget *widget, const char *function);
void disconnectWidgetUpdatesToSlot(QWidget *widget, const char *function);
void loadWidgetLimits(QWidget *widget, UAVObjectField *field, int index, bool hasLimits, double sclale);
QString outOfLimitsStyle;
protected slots:

View File

@ -10,9 +10,9 @@
<field name="RollRatePID" units="" type="float" elementnames="Kp,Ki,Kd,ILimit" defaultvalue="0.002,0,0,0.3" limits="%BE:0:0.01,%BE:0:0.01,, "/>
<field name="PitchRatePID" units="" type="float" elementnames="Kp,Ki,Kd,ILimit" defaultvalue="0.002,0,0,0.3" limits="%BE:0:0.01,%BE:0:0.01,, "/>
<field name="YawRatePID" units="" type="float" elementnames="Kp,Ki,Kd,ILimit" defaultvalue="0.0035,0.0035,0,0.3" limits="%BE:0:0.01,%BE:0:0.01,, "/>
<field name="RollPI" units="" type="float" elementnames="Kp,Ki,ILimit" defaultvalue="2,0,50" limits="%BE:0:10,%BE:0:10,, "/>
<field name="PitchPI" units="" type="float" elementnames="Kp,Ki,ILimit" defaultvalue="2,0,50" limits="%BE:0:10,%BE:0:10,, "/>
<field name="YawPI" units="" type="float" elementnames="Kp,Ki,ILimit" defaultvalue="2,0,50" limits="%BE:0:10,%BE:0:10,, "/>
<field name="RollPI" units="" type="float" elementnames="Kp,Ki,ILimit" defaultvalue="2,0,50" limits="%BE:0:10,%BE:0:10,"/>
<field name="PitchPI" units="" type="float" elementnames="Kp,Ki,ILimit" defaultvalue="2,0,50" limits="%BE:0:10,%BE:0:10,"/>
<field name="YawPI" units="" type="float" elementnames="Kp,Ki,ILimit" defaultvalue="2,0,50" limits="%BE:0:10,%BE:0:10,"/>
<field name="GyroTau" units="" type="float" elements="1" defaultvalue="0.005"/>