diff --git a/images/earth.html b/images/earth.html index 02827db1b9b36281b6824f57f24008a4e0cdac02..afa5fce015167f56d4eabacff0100cd7f5c9807c 100644 --- a/images/earth.html +++ b/images/earth.html @@ -23,12 +23,17 @@ var lastAlt = 0; var currLat = 47.3769; var currLon = 8.549444; var currAlt = 470; + +var currentCameraLatitude = 0; +var currentCameraLongitude = 0; +var currentCameraAltitude = 0; + var currFollowHeading = 0.0; var homeLat = 0; var homeLon = 0; var homeAlt = 0; -var homeViewRange = 500; +var homeViewRange = 800; var homeLocation = null; var homeGroundLevel = 0; @@ -85,6 +90,8 @@ var newWaypointLongitude = 0; var newWaypointAltitude = 0; var newWaypointPending = false; +var clickMode = 0; + var homePlacemark = null; function getGlobal(variable) @@ -107,6 +114,28 @@ function setDraggingAllowed(allowed) draggingAllowed = allowed; } +function sampleCurrentPosition() +{ + var thisView = ge.getView().copyAsLookAt(ge.ALTITUDE_ABSOLUTE); + currentCameraLatitude = thisView.getLatitude(); + currentCameraLongitude = thisView.getLongitude(); + currentCameraGroundAltitude = ge.getGlobe().getGroundAltitude(currentCameraLatitude, currentCameraLongitude); +} + +function enableSetHomeMode() +{ + clickMode = 1; +} + +function setLookAtLatLon(lat, lon) +{ + // Keep the current altitude above ground, just move the position + currView = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND); + currView.setLatitude(lat); + currView.setLongitude(lon); + ge.getView().setAbstractView(currView); +} + function setNewWaypointPending(pending) { newWaypointPending = pending; @@ -140,16 +169,35 @@ function enableEventListener() // listen for mousedown on the window (look specifically for point placemarks) google.earth.addEventListener(ge.getWindow(), 'mousedown', function(event) { +if (clickMode == 1) + { + // Set home mode + dragWaypointIndex = 'HOME'; + document.getElementById('JScript_dragWaypointIndex').setAttribute('value',dragWaypointIndex); + dragWaypointLatitude = event.getLatitude(); + dragWaypointLongitude = event.getLongitude(); + dragWaypointAltitude = ge.getGlobe().getGroundAltitude(dragWaypointLatitude, dragWaypointLongitude); + dragWaypointPending = true; + document.getElementById('JScript_dragWaypointLatitude').setAttribute('value',dragWaypointLatitude); + document.getElementById('JScript_dragWaypointLongitude').setAttribute('value',dragWaypointLongitude); + document.getElementById('JScript_dragWaypointAltitude').setAttribute('value',dragWaypointAltitude); + document.getElementById('JScript_dragWaypointPending').setAttribute('value',true); + setGCSHome(dragWaypointLatitude, dragWaypointLongitude, dragWaypointAltitude); +} + if (event.getTarget().getType() == 'KmlPlacemark' && event.getTarget().getGeometry().getType() == 'KmlPoint') { var placemark = event.getTarget(); event.preventDefault(); if (draggingAllowed) { + if (clickMode == 0) + { dragInfo = { placemark: event.getTarget(), dragged: false }; + } } } }); @@ -157,7 +205,7 @@ google.earth.addEventListener(ge.getWindow(), 'mousedown', function(event) // listen for mousemove on the globe google.earth.addEventListener(ge.getGlobe(), 'mousemove', function(event) { - if (draggingAllowed) + if (draggingAllowed && (clickMode == 0)) { if (dragInfo) { event.preventDefault(); @@ -182,7 +230,7 @@ google.earth.addEventListener(ge.getGlobe(), 'mousemove', function(event) // listen for mouseup on the window google.earth.addEventListener(ge.getWindow(), 'mouseup', function(event) { - if (draggingAllowed) + if (draggingAllowed && (clickMode == 0)) { if (dragInfo) { if (dragInfo.dragged) @@ -206,6 +254,7 @@ google.earth.addEventListener(ge.getWindow(), 'mouseup', function(event) dragInfo = null; } } + clickMode = 0; }); // Listen for wp creation request on the globe @@ -235,6 +284,9 @@ function setCurrAircraft(id) function setGCSHome(lat, lon, alt) { + // Only update if position actually changed + if (lat != homeLat || lon != homeLon || alt != homeAlt) + { homeLat = lat; homeLon = lon; homeAlt = alt; @@ -265,12 +317,15 @@ function setGCSHome(lat, lon, alt) } else { - var location = ge.createPoint(''); - location.setLatitude(lat); - location.setLongitude(lon); - location.setAltitude(alt); - homePlacemark.setGeometry(location); - homePlacemark.setDescription('HOME'); + var location = ge.createPoint(''); + if (location.getLatitude() != lat || location.getLongitude() != lon || location.getAltitude() != alt) + { + location.setLatitude(lat); + location.setLongitude(lon); + location.setAltitude(alt); + homePlacemark.setGeometry(location); + homePlacemark.setDescription('HOME'); + } } homeGroundLevel = ge.getGlobe().getGroundAltitude(lat,lon); @@ -278,6 +333,7 @@ function setGCSHome(lat, lon, alt) { homeGroundLevel = alt; } + } } function updateWaypointListLength(id, len) @@ -560,14 +616,8 @@ function setViewMode(mode) { lastTilt = currView.getTilt(); lastHeading = currView.getHeading(); - //var lastLat2 = currView.getLatitude(); - //var lastLon2 = currView.getLongitude(); - //var lastAlt2 = currView.getAltitude(); currView.setTilt(0); currView.setHeading(0); - //currView.setLatitude(lastLat2); - //currView.setLongitude(lastLon2); - //currView.setAltitude(lastAlt2); } viewMode = mode; @@ -628,5 +678,8 @@ function failureCallback(object) + + + diff --git a/src/uas/UAS.cc b/src/uas/UAS.cc index be1dba7d2a72845fd633e2e0bd50d904afa9ff6b..a16ac869895a8374852c7cff1a42e97f943b3ee4 100644 --- a/src/uas/UAS.cc +++ b/src/uas/UAS.cc @@ -1042,6 +1042,20 @@ void UAS::receiveMessage(LinkInterface* link, mavlink_message_t message) } } +void UAS::setHomePosition(double lat, double lon, double alt) +{ + // Send new home position to UAS + mavlink_gps_set_global_origin_t home; + home.target_system = uasId; + home.target_component = 0; // ALL components + home.latitude = lat*1E7; + home.longitude = lon*1E7; + home.altitude = alt*1000; + mavlink_message_t msg; + mavlink_msg_gps_set_global_origin_encode(mavlink->getSystemId(), mavlink->getComponentId(), &msg, &home); + sendMessage(msg); +} + void UAS::setLocalOriginAtCurrentGPSPosition() { @@ -1061,7 +1075,7 @@ void UAS::setLocalOriginAtCurrentGPSPosition() if (ret == QMessageBox::Yes) { mavlink_message_t msg; - mavlink_msg_action_pack(mavlink->getSystemId(), mavlink->getSystemId(), &msg, this->getUASID(), 0, MAV_ACTION_SET_ORIGIN); + mavlink_msg_action_pack(mavlink->getSystemId(), mavlink->getComponentId(), &msg, this->getUASID(), 0, MAV_ACTION_SET_ORIGIN); // Send message twice to increase chance that it reaches its goal sendMessage(msg); // Wait 5 ms diff --git a/src/uas/UAS.h b/src/uas/UAS.h index 008cbd6c5b97e32aec7f14dafc9b01bf0d87b9fd..a9e68cf2368d74e150329508b72e1d1d59c126c4 100644 --- a/src/uas/UAS.h +++ b/src/uas/UAS.h @@ -309,6 +309,8 @@ public slots: /** @brief Set world frame origin at current GPS position */ void setLocalOriginAtCurrentGPSPosition(); + /** @brief Set world frame origin / home position at this GPS position */ + void setHomePosition(double lat, double lon, double alt); /** @brief Set local position setpoint */ void setLocalPositionSetpoint(float x, float y, float z, float yaw); /** @brief Add an offset in body frame to the setpoint */ diff --git a/src/uas/UASInterface.h b/src/uas/UASInterface.h index 643a715a5fe0d7966161a825a0cd6a34c1a92b01..1b92baf0f391e8c86efe17abe285ffc3d7f47ac4 100644 --- a/src/uas/UASInterface.h +++ b/src/uas/UASInterface.h @@ -224,6 +224,8 @@ public slots: //virtual void clearWaypointList() = 0; /** @brief Set world frame origin at current GPS position */ virtual void setLocalOriginAtCurrentGPSPosition() = 0; + /** @brief Set world frame origin / home position at this GPS position */ + virtual void setHomePosition(double lat, double lon, double alt) = 0; /** @brief Request all onboard parameters of all components */ virtual void requestParameters() = 0; /** @brief Request one specific onboard parameter */ diff --git a/src/uas/UASManager.cc b/src/uas/UASManager.cc index 7ce41e847127c4aaf5530a78acbef897c0ad63bf..024301a9be57dbe29bbe4e6412624b1b8c7f1601 100644 --- a/src/uas/UASManager.cc +++ b/src/uas/UASManager.cc @@ -32,6 +32,7 @@ This file is part of the QGROUNDCONTROL project #include #include #include +#include #include "UAS.h" #include "UASInterface.h" #include "UASManager.h" @@ -50,19 +51,64 @@ UASManager* UASManager::instance() return _instance; } +void UASManager::storeSettings() +{ + QSettings settings; + settings.beginGroup("QGC_UASMANAGER"); + settings.setValue("HOMELAT", homeLat); + settings.setValue("HOMELON", homeLon); + settings.setValue("HOMEALT", homeAlt); + settings.endGroup(); + settings.sync(); +} + +void UASManager::loadSettings() +{ + QSettings settings; + settings.sync(); + settings.beginGroup("QGC_UASMANAGER"); + setHomePosition(settings.value("HOMELAT", homeLat).toDouble(), + settings.value("HOMELON", homeLon).toDouble(), + settings.value("HOMEALT", homeAlt).toDouble()); + settings.endGroup(); +} + +void UASManager::setHomePosition(double lat, double lon, double alt) +{ + // Checking for NaN and infitiny + if (lat == lat && lon == lon && alt == alt && !std::isinf(lat) && !std::isinf(lon) && !std::isinf(alt)) + { + bool changed = false; + if (homeLat != lat) changed = true; + if (homeLon != lon) changed = true; + if (homeAlt != alt) changed = true; + + homeLat = lat; + homeLon = lon; + homeAlt = alt; + + if (changed) emit homePositionChanged(homeLat, homeLon, homeAlt); + } +} + /** * @brief Private singleton constructor * * This class implements the singleton design pattern and has therefore only a private constructor. **/ UASManager::UASManager() : - activeUAS(NULL) + activeUAS(NULL), + homeLat(47.3769), + homeLon(8.549444), + homeAlt(470.0) { start(QThread::LowPriority); + loadSettings(); } UASManager::~UASManager() { + storeSettings(); // Delete all systems foreach (UASInterface* mav, systems) { @@ -99,6 +145,7 @@ void UASManager::addUAS(UASInterface* uas) { systems.append(uas); connect(uas, SIGNAL(destroyed(QObject*)), this, SLOT(removeUAS(QObject*))); + connect(this, SIGNAL(homePositionChanged(double,double,double)), uas, SLOT(setHomePosition(double,double,double))); emit UASCreated(uas); } diff --git a/src/uas/UASManager.h b/src/uas/UASManager.h index bbdc87c4f703b0dd68a895dc16105ef0eebdb3ee..ca8b517c6230691d3edb915b9859bbdfe6401af2 100644 --- a/src/uas/UASManager.h +++ b/src/uas/UASManager.h @@ -70,6 +70,12 @@ public: UASInterface* getUASForId(int id); QList getUASList(); + /** @brief Get home position latitude */ + double getHomeLatitude() const { return homeLat; } + /** @brief Get home position longitude */ + double getHomeLongitude() const { return homeLon; } + /** @brief Get home position altitude */ + double getHomeAltitude() const { return homeAlt; } public slots: @@ -162,12 +168,23 @@ public slots: /** @brief Shut down the onboard operating system down */ bool shutdownActiveUAS(); + /** @brief Set the current home position */ + void setHomePosition(double lat, double lon, double alt); + + /** @brief Load settings */ + void loadSettings(); + /** @brief Store settings */ + void storeSettings(); + protected: UASManager(); QList systems; UASInterface* activeUAS; QMutex activeUASMutex; + double homeLat; + double homeLon; + double homeAlt; signals: void UASCreated(UASInterface* UAS); @@ -181,6 +198,8 @@ signals: void activeUASStatusChanged(UASInterface* UAS, bool active); /** @brief The UAS currently under main operator control changed */ void activeUASStatusChanged(int systemId, bool active); + /** @brief Current home position changed */ + void homePositionChanged(double lat, double lon, double alt); }; diff --git a/src/ui/MainWindow.cc b/src/ui/MainWindow.cc index cfbee50af57d81c26c88a1035444eda4461b7c01..d8de6ca2cbd65cd6883e306a9b9ce8e0f5489fc5 100644 --- a/src/ui/MainWindow.cc +++ b/src/ui/MainWindow.cc @@ -939,6 +939,7 @@ void MainWindow::closeEvent(QCloseEvent *event) storeSettings(); aboutToCloseFlag = true; mavlink->storeSettings(); + UASManager::instance()->storeSettings(); QMainWindow::closeEvent(event); } diff --git a/src/ui/map3D/QGCGoogleEarthView.cc b/src/ui/map3D/QGCGoogleEarthView.cc index ed6afd88ee03d30316a8a50fcc0861ad86d18e55..2b2689251acbf152806a34d870df628854eb3dcf 100644 --- a/src/ui/map3D/QGCGoogleEarthView.cc +++ b/src/ui/map3D/QGCGoogleEarthView.cc @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -88,6 +89,8 @@ QGCGoogleEarthView::QGCGoogleEarthView(QWidget *parent) : connect(ui->clearTrailsButton, SIGNAL(clicked()), this, SLOT(clearTrails())); connect(ui->atmosphereCheckBox, SIGNAL(clicked(bool)), this, SLOT(enableAtmosphere(bool))); connect(ui->daylightCheckBox, SIGNAL(clicked(bool)), this, SLOT(enableDaylight(bool))); + + connect(UASManager::instance(), SIGNAL(homePositionChanged(double,double,double)), this, SLOT(setHome(double,double,double))); } QGCGoogleEarthView::~QGCGoogleEarthView() @@ -355,9 +358,43 @@ void QGCGoogleEarthView::goHome() void QGCGoogleEarthView::setHome(double lat, double lon, double alt) { + qDebug() << "SETTING GCS HOME IN GOOGLE MAPS" << lat << lon << alt; javaScript(QString("setGCSHome(%1,%2,%3);").arg(lat, 0, 'f', 15).arg(lon, 0, 'f', 15).arg(alt, 0, 'f', 15)); } +void QGCGoogleEarthView::setHome() +{ + javaScript(QString("enableSetHomeMode();")); +} + +void QGCGoogleEarthView::moveToPosition() +{ + bool ok; + javaScript("sampleCurrentPosition();"); + double latitude = documentElement("currentCameraLatitude").toDouble(); + double longitude = documentElement("currentCameraLongitude").toDouble(); + QString text = QInputDialog::getText(this, tr("Please enter coordinates"), + tr("Coordinates (Lat,Lon):"), QLineEdit::Normal, + QString("%1,%2").arg(latitude).arg(longitude), &ok); + if (ok && !text.isEmpty()) + { + QStringList split = text.split(","); + if (split.length() == 2) + { + bool convert; + double latitude = split.first().toDouble(&convert); + ok &= convert; + double longitude = split.last().toDouble(&convert); + ok &= convert; + + if (ok) + { + javaScript(QString("setLookAtLatLon(%1,%2);").arg(latitude, 0, 'f', 15).arg(longitude, 0, 'f', 15)); + } + } + } +} + void QGCGoogleEarthView::hideEvent(QHideEvent* event) { Q_UNUSED(event); @@ -441,80 +478,47 @@ QVariant QGCGoogleEarthView::documentElement(QString name) if(!jScriptInitialized) { qDebug() << "TOO EARLY JAVASCRIPT CALL, ABORTING"; - return QVariant(false); } else { -// QVariantList params; -// QString javaScript("getGlobal(%1)"); -// params.append(javaScript.arg(name)); -// params.append("JScript"); -// QVariant result = jScriptWin->dynamicCall("execScript(QString, QString)", params); -// qDebug() << "JScript result: " << result << result.toDouble(); - if (documentWin) - { - QString resultString; - - // Get HTMLElement object - QVariantList params; - IHTMLDocument3* doc; - documentWin->queryInterface( IID_IHTMLDocument3, (void**)&doc); - params.append(name); - IHTMLElement* element = NULL; - // Append alias - name.prepend("JScript_"); - HRESULT res = doc->getElementById(QStringToBSTR(name), &element); - //BSTR elemString; - if (element) - { - //element->get_innerHTML(&elemString); - VARIANT var; - var.vt = VT_BSTR; - HRESULT res = element->getAttribute(L"value", 0, &var); - if (SUCCEEDED(res) && (var.vt != VT_NULL)) - { - //VariantChangeType(&var, &var, 0, VT_BSTR); - //qDebug() << "GOT ATTRIBUTE"; - //_bstr_t bstrHello(var.bstrVal); // passing true means - // you should not call - // SysFreeString - - //qDebug() << "BSTR:" << LPCSTR(bstrHello); - } - else - { - qDebug() << "JAVASCRIPT ATTRIBUTE" << name << "NOT FOUND"; - } - QByteArray typeName; - QVariant qtValue = VARIANTToQVariant(var,typeName); - return qtValue; - - //element->toString(&elemString); - - //_bstr_t bstrHello(elemString, true); // passing true means - // you should not call - // SysFreeString - - //qDebug() << "BSTR:" << LPCSTR(bstrHello); - - //QAxObject* elementWin = new QAxObject(element, documentWin); - //if (elementWin) - //{ - // QVariant result = elementWin->dynamicCall("toString()"); - // qDebug() << "GOT RESULT" << result << result.toString(); - //} - //else - //{ - // qDebug() << "CREATING HTML ELEMENT FAILED"; - //} - } - else - { - qDebug() << "DID NOT GET HTML ELEMENT"; - } - return QVariant(0);//QVariant(result); - } + if (documentWin) + { + QString resultString; + + // Get HTMLElement object + QVariantList params; + IHTMLDocument3* doc; + documentWin->queryInterface( IID_IHTMLDocument3, (void**)&doc); + params.append(name); + IHTMLElement* element = NULL; + // Append alias + name.prepend("JScript_"); + HRESULT res = doc->getElementById(QStringToBSTR(name), &element); + //BSTR elemString; + if (element) + { + //element->get_innerHTML(&elemString); + VARIANT var; + var.vt = VT_BSTR; + HRESULT res = element->getAttribute(L"value", 0, &var); + if (SUCCEEDED(res) && (var.vt != VT_NULL)) + { + QByteArray typeName; + QVariant qtValue = VARIANTToQVariant(var,typeName); + return qtValue; + } + else + { + qDebug() << __FILE__ << __LINE__ << "JAVASCRIPT ATTRIBUTE" << name << "NOT FOUND"; + } + } + else + { + qDebug() << __FILE__ << __LINE__ << "DID NOT GET HTML ELEMENT" << name; + } + } } + return QVariant(0); #endif } @@ -529,22 +533,18 @@ void QGCGoogleEarthView::initializeGoogleEarth() QAxObject* doc = webViewWin->querySubObject("Document()"); //IDispatch* Disp; IDispatch* winDoc = NULL; - IHTMLDocument2* document = NULL; + IHTMLDocument2* document = NULL; //332C4425-26CB-11D0-B483-00C04FD90119 IHTMLDocument2 //25336920-03F9-11CF-8FD0-00AA00686F13 HTMLDocument doc->queryInterface(QUuid("{332C4425-26CB-11D0-B483-00C04FD90119}"), (void**)(&winDoc)); if (winDoc) { - // Security: - // CoInternetSetFeatureEnabled - // (FEATURE_LOCALMACHINE_LOCKDOWN, SET_FEATURE_ON_PROCESS, TRUE); - // document = NULL; winDoc->QueryInterface( IID_IHTMLDocument2, (void**)&document ); IHTMLWindow2 *window = NULL; document->get_parentWindow( &window ); - documentWin = new QAxObject(document, webViewWin); + documentWin = new QAxObject(document, webViewWin); jScriptWin = new QAxObject(window, webViewWin); connect(jScriptWin, SIGNAL(exception(int,QString,QString,QString)), this, SLOT(printWinException(int,QString,QString,QString))); jScriptInitialized = true; @@ -570,10 +570,7 @@ void QGCGoogleEarthView::initializeGoogleEarth() gEarthInitialized = true; // Set home location - setHome(47.3769, 8.549444, 500); - - // Move to home location - goHome(); + setHome(UASManager::instance()->getHomeLatitude(), UASManager::instance()->getHomeLongitude(), UASManager::instance()->getHomeAltitude()); // Add all MAVs QList mavs = UASManager::instance()->getUASList(); @@ -601,6 +598,15 @@ void QGCGoogleEarthView::initializeGoogleEarth() // Go home connect(ui->goHomeButton, SIGNAL(clicked()), this, SLOT(goHome())); + // Set home + connect(ui->setHomeButton, SIGNAL(clicked()), this, SLOT(setHome())); + + // Visibility of set home button + connect(ui->editButton, SIGNAL(clicked(bool)), ui->setHomeButton, SLOT(setVisible(bool))); + ui->setHomeButton->setVisible(ui->editButton->isChecked()); + + // To Lat/Lon button + connect(ui->toLatLonButton, SIGNAL(clicked()), this, SLOT(moveToPosition())); // Cam distance slider connect(ui->camDistanceSlider, SIGNAL(valueChanged(int)), this, SLOT(setViewRangeScaledInt(int)), Qt::UniqueConnection); @@ -624,6 +630,9 @@ void QGCGoogleEarthView::initializeGoogleEarth() enableAtmosphere(ui->atmosphereCheckBox->isChecked()); enableDaylight(ui->daylightCheckBox->isChecked()); follow(this->followCamera); + + // Move to home location + goHome(); } } } @@ -723,7 +732,9 @@ void QGCGoogleEarthView::updateState() QString idText = documentElement("dragWaypointIndex").toString(); if (idText == "HOME") { - setHome(latitude, longitude, altitude); + qDebug() << "HOME UPDATED!"; + UASManager::instance()->setHomePosition(latitude, longitude, altitude); + ui->setHomeButton->setChecked(false); } else { diff --git a/src/ui/map3D/QGCGoogleEarthView.h b/src/ui/map3D/QGCGoogleEarthView.h index f4eb4c3ac4cb615f7ca75a3ee962bd5cb99d9395..20c3b15a407b6a94088adb5a42e71229b1020361 100644 --- a/src/ui/map3D/QGCGoogleEarthView.h +++ b/src/ui/map3D/QGCGoogleEarthView.h @@ -104,6 +104,10 @@ public slots: void goHome(); /** @brief Set the home location */ void setHome(double lat, double lon, double alt); + /** @brief Set the home location interactively in the UI */ + void setHome(); + /** @brief Move the view to a latitude / longitude position */ + void moveToPosition(); /** @brief Allow waypoint editing */ void enableEditMode(bool mode); /** @brief Enable daylight/night */ diff --git a/src/ui/map3D/QGCGoogleEarthView.ui b/src/ui/map3D/QGCGoogleEarthView.ui index cfe038858f141833c7194a349234cd661e46f6e3..e510cd6b635ee159273829a5f676de461d3b9d21 100644 --- a/src/ui/map3D/QGCGoogleEarthView.ui +++ b/src/ui/map3D/QGCGoogleEarthView.ui @@ -6,16 +6,16 @@ 0 0 - 1089 + 1409 302 Form - + - 8 + 4 2 @@ -23,7 +23,7 @@ 2 - + @@ -38,11 +38,37 @@ Go to home location - Home + To Home + + + Set Home + + + true + + + + + + + Enable waypoint and home location edit mode + + + Enable waypoint and home location edit mode + + + Edit + + + true + + + + Show MAV trajectories @@ -58,21 +84,35 @@ - - + + - Qt::Horizontal + Qt::Vertical - - QSizePolicy::Expanding + + + + + + Select the MAV to chase - - - 5 - 20 - + + Select the MAV to chase - + + Select the MAV to chase + + + + MAV Distance + + + + + Ground Distance + + + @@ -115,50 +155,20 @@ - - - - Select the MAV to chase - - - Select the MAV to chase - - - Select the MAV to chase + + + + Overhead - - - MAV Distance - - - - - Ground Distance - - - - + + Qt::Vertical - - - - Reset - - - - - - - Overhead - - - @@ -175,28 +185,28 @@ - - - - Qt::Vertical + + + + Reset - - - - Enable waypoint and home location edit mode - - - Enable waypoint and home location edit mode + + + + Qt::Horizontal - - Edit + + QSizePolicy::MinimumExpanding - - true + + + 10 + 20 + - + @@ -224,6 +234,13 @@ + + + + To Lat/Lon + + +