Введение в сценарий отслеживания и симуляции обнаружений датчиков

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

  • Как симулировать движение целей с помощью trackingScenario.

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

  • Как использовать различные плоттеры, предлагаемые theaterPlot для визуализации сценария, покрытия датчика и обнаружений.

Основным преимуществом использования генерации сценария и симуляции датчика над записью датчика является способность создавать редкие и потенциально опасные сценарии и алгоритмы слияния датчика тестирования с этими сценариями. Эти радиолокационные обнаружения могут использоваться, чтобы разработать различные алгоритмы отслеживания, такие как trackerGNN и trackerJPDA.

Симулируйте движущийся объект и его атрибуты

Создайте сценарий отслеживания с движущейся целью

Первым шагом в генерации моделируемых радиолокационных обнаружений является создание сценария слежения, в котором моделируется движение одной или нескольких движущихся целей. Чтобы настроить сценарий отслеживания, вы сначала создадите trackingScenario объект, который служит средой симуляции для всех движущихся целей, добавленных позже.

rng(2020); % For repeatable results.
scene = trackingScenario('UpdateRate',2.5)
scene = 
  trackingScenario with properties:

     IsEarthCentered: 0
          UpdateRate: 2.5000
      SimulationTime: 0
            StopTime: Inf
    SimulationStatus: NotStarted
           Platforms: {}

По умолчанию сценарий отслеживания запускается из SimulationTime на StopTime. Размер шага определяется UpdateRate в Гц. Основанный на частоты обновления 2,5 Гц, размер шага scene 0,4 сек. В настоящее время нет целей (задано с помощью platform), определенный в сценарии. Когда StopTime определяется как Infсценарий запускается до тех пор, пока не закончится движение всех платформ в сценарии. Определите платформу в сценарии с именем target:

target = platform(scene);

Теперь можно проверить, что цель определена в сценарии scene.

scene.Platforms{1}
ans = 
  Platform with properties:

       PlatformID: 1
          ClassID: 0
         Position: [0 0 0]
      Orientation: [0 0 0]
       Dimensions: [1×1 struct]
             Mesh: [1×1 extendedObjectMesh]
       Trajectory: [1×1 kinematicTrajectory]
    PoseEstimator: [1×1 insSensor]
         Emitters: {}
          Sensors: {}
       Signatures: {[1×1 rcsSignature]  [1×1 irSignature]  [1×1 tsSignature]}

По умолчанию создается безразмерный объект точки, но можно задать протяженность объекта по длине, ширине и высоте. Кроме того, тривиальное kinematicTrajectory сопоставлен с целевым объектом. Чтобы создать траекторию для цели, можно использовать waypointTrajectory объект. Можно настроить траекторию путевой точки путем определения серии путевых точек цели и соответствующего времени посещения. Можно также задать другие свойства траектории, такие как скорость и курс. См. waypointTrajectory для получения дополнительной информации.

Следующий код определяет путь ипподрома для цели с прямыми ногами 20 км и радиусом поворота 2 км. Высота траектории составляет 3 км, что определяется как -3 км в стандартной системе координат Северо-Восток-Даун, используемой в этом сценарии.

h = 3; % Unit in km
waypoints = 1e3*[  1    1    0   -1    -1   0     1    1
                   0   10   12   10   -10  -12  -10    0
                   h    h    h    h     h   h     h    h]';
course = [ 90   90  180   270  270    0   90   90]';% unit in degree
timeOfArrival = 60*[  0   1.5  1.8  2.1  5.1  5.4  5.7  7.2]';
targetTrajectory = waypointTrajectory('Waypoints', waypoints, 'TimeOfArrival', timeOfArrival);
target.Trajectory = targetTrajectory;

Визуализация и запуск сценария отслеживания

Чтобы визуализировать сценарий во время его выполнения, создайте theaterPlot и добавить trajectoryPlotter и a platformPlotter для визуализации траектории и цели, соответственно.

tp = theaterPlot('XLimits',[-12 12]*1e3,'Ylimits',[-12 12]*1e3,'ZLimits',[-1e4 1e4]);
trajPlotter = trajectoryPlotter(tp,'DisplayName','Trajectory');
plotTrajectory(trajPlotter,{waypoints})
targetPlotter = platformPlotter(tp,'DisplayName','Target');

Запустите сценарий отслеживания и визуализируйте движение цели в виде птичьего глаза.

while advance(scene) && ishghandle(tp.Parent)
    targetPose = pose(target,'true');
    plotPlatform(targetPlotter, targetPose.Position);
end

Сгенерируйте обнаружения с помощью радарных датчиков

В сценарии отслеживания можно сгенерировать обнаружения целей в трех различных подходах:

Моделируйте радарный датчик и симулируйте его обнаружения

Чтобы добавить датчик к сценарию, вы сначала создадите Platform на котором установлен датчик. The Platform объект также предоставляет targetPoses функция, которую можно использовать, чтобы получить положения целей относительно платформы.

Создайте башню и радар

Далее вы создаете платформу башни с размерностями 5 м, 5 м и 30 м в длину, ширину и высоту соответственно. Расположите башню налево по пути цели. Установите координату z положения башни равную -15 м так, чтобы дно башни находилось на горизонтальной плоскости системы координат сценария.

tower = platform(scene);
tower.Dimensions = struct ('Length',5,'Width',5,'Height',30,'OriginOffset', [0 0 0]);
tower.Trajectory.Position = [-1e4 0 15];

Определите плоттер платформы, чтобы показать башню.

towerPlotter = platformPlotter(tp,'DisplayName','Tower','Marker','o','MarkerFaceColor',[0 0 0]);
plotPlatform(towerPlotter,tower.Trajectory.Position,tower.Dimensions,tower.Trajectory.Orientation);

Используйте fusionRadarSensor в моностатическом режиме, чтобы реализовать моностатический сканирующий радарный датчик. По умолчанию датчик объекта сообщает об обнаружениях в координатной системе координат платформы, на которой установлен датчик. Можно изменить выходную систему координат с помощью DetectionsCoordinates свойство fusionRadarSensor. Доступные выходные системы координат 'Body'(по умолчанию), 'Scenario', 'Sensor rectangular', и 'Sensor spherical'.

radar1 = fusionRadarSensor(1,'UpdateRate',2.5,...
    'MountingLocation',[0 0 -15],'FieldOfView',[4;45],...
    'MechanicalAzimuthLimits',[-60 60],'MechanicalElevationLimits',[0 0],...
    'HasElevation',true,'FalseAlarmRate',1e-7)
radar1 = 
  fusionRadarSensor with properties:

              SensorIndex: 1
               UpdateRate: 2.5000
            DetectionMode: 'Monostatic'
                 ScanMode: 'Mechanical'
    InterferenceInputPort: 0
       EmissionsInputPort: 0

         MountingLocation: [0 0 -15]
           MountingAngles: [0 0 0]

              FieldOfView: [4 45]
              RangeLimits: [0 100000]

     DetectionProbability: 0.9000
           FalseAlarmRate: 1.0000e-07
           ReferenceRange: 100000

       TargetReportFormat: 'Clustered detections'

  Show all properties

Установите датчик на платформу башни.

tower.Sensors = radar1;

Генерация и моделирование обнаружений

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

radar1Plotter = coveragePlotter(tp,'DisplayName','Radar1 Beam','Color','b');
detPlotter = detectionPlotter(tp,'DisplayName','Detections',...
    'Marker','o','MarkerFaceColor',[1 0 0]);

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

restart(scene);
while advance(scene) && ishghandle(tp.Parent)
    
    view(70,40); % Comment this to show the bird's eye view;
    time = scene.SimulationTime;

    % Obtain the target pose and plot it.
    poseTarget = pose(target,'true');
    plotPlatform(targetPlotter,poseTarget.Position);
    
    % Obtain the target pose expressed in the tower's coordinate frame.
    poseInTower = targetPoses(tower);
    
    % Obtain the radar detections using the radar object.
    [detections, numDets] = radar1(poseInTower,time);
    
    % Extract detection positions and transform them to the scenario frame.
    detPos = zeros(numDets,3);
    for i=1:numDets
        detPos(i,:) = tower.Trajectory.Position + detections{i}.Measurement';
    end

    % Plot detections.
    if ~isempty(detPos)
        plotDetection(detPlotter,detPos);
    end
    
    % Plot the radar beam and coverage area.
    plotCoverage(radar1Plotter,coverageConfig(scene));
    
end

Сгенерируйте обнаружения для всех датчиков, установленных на платформе

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

radar2 = fusionRadarSensor(2,'Rotator','UpdateRate',2.5, ...
    'MountingLocation',[0 0 -15], 'FieldOfView',[4; 45], ...
    'HasElevation',true,'FalseAlarmRate',1e-7);
tower.Sensors{2} = radar2;
radar2Plotter = coveragePlotter(tp,'DisplayName','Radar 2 Beam', 'Color','g');

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

restart(scene);
while advance(scene) && ishghandle(tp.Parent)
    
    time = scene.SimulationTime;

    % Obtain the target pose and plot it.
    poseTarget = pose(target,'true');
    plotPlatform(targetPlotter,poseTarget.Position);

    % Plot the coverage of sensors.
    configs = coverageConfig(scene);
    plotCoverage(radar1Plotter,configs(1));
    plotCoverage(radar2Plotter,configs(2));

    % Generate the detections.
    [towerDetections, numDets] = detect(tower,time);

    % Extract detection positions and transform them to the scenario frame.
    detPos = NaN(numDets,3);
    for i=1:numDets
        detPos(i,:) = tower.Trajectory.Position + towerDetections{i}.Measurement';    
    end

    % Plot detections.
    if numDets
        plotDetection(detPlotter,detPos);
    end
    
end

Сгенерируйте обнаружения от всех датчиков в сценарии

Можно также сгенерировать обнаружения от всех датчиков в сценарии отслеживания, используя detect функция trackingScenario.

Чтобы проиллюстрировать этот подход, вы добавляете плоскость в сценарий и задаете ее траекторию путевой точки. Самолёт летит с юго-запада на северо-восток на высоте 2,9 км. Создайте плоттер платформы для плоскости.

plane = platform(scene);
planeTrajectory = waypointTrajectory('Waypoints',1e3*[-10 -10 -2.9; 12 12 -2.9],'TimeOfArrival',[0 80]);
plane.Trajectory = planeTrajectory;
planePlotter = platformPlotter(tp,'DisplayName','Plane','Marker','d','MarkerEdgeColor','k');

Установите на плоскости смотрящий радар с полем зрения 50 степеней. Создайте плоттер для радара.

radar3 = fusionRadarSensor(3,'No scanning','UpdateRate',2.5,'FieldOfView',[60,20], ...
    'HasElevation',true,'FalseAlarmRate',1e-7);
plane.Sensors = radar3;
radar3Plotter = coveragePlotter(tp,'DisplayName','Radar 3 Beam', 'Color','y');

Установите системы координат отчетности всех трех радаров в систему координат сценария. Необходимо включить инерционную навигационную систему (INS), прежде чем устанавливать координату обнаружения в систему координат сценария.

release(radar1);
radar1.HasINS = true;
radar1.DetectionCoordinates = 'Scenario';
release(radar2);
radar2.HasINS = true;
radar2.DetectionCoordinates = 'Scenario';
radar3.HasINS = true;
radar3.DetectionCoordinates = 'Scenario';

Перезапустите и запустите сценарий, сгенерируйте все обнаружения в сценарии и постройте график обнаружений.

% Hide the published figure. Show a pre-recorded animation instead.
f = tp.Parent.Parent;
if numel(dbstack) > 5
    f.Visible = 'on';
    f.Visible = 'off';
end

restart(scene);
while advance(scene) && ishghandle(tp.Parent)
     
    % Obtain the target pose and plot it.
    poseTarget = pose(target,'true');
    plotPlatform(targetPlotter,poseTarget.Position);
    
    % Obtain the plane pose and plot it.
    posePlane = pose(plane,'true');
    plotPlatform(planePlotter,posePlane.Position);
    
    % Plot the coverage of sensors.
    configs = coverageConfig(scene);
    plotCoverage(radar1Plotter,configs(1));
    plotCoverage(radar2Plotter,configs(2));
    plotCoverage(radar3Plotter,configs(3));
    
    % Generate the detections.
    scenarioDetections = detect(scene);
    numDets = numel(scenarioDetections);
    
    % Extract detection positions in the scenario frame.
    detPos = NaN(numDets,3);
    for i=1:numDets
        detPos(i,:) = scenarioDetections{i}.Measurement';    
    end
    
    % Plot detections.
    if numDets
        plotDetection(detPlotter,detPos);
    end
    
end

Из результатов в течение некоторого периода времени радар на плоскости может непрерывно обнаруживать цель. Радар на плоскости также генерирует несколько ложных обнаружений. Два радара на башне могут обнаружить самолет.

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

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