Этот пример визуализирует моделируемое беспилотное воздушное транспортное средство (БПЛА), рейс от базовой обсерватории Мауна-Лоа до верхней части вулкана Мауна-Лоа на Гавайях. Сначала отобразите дорожку на географических осях и географическом глобусе. Затем синхронизируйте вид и визуализируйте угол тангажа с помощью функций навигации камеры. Наконец, рассмотрим верхнюю часть вулкана Мауна-Лоа как панораму.
Использование БПЛА для отслеживания характеристик изменяющейся топологии, газов и пепловых облаков вокруг вулканов становится важным направлением исследований для ученых [1]. БПЛА может путешествовать по опасным для вулканолога областям. Симуляция угла тангажа БПЛА перед отправкой его на задание может помочь с пониманием топологии и местности. Чтобы получить обзор и 2-D перспективу области, посмотрите местоположения базовой обсерватории Мауна-Лоа и вулкана Мауна-Лоа в географических осях.
Укажите координаты базовой обсерватории Мауна-Лоа [2]. Высота обсерватории в метрах над средним уровнем моря (MSL).
obslat = 19.5362; obslon = -155.5763; obsH = 3397.00;
Задайте координаты верхней части Мауна Лоа [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;
Управляйте видом географического глобуса путем изменения положения камеры. The 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(:)];
Вычислите совокупное расстояние для траектории рейса БПЛА. The 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] Williams, Sarah C. P. «Studing Volcanic Eruptions with Aerial Drones». Материалы Национальной академии наук Соединенных Штатов Америки 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