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