В этом примере показано, как имитировать обнаружение и отслеживание призрачной цели из-за многолучевых отражений, когда энергия сигнала отражается от другой цели перед возвращением на радар. Вы будете моделировать призраки с помощью статистической радиолокационной модели и более подробной модели приемопередатчика, которая генерирует IQ-сигналы.
Во многих сценариях шоссе задействованы не только другие автомобили, но и заграждения и ограждения. Рассмотрим простую магистраль, созданную с помощью приложения «Конструктор сценариев вождения». drivingScenario см. пример слияния датчиков с использованием синтетических радаров и данных зрения. Используйте функцию helperSimpleHighwayScenarioDSD экспортирован из конструктора сценариев вождения, чтобы получить наш сценарий шоссе и ручку к эго-транспортному средству.
% Set random seed for reproducible results rndState = rng('default'); % Create scenario using helper [scenario, egoVehicle] = helperSimpleHighwayScenarioDSD();
Для моделирования обнаружений, генерируемых передним автомобильным радаром, используйте radarDataGenerator. Использовать центральную частоту 77 ГГц, что типично для автомобильных радаров. Мы создадим детекторы до 100 метров в диапазоне и выберем PRF, который позволит нам однозначно измерить скорость закрытия до 67 м/с.
% Automotive radar system parameters fc = 77e9; % Center frequency (Hz) rangeMax = 100; % Maximum range (m) rangeRes = 2.5; % Range resolution (m) vMax = 67; % Maximum closing rate of cars (m/s) c = physconst('LightSpeed'); % Speed of light (m/s) bw = rangeres2bw(rangeRes,c); % Signal bandwidth (Hz) lambda = freq2wavelen(fc,c); % Wavelength (m) prf = speed2dop(2*vMax,lambda); % Maximum Doppler shift (Hz) Ramb = c/(2*prf); % Maximum unambiguous range (m) % Create a forward-looking automotive radar rdr = radarDataGenerator(1, 'No scanning', ... 'MountingLocation', [3.4 0 0.2], ... 'AzimuthResolution', 4, ... 'RangeResolution', rangeRes, ... 'CenterFrequency', fc, ... 'Bandwidth', bw, ... 'HasRangeRate', true, ... 'RangeRateResolution', 10, ... 'ReferenceRange', 100, ... 'FieldOfView', [70 5], ... 'RangeLimits', [0 rangeMax], ... 'RangeRateLimits', [-100 100], ... 'HasRangeAmbiguities', true, ... 'MaxUnambiguousRange', Ramb, ... 'HasRangeRateAmbiguities', true, ... 'MaxUnambiguousRadialSpeed', vMax/2, ... 'TargetReportFormat', 'Detections', ... 'HasOcclusion', false, ... 'Profiles',actorProfiles(scenario)); % Show all detections for illustrative purposes rdr.DetectionProbability = 1; % Create bird's eye plot and detection plotter function [~,detPlotterFcn] = helperSetupBEP(egoVehicle,rdr); % Generate raw detections time = scenario.SimulationTime; tposes = targetPoses(egoVehicle); [dets,~,config] = rdr(tposes,time); % Plot detections detPlotterFcn(dets,config); title('Free Space (no multipath)')

На предыдущем рисунке показаны места обнаружения вдоль целевого транспортного средства, а также вдоль боковой стороны барьера. Тем не менее, обнаружения не всегда так хорошо ведут себя. Одним из явлений, которое может создать значительные проблемы для инженеров-радаров, является многолучевое распространение. Многолучевое распространение - это когда сигнал не только распространяется непосредственно на намеченную цель и обратно на радар, но и включает в себя дополнительные отражения от объектов в окружающей среде.
Когда радиолокационный сигнал распространяется на интересующую цель, он может поступать по различным путям. Помимо прямого пути от РЛС к цели, а затем обратно к РЛС, существуют и другие возможные пути распространения. Количество путей неограниченно, но с каждым отражением энергия сигнала будет уменьшаться. Обычно для моделирования этого явления используется модель распространения с учетом путей с тремя отскоками.
Чтобы понять модель с тремя отскоками, сначала рассмотрим более простые пути с одним и двумя отскоками, как показано на следующих рисунках.

Траектория одностороннего отскока распространяется от РЛС (1) к цели (2) и затем отражается от цели (2) обратно к РЛС. Это часто называют траекторией прямой или прямой видимости.
Существуют два уникальных пути распространения, которые состоят из двух отскоков.
Первый двухзвенный путь распространяется от РЛС (1) до отражающей поверхности (3), затем до цели (2) перед возвращением на РЛС (1). Поскольку сигнал, принятый на радаре, поступает от последнего отскока от истинной цели, он будет генерировать призрачные обнаружения в том же направлении, что и истинная цель. Поскольку длина пути для этого распространения больше, он будет отображаться на более дальнем диапазоне, чем истинные целевые обнаружения.
Второй двухзвенный путь распространяется от РЛС (1) до цели (2), затем до отражающей поверхности (3) перед возвращением на РЛС (1). В этом случае призрачные обнаружения будут появляться на другой стороне отражающей поверхности, поскольку это направление, в котором радар будет принимать отраженный сигнал.
Обратите внимание, что длина контура для обоих контуров с двумя отскоками одинакова. В результате измеренная дальность и дальность для этих трактов также будут одинаковыми.

Путь с тремя отскоками отражается от барьера дважды. Этот путь никогда не распространяется непосредственно к цели или обратно к радару. На другой стороне отражающей поверхности появятся призрачные обнаружения с тремя отскоками, поскольку это направление, в котором радар будет принимать отраженный сигнал. Кроме того, он имеет самую длинную длину пути распространения из трех путей с отскоком и, следовательно, будет иметь самый длинный измеренный диапазон из трех путей. Этот путь соответствует зеркальному отражению истинной цели на другой стороне барьера.
Установите HasGhosts свойство на radarDataGenerator для моделирования обнаружений, генерируемых этими путями с тремя отскоками.
% Enable ghost target model release(rdr); rdr.HasGhosts = true; % Generate raw detections time = scenario.SimulationTime; tposes = targetPoses(egoVehicle); [dets,~,config] = rdr(tposes,time); % Plot detections detPlotterFcn(dets,config); title('Simple Multipath Environment');

На предыдущем рисунке воспроизводится анализ трех путей распространения. Первые 2-подпрыгивающие призраки лежат в направлении цели с несколько большей дальностью. Второй 2-отскок лежит в направлении зеркального изображения цели, генерируемого отражением от барьера, и в том же диапазоне, что и первый 2-отскок. И обнаруженные 3-рывки следуют контуру изображенного призрака целевого транспортного средства.
Поскольку дальность и скорости обнаружения цели-призрака подобны дальности и скорости истинных целей, они будут иметь кинематику, согласованную для трекера, который сконфигурирован для отслеживания истинных обнаружений цели. Эта согласованность между кинематикой реальных и призрачных целей приводит к тому, что дорожки генерируются для призрачной цели на другой стороне барьера.
Установите TargetReportFormat свойство на radarDataGenerator to 'Tracks' для моделирования дорожек, генерируемых радаром в присутствии многолучевого распространения.
% Output tracks instead of detections release(rdr); rdr.TargetReportFormat = 'Tracks'; rdr.ConfirmationThreshold = [2 3]; rdr.DeletionThreshold = [5 5]; FilterInitializationFcn = 'initcvekf'; % constant-velocity EKF % Create a new bird's eye plot to plot the tracks [bep,trkPlotterFcn] = helperSetupBEP(egoVehicle,rdr); % Run simulation restart(scenario); scenario.StopTime = 7.5; while advance(scenario) time = scenario.SimulationTime; tposes = targetPoses(egoVehicle); % Generate tracks [trks,~,config] = rdr(tposes,time); % Filter out tracks corresponding to static objects (e.g. barrier) dyntrks = helperKeepDynamicObjects(trks, egoVehicle, rdr); % Visualize dynamic tracks helperPlotScenario(bep,egoVehicle); trkPlotterFcn(dyntrks,config); end title('Simple Multipath Environment');

На предыдущем рисунке показаны подтвержденные позиции дорожки с использованием квадратных маркеров. Дорожки, соответствующие статическим объектам (т.е. барьеру), не печатаются. Обратите внимание, что с ведущим автомобилем связано несколько дорожек. Дорожки, перекрывающие ведущий вагон, соответствуют истинному обнаружению и первому 2-подпрыгивающему призраку. Трассы, которые лежат вне дороги на другой стороне ограждения, соответствуют вторым 2-отскоку и 3-отскоку призракам.
Скорости пути обозначаются длиной и направлением векторов, направленных в сторону от положения пути (они малы, потому что они относительно эго-транспортного средства). Призрачные обнаружения могут обмануть трекера, потому что у них есть кинематика, подобная кинематике истинных целей. Эти дорожки-призраки могут быть проблематичными, поскольку они добавляют дополнительную нагрузку обработки в трекер и, возможно, будут путать решения управления с использованием целевых дорожек.
При моделировании с одним и несколькими отскоками, выполненном выше, для генерации обнаружений и дорожек использовались статистические модели радаров. Теперь используйте radarTransceiver для формирования IQ-сигналов временной области. В то время как radarTransceiver имеет другие варианты конструкции, radarDataGenerator удобно имеет возможность вернуть объект приемопередатчика, который был автоматически сконфигурирован так, чтобы его рабочие характеристики были как можно ближе к характеристикам radarDataGenerator.
Поскольку приемопередатчик не будет выполнять никакого обнаружения или оценки, установите разрешение угла радара равным его FoV. Также установите вероятность обнаружения равной 0,9, так чтобы приемопередатчик использовал реалистичный показатель мощности передачи и шума.
% Reset radarDataGenerator and get the transceiver
release(rdr);
rdr.AzimuthResolution = rdr.FieldOfView(1);
rdr.DetectionProbability = 0.9;
transceiver = radarTransceiver(rdr);Используйте NumRepetitions свойство для указания количества импульсов, собираемых на вызов приемопередатчика.
% Total number of pulses to collect numPulses = 128; % Number of pulses per collection transceiver.NumRepetitions = numPulses;
Вспомогательная функция helperIncludeSignatures добавляет информацию о сигнатуре в структуру позы, которая сообщает приемопередатчику RCS каждой цели. helperGetPathsFromPoses будет генерировать информацию о каждом пути распространения в среде, включая те, которые связаны с несколькими отскоками. Приемопередатчик будет использовать это для вычисления нашего многолучевого возврата.
restart(scenario); % restart the scenario tgtPoses = targetPoses(egoVehicle); % Get target poses in ego vehicle's reference frame tgtPoses = helperIncludeSignatures(tgtPoses,scenario); % Get propagation path information paths = helperGetPathsFromPoses( tgtPoses,scenario,rdr,lambda );
Теперь соберите один интервал когерентной обработки (CPI) данных, сформируйте RDM и постройте график. Приемопередатчик просто принимает структуру путей сверху и текущее время моделирования в качестве входных данных и возвращает IQ-данные, отформатированные как диапазон за импульсом, обычно называемые фазовой историей (PH).
time = scenario.SimulationTime; % Current simulation time rx = transceiver(paths,time); % Get IQ data from transceiver for real and ghost targets % Match filter the received signal matchingcoeff = getMatchedFilter(transceiver.Waveform); matchedfilter = phased.MatchedFilter('Coefficients',matchingcoeff); matchingdelay = size(matchingcoeff,1)-1; mfiltOut = matchedfilter(rx); mfiltOut = buffer(mfiltOut(matchingdelay+1:end),size(mfiltOut,1));
Используйте DC-центрированную карту диапазона-доплеровскую карту (RDM) и диапазон, который простирается до нашего максимального диапазона, с одним образцом на ячейку разрешения.
df = prf / numPulses; % Doppler filter spacing dopAx = (-prf/2:df:prf/2-df).'; % Doppler axis rngAx = (rangeRes:rangeRes:rangeMax).'; % Range axis % Select only the range gates up to our max range PH = mfiltOut(1:numel(rngAx),:); % Form DC-centered RDM RDM = fftshift(fft(PH,[],2),2); % Plot RDM and close-up of target vehicle helperPlotRDM( RDM,rngAx,dopAx,scenario.SimulationTime );

На графике выше показан полный RDM вместе с крупным планом возврата транспортного средства. Полоса возврата при доплеровской частоте около 12 кГц находится от ограждения на обочине. Целевой носитель виден в диапазоне около 30 метров и при слегка отрицательном доплеровском значении, поскольку он движется вперед быстрее, чем эго-носитель. Две другие полосы возврата происходят от многолучевых отражений между ограждениями и целевым транспортным средством.
Ниже приведена запись около 60 кадров данных с более высоким разрешением, и начиная примерно с 3 секунд, вместе с сюжетом птичьего глаза от более раннего. Эта запись показывает только односкатные отражения от ограждения. Многолучевое возвращение от целевого транспортного средства начинается, когда оно начинает менять полосы движения и его расстояние до ограждений уменьшается. Мы видим призрачную цель на большем диапазоне и доплеровском, чем реальная цель, затем медленно они сходятся, когда реальный автомобиль стабилизируется в центре дороги.

% Restore random state
rng(rndState);В этом примере вы узнали, как обнаружение цели-призрака возникает из-за нескольких отражений, которые могут произойти между радаром и целью. Сценарий автомобильной РЛС использовался для выделения общего случая, когда цели-призраки генерируются ограждением в поле зрения РЛС. В результате, существует 4 уникальных пути отскока, которые могут создавать эти скрытые обнаружения. Кинематика обнаружений цели-призрака подобна обнаружениям истинной цели, и в результате эти цели-призраки могут создавать дорожки-призраки, которые могут добавлять дополнительную нагрузку обработки к трекеру и могут путать алгоритмы управления, используя эти дорожки. radarTransceiver может использоваться для генерации данных IQ более высокой точности, которые являются подходящими для ввода в алгоритмы обнаружения и отслеживания.
Вспомогательные функции
helperKeepDynamicObjects
function dyntrks = helperKeepDynamicObjects( trks,egoVehicle,rdr ) % Filter out tracks corresponding to static objects (e.g. guardrail) % % This is a helper function and may be removed or modified in a future % release. dyntrks = trks; if ~isempty(trks) vel = cell2mat(arrayfun(@(t)t.State(2:2:end),trks(:)','UniformOutput',false)); isStatic = (-vel(1,:) > egoVehicle.Velocity(1)-rdr.RangeRateResolution) & (-vel(1,:) < egoVehicle.Velocity(1)+rdr.RangeRateResolution); dyntrks = trks(~isStatic); end end
helperIncludeSignatures
function tgtPoses = helperIncludeSignatures( tgtPoses,scenario ) % Include signature information in the target poses struct for use by % radarTransceiver % % This is a helper function and may be removed or modified in a future % release. prof = scenario.actorProfiles; id0 = [prof.ActorID]; id = [tgtPoses.ActorID]; for ind = 1:numel(tgtPoses) I = id0 == id(ind); tgtPoses(ind).Signatures = {rcsSignature("Azimuth",prof(I).RCSAzimuthAngles,"Elevation",... prof(I).RCSElevationAngles,"Pattern",prof(I).RCSPattern)}; end end
helperPlotRDM
function helperPlotRDM( RDM,rngAx,dopAx,time ) % Plot the RDM and a close-up % % This is a helper function and may be removed or modified in a future % release. figure; set(gcf,'Position',get(gcf,'Position')+[0 0 560 0]); subplot(1,2,1); imagesc(dopAx/1e3,rngAx,20*log10(abs(RDM))); colorbar; cx = caxis; caxis([cx(2)-60 cx(2)]); xlabel('Doppler (kHz)'); ylabel('Range (m)'); set(gca,'ydir','normal'); title(sprintf('RDM at T = %.2f s',time)); subplot(1,2,2); rIdx = rngAx >= 22 & rngAx <= 38; dIdx = dopAx >= -5e3 & dopAx <= 0; imagesc(dopAx(dIdx)/1e3,rngAx(rIdx),20*log10(abs(RDM(rIdx,dIdx)))); colorbar; cx = caxis; caxis([cx(2)-60 cx(2)]); xlabel('Doppler (kHz)'); ylabel('Range (m)'); set(gca,'ydir','normal'); title('Vehicle Return'); end