Визуализация угла тангажа БПЛА на 2-D и 3-D картах

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

Визуализация необходимой области к 2-D

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

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

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

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

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

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

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

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

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

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

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(:)];

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

Вычислите совокупное расстояние для траектории рейса БПЛА. 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-Degree панораму с верхней части вулкана Мауна-Лоа

Просмотрите 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

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

Преобразовать высоту (в метрах выше 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] 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.

См. также

Функции

Объекты

Свойства

Похожие темы