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

OP-38 Experimental AHRS automated calibration widget, for testing purpose only. Does not save to SD, and wait 10 seconds before hitting "Save" once the button becomes enabled.

git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@1410 ebee16cc-31ac-478f-84a7-5cbb03baadba
This commit is contained in:
edouard 2010-08-25 22:54:32 +00:00 committed by edouard
parent d71ade8227
commit 86bef7b96b
5 changed files with 237 additions and 57 deletions

View File

@ -37,6 +37,11 @@
<height>141</height> <height>141</height>
</rect> </rect>
</property> </property>
<property name="toolTip">
<string>These are the sensor variance values computed by the AHRS.
Tip: lower is better!</string>
</property>
<property name="verticalScrollBarPolicy"> <property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum> <enum>Qt::ScrollBarAlwaysOff</enum>
</property> </property>
@ -49,40 +54,32 @@
<rect> <rect>
<x>390</x> <x>390</x>
<y>90</y> <y>90</y>
<width>301</width> <width>231</width>
<height>17</height> <height>17</height>
</rect> </rect>
</property> </property>
<property name="text"> <property name="text">
<string>Instructions......................</string> <string>Press &quot;Start&quot; above to calibrate.</string>
</property> </property>
</widget> </widget>
<widget class="QPushButton" name="ahrsCalibStart"> <widget class="QPushButton" name="ahrsCalibStart">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>400</x> <x>380</x>
<y>30</y> <y>40</y>
<width>93</width> <width>93</width>
<height>27</height> <height>27</height>
</rect> </rect>
</property> </property>
<property name="toolTip">
<string>Press to start a calibration procedure.
Takes about 10 seconds.</string>
</property>
<property name="text"> <property name="text">
<string>Start</string> <string>Start</string>
</property> </property>
</widget> </widget>
<widget class="QPushButton" name="pushButton_2">
<property name="geometry">
<rect>
<x>540</x>
<y>30</y>
<width>93</width>
<height>27</height>
</rect>
</property>
<property name="text">
<string>Cancel</string>
</property>
</widget>
<widget class="Line" name="line"> <widget class="Line" name="line">
<property name="geometry"> <property name="geometry">
<rect> <rect>
@ -269,6 +266,35 @@
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
</widget> </widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>380</x>
<y>10</y>
<width>151</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>Sensors calibration</string>
</property>
</widget>
<widget class="QPushButton" name="ahrsCalibSave">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>500</x>
<y>40</y>
<width>93</width>
<height>27</height>
</rect>
</property>
<property name="text">
<string>Save</string>
</property>
</widget>
</widget> </widget>
</widget> </widget>
<resources/> <resources/>

View File

@ -26,6 +26,7 @@
*/ */
#include "configahrswidget.h" #include "configahrswidget.h"
#include "math.h"
#include <QDebug> #include <QDebug>
#include <QTimer> #include <QTimer>
#include <QStringList> #include <QStringList>
@ -56,8 +57,11 @@ ConfigAHRSWidget::ConfigAHRSWidget(QWidget *parent) : ConfigTaskWidget(parent)
// Initialize the 9 bargraph values: // Initialize the 9 bargraph values:
QMatrix lineMatrix = renderer->matrixForElement("accel_x"); QMatrix lineMatrix = renderer->matrixForElement("accel_x");
qreal startX = lineMatrix.mapRect(renderer->boundsOnElement("accel_x")).x(); QRectF rect = lineMatrix.mapRect(renderer->boundsOnElement("accel_x"));
qreal startY = lineMatrix.mapRect(renderer->boundsOnElement("accel_x")).y(); qreal startX = rect.x();
qreal startY = rect.y()+ rect.height();
// maxBarHeight will be used for scaling it later.
maxBarHeight = rect.height();
// Then once we have the initial location, we can put it // Then once we have the initial location, we can put it
// into a QGraphicsSvgItem which we will display at the same // into a QGraphicsSvgItem which we will display at the same
// place: we do this so that the heading scale can be clipped to // place: we do this so that the heading scale can be clipped to
@ -66,31 +70,97 @@ ConfigAHRSWidget::ConfigAHRSWidget(QWidget *parent) : ConfigTaskWidget(parent)
accel_x->setSharedRenderer(renderer); accel_x->setSharedRenderer(renderer);
accel_x->setElementId("accel_x"); accel_x->setElementId("accel_x");
m_ahrs->ahrsBargraph->scene()->addItem(accel_x); m_ahrs->ahrsBargraph->scene()->addItem(accel_x);
QTransform matrix; accel_x->setPos(startX, startY);
matrix.translate(startX,startY); accel_x->setTransform(QTransform::fromScale(1,0),true);
accel_x->setTransform(matrix,false);
lineMatrix = renderer->matrixForElement("accel_y"); lineMatrix = renderer->matrixForElement("accel_y");
startX = lineMatrix.mapRect(renderer->boundsOnElement("accel_y")).x(); rect = lineMatrix.mapRect(renderer->boundsOnElement("accel_y"));
startY = lineMatrix.mapRect(renderer->boundsOnElement("accel_y")).y(); startX = rect.x();
startY = rect.y()+ rect.height();
accel_y = new QGraphicsSvgItem(); accel_y = new QGraphicsSvgItem();
accel_y->setSharedRenderer(renderer); accel_y->setSharedRenderer(renderer);
accel_y->setElementId("accel_y"); accel_y->setElementId("accel_y");
m_ahrs->ahrsBargraph->scene()->addItem(accel_y); m_ahrs->ahrsBargraph->scene()->addItem(accel_y);
matrix.reset(); accel_y->setPos(startX,startY);
matrix.translate(startX,startY); accel_y->setTransform(QTransform::fromScale(1,0),true);
accel_y->setTransform(matrix,false);
lineMatrix = renderer->matrixForElement("accel_z"); lineMatrix = renderer->matrixForElement("accel_z");
startX = lineMatrix.mapRect(renderer->boundsOnElement("accel_z")).x(); rect = lineMatrix.mapRect(renderer->boundsOnElement("accel_z"));
startY = lineMatrix.mapRect(renderer->boundsOnElement("accel_z")).y(); startX = rect.x();
startY = rect.y()+ rect.height();
accel_z = new QGraphicsSvgItem(); accel_z = new QGraphicsSvgItem();
accel_z->setSharedRenderer(renderer); accel_z->setSharedRenderer(renderer);
accel_z->setElementId("accel_z"); accel_z->setElementId("accel_z");
m_ahrs->ahrsBargraph->scene()->addItem(accel_z); m_ahrs->ahrsBargraph->scene()->addItem(accel_z);
matrix.reset(); accel_z->setPos(startX,startY);
matrix.translate(startX,startY); accel_z->setTransform(QTransform::fromScale(1,0),true);
accel_z->setTransform(matrix,false);
lineMatrix = renderer->matrixForElement("gyro_x");
rect = lineMatrix.mapRect(renderer->boundsOnElement("gyro_x"));
startX = rect.x();
startY = rect.y()+ rect.height();
gyro_x = new QGraphicsSvgItem();
gyro_x->setSharedRenderer(renderer);
gyro_x->setElementId("gyro_x");
m_ahrs->ahrsBargraph->scene()->addItem(gyro_x);
gyro_x->setPos(startX,startY);
gyro_x->setTransform(QTransform::fromScale(1,0),true);
lineMatrix = renderer->matrixForElement("gyro_y");
rect = lineMatrix.mapRect(renderer->boundsOnElement("gyro_y"));
startX = rect.x();
startY = rect.y()+ rect.height();
gyro_y = new QGraphicsSvgItem();
gyro_y->setSharedRenderer(renderer);
gyro_y->setElementId("gyro_y");
m_ahrs->ahrsBargraph->scene()->addItem(gyro_y);
gyro_y->setPos(startX,startY);
gyro_y->setTransform(QTransform::fromScale(1,0),true);
lineMatrix = renderer->matrixForElement("gyro_z");
rect = lineMatrix.mapRect(renderer->boundsOnElement("gyro_z"));
startX = rect.x();
startY = rect.y()+ rect.height();
gyro_z = new QGraphicsSvgItem();
gyro_z->setSharedRenderer(renderer);
gyro_z->setElementId("gyro_z");
m_ahrs->ahrsBargraph->scene()->addItem(gyro_z);
gyro_z->setPos(startX,startY);
gyro_z->setTransform(QTransform::fromScale(1,0),true);
lineMatrix = renderer->matrixForElement("mag_x");
rect = lineMatrix.mapRect(renderer->boundsOnElement("mag_x"));
startX = rect.x();
startY = rect.y()+ rect.height();
mag_x = new QGraphicsSvgItem();
mag_x->setSharedRenderer(renderer);
mag_x->setElementId("mag_x");
m_ahrs->ahrsBargraph->scene()->addItem(mag_x);
mag_x->setPos(startX,startY);
mag_x->setTransform(QTransform::fromScale(1,0),true);
lineMatrix = renderer->matrixForElement("mag_y");
rect = lineMatrix.mapRect(renderer->boundsOnElement("mag_y"));
startX = rect.x();
startY = rect.y()+ rect.height();
mag_y = new QGraphicsSvgItem();
mag_y->setSharedRenderer(renderer);
mag_y->setElementId("mag_y");
m_ahrs->ahrsBargraph->scene()->addItem(mag_y);
mag_y->setPos(startX,startY);
mag_y->setTransform(QTransform::fromScale(1,0),true);
lineMatrix = renderer->matrixForElement("mag_z");
rect = lineMatrix.mapRect(renderer->boundsOnElement("mag_z"));
startX = rect.x();
startY = rect.y()+ rect.height();
mag_z = new QGraphicsSvgItem();
mag_z->setSharedRenderer(renderer);
mag_z->setElementId("mag_z");
m_ahrs->ahrsBargraph->scene()->addItem(mag_z);
mag_z->setPos(startX,startY);
mag_z->setTransform(QTransform::fromScale(1,0),true);
@ -105,6 +175,7 @@ ConfigAHRSWidget::ConfigAHRSWidget(QWidget *parent) : ConfigTaskWidget(parent)
// Connect the signals // Connect the signals
connect(m_ahrs->ahrsCalibStart, SIGNAL(clicked()), this, SLOT(launchAHRSCalibration())); connect(m_ahrs->ahrsCalibStart, SIGNAL(clicked()), this, SLOT(launchAHRSCalibration()));
connect(m_ahrs->ahrsCalibSave, SIGNAL(clicked()), this, SLOT(saveAHRSCalibration()));
} }
@ -126,6 +197,7 @@ void ConfigAHRSWidget::launchAHRSCalibration()
{ {
m_ahrs->calibInstructions->setText("Calibration launched..."); m_ahrs->calibInstructions->setText("Calibration launched...");
m_ahrs->ahrsCalibStart->setEnabled(false); m_ahrs->ahrsCalibStart->setEnabled(false);
m_ahrs->ahrsCalibSave->setEnabled(false);
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>(); UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
@ -138,18 +210,90 @@ void ConfigAHRSWidget::launchAHRSCalibration()
waitabit->setSingleShot(true); waitabit->setSingleShot(true);
waitabit->start(15000); waitabit->start(15000);
connect(waitabit, SIGNAL(timeout()), this, SLOT(calibPhase2())); connect(waitabit, SIGNAL(timeout()), this, SLOT(calibPhase2()));
phaseCounter = 0;
} }
/**
Callback after 15 seconds once calibration is done on the board.
Currently we don't have a way to tell if calibration is finished, so we
have to use a timer.
*/
void ConfigAHRSWidget::calibPhase2() void ConfigAHRSWidget::calibPhase2()
{ {
m_ahrs->calibInstructions->setText("Confirming settings..."); ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
UAVObject *obj = dynamic_cast<UAVDataObject*>(objManager->getObject(QString("AHRSCalibration")));
// Now update size of all the graphs in log scale // This is a bit weird, but it is because we are expecting an update from the
// 'log(1/val)' // OP board with the correct calibration values, and those only arrive on the object update
// which comes back from the board, and not the first object update signal which is in fast
// the object update we did ourselves... Clear ?
switch (phaseCounter) {
case 0:
phaseCounter++;
m_ahrs->calibInstructions->setText("Getting results...");
connect(obj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(calibPhase2()));
obj->updated();
break;
case 1: // this is where we end up with the update just above
phaseCounter++;
break;
case 2: // This is the update with the right values
disconnect(obj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(calibPhase2()));
// Now update size of all the graphs
// I have not found a way to do this elegantly...
UAVObjectField *field = obj->getField(QString("accel_var"));
// The expected range is from 1E-6 to 1E-1
double steps = 6; // 6 bars on the graph
float accel_x_var = -1/steps*(1+steps+log10(field->getValue(0).toFloat()));
accel_x->setTransform(QTransform::fromScale(1,accel_x_var),false);
float accel_y_var = -1/steps*(1+steps+log10(field->getValue(1).toFloat()));
accel_y->setTransform(QTransform::fromScale(1,accel_y_var),false);
float accel_z_var = -1/steps*(1+steps+log10(field->getValue(2).toFloat()));
accel_z->setTransform(QTransform::fromScale(1,accel_z_var),false);
field = obj->getField(QString("gyro_var"));
float gyro_x_var = -1/steps*(1+steps+log10(field->getValue(0).toFloat()));
gyro_x->setTransform(QTransform::fromScale(1,gyro_x_var),false);
float gyro_y_var = -1/steps*(1+steps+log10(field->getValue(1).toFloat()));
gyro_y->setTransform(QTransform::fromScale(1,gyro_y_var),false);
float gyro_z_var = -1/steps*(1+steps+log10(field->getValue(2).toFloat()));
gyro_z->setTransform(QTransform::fromScale(1,gyro_z_var),false);
field = obj->getField(QString("mag_var"));
float mag_x_var = -1/steps*(1+steps+log10(field->getValue(0).toFloat()));
mag_x->setTransform(QTransform::fromScale(1,mag_x_var),false);
float mag_y_var = -1/steps*(1+steps+log10(field->getValue(1).toFloat()));
mag_y->setTransform(QTransform::fromScale(1,mag_y_var),false);
float mag_z_var = -1/steps*(1+steps+log10(field->getValue(2).toFloat()));
mag_z->setTransform(QTransform::fromScale(1,mag_z_var),false);
m_ahrs->ahrsCalibStart->setEnabled(true); m_ahrs->ahrsCalibStart->setEnabled(true);
m_ahrs->ahrsCalibSave->setEnabled(true);
break;
}
}
/**
Saves the AHRS sensors calibration
*/
void ConfigAHRSWidget::saveAHRSCalibration()
{
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
UAVObject *obj = dynamic_cast<UAVDataObject*>(objManager->getObject(QString("AHRSCalibration")));
UAVObjectField *field = obj->getField(QString("measure_var"));
field->setValue("FALSE");
obj->updated();
} }

View File

@ -52,9 +52,19 @@ private:
QGraphicsSvgItem *accel_x; QGraphicsSvgItem *accel_x;
QGraphicsSvgItem *accel_y; QGraphicsSvgItem *accel_y;
QGraphicsSvgItem *accel_z; QGraphicsSvgItem *accel_z;
QGraphicsSvgItem *gyro_x;
QGraphicsSvgItem *gyro_y;
QGraphicsSvgItem *gyro_z;
QGraphicsSvgItem *mag_x;
QGraphicsSvgItem *mag_y;
QGraphicsSvgItem *mag_z;
double maxBarHeight;
int phaseCounter;
const static double maxVarValue = 0.1;
private slots: private slots:
void launchAHRSCalibration(); void launchAHRSCalibration();
void saveAHRSCalibration();
void calibPhase2(); void calibPhase2();
protected: protected:

View File

@ -235,7 +235,7 @@ void ConfigServoWidget::requestRCOutputUpdate()
obj->requestUpdate(); obj->requestUpdate();
QList<UAVObjectField*> fieldList = obj->getFields(); QList<UAVObjectField*> fieldList = obj->getFields();
foreach (UAVObjectField* field, fieldList) { foreach (UAVObjectField* field, fieldList) {
if (!field->getName().contains("Channel")) { if (field->getUnits().contains("channel")) {
assignOutputChannel(obj,field,field->getName()); assignOutputChannel(obj,field,field->getName());
} }
} }

View File

@ -288,7 +288,7 @@
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:zoom="0.98994949" inkscape:zoom="0.98994949"
inkscape:cx="334.4393" inkscape:cx="334.4393"
inkscape:cy="152.4432" inkscape:cy="117.47189"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:current-layer="background" inkscape:current-layer="background"
showgrid="false" showgrid="false"
@ -333,7 +333,7 @@
<rect <rect
style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:9.4025631;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:9.4025631;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
id="rect6737" id="rect6737"
width="687.74054" width="683.69995"
height="354.43222" height="354.43222"
x="187.97757" x="187.97757"
y="-563.36774" y="-563.36774"
@ -353,28 +353,28 @@
inkscape:export-ydpi="88.809998" inkscape:export-ydpi="88.809998"
rx="3.1741481" /> rx="3.1741481" />
<path <path
style="fill:none;stroke:#000000;stroke-width:1.17532039px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Lstart);marker-end:url(#Arrow1Lend)" style="fill:none;stroke:#000000;stroke-width:1.17532039000000021px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-end:none"
d="m 537.38036,217.29216 -294.4803,0 0,614.17274" d="m 537.38036,217.29216 -294.4803,0 0,614.17274"
id="path5991" /> id="path5991" />
<path <path
style="fill:none;stroke:#000000;stroke-width:1.17532039;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.17532035, 3.52596104;stroke-dashoffset:0" style="fill:none;stroke:#000000;stroke-width:1.17532039;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.17532035, 3.52596104;stroke-dashoffset:0"
d="m 281.83723,219.31246 0,602.05092" d="m 285.2717,219.31246 0,602.05092"
id="path6633" /> id="path6633" />
<path <path
id="path6635" id="path6635"
d="m 324.63724,219.31246 0,602.05092" d="m 327.3848,219.31246 0,602.05092"
style="fill:none;stroke:#000000;stroke-width:1.17532039;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.17532035, 3.52596104;stroke-dashoffset:0" /> style="fill:none;stroke:#000000;stroke-width:1.17532039;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.17532035, 3.52596104;stroke-dashoffset:0" />
<path <path
style="fill:none;stroke:#000000;stroke-width:1.17532039;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.17532035, 3.52596104;stroke-dashoffset:0" style="fill:none;stroke:#000000;stroke-width:1.17532039;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.17532035, 3.52596104;stroke-dashoffset:0"
d="m 367.43724,219.31246 0,602.05092" d="m 369.49791,219.31246 0,602.05092"
id="path6637" /> id="path6637" />
<path <path
id="path6639" id="path6639"
d="m 410.23724,219.31246 0,602.05092" d="m 411.61102,219.31246 0,602.05092"
style="fill:none;stroke:#000000;stroke-width:1.17532039;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.17532035, 3.52596104;stroke-dashoffset:0" /> style="fill:none;stroke:#000000;stroke-width:1.17532039;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.17532035, 3.52596104;stroke-dashoffset:0" />
<path <path
style="fill:none;stroke:#000000;stroke-width:1.17532039;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.17532035, 3.52596104;stroke-dashoffset:0" style="fill:none;stroke:#000000;stroke-width:1.17532039;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.17532035, 3.52596104;stroke-dashoffset:0"
d="m 453.03722,219.31246 0,602.05092" d="m 453.72413,219.31246 0,602.05092"
id="path6641" /> id="path6641" />
<path <path
id="path6643" id="path6643"
@ -382,7 +382,7 @@
style="fill:none;stroke:#000000;stroke-width:1.17532039;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.17532035, 3.52596104;stroke-dashoffset:0" /> style="fill:none;stroke:#000000;stroke-width:1.17532039;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.17532035, 3.52596104;stroke-dashoffset:0" />
<text <text
xml:space="preserve" xml:space="preserve"
style="font-size:21.98640251px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" style="font-size:21.98640251px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
x="808.37286" x="808.37286"
y="-500.03018" y="-500.03018"
id="text6659" id="text6659"
@ -396,7 +396,7 @@
id="text6667" id="text6667"
y="-458.03018" y="-458.03018"
x="808.37286" x="808.37286"
style="font-size:21.98640251px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" style="font-size:21.98640251px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
xml:space="preserve"><tspan xml:space="preserve"><tspan
id="tspan6669" id="tspan6669"
y="-458.03018" y="-458.03018"
@ -404,7 +404,7 @@
sodipodi:role="line">1E-2</tspan></text> sodipodi:role="line">1E-2</tspan></text>
<text <text
xml:space="preserve" xml:space="preserve"
style="font-size:21.98640251px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" style="font-size:21.98640251px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
x="808.37286" x="808.37286"
y="-418.03018" y="-418.03018"
id="text6671" id="text6671"
@ -418,7 +418,7 @@
id="text6675" id="text6675"
y="-374.03018" y="-374.03018"
x="808.37286" x="808.37286"
style="font-size:21.98640251px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" style="font-size:21.98640251px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
xml:space="preserve"><tspan xml:space="preserve"><tspan
id="tspan6677" id="tspan6677"
y="-374.03018" y="-374.03018"
@ -426,7 +426,7 @@
sodipodi:role="line">1E-4</tspan></text> sodipodi:role="line">1E-4</tspan></text>
<text <text
xml:space="preserve" xml:space="preserve"
style="font-size:21.98640251px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" style="font-size:21.98640251px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
x="808.37286" x="808.37286"
y="-330.03018" y="-330.03018"
id="text6679" id="text6679"
@ -440,7 +440,7 @@
id="text6683" id="text6683"
y="-288.03018" y="-288.03018"
x="808.37286" x="808.37286"
style="font-size:21.98640251px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" style="font-size:21.98640251px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
xml:space="preserve"><tspan xml:space="preserve"><tspan
id="tspan6685" id="tspan6685"
y="-288.03018" y="-288.03018"
@ -460,7 +460,7 @@
id="path6707" /> id="path6707" />
<text <text
xml:space="preserve" xml:space="preserve"
style="font-size:47.01281357px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans" style="font-size:47.01281356999999161px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
x="355.29535" x="355.29535"
y="-449.45621" y="-449.45621"
id="text6755" id="text6755"
@ -469,10 +469,10 @@
id="tspan6757" id="tspan6757"
x="355.29535" x="355.29535"
y="-449.45621" y="-449.45621"
style="font-size:23.50640678px">Accel</tspan></text> style="font-size:23.50640677999999895px;fill:#ffffff;fill-opacity:1">Accel</tspan></text>
<text <text
xml:space="preserve" xml:space="preserve"
style="font-size:47.01281357px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans" style="font-size:47.01281356999999161px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
x="573.94739" x="573.94739"
y="-451.94113" y="-451.94113"
id="text6759" id="text6759"
@ -481,10 +481,10 @@
id="tspan6761" id="tspan6761"
x="573.94739" x="573.94739"
y="-451.94113" y="-451.94113"
style="font-size:23.50640678px">Gyro</tspan></text> style="font-size:23.50640677999999895px;fill:#ffffff;fill-opacity:1">Gyro</tspan></text>
<text <text
xml:space="preserve" xml:space="preserve"
style="font-size:47.01281357px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans" style="font-size:47.01281356999999161px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
x="797.87463" x="797.87463"
y="-452.0961" y="-452.0961"
id="text6763" id="text6763"
@ -493,7 +493,7 @@
id="tspan6765" id="tspan6765"
x="797.87463" x="797.87463"
y="-452.0961" y="-452.0961"
style="font-size:23.50640678px">Mag</tspan></text> style="font-size:23.50640677999999895px;fill:#ffffff;fill-opacity:1">Mag</tspan></text>
</g> </g>
</g> </g>
<g <g

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB