Многоплатформенная радарная генерация обнаружения

В этом примере показано, как сгенерировать радарные обнаружения от многоплатформенной радарной сети. Сеть включает три платформы дальних: два бортовых и одно наземное. Такие синтетические данные могут использоваться, чтобы проверить производительность отслеживания архитектуры для различных целевых типов и маневров.

Радарные платформы и цели моделируются в сценарии как platforms. Симуляция движения платформ в сценарии управляема trackingScenario.

% Add path to helper files used by this example.
helperPath = fullfile(matlabroot,'examples','fusion','main');
addpath(helperPath);

% Remove path to helper files when 'cleanPath' variable is cleared or deleted.
cleanPath = onCleanup(@()rmpath(helperPath));

% Create a tracking scenario to manage the movement of the platforms.
scene = trackingScenario;                % Create tracking scenario
sceneDuration = 60;                      % Duration of scenario in seconds
scene.StopTime = sceneDuration;

Бортовая платформа с вращающимся радарным массивом

Добавьте бортовую платформу в сценарий, переместившись на север на уровне 650 км/час на крейсерской высоте 10 км. Сгенерируйте траекторию платформы от waypoints использование waypointTrajectory.

ht = 10e3;                               % Altitude in meters
spd = 650*1e3/3600;                      % Speed in m/s
start = [-spd*sceneDuration/2 5e3 -ht];
stop  =  [spd*sceneDuration/2 5e3 -ht];
traj  = waypointTrajectory('Waypoints',[start;stop],'TimeOfArrival',[0; sceneDuration]);

% Create the airborne platform with its trajectory.
plat1 = platform(scene,'Trajectory',traj);

Добавьте плоский радар массивов в платформу. Смонтируйте радар в антенном колпаке на 5 метров выше платформы. Смоделируйте радар, когда механически вращение поэтапно осуществило массив. Радар электронно складывает лучи в вертикальном изменении вдоль опорного направления массива. Спецификации для смоделированного радара сведены в таблицу ниже:

  • Чувствительность: 0 dBsm 375 км

  • Механическое Сканирование: Азимут только

  • Механические Пределы Сканирования: от 0 до 360 градусов

  • Электронное Сканирование: Вертикальное изменение только

  • Электронные Пределы Сканирования:-2 к 45 градусам

  • Поле зрения: азимут на 1 градус, вертикальное изменение на 47 градусов

  • Измерения: Азимут, вертикальное изменение, область значений

  • Разрешение азимута: 1 градус

  • Разрешение вертикального изменения: 5 градусов

  • Разрешение области значений: 30 м

Смоделируйте механически вращающийся радар с помощью monostaticRadarSensor.

sensorIndex = 1; % Identifies originating sensor of each detection
radar = monostaticRadarSensor(sensorIndex, 'Rotator', ...
    'MountingLocation', [0 0 -5], ...    % m
    'UpdateRate', 12.5, ...              % Hz
    'ReferenceRCS', 0, ...               % dBsm
    'ReferenceRange', 375e3, ...         % m
    'ScanMode', 'Mechanical and electronic', ...
    'MechanicalScanLimits', [0 360;0 0], ... % deg
    'ElectronicScanLimits', [0 0;-2 45], ... % deg
    'FieldOfView',[1;47.1], ...          % deg
    'HasElevation', true, ...
    'AzimuthResolution', 1, ...          % deg
    'ElevationResolution', 5, ...        % deg
    'RangeResolution', 30, ...           % m
    'HasINS', true);

% Attach the radar to its airborne platform.
plat1.Sensors = radar;

Бортовая платформа с двумя радарными массивами

Добавьте вторую бортовую платформу в сценарий, переместившись на юг на уровне 550 км/час на крейсерской высоте 8 км.

ht = 8e3;                                % Altitude in meters
spd = 550*1e3/3600;                      % Speed in m/s
start =  [spd*sceneDuration/2 5e3 -ht];
stop  = [-spd*sceneDuration/2 5e3 -ht];
traj  = waypointTrajectory('Waypoints',[start;stop],'TimeOfArrival',[0; sceneDuration]);
plat2 = platform(scene,'Trajectory',traj);

Несколько датчиков могут быть смонтированы на платформе. Добавьте радар, состоявший из двух линейных поэтапных массивов, смонтированных на 5 метров выше платформы. Смонтируйте массивы так, чтобы один массив просмотрел правую сторону корпуса, и другой массив просматривает левую сторону корпуса. Оба массива предоставляют страховую защиту по 150 секторам азимута степени по обе стороны от платформы. Вертикальное изменение не измеряется линейными матрицами. Спецификации для этого радара сведены в таблицу ниже:

  • Чувствительность: 0 dBsm 350 км

  • Механическое сканирование: нет

  • Электронное Сканирование: Азимут только

  • Электронные Пределы Сканирования:-75 к 75 градусам

  • Поле зрения: азимут на 1 градус, вертикальное изменение на 60 градусов

  • Измерения: Азимут, область значений

  • Разрешение азимута: 1 градус

  • Разрешение области значений: 30 м

Смоделируйте линейный поэтапный радар массивов с помощью monostaticRadarSensor.

% Create right facing radar by setting radar's yaw to 90 degrees.
sensorIndex = sensorIndex+1;
rightRadar = monostaticRadarSensor(sensorIndex, 'Sector', ...
    'SensorIndex', sensorIndex, ...
    'MountingLocation', [0 0 -5], ...    % m
    'MountingAngles', [90 0 0], ...      % deg, look over right side
    'UpdateRate', 12.5, ...              % Hz
    'ReferenceRCS', 0, ...               % dBsm
    'ReferenceRange', 350e3, ...         % m
    'ScanMode','Electronic', ...
    'ElectronicScanLimits',[-75 75], ... % deg
    'FieldOfView',[1;60], ...            % deg
    'HasElevation', false, ...
    'AzimuthResolution', 1, ...          % deg
    'RangeResolution', 30, ...           % m
    'HasINS', true);

% Create an identical radar looking over the left side of the airframe.
leftRadar = clone(rightRadar);
sensorIndex = sensorIndex+1;
leftRadar.SensorIndex = sensorIndex;
leftRadar.MountingAngles(1) = -90; % Look over the left side

% Attach the two linear radar arrays to the airborne platform.
plat2.Sensors = {leftRadar, rightRadar};

Наземная платформа с прямоугольным радарным массивом

Добавьте наземный радар с помощью прямоугольного поэтапного массива, смонтированного на 5 метров выше его трейлера. Радар электронно рассматривает 60 промежутков азимута степени и 20 градусов вертикального изменения над землей с помощью электронного шаблона развертки растра.

  • Чувствительность: 0 dBsm 350 км

  • Механическое сканирование: нет

  • Электронное Сканирование: Азимут и повышение

  • Электронные Пределы Сканирования:-30 к азимуту на 30 градусов,-20 к вертикальному изменению на 0 градусов

  • Поле зрения: азимут на 1 градус, вертикальное изменение на 5 градусов

  • Измерения: Азимут, вертикальное изменение, область значений

  • Разрешение азимута: 1 градус

  • Разрешение вертикального изменения: 5 градусов

  • Разрешение области значений: 30 м

Смоделируйте прямоугольный поэтапный радар массивов с помощью monostaticRadarSensor.

% Create an electronically scanning rectangular array radar.
sensorIndex = sensorIndex+1;
radar = monostaticRadarSensor(sensorIndex, 'Raster', ...
    'MountingLocation', [0 0 -5], ...    % m
    'UpdateRate', 25, ...                % Hz
    'ReferenceRCS', 0, ...               % dBsm
    'ReferenceRange', 350e3, ...         % m
    'ScanMode','Electronic', ...
    'ElectronicScanLimits',[-30 30;-20 0],... % deg
    'FieldOfView', [1;5], ...            % deg
    'HasElevation', true, ...
    'AzimuthResolution', 1, ...          % deg
    'ElevationResolution', 5, ...        % deg
    'RangeResolution', 30, ...           % m
    'HasINS', true);

% Attach the rectangular radar array to the trailer platform.
plat3 = platform(scene,'Sensors',radar);
plat3.Trajectory.Position = [-30e3 30e3 0];
plat3.Trajectory.Orientation = quaternion([-60 0 0],'eulerd','zyx','frame');

Бортовые цели

Добавьте четыре бортовых цели в области наблюдения.

  1. Авиалайнер перемещаясь на северо-восток на уровне 700 км/час на высоте на 3 000 м

  2. Пересечение авиалайнера, перемещаясь на юго-восток на уровне 900 км/час на высоте на 4 000 м

  3. Авиалайнер перемещаясь на восток на уровне 600 км/час на высоте на 9 000 м

  4. Струя, перемещающаяся на уровне 300 км/час и выполняющая 90 поворотов степени на высоте на 3 000 м

% Add airliner traveling northeast.
ht = 3e3;                                % Altitude in meters
spd = 700*1e3/3600;                      % Speed in m/s
ang = 45;
rot = [cosd(ang) sind(ang) 0;-sind(ang) cosd(ang) 0; 0 0 1];
offset = [-15e3 -25e3 -ht];
start = offset - [spd*sceneDuration/2 0 0]*rot;
stop  = offset + [spd*sceneDuration/2 0 0]*rot;
traj  = waypointTrajectory('Waypoints',[start;stop],'TimeOfArrival',[0; sceneDuration]);

rcs = rcsSignature('Pattern', [10 10; 10 10], ...
        'Azimuth', [-180 180], 'Elevation', [-90 90], ...
        'Frequency', [0 10e9]);          % Define custom RCS signature of target
platform(scene,'Trajectory',traj,'Signatures',rcs);

% Add crossing airliner traveling southeast.
ht = 4e3;                                % Altitude in meters
spd = 900*1e3/3600;                      % Speed in m/s
offset = [(start(1)+stop(1))/2 (start(2)+stop(2))/2 -ht];
start = offset + [0 -spd*sceneDuration/2 0]*rot;
stop  = offset + [0  spd*sceneDuration/2 0]*rot;
traj  = waypointTrajectory('Waypoints',[start;stop],'TimeOfArrival',[0; sceneDuration]);
rcs = rcsSignature;                      % Default 10 dBsm RCS at all viewing angles
platform(scene,'Trajectory',traj,'Signatures',rcs);

% Add eastbound airliner.
ht = 9e3;                                % Altitude in meters
spd = 600*1e3/3600;                      % Speed in m/s
start = [30e3 -spd*sceneDuration/2-20e3 -ht];
stop  = [30e3  spd*sceneDuration/2-20e3 -ht];
traj  = waypointTrajectory('Waypoints',[start;stop],'TimeOfArrival',[0; sceneDuration]);
platform(scene,'Trajectory',traj);       % Default 10 dBsm RCS at all viewing angles

% Add jet turning with horizontal acceleration of 0.3 G.
ht = 3e3;                                % Altitude in meters
spd = 300*1e3/3600;                      % Speed in m/s
accel = 0.3*9.8;                         % Centripetal acceleration m/s^2
radius = spd^2/accel;                    % Turn radius in meters
t0 = 0;
t1 = t0+5;
t2 = t1+pi/2*radius/spd;
t3 = sceneDuration;
start = [0e4 -4e4 -ht];
wps = [ ...
    0                   0                   0; ... % Begin straight segment
    spd*t1              0                   0; ... % Begin horizontal turn
    spd*t1+radius       radius              0; ... % End of horizontal turn
    spd*t1+radius       radius+spd*(t3-t2)  0];    % End of second straight segment
traj  = waypointTrajectory('Waypoints',start+wps,'TimeOfArrival',[t0; t1; t2; t3]);
platform(scene,'Trajectory',traj);

Генерация радарных обнаружений

Следующий цикл совершенствует платформу и целевые положения, пока конец сценария не был достигнут. Для каждого шага вперед в сценарии обнаружения сгенерированы с каждой платформы и буферизованы.

trackingScenario должен совершенствоваться в фиксированном временном интервале. Установите UpdateRate для сценария так, чтобы временной интервал был самым большим общим знаменателем (GCD) всех интервалов обновления, сопоставленных с частотами обновления радаров. commonUpdateRate поддерживание функции находит интервал обновления характерным для всех радаров в этом сценарии.

platforms = scene.Platforms;
scene.UpdateRate = commonUpdateRate(platforms);
nPlat = numel(platforms);

rng(2018); % Set random seed for repeatable results

% Create a display to show the true and measured positions of the detected targets and platforms.
theaterDisplay = helperMultiPlatDisplay(scene, 'XLim', [-45 45], ...
    'YLim', [-45 45], 'ZLim', [-40 0]);
title('Multiplatform Radar Scenario');
legend('show');

% Show 3D view of the scenario.
view(-60,10);

while advance(scene)
    % Get current simulation time.
    time = scene.SimulationTime;

    % Generate detections from radars on each platform.
    detBuffer = {};
    configsBuffer = [];
    for iPlat = 1:nPlat
        % Generate detections from the platform's radars.
        [dets,~,configs] = detect(platforms{iPlat}, time);

        % Buffer detections and configurations from this platform's radars.
        detBuffer = [detBuffer;dets]; %#ok<AGROW>
        configsBuffer = [configsBuffer;configs]; %#ok<AGROW>
    end

    % Update display with current beam positions and detections.
    theaterDisplay(detBuffer,configsBuffer);

    % Log sensor data and ground truth.
    [truthLog, dataLog] = logScenario(time, scene, configsBuffer, detBuffer);
end
snapnow(theaterDisplay);

% Save scenario and detections.
save MultiplatformRadarDetectionGeneration.mat scene truthLog dataLog

Заметьте большие лучи вентилятора с бортовых платформ и узкий луч карандаша от наземного радара, выполняющего развертку растра. Траектории основной истины лучше визуализируются в 2D проекции. Заметьте четыре цели, представленные треугольниками. Приблизительно 30 км на оси X являются авиалайнером, перемещаясь на восток (слева направо). Приблизительно 2 км на оси X являются струей, выполняющей поворот по часовой стрелке. Дальнейший юг является двумя пересекающимися авиалайнерами.

view(-90,90); % 2D view

Постройте регистрируемые обнаружения с их неопределенностью измерения. Каждый цвет соответствует платформе, генерирующей обнаружения. Легенда от предыдущего отображения применяется ко всем графикам в следующем анализе. Для краткости не повторяется эта легенда. Заметьте, что радары генерируют ложные предупреждения. Это обнаружения в следующем графике, которые не лежат около ни одной из целевых траекторий.

theaterDisplay(dataLog.Detections);
title([num2str(numel(dataLog.Detections)) ' Detections Logged from ' num2str(numel(truthLog.SimulationTime)) ' Simulation Steps']);
legend('hide');

3D представление в следующем графике показывает, как эти обнаружения распределяются в вертикальном изменении. Для платформ с 3D датчиками (синие и желтые платформы), обнаружения сопровождают целевые траектории. Обнаружения 2D платформы (красная платформа) возмещены в вертикальном изменении от целевых траекторий, потому что ее радар не может измерить вертикальное изменение. Неопределенность измерения с 1 сигмой показывают для каждого обнаружения как серый эллипсоид, сосредоточенный на измеренном целевом положении его обнаружения (показавшую заполненными кругами).

view([-60 25]); % 3D view

Увеличьте масштаб струи, выполняющей 90 горизонтальных поворотов степени. О неопределенности измерения с 1 сигмой сообщает радар согласно разрешению радара и отношению сигнал-шум (SNR) для каждого обнаружения. Цели в более длинных областях значений или с меньшими значениями ОСШ будут иметь большую неопределенность измерения, чем цели в более близких областях значений, которые будут иметь меньшие размеры интервала разрешения и большие значения ОСШ. Заметьте, что синие обнаружения имеют меньшую неопределенность измерения, чем желтые обнаружения. Это вызвано тем, что синие обнаружения происходят из бортовой платформы (Платформа 1), который намного ближе к цели, чем наземная платформа (Платформа 3), который сгенерировал желтые обнаружения.

xlim([-3 9]); ylim([-44 -32]); zlim([-12 0]);
axis('square');
title('Jet Executing Horizontal Turn');

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

Увеличьте масштаб двух пересекающихся авиалайнеров. Заметьте, что синий бортовой радар с вращающимся массивом генерирует наименьшее количество количества обнаружений (только 4 обнаружения для этих двух целей), но эти обнаружения являются самыми точными (самые маленькие замещающие знаки). Небольшое количество обнаружений с этой платформы происходит из-за 360 механических сканирований ее радара, которые ограничивают, как часто ее луч может пересмотреть цель в сценарии. Другие платформы имеют радары, которые сканируют меньшие области, позволяя им пересмотреть цели на более высоком уровне.

view([-55 20]);
xlim([-22 -10]); ylim([-31 -19]);
title('Crossing Airliners');

Увеличьте масштаб авиалайнера, переместившись на восток. Те же наблюдения относительно относительного количества обнаружений и точности с различных радарных платформ применяются.

view([-70 10]);
xlim([24 36]); ylim([-26 -14]); zlim([-15 -3])
title('Airliner Traveling East');

Сводные данные

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

% Remove path to helper files used by this example.
delete(cleanPath);

Вспомогательные Функции

commonUpdateRate

Эта функция находит общую частоту обновления через все датчики присоединенной к каждому platform в массиве ячеек платформ. trackingScenario должен усовершенствованный в фиксированном временном интервале. Эта функция обеспечивает интервал выборки, который характерен для всех датчиков, смоделированных в сценарии.

function rate = commonUpdateRate(platforms)
dt = [];
for iPlat = 1:numel(platforms)
    thisPlatform = platforms{iPlat};
    theseSensors = thisPlatform.Sensors;
    for iSensor = 1:numel(theseSensors)
        thisSensor = theseSensors{iSensor};
        tau = round(1e6/thisSensor.UpdateRate); % microseconds
        if isempty(dt)
            dt = tau;
        else
            dt = gcd(dt,tau);
        end
    end
end
rate = 1e6./dt; % Hz
end

logScenario

Эта функция регистрирует основную истину и данные о датчике сценария.

function [truthLog, dataLog] = logScenario(time, scene, configsBuffer, detBuffer)

persistent isInitialized
persistent ptruthLog
persistent pdataLog

if isempty(isInitialized)
    ptruthLog.SimulationTime = [];
    ptruthLog.Truth = [];
    ptruthLog.Configurations = [];

    pdataLog.DetectionTime = [];
    pdataLog.Detections = {};
    isInitialized = true;
end

% Log position and velocity of all platforms at each time step along with
% each sensor field of view
ptruthLog.SimulationTime = [ptruthLog.SimulationTime; time];
ptruthLog.Truth = [ptruthLog.Truth; platformPoses(scene)'];
ptruthLog.Configurations = [ptruthLog.Configurations; configsBuffer'];
truthLog = ptruthLog;

% Log sensor detections
for k = 1:numel(detBuffer)
    pdataLog.DetectionTime = [pdataLog.DetectionTime; time];
    pdataLog.Detections = [pdataLog.Detections(:); detBuffer(k)];
end
dataLog = pdataLog;
end