В этом примере показано, как симулировать фантомные целевые обнаружения и дорожки из-за многопутевых отражений, где энергия сигнала отражается от другой цели прежде, чем возвратиться к радару. В этом примере вы симулируете фантомы и со статистической радарной моделью и с моделью приемопередатчика, которая генерирует сигналы IQ.
Много магистральных сценариев включают не только другие автомобили, но также и барьеры и поручни. Полагайте, что простая магистраль создала использование приложения Driving Scenario Designer. Для получения дополнительной информации о том, как смоделировать барьеры, смотрите, что Cочетание датчиков Использует Синтетический пример Данных о Радаре и Видении. Используйте helperSimpleHighwayScenarioDSD
функция, экспортируемая от Driving Scenario Designer, чтобы получить магистральный сценарий и указатель на автомобиль, оборудованный датчиком.
% Set random seed for reproducible results rndState = rng('default'); % Create scenario using helper [scenario, egoVehicle] = helperSimpleHighwayScenarioDSD();
Чтобы смоделировать обнаружения, сгенерированные перспективным автомобильным радаром, используйте radarDataGenerator System object™
. Используйте центральную частоту на 77 ГГц, которая типична для автомобильного радара. Сгенерируйте обнаружения до 100 метров в области значений и с радиальной скоростью до 100 м/с.
% Automotive radar system parameters freq = 77e9; % Hz rgMax = 150; % m spMax = 100; % m/s rcs = 10; % dBsm azRes = 4; % deg rgRes = 2.5; % m rrRes = 0.5; % m/s % Create a forward-looking automotive radar rdg = radarDataGenerator(1, 'No scanning', ... 'UpdateRate', 10, ... 'MountingLocation', [3.4 0 0.2], ... 'CenterFrequency', freq, ... 'HasRangeRate', true, ... 'FieldOfView', [70 5], ... 'RangeLimits', [0 rgMax], ... 'RangeRateLimits', [-spMax spMax], ... 'HasRangeAmbiguities',true, ... 'MaxUnambiguousRange', rgMax, ... 'HasRangeRateAmbiguities',true, ... 'MaxUnambiguousRadialSpeed', spMax, ... 'ReferenceRange', rgMax, ... 'ReferenceRCS',rcs, ... 'AzimuthResolution',azRes, ... 'RangeResolution',rgRes, ... 'RangeRateResolution',rrRes, ... 'TargetReportFormat', 'Detections', ... 'Profiles',actorProfiles(scenario)); % Create bird's eye plot and detection plotter function [~,detPlotterFcn] = helperSetupBEP(egoVehicle,rdg); title('Free Space (no multipath)'); % Generate raw detections time = scenario.SimulationTime; tposes = targetPoses(egoVehicle); [dets,~,config] = rdg(tposes,time); % Plot detections detPlotterFcn(dets,config);
Этот рисунок показывает местоположения обнаружений вдоль целевого транспортного средства, а также вдоль стороны барьера. Однако обнаружения не всегда так хорошего поведения. Одно явление, которое может поставить значительные проблемы радарным инженерам, является многопутевым. Многопутевой, когда сигнал не только распространяет непосредственно к намеченной цели и назад к радару, но также и включает дополнительные отражения от объектов в среде.
Когда радарный сигнал распространяет к цели интереса, это может прибыть через различные пути. В дополнение к прямому пути от радара до цели и затем обратно к радару, существуют другие возможные пути к распространению. Количество путей неограниченно, но с каждым отражением, энергетическими уменьшениями сигнала. Обычно модель распространения рассмотрение путей с тремя возвратами используется, чтобы смоделировать это явление.
Чтобы изучить модель с тремя возвратами, сначала рассмотрите более простой один возврат и пути 2D возврата, как показано на этих рисунках.
Путь с одним возвратом распространяет от радара (1) к цели (2) и затем отражается от цели (2) назад к радару. Это часто упоминается как прямой путь или путь угла обзора.
В этом случае существует два уникальных пути к распространению, которые состоят из двух возвратов.
Первый путь 2D возврата распространяет от радара (1) на отражающуюся поверхность (3), затем на цель (2) прежде, чем возвратиться к радару (1). Поскольку сигнал, полученный в радаре, прибывает от последнего возврата от истинной цели, это генерирует фантомные обнаружения вдоль того же направления как истинная цель. Поскольку длина пути для этого распространения более долга, это появляется в более далекой области значений, чем истинные целевые обнаружения.
Второй путь 2D возврата распространяет от радара (1) к цели (2), затем на отражающуюся поверхность (3) прежде, чем возвратиться к радару (1). В этом случае фантомные обнаружения появляются с другой стороны отражающейся поверхности, когда радар получает отраженный сигнал в том направлении.
Заметьте, что длина пути для обоих путей 2D возврата является тем же самым. В результате измеренная область значений и уровень области значений для этих путей будут эквивалентны хорошо.
Путь с тремя возвратами отражается от барьера дважды. Этот путь никогда не распространяет непосредственно к цели или непосредственно назад к радару. Фантомные обнаружения с тремя возвратами появляются с другой стороны отражающейся поверхности, когда радар получает отраженный сигнал в том направлении. Кроме того, это имеет самый длинный путь к распространению путей с тремя возвратами и поэтому имеет самую длинную измеренную область значений этих трех путей. Этот путь соответствует зеркальному отражению истинной цели с другой стороны барьера.
Установите HasGhosts
свойство на radarDataGenerator
смоделировать обнаружения, сгенерированные от этих путей с тремя возвратами.
% Enable ghost target model release(rdg); rdg.HasGhosts = true; % Generate raw detections time = scenario.SimulationTime; tposes = targetPoses(egoVehicle); [dets,~,config] = rdg(tposes,time); % Plot detections detPlotterFcn(dets,config); title('Simple Multipath Environment');
Этот рисунок воспроизводит анализ трех путей к распространению. Первые фантомы 2D возврата лежат в направлении цели в немного более длинной области значений, чем обнаружения прямого пути. Второй 2D возврат и фантомы с тремя возвратами лежат в направлении зеркального изображения цели, сгенерированной отражением от барьера.
Поскольку область значений и скорости фантомных целевых обнаружений похожи на область значений и скорость истинных целей, у них есть кинематика, которые сопоставимы для средства отслеживания, которое сконфигурировано, чтобы отследить истинные целевые обнаружения. Эта непротиворечивость между кинематикой действительных и фантомом предназначается для результатов в дорожках, сгенерированных для фантомной цели с другой стороны барьера.
Установите TargetReportFormat
свойство на radarDataGenerator
к Tracks
смоделировать дорожки, сгенерированные радаром в присутствии многопутевого.
% Output tracks instead of detections release(rdg); rdg.TargetReportFormat = 'Tracks'; rdg.ConfirmationThreshold = [2 3]; rdg.DeletionThreshold = [5 5]; FilterInitializationFcn = 'initcvekf'; % constant-velocity EKF % Create a new bird's eye plot to plot the tracks [bep,trkPlotterFcn] = helperSetupBEP(egoVehicle,rdg); title('Simple Multipath Environment'); % Run simulation restart(scenario); scenario.StopTime = 7.5; while advance(scenario) time = scenario.SimulationTime; tposes = targetPoses(egoVehicle); % Generate tracks [trks,~,config] = rdg(tposes,time); % Filter out tracks corresponding to static objects (e.g. barrier) dyntrks = helperKeepDynamicObjects(trks, egoVehicle); % Visualize dynamic tracks helperPlotScenario(bep,egoVehicle); trkPlotterFcn(dyntrks,config); end
Этот рисунок показывает подтвержденные положения дорожки с помощью квадратных маркеров. Дорожки, соответствующие статическим объектам (например, барьер), не построены. Заметьте, что существует несколько дорожек, сопоставленных с ведущим автомобилем. Дорожки, которые накладывают ведущий автомобиль, соответствуют истинному обнаружению и первому фантому 2D возврата. Дорожки, которые перестают работать дороги с другой стороны поручня, соответствуют второму 2D возврату и фантомам с тремя возвратами.
Скорости дорожки обозначаются длиной и направлением векторов, указывающих далеко от положения дорожки (они малы, потому что они относительно автомобиля, оборудованного датчиком). Раздвоитесь обнаружения могут одурачить средство отслеживания, потому что у них есть кинематика как кинематика истинных целей. Эти фантомные дорожки могут быть проблематичными, когда они добавляют дополнительную загрузку обработки в средство отслеживания и могут перепутать решения управления с помощью целевых дорожек.
В предыдущем свободном пространстве и многопутевых симуляциях в этом примере, вы использовали радарные модели уровня измерения, чтобы сгенерировать обнаружения и дорожки. Теперь используйте radarTransceiver
Системный объект, чтобы сгенерировать временной интервал сигналы IQ. Создайте эквивалентный radarTransceiver
непосредственно от radarDataGenerator
.
Статистический радар имеет следующую область значений и уровень области значений (Доплер) параметры, которые определяют ограничения для формы волны, используемой radarTransceiver
.
rgMax = rdg.RangeLimits(2) % m
rgMax = 150
spMax = rdg.RangeRateLimits(2) % m/s
spMax = 100
Вычислите импульсную частоту повторения (PRF), которая удовлетворит уровню области значений для радара.
lambda = freq2wavelen(rdg.CenterFrequency); prf = 2*speed2dop(2*spMax,lambda);
Вычислите количество импульсов, должен был удовлетворить требованию разрешения уровня области значений.
rrRes = rdg.RangeRateResolution
rrRes = 0.5000
dopRes = 2*speed2dop(rrRes,lambda); numPulses = 2^nextpow2(prf/dopRes)
numPulses = 512
prf = dopRes*numPulses
prf = 1.3150e+05
Подтвердите, что однозначная область значений, которая соответствует этому PRF, вне максимального предела области значений.
rgUmb = time2range(1/prf)
rgUmb = 1.1399e+03
Создайте эквивалентный radarTransceiver
непосредственно от radarDataGenerator
.
release(rdg); % Set the range and range-rate ambiguities according to desired PRF and % number of pulses rdg.MaxUnambiguousRange = rgUmb; rdg.MaxUnambiguousRadialSpeed = spMax; % Set the statistical radar to report clustered detections to compare to % the IQ video from the radar transceiver. rdg.TargetReportFormat = 'Clustered detections'; rdg.DetectionCoordinates = 'Body';
azRes = rdg.AzimuthResolution;
rdg.AzimuthResolution = rdg.FieldOfView(1);
% Construct the radar transceiver from the radar data generator
rtxrx = radarTransceiver(rdg)
rtxrx = radarTransceiver with properties: Waveform: [1×1 phased.RectangularWaveform] Transmitter: [1×1 phased.Transmitter] TransmitAntenna: [1×1 phased.Radiator] ReceiveAntenna: [1×1 phased.Collector] Receiver: [1×1 phased.ReceiverPreamp] MechanicalScanMode: 'None' ElectronicScanMode: 'None' MountingLocation: [3.4000 0 0.2000] MountingAngles: [0 0 0] NumRepetitionsSource: 'Property' NumRepetitions: 512
rdg.AzimuthResolution = azRes;
radarTransceiver
имеет только одну передачу, и получите элемент, но статистический радар использует универсальную линейную матрицу (ULA), чтобы сформировать несколько лучей. Присоедините массив ULA к получить антенне radarTransceiver
. Номер или элементы в ULA определяются разрешением и длиной волны азимута радара.
numRxElmt = ceil(beamwidth2ap(rdg.AzimuthResolution,lambda,0.8859)/(lambda/2))
numRxElmt = 26
elmt = rtxrx.ReceiveAntenna.Sensor;
rxarray = phased.ULA(numRxElmt,lambda/2,'Element',elmt);
rtxrx.ReceiveAntenna.Sensor = rxarray;
Используйте helper3BounceGhostPaths function
вычислить пути с тремя возвратами для цели и положений датчика из многопутевого сценария.
restart(scenario);
tposes = targetPoses(egoVehicle);
% Generate 3-bounce propagation paths for the targets in the scenario
paths = helper3BounceGhostPaths(tposes,rdg);
Используйте radarTransceiver
сгенерировать основную полосу произвело данные IQ, полученные радаром.
time = scenario.SimulationTime; % Current simulation time Xcube = rtxrx(paths,time); % Generate IQ data for transceiver from the 3-bounce path model
Куб принятых данных имеет три измерения: быстро-разовые выборки, получите антенный элемент и медленно-разовые выборки.
size(Xcube)
ans = 1×3
456 26 512
Используйте phased.RangeDopplerResponse
Системный объект, чтобы выполнить область значений и Доплера, обрабатывающего по первым и третьим измерениям куба данных.
rngdopproc = phased.RangeDopplerResponse( ... 'RangeMethod','Matched filter', ... 'DopplerOutput','Speed', ... 'PropagationSpeed',rtxrx.ReceiveAntenna.PropagationSpeed, ... 'OperatingFrequency',rtxrx.ReceiveAntenna.OperatingFrequency, ... 'SampleRate',rtxrx.Receiver.SampleRate); mfcoeff = getMatchedFilter(rtxrx.Waveform); [Xrngdop,rggrid,rrgrid] = rngdopproc(Xcube,mfcoeff);
Используйте phased.PhaseShiftBeamformer
Системный объект, чтобы сформировать лучи из получить элементов антенной решетки вдоль второго измерения куба данных.
azFov = rdg.FieldOfView(1); anggrid = -azFov/2:azFov/2; bmfwin = @(N)normmax(taylorwin(N,5,-60)); beamformer = phased.PhaseShiftBeamformer( ... 'Direction',[anggrid;0*anggrid],... 'SensorArray',rtxrx.ReceiveAntenna.Sensor, ... 'OperatingFrequency',rtxrx.ReceiveAntenna.OperatingFrequency); Xbfmrngdop = Xrngdop; [Nr,Ne,Nd] = size(Xbfmrngdop); Xbfmrngdop = permute(Xbfmrngdop,[1 3 2]); % Nr x Nd x Ne Xbfmrngdop = reshape(Xbfmrngdop,[],Ne); Xbfmrngdop = beamformer(Xbfmrngdop.*bmfwin(Ne)'); Xbfmrngdop = reshape(Xbfmrngdop,Nr,Nd,[]); % Nr x Nd x Nb Xbfmrngdop = permute(Xbfmrngdop,[1 3 2]); % Nr x Nb x Nd
Используйте helperPlotBeamformedRangeDoppler
функционируйте, чтобы построить карту угла области значений от beamformed, области значений, и Доплер обработал куб данных.
helperPlotBeamformedRangeDoppler(Xbfmrngdop,rggrid,anggrid,rtxrx);
Локальные максимумы полученных сигналов соответствуют местоположению целевого транспортного средства, поручня и фантомного изображения целевого транспортного средства с другой стороны поручня. Покажите что обнаружения уровня измерения, сгенерированные radarDataGenerator
сопоставимы с peaks в карте угла области значений, сгенерированной эквивалентным radarTransceiver
.
Используйте helperPlayStatAndIQMovie
функция, чтобы сравнить обнаружения уровня измерения и IQ обработала видео на время этого сценария.
helperPlayStatAndIQMovie(scenario,egoVehicle,rtxrx,rdg,rngdopproc,beamformer,bmfwin);
Многопутевые фантомные обнаружения могут использоваться время от времени, чтобы видеть объекты на дороге, которая не была бы в противном случае обнаружена радаром из-за поглощения газов. Одним примером является обнаружение закрытого транспортного средства из-за многопутевого прочь дорожного покрытия. Используйте helperGroundBounceScenarioDSD
функция, чтобы создать сценарий, где более медленное движущееся транспортное средство в том же маршруте, когда автомобиль, оборудованный датчиком закрывается другим транспортным средством непосредственно перед радаром.
[scenario, egoVehicle] = helperGroundBounceScenarioDSD; ax3d = helperRadarChasePlot(egoVehicle);
Желтый автомобиль закрывается красным автомобилем. Угол обзора не существует между синим перспективным радаром автомобиля эго и желтым автомобилем.
viewLoc = [scenario.Actors(2).Position(1)-10 -10]; chasePlot(egoVehicle,'ViewLocation',viewLoc,'ViewHeight',0,'ViewYaw',40,'Parent',ax3d);
Многопутевой может пройти через пробел между нижней стороной автомобиля и поверхностью дороги.
Снова используйте radarDataGenerator
чтобы сгенерировать фантом предназначаются для обнаружений из-за многопутевого между транспортными средствами и дорожным покрытием. Используйте helperRoadProfiles
и helperRoadPoses
функции, чтобы включать дорожное покрытие в список целей, смоделированных в сценарии, чтобы включить многопутевой между дорожным покрытием и транспортными средствами.
release(rdg); rdg.RangeRateResolution = 0.5; rdg.FieldOfView(2) = 10; rdg.TargetReportFormat = 'Detections'; tprofiles = actorProfiles(scenario); rdprofiles = helperRoadProfiles(scenario); rdg.Profiles = [tprofiles;rdprofiles]; % Create bird's eye plot and detection plotter function [bep,detPlotterFcn] = helperSetupBEP(egoVehicle,rdg); [ax3d,detChasePlotterFcn] = helperRadarChasePlot(egoVehicle,rdg); camup(ax3d,[0 0 1]); pos = egoVehicle.Position+[-5 -5 0]; campos(ax3d,pos); camtarget(ax3d,[15 0 0]); % Generate clustered detections time = scenario.SimulationTime; tposes = targetPoses(egoVehicle); rdposes = helperRoadPoses(egoVehicle); poses = [tposes rdposes]; [dets,~,config] = rdg(poses,time); % Plot detections dyndets = helperKeepDynamicObjects(dets,egoVehicle); detPlotterFcn(dyndets,config);
Обнаружение от закрытого автомобиля возможно из-за пути с тремя возвратами, который существует между дорожным покрытием и нижней стороной красного автомобиля.
% Find the 3-bounce detection from the occluded car i3 = find(cellfun(@(d)d.ObjectAttributes{1}.BouncePathIndex,dyndets)==3); det3 = dyndets{i3}; % Plot the 3-bounce path between the radar and the occluded car iBncTgt = find([poses.ActorID]==det3.ObjectAttributes{1}.BounceTargetIndex); iTgt = find([poses.ActorID]==det3.ObjectAttributes{1}.TargetIndex); pos = [rdg.MountingLocation;poses(iBncTgt).Position;poses(iTgt).Position]+egoVehicle.Position; hold(ax3d,'on'); plot3(ax3d,pos(:,1),pos(:,2),pos(:,3),'r-*','LineWidth',2); campos([-6 -15 2]); camtarget([17 0 0]);
Этот рисунок показывает путь с тремя возвратами красной линией. Заметьте, что путь к возврату между радаром и закрытым желтым автомобилем существует путем передачи ниже нижней стороны красного автомобиля.
% Show bounce path arriving at the occluded yellow car
campos([55 -10 3]); camtarget([35 0 0]);
Этот рисунок показывает путь с тремя возвратами, прибывающий в закрытый желтый автомобиль после возврата прочь дорожного покрытия.
В этом примере вы изучили, как фантомные целевые обнаружения являются результатом нескольких отражений, которые могут находиться между радаром и целью. Автомобильный радарный сценарий использовался, чтобы подсветить общий падеж, где фантомные цели сгенерированы поручнем в поле зрения радара. В результате существует четыре уникальных пути к возврату, которые могут произвести эти фантомные обнаружения. Кинематика фантомных целевых обнаружений похожа на обнаружения истинных целей, и в результате эти фантомные цели могут создать фантомные дорожки, которые могут добавить дополнительную загрузку обработки в средство отслеживания и могут перепутать алгоритмы управления с помощью этих дорожек. radarTransceiver
может использоваться, чтобы сгенерировать более высокую точность данные IQ, которые соответствуют, как введено алгоритмам обнаружения и отслеживания.
% Restore random state
rng(rndState);
Вспомогательные Функции
helperKeepDynamicObjects
function dynrpts = helperKeepDynamicObjects(rpts,egoVehicle) % Filter out target reports corresponding to static objects (e.g. guardrail) % % This is a helper function and may be removed or modified in a future % release. dynrpts = rpts; if ~isempty(rpts) if iscell(rpts) vel = cell2mat(cellfun(@(d)d.Measurement(4:end),rpts(:)','UniformOutput',false)); else vel = cell2mat(arrayfun(@(t)t.State(2:2:end),rpts(:)','UniformOutput',false)); end vel = sign(vel(1,:)).*sqrt(sum(abs(vel(1:2,:)).^2,1)); egoVel = sign(egoVehicle.Velocity(1))*norm(egoVehicle.Velocity(1:2)); gndvel = vel+egoVel; % detection speed relative to ground isStatic = gndvel > -4 & ... greater than 4 m/s departing and, gndvel < 8; % less than 8 m/s closing speed dynrpts = rpts(~isStatic); end end
normmax
function y = normmax(x) if all(abs(x(:))==0) y = ones(size(x),'like',x); else y = x(:)/max(abs(x(:))); end end