Esempio n. 1
0
/**
* 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);
}
Esempio n. 13
0
//-----------------------------------------------------------------------------
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;
}