/** * The default constructor will create a new MAVLink object sending heartbeats at * the MAVLINK_HEARTBEAT_DEFAULT_RATE to all connected links. */ MAVLinkProtocol::MAVLinkProtocol(QObject* parent) : QGCSingleton(parent), m_multiplexingEnabled(false), m_authEnabled(false), m_enable_version_check(true), m_paramRetransmissionTimeout(350), m_paramRewriteTimeout(500), m_paramGuardEnabled(true), m_actionGuardEnabled(false), m_actionRetransmissionTimeout(100), versionMismatchIgnore(false), systemId(QGC::defaultSystemId), _logSuspendError(false), _logSuspendReplay(false), _tempLogFile(QString("%2.%3").arg(_tempLogFileTemplate).arg(_logFileExtension)), _linkMgr(LinkManager::instance()), _heartbeatRate(MAVLINK_HEARTBEAT_DEFAULT_RATE), _heartbeatsEnabled(true) { qRegisterMetaType<mavlink_message_t>("mavlink_message_t"); m_authKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; loadSettings(); // All the *Counter variables are not initialized here, as they should be initialized // on a per-link basis before those links are used. @see resetMetadataForLink(). // Initialize the list for tracking dropped messages to invalid. for (int i = 0; i < 256; i++) { for (int j = 0; j < 256; j++) { lastIndex[i][j] = -1; } } // Start heartbeat timer, emitting a heartbeat at the configured rate connect(&_heartbeatTimer, &QTimer::timeout, this, &MAVLinkProtocol::sendHeartbeat); _heartbeatTimer.start(1000 / _heartbeatRate); connect(this, &MAVLinkProtocol::protocolStatusMessage, qgcApp(), &QGCApplication::criticalMessageBoxOnMainThread); connect(this, &MAVLinkProtocol::saveTempFlightDataLog, qgcApp(), &QGCApplication::saveTempFlightDataLogOnMainThread); emit versionCheckChanged(m_enable_version_check); }
//----------------------------------------------------------------------------- QNetworkRequest UrlFactory::getTileURL(MapType type, int x, int y, int zoom, QNetworkAccessManager* networkManager) { //-- Build URL QNetworkRequest request; QString url = _getURL(type, x, y, zoom, networkManager); if(url.isEmpty()) return request; request.setUrl(QUrl(url)); request.setRawHeader("Accept", "*/*"); switch (type) { #ifndef QGC_NO_GOOGLE_MAPS case GoogleMap: case GoogleSatellite: case GoogleLabels: case GoogleTerrain: case GoogleHybrid: request.setRawHeader("Referrer", "https://www.google.com/maps/preview"); break; #endif case BingHybrid: case BingMap: case BingSatellite: request.setRawHeader("Referrer", "https://www.bing.com/maps/"); break; case StatkartTopo: request.setRawHeader("Referrer", "https://www.norgeskart.no/"); break; case EniroTopo: request.setRawHeader("Referrer", "https://www.eniro.se/"); break; /* case OpenStreetMapSurfer: case OpenStreetMapSurferTerrain: request.setRawHeader("Referrer", "http://www.mapsurfer.net/"); break; case OpenStreetMap: case OpenStreetOsm: request.setRawHeader("Referrer", "https://www.openstreetmap.org/"); break; */ case EsriWorldStreet: case EsriWorldSatellite: case EsriTerrain: { QByteArray token = qgcApp()->toolbox()->settingsManager()->appSettings()->esriToken()->rawValue().toString().toLatin1(); request.setRawHeader("User-Agent", QByteArrayLiteral("Qt Location based application")); request.setRawHeader("User-Token", token); } return request; default: break; } request.setRawHeader("User-Agent", _userAgent); return request; }
void CollisionAvoidanceTestBoscamNormalLense::movingBackgroundNoCrash() { CollisionAvoidanceSettings& settings = CollisionAvoidanceSettings::getInstance(); settings.setFileName("/home/helli/d/m/qgroundcontrol/src/CollisionAvoidance/opticalflow/res/boscam/normalLense/movingBackgroundNoCrash.avi"); CollisionAvoidanceTestSettingsDto dto; dto.shouldTriggerCollisionImmanent = false; CollisionAvoidanceTestBase::_testCa(settings, qgcApp()->toolbox(), dto); }
void CollisionAvoidanceTestBoscamCheapFisheye::groundHoveringNoCa() { CollisionAvoidanceSettings& settings = CollisionAvoidanceSettings::getInstance(); settings.setFileName("/home/helli/d/m/qgroundcontrol/src/CollisionAvoidance/opticalflow/res/boscam/fisheye/cheapFisheye/groundHoveringNoCa.avi"); CollisionAvoidanceTestSettingsDto dto; dto.shouldTriggerCollisionImmanent = false; CollisionAvoidanceTestBase::_testCa(settings, qgcApp()->toolbox(), dto); }
void CollisionAvoidanceTestBoscamNormalLense::grillFrontalCrash() { CollisionAvoidanceSettings& settings = CollisionAvoidanceSettings::getInstance(); settings.setFileName("/home/helli/d/m/qgroundcontrol/src/CollisionAvoidance/opticalflow/res/boscam/normalLense/grillFrontalCrash.avi"); CollisionAvoidanceTestSettingsDto dto; dto.shouldTriggerCollisionImmanent = true; dto.lowerFrameNumberBound = 45; dto.upperFrameNumberBound = 60; CollisionAvoidanceTestBase::_testCa(settings, qgcApp()->toolbox(), dto); }
void CollisionAvoidanceTestBoscamCheapFisheye::groundRaisesCa() { CollisionAvoidanceSettings& settings = CollisionAvoidanceSettings::getInstance(); settings.setFileName("/home/helli/d/m/qgroundcontrol/src/CollisionAvoidance/opticalflow/res/boscam/fisheye/cheapFisheye/groundRaisesCa.avi"); CollisionAvoidanceTestSettingsDto dto; dto.shouldTriggerCollisionImmanent = true; dto.lowerFrameNumberBound = 200; dto.upperFrameNumberBound = 460; CollisionAvoidanceTestBase::_testCa(settings, qgcApp()->toolbox(), dto); }
void CollisionAvoidanceTestBoscamNormalLense::sideCrash() { CollisionAvoidanceSettings& settings = CollisionAvoidanceSettings::getInstance(); settings.setFileName("/home/helli/d/m/qgroundcontrol/src/CollisionAvoidance/opticalflow/res/boscam/normalLense/sideCrash.avi"); CollisionAvoidanceTestSettingsDto dto; dto.shouldTriggerCollisionImmanent = true; dto.lowerFrameNumberBound = 70; dto.upperFrameNumberBound = 80; // todo: this video is _very_ hard to detect CollisionAvoidanceTestBase::_testCa(settings, qgcApp()->toolbox(), dto); }
void CollisionAvoidanceTestBoscamCheapFisheye::roofThinObstacle() { CollisionAvoidanceSettings& settings = CollisionAvoidanceSettings::getInstance(); settings.setFileName("/home/helli/d/m/qgroundcontrol/src/CollisionAvoidance/opticalflow/res/boscam/fisheye/cheapFisheye/roofThinObstacle.avi"); CollisionAvoidanceTestSettingsDto dto; dto.shouldTriggerCollisionImmanent = true; // surprisingly this is an awesome result and the UAV would just have stopped in time :) dto.lowerFrameNumberBound = 180; dto.upperFrameNumberBound = 219; CollisionAvoidanceTestBase::_testCa(settings, qgcApp()->toolbox(), dto); }
void CollisionAvoidanceTestBoscamCheapFisheye::fenceCrash2() { CollisionAvoidanceSettings& settings = CollisionAvoidanceSettings::getInstance(); settings.setFileName("/home/helli/d/m/qgroundcontrol/src/CollisionAvoidance/opticalflow/res/boscam/fisheye/cheapFisheye/fenceCrash.avi"); CollisionAvoidanceTestSettingsDto dto; dto.shouldTriggerCollisionImmanent = true; // TODO: this is a really BAD video for CA (or better said how the algorithm behaves here :S - investigate more; there are only ~6 frames with ok-ish inlier ration and they account for CA in a too late manner dto.lowerFrameNumberBound = 140; dto.upperFrameNumberBound = 160; CollisionAvoidanceTestBase::_testCa(settings, qgcApp()->toolbox(), dto); }
void CollisionAvoidanceTestBoscamCheapFisheye::fastFenceFlyOver() { CollisionAvoidanceSettings& settings = CollisionAvoidanceSettings::getInstance(); settings.setFileName("/home/helli/d/m/qgroundcontrol/src/CollisionAvoidance/opticalflow/res/boscam/fisheye/cheapFisheye/fastFenceFlyOver.avi"); CollisionAvoidanceTestSettingsDto dto; dto.shouldTriggerCollisionImmanent = true; // this detection works surprisingly WELL, considering the high speed Volcy would still have been able to stop in time :-) dto.lowerFrameNumberBound = 50; dto.upperFrameNumberBound = 70; CollisionAvoidanceTestBase::_testCa(settings, qgcApp()->toolbox(), dto); }
QGCTabbedInfoView::QGCTabbedInfoView(const QString& title, QAction* action, QWidget *parent) : QGCDockWidget(title, action, parent) { ui.setupUi(this); messageView = new UASMessageViewWidget(qgcApp()->toolbox()->uasMessageHandler(), this); //actionsWidget = new UASActionsWidget(this); quickView = new UASQuickView(this); //rawView = new UASRawStatusView(this); ui.tabWidget->addTab(quickView,"Quick"); //ui.tabWidget->addTab(actionsWidget,"Actions"); //ui.tabWidget->addTab(rawView,"Status"); ui.tabWidget->addTab(messageView,"Messages"); loadSettings(); }
void CollisionAvoidanceTestBoscamNormalLense::hutFrontalCrash() { CollisionAvoidanceSettings& settings = CollisionAvoidanceSettings::getInstance(); settings.setFileName("/home/helli/d/m/qgroundcontrol/src/CollisionAvoidance/opticalflow/res/boscam/normalLense/hutFrontalCrash.avi"); CollisionAvoidanceTestSettingsDto dto; dto.shouldTriggerCollisionImmanent = true; dto.lowerFrameNumberBound = 90; dto.upperFrameNumberBound = 260; // TODO: this video has very different divergence readings, that's why the above range is _so_ big // -> does the algorithm work the same each time? (i.e. is the starting state correct, do the FoE readings correlate between multiple runs) // -> how does the black border to the right (camera specific) and the roof influence the FoE? // - very interesting video in general CollisionAvoidanceTestBase::_testCa(settings, qgcApp()->toolbox(), dto); }
//----------------------------------------------------------------------------- QString UrlFactory::_getURL(MapType type, int x, int y, int zoom, QNetworkAccessManager* networkManager) { switch (type) { #ifdef QGC_NO_GOOGLE_MAPS Q_UNUSED(networkManager); #else case GoogleMap: { // http://mt1.google.com/vt/lyrs=m QString server = "mt"; QString request = "vt"; QString sec1 = ""; // after &x=... QString sec2 = ""; // after &zoom=... _getSecGoogleWords(x, y, sec1, sec2); _tryCorrectGoogleVersions(networkManager); return QString("http://%1%2.google.com/%3/lyrs=%4&hl=%5&x=%6%7&y=%8&z=%9&s=%10").arg(server).arg(_getServerNum(x, y, 4)).arg(request).arg(_versionGoogleMap).arg(_language).arg(x).arg(sec1).arg(y).arg(zoom).arg(sec2); } break; case GoogleSatellite: { // http://mt1.google.com/vt/lyrs=s QString server = "khm"; QString request = "kh"; QString sec1 = ""; // after &x=... QString sec2 = ""; // after &zoom=... _getSecGoogleWords(x, y, sec1, sec2); _tryCorrectGoogleVersions(networkManager); return QString("http://%1%2.google.com/%3/v=%4&hl=%5&x=%6%7&y=%8&z=%9&s=%10").arg(server).arg(_getServerNum(x, y, 4)).arg(request).arg(_versionGoogleSatellite).arg(_language).arg(x).arg(sec1).arg(y).arg(zoom).arg(sec2); } break; case GoogleLabels: { QString server = "mts"; QString request = "vt"; QString sec1 = ""; // after &x=... QString sec2 = ""; // after &zoom=... _getSecGoogleWords(x, y, sec1, sec2); _tryCorrectGoogleVersions(networkManager); return QString("http://%1%2.google.com/%3/lyrs=%4&hl=%5&x=%6%7&y=%8&z=%9&s=%10").arg(server).arg(_getServerNum(x, y, 4)).arg(request).arg(_versionGoogleLabels).arg(_language).arg(x).arg(sec1).arg(y).arg(zoom).arg(sec2); } break; case GoogleTerrain: { QString server = "mt"; QString request = "vt"; QString sec1 = ""; // after &x=... QString sec2 = ""; // after &zoom=... _getSecGoogleWords(x, y, sec1, sec2); _tryCorrectGoogleVersions(networkManager); return QString("http://%1%2.google.com/%3/v=%4&hl=%5&x=%6%7&y=%8&z=%9&s=%10").arg(server).arg(_getServerNum(x, y, 4)).arg(request).arg(_versionGoogleTerrain).arg(_language).arg(x).arg(sec1).arg(y).arg(zoom).arg(sec2); } break; #endif case StatkartTopo: { return QString("http://opencache.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo2&zoom=%1&x=%2&y=%3").arg(zoom).arg(x).arg(y); } break; case EniroTopo: { return QString("http://map.eniro.com/geowebcache/service/tms1.0.0/map/%1/%2/%3.png").arg(zoom).arg(x).arg((1<<zoom)-1-y); } break; /* case OpenStreetMap: { char letter = "abc"[_getServerNum(x, y, 3)]; return QString("https://%1.tile.openstreetmap.org/%2/%3/%4.png").arg(letter).arg(zoom).arg(x).arg(y); } break; case OpenStreetOsm: { char letter = "abc"[_getServerNum(x, y, 3)]; return QString("http://%1.tah.openstreetmap.org/Tiles/tile/%2/%3/%4.png").arg(letter).arg(zoom).arg(x).arg(y); } break; case OpenStreetMapSurfer: { // http://tiles1.mapsurfer.net/tms_r.ashx?x=37378&y=20826&z=16 return QString("http://tiles1.mapsurfer.net/tms_r.ashx?x=%1&y=%2&z=%3").arg(x).arg(y).arg(zoom); } break; case OpenStreetMapSurferTerrain: { // http://tiles2.mapsurfer.net/tms_t.ashx?x=9346&y=5209&z=14 return QString("http://tiles2.mapsurfer.net/tms_t.ashx?x=%1&y=%2&z=%3").arg(x).arg(y).arg(zoom); } break; */ case BingMap: { QString key = _tileXYToQuadKey(x, y, zoom); return QString("http://ecn.t%1.tiles.virtualearth.net/tiles/r%2.png?g=%3&mkt=%4").arg(_getServerNum(x, y, 4)).arg(key).arg(_versionBingMaps).arg(_language); } break; case BingSatellite: { QString key = _tileXYToQuadKey(x, y, zoom); return QString("http://ecn.t%1.tiles.virtualearth.net/tiles/a%2.jpeg?g=%3&mkt=%4").arg(_getServerNum(x, y, 4)).arg(key).arg(_versionBingMaps).arg(_language); } break; case BingHybrid: { QString key = _tileXYToQuadKey(x, y, zoom); return QString("http://ecn.t%1.tiles.virtualearth.net/tiles/h%2.jpeg?g=%3&mkt=%4").arg(_getServerNum(x, y, 4)).arg(key).arg(_versionBingMaps).arg(_language); } /* case MapQuestMap: { char letter = "1234"[_getServerNum(x, y, 4)]; return QString("http://otile%1.mqcdn.com/tiles/1.0.0/map/%2/%3/%4.jpg").arg(letter).arg(zoom).arg(x).arg(y); } break; case MapQuestSat: { char letter = "1234"[_getServerNum(x, y, 4)]; return QString("http://otile%1.mqcdn.com/tiles/1.0.0/sat/%2/%3/%4.jpg").arg(letter).arg(zoom).arg(x).arg(y); } break; */ case EsriWorldStreet: return QString("http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/%1/%2/%3").arg(zoom).arg(y).arg(x); case EsriWorldSatellite: return QString("http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/%1/%2/%3").arg(zoom).arg(y).arg(x); case EsriTerrain: return QString("http://server.arcgisonline.com/ArcGIS/rest/services/World_Terrain_Base/MapServer/tile/%1/%2/%3").arg(zoom).arg(y).arg(x); case MapboxStreets: case MapboxLight: case MapboxDark: case MapboxSatellite: case MapboxHybrid: case MapboxWheatPaste: case MapboxStreetsBasic: case MapboxComic: case MapboxOutdoors: case MapboxRunBikeHike: case MapboxPencil: case MapboxPirates: case MapboxEmerald: case MapboxHighContrast: { QString mapBoxToken = qgcApp()->toolbox()->settingsManager()->appSettings()->mapboxToken()->rawValue().toString(); if(!mapBoxToken.isEmpty()) { QString server = "https://api.mapbox.com/v4/"; switch(type) { case MapboxStreets: server += "mapbox.streets"; break; case MapboxLight: server += "mapbox.light"; break; case MapboxDark: server += "mapbox.dark"; break; case MapboxSatellite: server += "mapbox.satellite"; break; case MapboxHybrid: server += "mapbox.streets-satellite"; break; case MapboxWheatPaste: server += "mapbox.wheatpaste"; break; case MapboxStreetsBasic: server += "mapbox.streets-basic"; break; case MapboxComic: server += "mapbox.comic"; break; case MapboxOutdoors: server += "mapbox.outdoors"; break; case MapboxRunBikeHike: server += "mapbox.run-bike-hike"; break; case MapboxPencil: server += "mapbox.pencil"; break; case MapboxPirates: server += "mapbox.pirates"; break; case MapboxEmerald: server += "mapbox.emerald"; break; case MapboxHighContrast: server += "mapbox.high-contrast"; break; default: return QString::null; } server += QString("/%1/%2/%3.jpg80?access_token=%4").arg(zoom).arg(x).arg(y).arg(mapBoxToken); return server; } } break; default: qWarning("Unknown map id %d\n", type); break; } return QString::null; }