В этом примере изображен имитационный полет беспилотного летательного аппарата (БПЛА) из базовой обсерватории Мауна-Лоа на вершину вулкана Мауна-Лоа на Гавайях. Сначала отобразите дорожку на географических осях и географическом шаре. Затем синхронизируйте вид и визуализируйте траекторию полета с помощью функций навигации камеры. Наконец, посмотрите на вершину вулкана Мауна-Лоа как на панораму.
Использование БПЛА для отслеживания характеристик изменения топологии, газов и пепловых облаков вокруг вулканов становится важной областью исследований для ученых [1]. БПЛА может путешествовать в опасных для вулканолога регионах. Моделирование траектории полета БПЛА перед отправкой его на задание может помочь в понимании топологии и рельефа местности. Для получения обзора и 2-D перспективы региона просмотрите местоположение базовой обсерватории Мауна-Лоа и вулкана Мауна-Лоа по географическим осям.
Укажите координаты базовой обсерватории Мауна-Лоа [2]. Высота обсерватории - в метрах над средним уровнем моря (MSL).
obslat = 19.5362; obslon = -155.5763; obsH = 3397.00;
Укажите координаты вершины Mauna Loa [3]. Высота вулкана ортометрическая и составляет в метрах.
mllat = 19.475; mllon = -155.608; mlH = 4169;
Для 2-D перспективы региона используйте 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

Используйте географические оси для просмотра обсерватории в 2-D и географический земной шар для просмотра обсерватории в 3-D.
Настройте отображение карты 2-D и 3-D, создав географические оси и географический глобус на одном и том же рисунке пользовательского интерфейса. Чтобы просмотреть больше карты 2-D, установите InnerPosition географических осей к его OuterPosition. Для просмотра обоих отображений карты с одной и той же базовой картой установите для базовой карты географических осей значение «satellite».
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

Импорт смоделированной трассы полета из базовой обсерватории Мауна-Лоа на вершину вулкана Мауна-Лоа. Файл содержит широты, долготы и высоты траектории БПЛА, относящиеся к среднему уровню моря.
trk = gpxread("sample_uavtrack.gpx");
tlat = trk.Latitude;
tlon = trk.Longitude;
talt = trk.Elevation;Рассчитать курс БПЛА в каждом путевом пункте с помощью azimuth функция.
wgs84 = wgs84Ellipsoid; theading = azimuth(tlat(1:end-1),tlon(1:end-1),tlat(2:end),tlon(2:end),wgs84); theading = [theading(1);theading(:)];
Рассчитать накопленную дистанцию для траектории полета БПЛА. distance функция не учитывает изменения высоты или высоты. Для того чтобы рассчитать расстояние, на которое БПЛА перемещается из точки в точку 3-D, нужно работать в геоцентрических декартовых координатах (X, Y, Z). Вычислите компоненты двухточечного смещения (в метрах) с помощью ecefOffset функция. Высотные данные полета БПЛА привязаны к среднему уровню моря. Для использования 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))
Показать местоположение БПЛА на карте 2-D, а также начальное и конечное расположение трассы полета с маркерами. Создать легенду для трассы БПЛА и маркеров.
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";Просмотреть координатное расположение, высоту и курс БПЛА с помощью пользовательской подсказки данных, соответствующей местоположению БПЛА. Включить расстояние от обсерватории.
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;

Анимация полета из базовой обсерватории Мауна-Лоа на вершину вулкана Мауна-Лоа. Просмотрите местоположение БПЛА на карте 2-D, анимировав маркер и подсказку данных. Анимация 3-D полета путем установки положения камеры. Для лучшего обзора трассы БПЛА установите высоту камеры на 100 метров над трассой полета. Обновите значение шага камеры для лучшего обзора траектории полета, когда БПЛА перемещается на вершину вулкана. Для просмотра текущего местоположения, высоты и курса БПЛА обновите наконечник данных текущим индексом.
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 градусов с вершины Mauna Loa, повернув курс камеры на 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