Визуализируйте угол тангажа UAV на 2D и 3-D картах

Этот пример визуализирует симулированный рейс беспилотного воздушного транспортного средства (UAV) от Базовой Обсерватории Мауна-Лоа до верхней части Вулкана Мауна-Лоа на Гавайях. Во-первых, отобразите дорожку на географических осях и географическом земном шаре. Затем синхронизируйте представление и визуализируйте угол тангажа при помощи функций навигации камеры. Наконец, просмотрите верхнюю часть вулкана Мауна-Лоа как панорама.

Визуализируйте необходимую область в 2D

Использование БПЛА, чтобы отследить характеристики изменяющейся топологии, газов и облаков пепла вокруг 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

Для 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 и 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];

Просмотрите обсерваторию в 2D

Просмотрите обсерваторию от на 200 метров выше ландшафта. Управляйте представлением географических осей путем изменения его центра карты и масштабируйте уровень. Можно синхронизировать представление географических осей с представлением географического земного шара путем преобразования высоты камеры земного шара к уровню изменения масштаба для осей. Вычислите аппроксимированный уровень изменения масштаба от высоты ландшафта при помощи heightToZoomLevel локальная функция.

heightAboveTerrain = 200;
gx.MapCenter = [obslat, obslon];
zoomLevel = heightToZoomLevel(heightAboveTerrain, obslat);
gx.ZoomLevel = zoomLevel;

Просмотрите обсерваторию в 3-D

Управляйте представлением географического земного шара, меняя положение камеры. campos функция требует, чтобы вы задали эллипсоидальную высоту (относительно эллипсоида WGS84) вместо ортометрической высоты (относительно среднего уровня моря). Преобразуйте высоту обсерватории к эллипсоидальной высоте. Все высоты исчисляются в метрах.

N = egm96geoid(obslat, obslon);
obsh = obsH + N;
ellipsoidalHeight = obsh + heightAboveTerrain;
campos(gg,obslat,obslon,ellipsoidalHeight)
drawnow

Импортируйте данные о дорожке рейса и вычислите заголовок и 3-D расстояние

Импортируйте симулированную дорожку рейса от Базовой Обсерватории Мауна-Лоа до верхней части вулкана Мауна-Лоа. Файл содержит широты, долготы и высоты пути UAV, на который ссылаются к среднему уровню моря.

T = readgeotable("sample_uavtrack.gpx","Layer","track_points");
tlat = T.Shape.Latitude';
tlon = T.Shape.Longitude';
talt = T.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(:)];

Вычислите 3-D расстояния

Вычислите совокупное расстояние для дорожки рейса 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

Локальные функции

Преобразуйте Высоту (в метрах выше эллипсоида WGS84), чтобы Масштабировать Уровень

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://gml.noaa.gov/obop/mlo/.

[3] USGS. “Мауна-Лоа”. Гавайская Обсерватория Вулкана. Полученный доступ 16 июня 2020. https://www.usgs.gov/volcanoes/mauna-loa.

Смотрите также

Функции

Объекты

Свойства

Похожие темы