В этом примере показано, как вычислить и визуализировать видимость угла обзора самолета от наземного местоположения по ландшафту. Во-первых, импортируйте данные о ландшафте для области и примените их к 3-D географическому земному шару. Затем выполните анализ видимости "точка-точка" от наземного местоположения до симулированного угла тангажа и отобразите результаты на 3-D географическом земном шаре. Наконец, выполните анализ видимости точки к области от наземного местоположения, соответствующего самолету, летящему на постоянной высоте, и отобразите результаты на 2D географические оси.
Используйте анализ угла обзора для сценариев класса "земля-воздух", где свободная видимость важна, такой что касается радарного наблюдения, коммуникаций и планирования пути UAV. Этот пример применяет анализ к радарному наблюдению для аэропорта.
Задайте файл ландшафта DTED-формата, чтобы использовать для анализа данных и 3-D визуализации. Файл ландшафта был загружен с "SRTM Пусто Заполненный" набор данных, доступный от Геологической службы США (USGS).
dtedfile = "n39_w106_3arc_v2.dt1"; attribution = "SRTM 3 arc-second resolution. Data available from the U.S. Geological Survey.";
Импортируйте данные о файле DTED в рабочую область как массив и географический объект растровой привязки, задав тип возврата как дважды так, чтобы данные работали со всеми аналитическими функциями.
[Zterrain,Rterrain] = readgeoraster(dtedfile,"OutputType","double");
Просмотрите географические пределы и демонстрационное разрешение данных о ландшафте путем доступа к свойствам географического объекта растровой привязки. Пределы для файла соответствуют области вокруг Булдера, Колорадо, США, и разрешение соответствует формату уровня 1 DTED, который имеет демонстрационное разрешение 3 секунд дуги, или приблизительно 90 метров.
latlim = Rterrain.LatitudeLimits; lonlim = Rterrain.LongitudeLimits; latspc = Rterrain.SampleSpacingInLatitude; lonspc = Rterrain.SampleSpacingInLongitude; disp("Latitude limits of terrain: " + mat2str(latlim) + newline + ... "Longitude limits of terrain: " + mat2str(lonlim) + newline + ... "Terrain resolution in latitude: " + latspc*3600 + " arc seconds" + newline + ... "Terrain resolution in longitude: " + lonspc*3600 + " arc seconds")
Latitude limits of terrain: [39 40] Longitude limits of terrain: [-106 -105] Terrain resolution in latitude: 3 arc seconds Terrain resolution in longitude: 3 arc seconds
Добавьте пользовательские данные с файлом DTED для использования с 3-D визуализацией.
addCustomTerrain("southboulder",dtedfile,"Attribution",attribution)
Задайте пользовательский ландшафт с новым географическим земным шаром. Сохраните пользовательский ландшафт на земном шаре, когда данные добавляются установкой, держатся.
fig = uifigure; g = geoglobe(fig,"Terrain","southboulder"); hold(g,"on")
Задайте радарное наземное местоположение в Горе Рокки Столичный Аэропорт. Радар смонтирован на башне 10 метров над землей. Радарная высота является суммой наземного вертикального изменения и радарной высоты башни, на которую ссылаются к среднему уровню моря.
rdrlat = 39.913756; rdrlon = -105.118062; rdrtowerht = 10; rdralt = 1717 + rdrtowerht;
Постройте радарное местоположение на географическом земном шаре.
geoplot3(g,rdrlat,rdrlon,rdralt,"co", ... "LineWidth",6, ... "MarkerSize",1)
Симулируйте траекторию самолета, кружащегося по горам.
Задайте центральное местоположение кружащегося самолета.
tlat0 = 39.80384; tlon0 = -105.49916; tht0 = 3000;
Задайте траекторию waypoints для самолета с помощью Декартовых координат "восточного севера" (ENU). Задайте кривую с радиусом 5 км (5 000 м) и вертикальным смещением 1 км (1 000 м) более чем 1,5 оборота. Затем преобразуйте координаты ENU в геодезические координаты, на которые ссылаются к эллипсоиду WGS84.
azs = 1:540; r = 5000; [X,Y] = pol2cart(deg2rad(azs),r); Z = linspace(0,1000,numel(azs)); wgs84 = wgs84Ellipsoid; [tlat,tlon,tht] = enu2geodetic(X,Y,Z,tlat0,tlon0,tht0,wgs84);
Постройте траекторию самолета на географическом земном шаре. Представление по умолчанию или положение камеры, является служебным и ориентировано вниз.
traj = geoplot3(g,tlat,tlon,tht,"y", ... "HeightReference","ellipsoid", ... "LineWidth",3);
Просмотрите 3-D ландшафт и радарное местоположение издалека путем изменения положения камеры и углов поворота.
campos(g,39.77114,-105.62662,6670) camheading(g,70) campitch(g,-12)
Вычислите видимость угла обзора с los2
функционируйте и данные DTED.
los2
функционируйте поддерживает любую ортометрическую высоту (высота над средним уровнем моря) или высота над уровнем земли. Преобразуйте высоты траектории самолета от эллипсоидальной высоты до ортометрической высоты. Затем вычислите угол обзора от радарного местоположения аэропорта до каждой траектории самолета waypoint и преобразуйте результаты в логический массив.
numwaypts = numel(tlat); isvis = zeros(1,numwaypts); talt = tht - egm96geoid(tlat,tlon); for k = 1:numwaypts isvis(k) = los2(Zterrain,Rterrain,rdrlat,rdrlon,tlat(k),tlon(k),rdralt,talt(k),"MSL","MSL"); end isvis = logical(isvis);
Обратите внимание на то, что los2
вычисляет видимость угла обзора, принимающую, что на данные ссылаются к сферической Земле, тогда как на данные на самом деле ссылаются к эллипсоиду WGS84, и в результате могут быть незначительные несоответствия. Вычисление угла обзора также соответствует оптическому углу обзора и не составляет преломление через атмосферу.
Постройте видимость угла обзора. Используйте зеленые маркеры, где самолет отображается из аэропорта и красных маркеров, где это не отображается.
delete(traj) geoplot3(g,tlat(isvis),tlon(isvis),tht(isvis),"og", ... "HeightReference","ellipsoid", ... "LineWidth",2, ... "MarkerSize",1) geoplot3(g,tlat(~isvis),tlon(~isvis),tht(~isvis),"or", ... "HeightReference","ellipsoid", ... "LineWidth",2, ... "MarkerSize",1)
Просмотрите график угла обзора с точки зрения аэропорта. Получите геодезические координаты положения, которое является в 900 метрах к востоку, в 200 метрах к северу, и 100 метров от радарного местоположения. Затем установите положение камеры и углы поворота. Зеленые маркеры появляются в поле зрения, но красные маркеры или полностью или частично затруднены ландшафтом.
rdrht = rdralt + egm96geoid(rdrlat,rdrlon); [camlat,camlon,camht] = enu2geodetic(900,200,100,rdrlat,rdrlon,rdrht,wgs84); campos(g,camlat,camlon,camht) camheading(g,-110) campitch(g,0)
Предыдущие разделы выполнили анализ угла обзора "точка-точка" и визуализацию от радарного местоположения до траектории самолета. Теперь выполните анализ угла обзора точки к области и визуализацию от того же радарного местоположения по области ландшафта. Визуализация отображает ребро видимости для самолета, летящего на постоянной высоте.
Постройте радарное местоположение на новом рисунке с топографической 2D картой.
figure geoplot(rdrlat,rdrlon,"co", ... "LineWidth",6, ... "MarkerSize",3, ... "DisplayName","Radar location") hold on geobasemap topographic gx = gca; gx.InnerPosition = gx.OuterPosition;
Отобразите пределы пользовательского ландшафта как прямоугольник на карте.
latmin = latlim(1); latmax = latlim(2); lonmin = lonlim(1); lonmax = lonlim(2); geoplot([latmin latmin latmax latmax latmin],[lonmin lonmax lonmax lonmin lonmin], ... "LineWidth",1, ... "Color","k", ... "DisplayName","Terrain limits")
Отобразите легенду в северо-западном углу.
legend("Location","northwest")
Задайте три высоты над средним уровнем моря для самолета. Для каждой высоты:
Вычислите viewshed использование радарного местоположения как наблюдатель. viewshed задает область, которая имеет видимость угла обзора.
Найдите ребро видимости самолета путем вычисления контуров из viewshed данных.
Удалите маленькие сегменты контура.
Постройте контуры на географических осях.
tgtalts = [3000 4000 5000]; minVertices = 10; cfig = figure("Visible","off"); % Suppress contour plot using invisible figure cax = axes("Parent",cfig); for tgtalt = tgtalts vis = viewshed(Zterrain,Rterrain,rdrlat,rdrlon,rdralt,tgtalt,"MSL","MSL"); C = contourm(vis,Rterrain,"LevelList",1,"Parent",cax); clat = C(2,:); clon = C(1,:); clats = []; clons = []; k = 1; while k < size(C,2) numVertices = clat(k); if numVertices > minVertices % Do not plot small segments clats = [clats clat(k+1:k+numVertices) NaN]; %#ok<AGROW> clons = [clons clon(k+1:k+numVertices) NaN]; %#ok<AGROW> end k = k + numVertices + 1; end geoplot(gx,clats,clons,"LineWidth",2, ... "DisplayName", "Aircraft: " + string(tgtalt) + " m"); end
Контуры появляются, в основном, на запад радарного местоположения по горам. Контуры не появляются в других направлениях, потому что видимость не ограничивается ландшафтом в тех направлениях в пределах данных о ландшафте.
Если радар ограничивается видимостью угла обзора, то контуры соответствуют радарным зонам обслуживания для различной высоты, где самый близкий контур к радару соответствует радарному покрытию для самолета, летящего на уровне 3 000 метров, и самый далекий контур соответствует радарному покрытию для самолета, летящего на уровне 5 000 метров.
Как с los2
, viewshed
функция вычисляет видимость угла обзора, принимающую, что на данные ссылаются к сферической Земле, тогда как на данные на самом деле ссылаются к эллипсоиду WGS84, и в результате могут быть незначительные несоответствия. Вычисление угла обзора также соответствует оптическому углу обзора и не составляет преломление через атмосферу.
Вымойтесь путем закрытия географического земного шара и удаления импортированных данных о ландшафте.
if isvalid(fig) close(fig) end removeCustomTerrain("southboulder")
addCustomTerrain
| campos
| geoglobe
| geoplot3
| los2
| readgeoraster