earth.html 9.91 KB
Newer Older
1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2 3

<html>
pixhawk's avatar
pixhawk committed
4
  <head>
5 6
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  <!-- <head> -->
7
<!-- QGroundControl -->
pixhawk's avatar
pixhawk committed
8 9
    <title>QGroundControl Google Earth View</title>
    <!-- *** Replace the key below below with your own API key, available at http://code.google.com/apis/maps/signup.html *** -->
10
    <script type="text/javascript" src="https://getfirebug.com/firebug-lite-beta.js"></script>
11 12
    <script type="text/javascript" src="http://www.google.com/jsapi?key=ABQIAAAAwbkbZLyhsmTCWXbTcjbgbRSzHs7K5SvaUdm8ua-Xxy_-2dYwMxQMhnagaawTo7L1FE1-amhuQxIlXw"></script>
    <script type="text/javascript">
13
google.load("earth", "1", { 'language': 'en'});
pixhawk's avatar
pixhawk committed
14 15

var ge = null;
16 17
var initialized = false;
var currAircraft = 220;
18
var followEnabled = false;
19 20 21

var lastLat = 0;
var lastLon = 0;
lm's avatar
lm committed
22
var lastAlt = 0;
23 24 25
var currLat = 47.3769;
var currLon = 8.549444;
var currAlt = 470;
26
var currFollowHeading = 0.0;
27 28 29 30 31 32 33 34

var homeLat = 0;
var homeLon = 0;
var homeAlt = 0;
var homeViewRange = 500;
var homeLocation = null;
var homeGroundLevel = 0;

35
var currViewRange = 50.0;	///<< The current viewing range from this position (in meters)
36 37 38 39
var currTilt = 40.0;		///<< The tilt angle (in degrees)
var currFollowTilt = 40.0;
var currView = null;

40 41
var M_PI = 3.14159265;

42 43 44 45 46


var planeOrient;
var planeLoc;

47
var aircraft = [];
48 49
var aircraftLocations = [];
var aircraftLastLocations = [];
50 51 52
var attitudes = [];
var locations = [];
var trails = [];
53 54 55
var trailPlacemarks = [];
var trailsVisible = [];
var trailColors = [];
pixhawk's avatar
pixhawk committed
56 57
var waypoints = [];
//var waypointLines = [];
58
//var trailPlacemarks[id];
59
var lineStyle;
60 61

// Aircraft class
62
var planeColor = '6600ffff';
63 64 65 66 67 68 69


function isInitialized()
{
	return initialized;
}

pixhawk's avatar
pixhawk committed
70

71 72
function init()
{
73 74 75
	google.earth.createInstance("map3d", initCallback, failureCallback);
}

pixhawk's avatar
pixhawk committed
76 77 78 79 80
function setFollowEnabled(enable)
{
	followEnabled = enable;
}

81 82


83 84 85 86
function setCurrAircraft(id)
{
	currAircraft = id;
}
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118

function setGCSHome(lat, lon, alt)
{
	homeLat = lat;
	homeLon = lon;
	homeAlt = alt;
	
	
	
	var placemark = ge.createPlacemark(''); 
	    var icon = ge.createIcon(''); 
	    icon.setHref('http://google-maps-icons.googlecode.com/files/blackH.png'); 
	    var style = ge.createStyle(''); 
	    style.getIconStyle().setIcon(icon); 
	    //style.getIconStyle().setScale(0.5); 
	    placemark.setStyleSelector(style);  

	    // Set the placemark's location.   
	    homeLocation = ge.createPoint(''); 
	    homeLocation.setLatitude(lat); 
	    homeLocation.setLongitude(lon);
	    homeLocation.setAltitude(alt); 
	    placemark.setGeometry(homeLocation);  

	    // Add the placemark to Earth. 
	    ge.getFeatures().appendChild(placemark); 

	    homeGroundLevel = ge.getGlobe().getGroundAltitude(lat,lon);
	    if (homeGroundLevel == 0)
	    {
		    homeGroundLevel = alt;
	    }
pixhawk's avatar
pixhawk committed
119 120
}

pixhawk's avatar
pixhawk committed
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
function updateWaypointListLength(id, len)
{
	// Delete any non-needed waypoints
	if (waypoints.length > len)
	{
		for (var i=len; i<waypoints.length; i++)
		{
			var placemark = waypoints.pop();
		    ge.getFeatures().removeChild(placemark);
		}
	}
}

function updateWaypoint(id, index, lat, lon, alt, action)
{
	// Check if waypoint exists
	if (waypoints.length > index)
	{
		// Waypoint exists
		// Set the placemark's location.   
	    var location = ge.createPoint(''); 
	    location.setLatitude(lat); 
	    location.setLongitude(lon);
	    location.setAltitude(alt); 
	    waypoints[index].setGeometry(location); 
	}
	else
	{
		// Waypoint does not exist yet
		var placemark = ge.createPlacemark(''); 
	    var icon = ge.createIcon('');
	    var numberstring = index;
	    if (index < 10) numberstring = '0' + numberstring
	    icon.setHref('http://google-maps-icons.googlecode.com/files/red' + numberstring +'.png'); 
	    var style = ge.createStyle(''); 
	    style.getIconStyle().setIcon(icon); 
	    //style.getIconStyle().setScale(0.5); 
	    placemark.setStyleSelector(style);  

	    // Set the placemark's location.   
	    var location = ge.createPoint(''); 
	    location.setLatitude(lat); 
	    location.setLongitude(lon);
	    location.setAltitude(alt); 
	    placemark.setGeometry(location);  

	    // Add the placemark to Earth. 
	    ge.getFeatures().appendChild(placemark); 
		waypoints[index] = placemark;
	}
	// Add connecting line
	
}

pixhawk's avatar
pixhawk committed
175
function createAircraft(id, type, color)
176
{
177
	      planePlacemark = ge.createPlacemark('');
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
          planePlacemark.setName('aircraft');
          planeModel = ge.createModel('');
          ge.getFeatures().appendChild(planePlacemark);
          planeLoc = ge.createLocation('');
          planeModel.setLocation(planeLoc);
          planeLink = ge.createLink('');
          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);
          
pixhawk's avatar
pixhawk committed
197 198 199
          // Write into global structure
          aircraft[id] = planePlacemark;
          attitudes[id] = planeOrient;
200
          aircraftLocations[id] = planeLoc;
201
		  aircraftLastLocations[id] = ge.createLocation('');
202
          //planeColor = color;
pixhawk's avatar
pixhawk committed
203
          
204 205
          createTrail(id, color);
          console.log(color);
pixhawk's avatar
pixhawk committed
206 207 208 209
}

function createTrail(id, color)
{
210
          trailPlacemarks[id] = ge.createPlacemark('');
211
          // Create the placemark
pixhawk's avatar
pixhawk committed
212 213
// Create the LineString; set it to extend down to the ground
// and set the altitude mode
214 215 216 217
trails[id] = ge.createLineString('');
trailPlacemarks[id].setGeometry(trails[id]);
trails[id].setExtrude(false);
trails[id].setAltitudeMode(ge.ALTITUDE_ABSOLUTE);
pixhawk's avatar
pixhawk committed
218 219 220 221 222

// Add LineString points
//lineString.getCoordinates().pushLatLngAlt(48.754, -121.835, 700);

// Create a style and set width and color of line
223 224
trailPlacemarks[id].setStyleSelector(ge.createStyle(''));
lineStyle = trailPlacemarks[id].getStyleSelector().getLineStyle();
pixhawk's avatar
pixhawk committed
225
lineStyle.setWidth(5);
226 227 228 229
trailColors[id] = color;
lineStyle.getColor().set('00000000');  // aabbggrr format

trailsVisible[id] = false;
pixhawk's avatar
pixhawk committed
230 231

// Add the feature to Earth
232
//ge.getFeatures().appendChild(trailPlacemarks[id]);
233

pixhawk's avatar
pixhawk committed
234 235
}

lm's avatar
lm committed
236
function clearTrail(id)
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
{
	trailsVisible[id] = false;
	ge.getFeatures().removeChild(trailPlacemarks[id]);
}

function showTrail(id)
{
	ge.getFeatures().appendChild(trailPlacemarks[id]);
	trailsVisible[id] = true;
}

function setViewRange(dist)
{
	currViewRange = dist;
}

pixhawk's avatar
pixhawk committed
253 254
function addTrailPosition(id, lat, lon, alt)
{
255
	trails[id].setExtrude(false);
256
    trails[id].setAltitudeMode(ge.ALTITUDE_ABSOLUTE);
257

258
    // Add LineString points
259
	trails[id].getCoordinates().pushLatLngAlt(lat, lon, alt);
260

261 262 263 264 265 266
    // Create a style and set width and color of line
    trailPlacemarks[id].setStyleSelector(ge.createStyle(''));
    lineStyle = trailPlacemarks[id].getStyleSelector().getLineStyle();
    lineStyle.setWidth(5);
    lineStyle.getColor().set(trailColors[id]);  // aabbggrr format
    //lineStyle.getColor().set(color);  // aabbggrr format
267

268 269
    // Add the feature to Earth
    if (trailsVisible[id] == true) ge.getFeatures().replaceChild(trailPlacemarks[id], trailPlacemarks[id]);
pixhawk's avatar
pixhawk committed
270 271
}

272 273
function initCallback(object)
{
274 275 276 277
    ge = object;
    ge.getWindow().setVisibility(true);
    ge.getOptions().setStatusBarVisibility(true); 
    ge.getOptions().setScaleLegendVisibility(true);
pixhawk's avatar
pixhawk committed
278 279
    //ge.getOptions().setFlyToSpeed(5.0); 
    ge.getOptions().setFlyToSpeed(ge.SPEED_TELEPORT); 
280
    ge.getNavigationControl().setVisibility(ge.VISIBILITY_AUTO);
pixhawk's avatar
pixhawk committed
281
        
282 283 284 285
    ge.getLayerRoot().enableLayerById(ge.LAYER_TERRAIN, true); 
    ge.getLayerRoot().enableLayerById(ge.LAYER_BUILDINGS, true); 
    ge.getLayerRoot().enableLayerById(ge.LAYER_BORDERS, true); 
    ge.getLayerRoot().enableLayerById(ge.LAYER_TREES, true);
286

287
    initialized = true;
288 289 290 291 292 293
}

function setAircraftPositionAttitude(id, lat, lon, alt, roll, pitch, yaw)
{
	if (id == currAircraft)
	{
lm's avatar
lm committed
294 295 296
		if (lastLat == 0)
		{
			lastLat = currLat;
pixhawk's avatar
pixhawk committed
297
			lastLon = currLon;
lm's avatar
lm committed
298
		}
299 300 301
		currLat = lat;
		currLon = lon;
		currAlt = alt;
pixhawk's avatar
pixhawk committed
302 303 304 305
		// Interpolate between t-1 and t and set new states
		lastLat = lastLat*0.8+currLat*0.2;
		lastLon = lastLon*0.8+currLon*0.2;
		lastAlt = lastAlt*0.8+currAlt*0.2;
306
		//currFollowHeading = ((yaw/M_PI)+1.0)*360.0;
307
	
308
	
309
	// FIXME Currently invalid conversion from right-handed z-down to z-up frame
310 311
	planeOrient.setRoll(((roll/M_PI))*180.0+180.0);
	planeOrient.setTilt(((pitch/M_PI))*180.0+180.0);
312
	planeOrient.setHeading(((yaw/M_PI))*180.0-90.0);
pixhawk's avatar
pixhawk committed
313
	
314
	currFollowHeading = ((yaw/M_PI))*180.0;
315
    
pixhawk's avatar
pixhawk committed
316 317 318
    planeLoc.setLatitude(lastLat);
    planeLoc.setLongitude(lastLon);
    planeLoc.setAltitude(lastAlt);
319
    planeModel.setLocation(planeLoc);
pixhawk's avatar
pixhawk committed
320 321
    
    if (followEnabled) updateFollowAircraft();
322
    }
pixhawk's avatar
pixhawk committed
323 324
}

325 326 327 328 329 330 331 332 333 334 335 336
function enableDaylight(enabled)
{
	if(enabled)
	{
		ge.getSun().setVisibility(true);
	}
	else
	{
		ge.getSun().setVisibility(false);
	}
}
		
337 338 339 340 341 342 343 344 345
function goHome()
{
	var currView = ge.getView().copyAsLookAt(ge.ALTITUDE_ABSOLUTE);
	currView.setLatitude(homeLat);
	currView.setLongitude(homeLon);
	currView.setAltitude(homeAlt);
	currView.setRange(homeViewRange);
	currView.setTilt(currTilt);
	ge.getView().setAbstractView(currView);
pixhawk's avatar
pixhawk committed
346
}
347 348 349 350 351 352 353 354 355

function setCurrentAircraft(id)
{
	currAircraft = id;
}

function updateFollowAircraft()
{
	currView = ge.getView().copyAsLookAt(ge.ALTITUDE_ABSOLUTE);
356 357 358 359
	currView.setLatitude(lastLat);
	currView.setLongitude(lastLon);
	currView.setAltitude(lastAlt);

360 361
	currView.setRange(currViewRange);
	currView.setTilt(currFollowTilt);
362
	currView.setHeading(currFollowHeading);
363
	
364 365 366 367 368 369 370 371 372
	ge.getView().setAbstractView(currView);
}

function failureCallback(object)
{
}
</script>


pixhawk's avatar
pixhawk committed
373 374 375 376 377 378 379 380 381 382 383 384 385 386
    <style type="text/css">
    html, body {
      margin: 0;
      width: 100%;
      height: 100%;
    }
    </style>
  </head>
  <body onload='init()' id='body'>
    <center>
      <div id='map3d' style='margin: 0; spacing: 0; height: 100%; width: 100%'></div>
    </center>
  </body>
</html>