В этом примере показано, как симулировать фантомные целевые обнаружения и дорожки из-за многопутевых отражений, где энергия сигнала отражается от другой цели прежде, чем возвратиться к радару. Вы симулируете фантомы и со статистической радарной моделью и с более подробной моделью приемопередатчика, которая генерирует сигналы IQ.
Много магистральных сценариев включают не только другие автомобили, но также и барьеры и поручни. Полагайте, что простая магистраль создала использование Driving Scenario Designer (Automated Driving Toolbox) приложение. Для получения дополнительной информации о том, как смоделировать барьеры в drivingScenario смотрите, что Fusion Датчика Использует Синтетические Данные о Радаре и Видении (Automated Driving Toolbox) пример. Используйте функциональный helperSimpleHighwayScenarioDSD экспортируемый от Driving Scenario Designer, чтобы получить наш магистральный сценарий и указатель на автомобиль, оборудованный датчиком.
% 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)')

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

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

Путь с тремя возвратами отражается от барьера дважды. Этот путь никогда не распространяет непосредственно к цели или непосредственно назад к радару. Фантомные обнаружения с тремя возвратами появятся с другой стороны отражающейся поверхности, поскольку это - направление, что радар получит отраженный сигнал. Кроме того, это имеет самую долгую длину пути распространения путей с тремя возвратами и будет поэтому иметь самую длинную измеренную область значений этих трех путей. Этот путь соответствует зеркальному отражению истинной цели с другой стороны барьера.
Установите 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 к 'Дорожкам', чтобы смоделировать дорожки, сгенерированные радаром в присутствии многопутевого.
% 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');

Предыдущий рисунок показывает подтвержденные положения дорожки с помощью квадратных маркеров. Дорожки, соответствующие статическим объектам (i.e барьер), не построены. Заметьте, что существует несколько дорожек, сопоставленных с ведущим автомобилем. Дорожки, которые накладывают ведущий автомобиль, соответствуют истинному обнаружению и первому фантому с 2 возвратами. Дорожки, которые перестают работать дороги с другой стороны поручня, соответствуют вторым фантомам с 3 возвратами и с 2 возвратами.
Скорости дорожки обозначаются длиной и направлением векторов, указывающих далеко от положения дорожки (они малы, потому что они относительно автомобиля, оборудованного датчиком). Раздвоитесь обнаружения могут одурачить средство отслеживания, потому что у них есть кинематика как кинематика истинных целей. Эти фантомные дорожки могут быть проблематичными, когда они добавляют дополнительную загрузку обработки в средство отслеживания и возможно перепутают решения управления с помощью целевых дорожек.
На сингле - и симуляции мультивозврата выполнил выше, вы использовали статистические радарные модели, чтобы сгенерировать обнаружения и дорожки. Теперь используйте 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 добавит информация о подписи к struct положений, который говорит приемопередатчику 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 и график. Приемопередатчик просто берет struct путей сверху и текущее время симуляции, как введено, и возвращает данные 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) и swath области значений, который расширяет до нашей макс. области значений с одной выборкой на ячейку разрешения.
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