Этот пример визуализирует симулированный рейс беспилотного воздушного транспортного средства (UAV) от Базовой Обсерватории Мауна-Лоа до верхней части Вулкана Мауна-Лоа на Гавайях. Во-первых, отобразите дорожку на географических осях и географическом земном шаре. Затем синхронизируйте представление и визуализируйте угол тангажа при помощи функций навигации камеры. Наконец, просмотрите верхнюю часть вулкана Мауна-Лоа как панорама.
Использование БПЛА, чтобы отследить характеристики изменяющейся топологии, газов и облаков пепла вокруг volcanos становится важной областью исследования для ученых [1]. БПЛА может переместиться в областях, которые опасны для вулканолога. Симуляция угла тангажа UAV до отсылки его на миссии может помочь с пониманием топологии и ландшафта. Чтобы получить обзор и 2D перспективу области, просмотрите местоположения Базовой Обсерватории Мауна-Лоа и Вулкан Мауна-Лоа в географические оси.
Задайте координаты Базовой Обсерватории Мауна-Лоа [2]. Высота обсерватории исчисляется в метрах над средним уровнем моря (MSL).
obslat = 19.5362; obslon = -155.5763; obsH = 3397.00;
Задайте координаты верхней части Мауна-Лоа [3]. Высота вулкана является ортометрикой и исчисляется в метрах.
mllat = 19.475; mllon = -155.608; mlH = 4169;
Для 2D перспективы области используйте geoaxes
и geoplot
построить местоположение обсерватории и верхнюю часть вулкана.
figure geoaxes("Basemap","satellite","ZoomLevel",12); hold("on") geoplot(obslat,obslon,"ow","MarkerSize",10,"MarkerFaceColor","magenta", ... "DisplayName","Mauna Loa Observatory"); geoplot(mllat,mllon,"ow","MarkerSize",10,"MarkerFaceColor","blue", ... "DisplayName","Mauna Loa Volcanao"); legend
Используйте географические оси, чтобы просмотреть обсерваторию в 2D и географическом земном шаре, чтобы просмотреть обсерваторию в 3-D.
Настройте 2D и 3-D отображение карты путем создания географических осей и географического земного шара в той же фигуре пользовательского интерфейса. Чтобы просмотреть больше 2D карты, установите InnerPosition
из географических осей к его OuterPosition
. Чтобы просмотреть оба отображения карты с той же основной картой, установите основную карту географических осей к "спутнику".
figpos = [1000 500 800 400]; uif = uifigure("Position",figpos); ug = uigridlayout(uif,[1,2]); p1 = uipanel(ug); p2 = uipanel(ug); gx = geoaxes(p1,"Basemap","satellite"); gg = geoglobe(p2); gx.InnerPosition = gx.OuterPosition; gg.Position = [0 0 1 1];
Просмотрите обсерваторию от на 200 метров выше ландшафта. Управляйте представлением географических осей путем изменения его центра карты и масштабируйте уровень. Можно синхронизировать представление географических осей с представлением географического земного шара путем преобразования высоты камеры земного шара к уровню изменения масштаба для осей. Вычислите аппроксимированный уровень изменения масштаба от высоты ландшафта при помощи heightToZoomLevel
локальная функция.
heightAboveTerrain = 200; gx.MapCenter = [obslat, obslon]; zoomLevel = heightToZoomLevel(heightAboveTerrain, obslat); gx.ZoomLevel = zoomLevel;
Управляйте представлением географического земного шара, меняя положение камеры. campos
функция требует, чтобы вы задали эллипсоидальную высоту (относительно эллипсоида WGS84) вместо ортометрической высоты (относительно среднего уровня моря). Преобразуйте высоту обсерватории к эллипсоидальной высоте. Все высоты исчисляются в метрах.
N = egm96geoid(obslat, obslon); obsh = obsH + N; ellipsoidalHeight = obsh + heightAboveTerrain; campos(gg,obslat,obslon,ellipsoidalHeight) drawnow
Импортируйте симулированную дорожку рейса от Базовой Обсерватории Мауна-Лоа до верхней части вулкана Мауна-Лоа. Файл содержит широты, долготы и высоты пути UAV, на который ссылаются к среднему уровню моря.
trk = gpxread("sample_uavtrack.gpx");
tlat = trk.Latitude;
tlon = trk.Longitude;
talt = trk.Elevation;
Вычислите UAV, направляющийся в каждой точке дорожки с помощью azimuth
функция.
wgs84 = wgs84Ellipsoid; theading = azimuth(tlat(1:end-1),tlon(1:end-1),tlat(2:end),tlon(2:end),wgs84); theading = [theading(1);theading(:)];
Вычислите совокупное расстояние для дорожки рейса UAV. distance
функция не учитывает разницы в вертикальном положении или высоту. Для того, чтобы вычислить расстояние, которое UAV перемещает от точки до точки в 3-D, необходимо работать в геоцентрических Декартовых координатах (X, Y, Z). Вычислите компоненты смещения "точка-точка" (в метрах) использование ecefOffset
функция. На высотные данные рейса UAV ссылаются к среднему уровню моря. Использовать ecefOffset
функция, на высоты нужно сослаться к эллипсоиду. Преобразуйте ортометрические высоты дорожки рейса к эллипсоидальной высоте (относительно эллипсоида WGS84). Все высоты исчисляются в метрах.
N = egm96geoid(tlat,tlon); h = talt + N;
Вычислите смещения расстояния.
lat1 = tlat(1:end-1); lat2 = tlat(2:end); lon1 = tlon(1:end-1); lon2 = tlon(2:end); h1 = h(1:end-1); h2 = h(2:end); [dx,dy,dz] = ecefOffset(wgs84,lat1,lon1,h1,lat2,lon2,h2);
Вычислите Евклидово расстояние между каждой парой смежных точек с помощью hypot
функция. Расстояние исчисляется в метрах.
distanceIncrementIn3D = hypot(hypot(dx, dy), dz);
Вычислите совокупное расстояние в 3-D и общее расстояние в метрах.
cumulativeDistanceIn3D = cumsum(distanceIncrementIn3D);
totalDistanceIn3D = sum(distanceIncrementIn3D);
fprintf("Total UAV track distance is %f meters.\n",totalDistanceIn3D)
Total UAV track distance is 8931.072120 meters.
Присвойте переменную для совокупного расстояния, которое будет использоваться для графического вывода анимации.
tdist = [0 cumulativeDistanceIn3D];
Постройте симулированный график рейса от Базовой Обсерватории Мауна-Лоа до верхней части вулкана Мауна-Лоа.
Постройте график рейса. По умолчанию географический земной шар помещает линию в центре отображения. Содержите географические оси, чтобы сохранить основную карту. Его местоположение не изменится, потому что вы ранее установили MapCenter
и ZoomLevel
.
geoplot3(gg,tlat,tlon,talt,"c","LineWidth",2,"HeightReference","geoid") hold(gx,"on") ptrack = geoplot(gx,tlat,tlon,"c","LineWidth",2);
Установите центр карты и масштабируйте уровень, чтобы быть сопоставимыми с 3-D представлением путем преобразования высоты камеры для земного шара к уровню изменения масштаба для осей.
[clat,clon,cheight] = campos(gg); gx.MapCenter = [clat,clon]; gx.ZoomLevel = heightToZoomLevel(cheight, clat); drawnow
Просмотрите линию рейса от положения запуска путем установки положения камеры на первую координату дорожки. Для лучшей перспективы, набор высота камеры к 75 метрам о высоте дорожки. Просмотрите прямо вниз в обсерваторию путем установки подачи камеры на-90. Просмотрите дорожку путем установки заголовка на третий элемент расчетного массива заголовка, поскольку первые две точки дорожки являются тем же местоположением, и расчетное достижение тех местоположений 0.
campos(gg,tlat(1),tlon(1)) camheight(gg,talt(1) + 75) campitch(gg,-90) camheading(gg,theading(3))
Покажите местоположение UAV в 2D карте и местоположения начала и конца дорожки рейса с маркерами. Создайте легенду для дорожки UAV и маркеров.
marker = geoplot(gx,tlat(1),tlon(1),"ow","MarkerSize",10,"MarkerFaceColor","k"); mstart = geoplot(gx,tlat(1),tlon(1),"ow","MarkerSize",10,"MarkerFaceColor","magenta"); mend = geoplot(gx,tlat(end),tlon(end),"ow","MarkerSize",10,"MarkerFaceColor","blue"); marker.DisplayName = "Current Location"; mstart.DisplayName = "Start Location"; mend.DisplayName = "End Location"; ptrack.DisplayName = "UAV Track"; legend(gx)
Просмотрите топологию области путем изменения основной карты.
gx.Basemap = "topographic";
Просмотрите координатное местоположение, высоту и заголовок UAV при помощи пользовательской всплывающей подсказки, которая соответствует местоположению UAV. Включайте расстояние от обсерватории.
dt = datatip(ptrack,"DataIndex",1,"Location","southeast"); dtrow = dataTipTextRow("Distance",tdist); dtrow(end+1) = dataTipTextRow("Altitude",talt); dtrow(end+1) = dataTipTextRow("Heading",theading); ptrack.DataTipTemplate.DataTipRows(end+1:end+3) = dtrow;
Анимируйте рейс от Базовой Обсерватории Мауна-Лоа до верхней части вулкана Мауна-Лоа. Просмотрите местоположение UAV на 2D карте путем анимации маркера и всплывающей подсказки. Анимируйте 3-D рейс путем установки положения камеры. Для лучшего представления дорожки UAV, набор высота камеры к на 100 метров выше дорожки рейса. Обновите значение подачи камеры для лучшего представления дорожки рейса, когда UAV перешел к верхней части вулкана. Чтобы просмотреть текущее местоположение, высота и заголовок UAV, обновляют всплывающую подсказку с текущим индексом.
pitch = -2.7689; campitch(gg,pitch) for k = 2:(length(tlat)-1) campos(gg,tlat(k),tlon(k)) camheight(gg,talt(k)+100) camheading(gg,theading(k)) set(marker,"LatitudeData",tlat(k),"LongitudeData",tlon(k)); dt.DataIndex = k; drawnow pause(.25) end campos(gg,tlat(end),tlon(end),talt(end)+100) dt.DataIndex = length(tlat);
Просмотрите полную панораму от верхней части Мауна-Лоа путем вращения камеры, возглавляющей 360 градусов. Вращайтесь по часовой стрелке с размером шага 5 степеней и запуститесь на следующих 5 шагах степени. Обновите направляющуюся всплывающую подсказку.
initialHeading = camheading(gg); increment = 5; initialHeading = initialHeading + (increment - mod(initialHeading,increment)); filename = 'panoramic.gif'; for degree = initialHeading:increment:initialHeading+360 heading = mod(degree,360); ptrack.DataTipTemplate.DataTipRows(end).Value(dt.DataIndex) = heading; camheading(gg,heading); drawnow end
function zoomLevel = heightToZoomLevel(height, lat) earthCircumference = 2 * pi * 6378137; zoomLevel = log2((earthCircumference *cosd(lat)) / height) + 1; zoomLevel = max(0, zoomLevel); zoomLevel = min(19, zoomLevel); end
[1] Уильямс, Сара К. П., “Изучающая Извержения вулканов с Самолетами-разведчиками”. Продолжения Национальной академии наук Соединенных Штатов Америки 110, № 27 (2 июля 2013): 10881. https://doi.org/10.1073/pnas.1309922110.
[2] NOAA. “Базовая Обсерватория Мауна-Лоа”. Глобальная Контрольная Лаборатория. Полученный доступ 16 июня 2020. https://www.esrl.noaa.gov/gmd/obop/mlo/.
[3] USGS. “Мауна-Лоа”. Гавайская Обсерватория Вулкана. Полученный доступ 16 июня 2020. https://www.usgs.gov/volcanoes/mauna-loa.
azimuth
| camheading
| campitch
| campos
| camroll
| egm96geoid