1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2024-12-02 10:24:11 +01:00

OP-138 Multirotor mixer supports adjustment of weight of Roll/Pitch/Yaw on quad + and X configurations.

git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@1937 ebee16cc-31ac-478f-84a7-5cbb03baadba
This commit is contained in:
edouard 2010-10-10 12:04:05 +00:00 committed by edouard
parent 706e418990
commit 4dae7ef2df
2 changed files with 275 additions and 18 deletions

View File

@ -69,7 +69,7 @@
<item>
<widget class="QStackedWidget" name="airframesWidget">
<property name="currentIndex">
<number>2</number>
<number>1</number>
</property>
<widget class="QWidget" name="fixedWing">
<property name="enabled">
@ -444,7 +444,11 @@
</widget>
</item>
<item>
<widget class="QComboBox" name="multirotorFrameType"/>
<widget class="QComboBox" name="multirotorFrameType">
<property name="toolTip">
<string>Select the Multirotor frame type here.</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_5">
@ -475,7 +479,163 @@
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7" stretch="5,2">
<layout class="QHBoxLayout" name="horizontalLayout_7" stretch="0,5,2">
<item>
<layout class="QVBoxLayout" name="verticalLayout_20">
<item>
<widget class="QLabel" name="label_4">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Mix Level</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_19">
<item>
<layout class="QVBoxLayout" name="verticalLayout_22">
<item>
<widget class="QLabel" name="label_43">
<property name="text">
<string>100</string>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="mrRollMixLevel">
<property name="toolTip">
<string>Weight of Roll mixing in percent. Typical values are 100% for + configuration and 50% for X configuration on quads.</string>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>100</number>
</property>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_42">
<property name="text">
<string>R</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBox_3">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>All checked sliders will move together.</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_23">
<item>
<widget class="QLabel" name="label_44">
<property name="text">
<string>100</string>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="mrPitchMixLevel">
<property name="toolTip">
<string>Weight of Pitch mixing in percent. Typical values are 100% for + configuration and 50% for X configuration on quads.</string>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>100</number>
</property>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_40">
<property name="text">
<string>P</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBox_2">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_21">
<item>
<widget class="QLabel" name="label_45">
<property name="text">
<string>50</string>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="mrYawMixLevel">
<property name="toolTip">
<string>Weight of Yaw mixing in percent. Typical value is 50% for + or X configuration on quads.</string>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>50</number>
</property>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>Y</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_11" stretch="0,1,0,0">
<item>
@ -1487,12 +1647,12 @@
<slot>setNum(int)</slot>
<hints>
<hint type="sourcelabel">
<x>284</x>
<x>496</x>
<y>171</y>
</hint>
<hint type="destinationlabel">
<x>156</x>
<y>170</y>
<x>271</x>
<y>171</y>
</hint>
</hints>
</connection>
@ -1503,12 +1663,60 @@
<slot>setNum(int)</slot>
<hints>
<hint type="sourcelabel">
<x>198</x>
<y>234</y>
<x>488</x>
<y>262</y>
</hint>
<hint type="destinationlabel">
<x>127</x>
<y>235</y>
<x>249</x>
<y>262</y>
</hint>
</hints>
</connection>
<connection>
<sender>mrPitchMixLevel</sender>
<signal>valueChanged(int)</signal>
<receiver>label_44</receiver>
<slot>setNum(int)</slot>
<hints>
<hint type="sourcelabel">
<x>76</x>
<y>210</y>
</hint>
<hint type="destinationlabel">
<x>80</x>
<y>149</y>
</hint>
</hints>
</connection>
<connection>
<sender>mrYawMixLevel</sender>
<signal>valueChanged(int)</signal>
<receiver>label_45</receiver>
<slot>setNum(int)</slot>
<hints>
<hint type="sourcelabel">
<x>119</x>
<y>199</y>
</hint>
<hint type="destinationlabel">
<x>108</x>
<y>151</y>
</hint>
</hints>
</connection>
<connection>
<sender>mrRollMixLevel</sender>
<signal>valueChanged(int)</signal>
<receiver>label_43</receiver>
<slot>setNum(int)</slot>
<hints>
<hint type="sourcelabel">
<x>39</x>
<y>217</y>
</hint>
<hint type="destinationlabel">
<x>43</x>
<y>149</y>
</hint>
</hints>
</connection>

View File

@ -335,6 +335,27 @@ void ConfigAirframeWidget::requestAircraftUpdate()
field = obj->getField(QString("VTOLMotorW"));
Q_ASSERT(field);
m_aircraft->multiMotor4->setCurrentIndex(m_aircraft->multiMotor4->findText(field->getValue().toString()));
// Now, read the 1st mixer R/P/Y levels and initialize the mix sliders.
// This assumes that all vectors are identical - if not, the user should use the
// "custom" setting.
obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
Q_ASSERT(obj);
int eng= m_aircraft->multiMotor1->currentIndex()-1;
// eng will be -1 if value is set to "None"
if (eng > -1) {
field = obj->getField(mixerVectors.at(eng));
int i = field->getElementNames().indexOf("Pitch");
double val = field->getDouble(i)/1.27;
m_aircraft->mrPitchMixLevel->setValue(val);
i = field->getElementNames().indexOf("Yaw");
val = (1-field->getDouble(i)/1.27);
m_aircraft->mrYawMixLevel->setValue(val);
eng = m_aircraft->multiMotor2->currentIndex()-1;
field = obj->getField(mixerVectors.at(eng));
i = field->getElementNames().indexOf("Roll");
val = -field->getDouble(i)/1.27;
m_aircraft->mrRollMixLevel->setValue(val);
}
} else if (frameType == "QuadX") {
// Motors 1/2/3/4 are: NW / NE / SE / SW
field = obj->getField(QString("VTOLMotorNW"));
@ -349,7 +370,26 @@ void ConfigAirframeWidget::requestAircraftUpdate()
field = obj->getField(QString("VTOLMotorSW"));
Q_ASSERT(field);
m_aircraft->multiMotor4->setCurrentIndex(m_aircraft->multiMotor4->findText(field->getValue().toString()));
// Now, read the 1st mixer R/P/Y levels and initialize the mix sliders.
// This assumes that all vectors are identical - if not, the user should use the
// "custom" setting.
obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
Q_ASSERT(obj);
int eng= m_aircraft->multiMotor1->currentIndex()-1;
// eng will be -1 if value is set to "None"
if (eng > -1) {
field = obj->getField(mixerVectors.at(eng));
int i = field->getElementNames().indexOf("Pitch");
double val = field->getDouble(i)/1.27;
m_aircraft->mrPitchMixLevel->setValue(val);
i = field->getElementNames().indexOf("Yaw");
val = 1-field->getDouble(i)/1.27;
m_aircraft->mrYawMixLevel->setValue(val);
i = field->getElementNames().indexOf("Roll");
val = field->getDouble(i)/1.27;
m_aircraft->mrRollMixLevel->setValue(val);
}
} else if (frameType == "Hexa") {
// Motors 1/2/3 4/5/6 are: NW / N / NE and SE / S / SW
field = obj->getField(QString("VTOLMotorNW"));
@ -488,6 +528,9 @@ void ConfigAirframeWidget::setupAirframeUI(QString frameType)
m_aircraft->multiMotor6->setEnabled(false);
m_aircraft->multiMotor7->setEnabled(false);
m_aircraft->multiMotor8->setEnabled(false);
m_aircraft->mrRollMixLevel->setValue(50);
m_aircraft->mrPitchMixLevel->setValue(50);
m_aircraft->mrYawMixLevel->setValue(50);
} else if (frameType == "QuadP" || frameType == "Quad +") {
m_aircraft->aircraftType->setCurrentIndex(m_aircraft->aircraftType->findText("Multirotor"));
m_aircraft->multirotorFrameType->setCurrentIndex(m_aircraft->multirotorFrameType->findText("Quad +"));
@ -498,6 +541,9 @@ void ConfigAirframeWidget::setupAirframeUI(QString frameType)
m_aircraft->multiMotor6->setEnabled(false);
m_aircraft->multiMotor7->setEnabled(false);
m_aircraft->multiMotor8->setEnabled(false);
m_aircraft->mrRollMixLevel->setValue(100);
m_aircraft->mrPitchMixLevel->setValue(100);
m_aircraft->mrYawMixLevel->setValue(50);
} else if (frameType == "Hexa" || frameType == "Hexacopter") {
m_aircraft->aircraftType->setCurrentIndex(m_aircraft->aircraftType->findText("Multirotor"));
m_aircraft->multirotorFrameType->setCurrentIndex(m_aircraft->multirotorFrameType->findText("Hexacopter"));
@ -979,18 +1025,21 @@ bool ConfigAirframeWidget::setupQuad(bool pLayout)
// {0 ,-1 ,0.5 //Right motor(CCW)
// {-1 ,0 ,-0.5 //Rear motor (CW)
// {0 ,1 ,0.5 //Left motor (CCW)
double pFactor = (double)m_aircraft->mrPitchMixLevel->value()/100;
double rFactor = (double)m_aircraft->mrRollMixLevel->value()/100;
double yFactor = (double)m_aircraft->mrYawMixLevel->value()/100;
int channel = m_aircraft->multiMotor1->currentIndex()-1;
pLayout ? setupQuadMotor(channel, 1, 0, -0.5)
: setupQuadMotor(channel, 0.5, 0.5, -0.5);
pLayout ? setupQuadMotor(channel, pFactor, 0, -yFactor)
: setupQuadMotor(channel, pFactor, rFactor, -yFactor);
channel = m_aircraft->multiMotor2->currentIndex()-1;
pLayout ? setupQuadMotor(channel, 0, -1, 0.5)
: setupQuadMotor(channel, 0.5, -0.5, 0.5);
pLayout ? setupQuadMotor(channel, 0, -rFactor, yFactor)
: setupQuadMotor(channel, pFactor, -rFactor, yFactor);
channel = m_aircraft->multiMotor3->currentIndex()-1;
pLayout ? setupQuadMotor(channel, -1, 0, -0.5)
: setupQuadMotor(channel, -0.5, -0.5, -0.5);
pLayout ? setupQuadMotor(channel, -pFactor, 0, -yFactor)
: setupQuadMotor(channel, -pFactor, -rFactor, -yFactor);
channel = m_aircraft->multiMotor4->currentIndex()-1;
pLayout ? setupQuadMotor(channel, 0, 1, 0.5)
: setupQuadMotor(channel, -0.5, 0.5, 0.5);
pLayout ? setupQuadMotor(channel, 0, rFactor, yFactor)
: setupQuadMotor(channel, -pFactor, rFactor, yFactor);
obj->updated();
m_aircraft->mrStatusLabel->setText("SUCCESS: Mixer Saved OK");