Этот пример показывает, как симулировать обнаружения призрачных целей и дорожки из-за многолучевых отражений, где энергия сигнала отражается от другой цели перед возвращением к радару. Вы будете симулировать призраки как с помощью статистической модели радара, так и с помощью более подробной модели приемопередатчика, которая генерирует сигналы IQ.
Во многих сценариях шоссе участвуют не только другие автомобили, но и барьеры и ограждения. Рассмотрим простое шоссе, созданное с помощью приложения Driving Scenario Designer (Automated Driving Toolbox). Для получения дополнительной информации о том, как смоделировать барьеры в drivingScenario
см. пример Sensor Fusion Using Synthetic Radar and Vision Data (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)')
Предыдущий рисунок показывает местоположение обнаружений вдоль целевого транспортного средства, а также вдоль стороны барьера. Однако обнаружения не всегда так хорошо себя ведут. Одним из явлений, которое может поставить значительные проблемы для радиолокационных инженеров, является многолучевой канал. Многолучевой канал - это когда сигнал не только распространяется непосредственно на намеченную цель и обратно на радар, но и включает дополнительные отражения от объектов в окружении.
Когда радиолокационный сигнал распространяется на интересующую цель, он может прибыть через различные пути. В дополнение к прямому пути от радара до цели и затем назад к радару, существуют другие возможные пути распространения. Количество путей неограниченно, но с каждым отражением энергия сигнала будет уменьшаться. Обычно для моделирования этого явления используется модель распространения, учитывающая три пути отскока.
Чтобы понять модель с тремя отказами, сначала рассмотрим более простые пути с одним и двумя отказами, как показано на следующих рисунках.
Одноотбойный путь распространяется от радара (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-bounce призраки лежат в направлении цели с немного большей областью значений. Второй 2-отскок лежит в направлении зеркального изображения цели, генерируемого отражением от барьера, и находится в той же области значений, что и первый 2-отскок. И 3 обнаружения отскока следуют контуру визуализированного призрака целевого транспортного средства.
Поскольку область значений и скорости обнаружений призрачных целей похожи на область значений и скорость истинных целей, они будут иметь кинематику, которая согласована для трекера, который сконфигурирован для отслеживания истинных обнаружений целей. Эта согласованность между кинематикой реальных и призрачных целей приводит к тому, что дорожки генерируются для призрачной цели на другой стороне барьера.
Установите TargetReportFormat
свойство на radarDataGenerator
к '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
добавит информацию о сигнатуре в 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 и постройте график. Приемопередатчик просто принимает пути, структурированные сверху, и текущее время симуляции как вход и возвращает данные 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 уникальных пути отскока, которые могут привести к этим обнаружениям призраков. Кинематика обнаружений призрачных целей подобна обнаружениям истинной цели, и в результате эти призрачные цели могут создать следы призрака, которые могут добавить дополнительную нагрузку обработки трекеру и могут запутать алгоритмы управления, используя эти дорожки. The 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