Commit 43ce5cca authored by pixhawk's avatar pixhawk

Improving Google Earth support

parent 53a72a04
...@@ -13,12 +13,12 @@ google.load("earth", "1", { 'language': 'en'}); ...@@ -13,12 +13,12 @@ google.load("earth", "1", { 'language': 'en'});
var ge = null; var ge = null;
var initialized = false; var initialized = false;
var aircraft = new Array();
var currAircraft = 220; var currAircraft = 220;
var followAircraft = false; var followEnabled = false;
var currLat = 47.3769; var currLat = 47.3769;
var currLon = 8.549444; var currLon = 8.549444;
var currAlt = 470; var currAlt = 470;
var currFollowHeading = 0.0;
var homeLat = 0; var homeLat = 0;
var homeLon = 0; var homeLon = 0;
...@@ -32,11 +32,17 @@ var currTilt = 40.0; ///<< The tilt angle (in degrees) ...@@ -32,11 +32,17 @@ var currTilt = 40.0; ///<< The tilt angle (in degrees)
var currFollowTilt = 40.0; var currFollowTilt = 40.0;
var currView = null; var currView = null;
var M_PI = 3.14159265;
var planeOrient; var planeOrient;
var planeLoc; var planeLoc;
var aircraft = [];
var attitudes = [];
var locations = [];
var trails = [];
// Aircraft class // Aircraft class
...@@ -53,7 +59,10 @@ function init() { ...@@ -53,7 +59,10 @@ function init() {
function setCurrAircraft(id)
{
currAircraft = id;
}
function setGCSHome(lat, lon, alt) function setGCSHome(lat, lon, alt)
{ {
...@@ -86,13 +95,70 @@ function setGCSHome(lat, lon, alt) ...@@ -86,13 +95,70 @@ function setGCSHome(lat, lon, alt)
{ {
homeGroundLevel = alt; homeGroundLevel = alt;
} }
}
function createAircraft(id, type, color)
{
console.debug("Aircraft created");
var planePlacemark = ge.createPlacemark('');
goHome(); planePlacemark.setName('aircraft');
var planeModel = ge.createModel('');
ge.getFeatures().appendChild(planePlacemark);
var planeLoc = ge.createLocation('');
planeModel.setLocation(planeLoc);
var planeLink = ge.createLink('');
var planeOrient = ge.createOrientation('');
planeModel.setOrientation(planeOrient);
planeLink.setHref('http://qgroundcontrol.org/_media/users/models/multiplex-twinstar.dae');
planeModel.setLink(planeLink);
planeModel.setAltitudeMode (ge.ALTITUDE_ABSOLUTE);
planeLoc.setLatitude(currLat);
planeLoc.setLongitude(currLon);
planeLoc.setAltitude(currAlt);
planePlacemark.setGeometry(planeModel);
// Write into global structure
aircraft[id] = planePlacemark;
attitudes[id] = planeOrient;
locations[id] = planeLoc;
createTrail(id, color);
console.debug("Aircraft created");
}
function createTrail(id, color)
{
// Create the placemark
var lineStringPlacemark = ge.createPlacemark('');
// Create the LineString; set it to extend down to the ground
// and set the altitude mode
trails[id] = ge.createLineString('');
lineStringPlacemark.setGeometry(trails[id]);
trails[id].setExtrude(true);
lineString.setAltitudeMode(ge.ALTITUDE_ABSOLUTE);
// Add LineString points
//lineString.getCoordinates().pushLatLngAlt(48.754, -121.835, 700);
// Create a style and set width and color of line
lineStringPlacemark.setStyleSelector(ge.createStyle(''));
var lineStyle = lineStringPlacemark.getStyleSelector().getLineStyle();
lineStyle.setWidth(5);
lineStyle.getColor().set('99bbaaff');
//lineStyle.getColor().set(color);  // aabbggrr format
// Add the feature to Earth
ge.getFeatures().appendChild(lineStringPlacemark);
}
function addTrailPosition(id, lat, lon, alt)
{
//trails[id].getCoordinates().pushLatLngAlt(lat, lon, alt);
} }
function initCallback(object) function initCallback(object)
...@@ -110,7 +176,7 @@ function initCallback(object) ...@@ -110,7 +176,7 @@ function initCallback(object)
ge.getLayerRoot().enableLayerById(ge.LAYER_TREES, true); ge.getLayerRoot().enableLayerById(ge.LAYER_TREES, true);
// Now after the Google Earth initialization, initialize the GCS view // Now after the Google Earth initialization, initialize the GCS view
setGCSHome(currLat, currLon, currAlt); //setGCSHome(currLat, currLon, currAlt);
// Create the first aircraft model // Create the first aircraft model
...@@ -135,8 +201,8 @@ function initCallback(object) ...@@ -135,8 +201,8 @@ function initCallback(object)
planePlacemark.setGeometry(planeModel); planePlacemark.setGeometry(planeModel);
setAircraftPositionAttitude(220, 47.3772, currLon, currAlt+50, 20, 15, 50); //setAircraftPositionAttitude(220, 47.3772, currLon, currAlt+50, 20, 15, 50);
enableFollowing(true); //enableFollowing(true);
updateFollowAircraft(); updateFollowAircraft();
initialized = true; initialized = true;
...@@ -150,17 +216,19 @@ function setAircraftPositionAttitude(id, lat, lon, alt, roll, pitch, yaw) ...@@ -150,17 +216,19 @@ function setAircraftPositionAttitude(id, lat, lon, alt, roll, pitch, yaw)
currLat = lat; currLat = lat;
currLon = lon; currLon = lon;
currAlt = alt; currAlt = alt;
currFollowHeading = ((yaw/M_PI)+1.0)*360.0;
} }
planeOrient.setRoll(roll); // FIXME Currently invalid conversion from right-handed z-down to z-up frame
planeOrient.setTilt(pitch); planeOrient.setRoll(((roll/M_PI)+1.0)*360.0);
planeOrient.setHeading(yaw); planeOrient.setTilt(((pitch/M_PI)+1.0)*360.0);
planeOrient.setHeading(((yaw/M_PI)+1.0)*360.0);
planeLoc.setLatitude(lat); planeLoc.setLatitude(lat);
planeLoc.setLongitude(lon); planeLoc.setLongitude(lon);
planeLoc.setAltitude(alt); planeLoc.setAltitude(alt);
} }
...@@ -180,24 +248,16 @@ function setCurrentAircraft(id) ...@@ -180,24 +248,16 @@ function setCurrentAircraft(id)
currAircraft = id; currAircraft = id;
} }
function enableFollowing(follow)
{
followEnabled = follow;
}
function updateFollowAircraft() function updateFollowAircraft()
{ {
if (followEnabled)
{
currView = ge.getView().copyAsLookAt(ge.ALTITUDE_ABSOLUTE); currView = ge.getView().copyAsLookAt(ge.ALTITUDE_ABSOLUTE);
currView.setLatitude(currLat); currView.setLatitude(currLat);
currView.setLongitude(currLon); currView.setLongitude(currLon);
currView.setAltitude(currAlt); currView.setAltitude(currAlt);
currView.setRange(currViewRange); currView.setRange(currViewRange);
currView.setTilt(currFollowTilt); currView.setTilt(currFollowTilt);
currView.setHeading(currFollowHeading-90.0);
ge.getView().setAbstractView(currView); ge.getView().setAbstractView(currView);
}
} }
function failureCallback(object) function failureCallback(object)
......
...@@ -1119,41 +1119,9 @@ void MainWindow::loadMAVLinkView() ...@@ -1119,41 +1119,9 @@ void MainWindow::loadMAVLinkView()
void MainWindow::presentView() void MainWindow::presentView()
{ {
showTheCentralWidget(CENTRAL_3D_LOCAL, currentView);
showTheCentralWidget(CENTRAL_3D_MAP, currentView);
//#ifdef QGC_OSG_ENABLED
// // 3D map
// if (_3DWidget)
// {
// if (centerStack)
// {
// //map3DWidget->setActive(true);
// centerStack->setCurrentWidget(_3DWidget);
// }
// }
//#endif
qDebug() << "LC"; qDebug() << "LC";
showTheCentralWidget(CENTRAL_LINECHART, currentView); showTheCentralWidget(CENTRAL_LINECHART, currentView);
// FIXME
// if (linechartWidget)
// {
// qDebug () << buildMenuKey (SUB_SECTION_CHECKED,CENTRAL_LINECHART,currentView) <<
// settings.value(buildMenuKey (SUB_SECTION_CHECKED,CENTRAL_LINECHART,currentView)).toBool() ;
// if (settings.value(buildMenuKey (SUB_SECTION_CHECKED,CENTRAL_LINECHART,currentView)).toBool()){
// if (centerStack)
// {
// centerStack->setCurrentWidget(linechartWidget);
// }
// }
// }
// MAP // MAP
qDebug() << "MAP"; qDebug() << "MAP";
showTheCentralWidget(CENTRAL_MAP, currentView); showTheCentralWidget(CENTRAL_MAP, currentView);
...@@ -1164,16 +1132,17 @@ void MainWindow::presentView() ...@@ -1164,16 +1132,17 @@ void MainWindow::presentView()
// HEAD UP DISPLAY // HEAD UP DISPLAY
showTheCentralWidget(CENTRAL_HUD, currentView); showTheCentralWidget(CENTRAL_HUD, currentView);
// qDebug() << "HUD";
// if (hudWidget){ // GOOGLE EARTH
// qDebug() << buildMenuKey(SUB_SECTION_CHECKED,CENTRAL_HUD,currentView) << showTheCentralWidget(CENTRAL_GOOGLE_EARTH, currentView);
// settings.value(buildMenuKey (SUB_SECTION_CHECKED,CENTRAL_HUD,currentView)).toBool();
// if (settings.value(buildMenuKey (SUB_SECTION_CHECKED,CENTRAL_HUD,currentView)).toBool()){ // LOCAL 3D VIEW
// if (centerStack) { showTheCentralWidget(CENTRAL_3D_LOCAL, currentView);
// centerStack->setCurrentWidget(hudWidget);
// } // GLOBAL 3D VIEW
// } showTheCentralWidget(CENTRAL_3D_MAP, currentView);
// }
// Show docked widgets based on current view and autopilot type // Show docked widgets based on current view and autopilot type
......
...@@ -48,6 +48,7 @@ Q3DWidget::Q3DWidget(QWidget* parent) ...@@ -48,6 +48,7 @@ Q3DWidget::Q3DWidget(QWidget* parent)
, robotAttitude(new osg::PositionAttitudeTransform()) , robotAttitude(new osg::PositionAttitudeTransform())
, hudGroup(new osg::Switch()) , hudGroup(new osg::Switch())
, hudProjectionMatrix(new osg::Projection) , hudProjectionMatrix(new osg::Projection)
, fps(30.0f)
{ {
// set initial camera parameters // set initial camera parameters
cameraParams.minZoomRange = 2.0f; cameraParams.minZoomRange = 2.0f;
...@@ -70,6 +71,8 @@ Q3DWidget::~Q3DWidget() ...@@ -70,6 +71,8 @@ Q3DWidget::~Q3DWidget()
void void
Q3DWidget::init(float fps) Q3DWidget::init(float fps)
{ {
this->fps = fps;
getCamera()->setGraphicsContext(osgGW); getCamera()->setGraphicsContext(osgGW);
// manually specify near and far clip planes // manually specify near and far clip planes
...@@ -105,6 +108,23 @@ Q3DWidget::init(float fps) ...@@ -105,6 +108,23 @@ Q3DWidget::init(float fps)
timer.start(static_cast<int>(floorf(1000.0f / fps))); timer.start(static_cast<int>(floorf(1000.0f / fps)));
} }
void Q3DWidget::showEvent(QShowEvent* event)
{
// React only to internal (pre/post-display)
// events
if (!event->spontaneous())
{
if (event->type() == QEvent::Hide)
{
timer.stop();
}
else if (event->type() == QEvent::Show)
{
timer.start(static_cast<int>(floorf(1000.0f / fps)));
}
}
}
osg::ref_ptr<osg::Geode> osg::ref_ptr<osg::Geode>
Q3DWidget::createRobot(void) Q3DWidget::createRobot(void)
{ {
......
...@@ -257,6 +257,7 @@ protected: ...@@ -257,6 +257,7 @@ protected:
}; };
CameraParams cameraParams; /**< Struct representing camera parameters. */ CameraParams cameraParams; /**< Struct representing camera parameters. */
float fps;
}; };
#endif // Q3DWIDGET_H #endif // Q3DWIDGET_H
This diff is collapsed.
...@@ -54,14 +54,24 @@ public: ...@@ -54,14 +54,24 @@ public:
public slots: public slots:
/** @brief Update the internal state. Does not trigger a redraw */ /** @brief Update the internal state. Does not trigger a redraw */
void updateState(); void updateState();
/** @brief Add a new MAV/UAS to the visualization */
void addUAS(UASInterface* uas);
/** @brief Set the currently selected UAS */ /** @brief Set the currently selected UAS */
void setActiveUAS(UASInterface* uas); void setActiveUAS(UASInterface* uas);
/** @brief Update the global position */
void updateGlobalPosition(UASInterface* uas, double lat, double lon, double alt, quint64 usec);
/** @brief Show the vehicle trail */ /** @brief Show the vehicle trail */
void showTrail(bool state); void showTrail(bool state);
/** @brief Show the waypoints */ /** @brief Show the waypoints */
void showWaypoints(bool state); void showWaypoints(bool state);
/** @brief Follow the aircraft during flight */ /** @brief Follow the aircraft during flight */
void follow(bool follow); void follow(bool follow);
/** @brief Go to the home location */
void goHome();
/** @brief Set the home location */
void setHome(double lat, double lon, double alt);
/** @brief Initialize Google Earth */
void initializeGoogleEarth();
protected: protected:
void changeEvent(QEvent *e); void changeEvent(QEvent *e);
...@@ -71,6 +81,7 @@ protected: ...@@ -71,6 +81,7 @@ protected:
bool followCamera; bool followCamera;
bool trailEnabled; bool trailEnabled;
bool webViewInitialized; bool webViewInitialized;
bool gEarthInitialized;
#ifdef _MSC_VER #ifdef _MSC_VER
QGCWebAxWidget* webViewWin; QGCWebAxWidget* webViewWin;
#endif #endif
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment