Автомобильный радар для оценки дальности и скорости нескольких целей
В примере рассматривается проектирование системной модели автомобильного радара для определения дальности и скорости нескольких объектов.
Используемые функции
Pkg.add(["LinearAlgebra", "DSP"])
using DSP,FFTW,LinearAlgebra
function run_model( name_model, path_to_folder ) # определение функции для прогона модели
Path = path_to_folder * "/" * name_model * ".engee"
if name_model in [m.name for m in engee.get_all_models()] # Проверка условия загрузки модели в ядро
model = engee.open( name_model ) # Открыть модель
engee.run( model, verbose=true ); # Запустить модель
engee.close( name_model, force=true ); # Закрыть модель
else
model = engee.load( Path, force=true ) # Загрузить модель
engee.run( model, verbose=true ); # Запустить модель
engee.close( name_model, force=true ); # Закрыть модель
end
return
end;
function DataFrame2Array(X)
out = collect(X)
out_data = zeros(eltype(out.value[1]),size(out.value[1],1),size(out.value[1],2),length(out.value))
[out_data[:,:,i] = out.value[i] for i in 1:length(out.value)]
return out_data, out.time
end
function calc_spectrogram(x::Array,fs::Real,title::String;
num_pulses::Int64 = 4,
window_length::Int64 = 64,
nfft::Int64=512,
lap::Int64 = 60,
thesh::Real = -Inf)
gr()
spec_out = DSP.spectrogram(x[:,:,1:num_pulses][:],window_length,lap;window=kaiser(window_length,3.95),nfft=nfft,fs=fs)
power = DSP.pow2db.(spec_out.power)
power .= map(x -> x < thesh ? thesh : x,power)
power_new = zeros(size(power))
power_new[1:round(Int64,size(power,1)/2),:] .= power[round(Int64,size(power,1)/2)+1:end,:]
power_new[round(Int64,size(power,1)/2)+1:end,:] .= power[1:round(Int64,size(power,1)/2),:]
fig = heatmap(fftshift(spec_out.freq).*1e-6,spec_out.time .*1e6, permutedims(power_new),color= :jet,
gridalpha=0.5,margin=5Plots.mm,size=(900,400))
xlabel!("Частота, МГц")
ylabel!("Время, мкс")
title!(title)
return fig
end
function calc_RD_Response(x,param;tresh=-Inf)
plotlyjs()
range_scale = Vector(range(param.RngLims...,length=size(x,1)))
speed_scale = Vector(range(param.SpeedLims...,length=size(x,2)))
out_RD = pow2db.(abs.(x[:,:,end]))
out_RD .= rot180(map(x -> x < tresh ? tresh : x,out_RD))
fig = heatmap(speed_scale,range_scale,
out_RD,colorscale=:parula256,
top_margin=10Plots.mm,size=(900,400))
xlabel!("Скорость, м/с")
ylabel!("Дальность, м")
title!("Дальностно-доплероский портрет")
return fig
end
function plotting_result(rng_est,speed_est,true_range,true_speed,name::String,slow_time)
plotlyjs()
fig1=plot(slow_time*1e3,rng_est,
lab="оценка расстояния",
margin=5Plots.mm,
legend=:outertopright,
titlefont=font(12,"Computer Modern"),
guidefont = font(12,"Computer Modern"),size=(900,220))
plot!(fast_time*1e3,true_range,lab="истинное расстояние",ls= :dash)
xlabel!("Время, мс")
ylabel!("Расстояние, м")
title!("Зависимость расстояния до объекта ($(name))")
fig2 = plot(slow_time*1e3,speed_est,
lab="оценка скорости",
size=(900,220),
legend=:outertopright,
titlefont=font(12,"Computer Modern"),
guidefont = font(12,"Computer Modern"))
plot!(fast_time*1e3,true_speed,lab="истинная скорость",ls= :dash)
xlabel!("Время, мс")
ylabel!("Скорость, м/c")
title!("Зависимость относительной скорости объекта ($name)")
display(fig1)
display(fig2)
return
end
calc_range_or_speed_object(x,y) = [norm(x[:,1,i]).-norm(y[:,1,i]) for i in 1:size(y,3)];
1. Описание структуры системной модели
1.1 Общая структура модели
Общая структурная схема системной модели приведена ниже:

Рассматриваемая модель имеет схожую структура, как в примере (автомобильный радар для обнаружения одной цели), но имеет несколько основных отличий:
- имитирует движение 2-х транспортных средств - автомобиля и грузовика;
- реализует обработку по доплеровской частоте с помощью блока "Range-Doppler Response";
- одноканальная обработка;
- выполняет обнаружение с использованием двухмерного усредняющего детектора при помощи блока - "CA CFAR 2-D"
1.2 Блок цифровой обрабоки сигнала (Signal Processing)
В модели используется совместная обработка по дальности и доплеровской частоте в подсистеме Signal Processing. Такая обработка позволяет оценить сдвиг принятого сигнала по частоте относительно зондирующего за время когерентного накопления, а затем использовать результат обработки для оценки дальности и скорости.
Подсистема цифровой обработки сигналов представлен ниже:

Процесс цифровой обработки разбит на следующие этапы:
- Этап 1: происходит демодуляция принятого сигнала и когерентное накопление 64 импульсов. Затем данные передаются в блок Range-Doppler Response для вычисления дальностно-доплеровского портрета принятого сигнала. Отсчеты, несущие информацию о дальности, передаются в подсистему Range Subset. В ней извлекаются часть оценочных данных, которые соответсвуют заранее заданным пределам по дальности (от 1 до 200 м) в файле calcParamFMCW.jl;
- Этап 2: осуществляется процесс обнаружения. Детектор в этом примере представляет собой блок CA CFAR 2-D, который обнаруживает сигнал;
- Этап 3: выполняется процесс кластеризации в блоке "DBSCAN Clusterer", где объединяются ячейки обнаружения в группы по дальности и скорости, используя данные полученные в блоке СA CFAR 2-D;
- Этап 4: проиходит расчет оценок по дальности и скорости целей с использованием блоков Range Estimator (расчет оценки дальности) и Doppler Estimator (расчет оценки скорости).
1.3 Модели канала и целей

Сценарий моделирования представляет собой следующий сценарий: транспортное средство с радаром движется из точки отсчёта со скоростью 100 км/ч (27,8 м/с)
В зоне обзора присутствуют два целевых транспортных средства, представляющие собой легковой автомобиль и грузовик, у каждого транспортного средства есть соответствующий канал распространения. Автомобиль двигается на расстоянии 50 метров от радара и движется со скоростью 60 км/ч (16,7 м/с). Грузовик расположен на расстоянии 150 метров от радара и движется со скоростью 130 км/ч (36,1 м/с).
Канал распространения сигнала представлет собой свободное пространство.
2. Инициализация входных параметров
Для инициализации входных параметров модели подключим файл "calcParamFMCWMT.jl". Если требуется изменить значения параметров, то откройте данный файл и отредактируйте необходимые параметры.
include("$(@__DIR__)/calcParamFMCWMT.jl") # подключение jl файла для инициализации входных параметров
paramRadarFMCWMT = calcParamFMCWMT() # создание структуры входных параметров
T = paramRadarFMCWMT.T; # шаг дискретизации модели по времени
SimT = 10*paramRadarFMCWMT.NumSweeps*paramRadarFMCWMT.T; # время симуляции модели
3. Запуск модели
Запустим расчет симуляции модели при помощи функции run_model:
run_model("FMCW_Radar_Range_Estimation_MT",@__DIR__) # Запустить модель
4. Извлечение результатов симуляции
Извлечем из переменных, записанных в рабочую область, результаты симуляции в массив для дальнейшей визуализации:
FMCW_signal, fast_time = DataFrame2Array(FMCW_sig) # входной ЛЧМ-сигнал
Range_Estimate, _ = DataFrame2Array(Range) # оценка дальности
Speed_Estimate, slow_time = DataFrame2Array(Speed) # оценки cкорости
RD_Response,_ = DataFrame2Array(RD); # дальностно-доплероский портрет
Truck_vel,_ = DataFrame2Array(Tvel) # скорость грузовика
Truck_pos,_ = DataFrame2Array(Tpos); # положение грузовика
Car_vel,_ = DataFrame2Array(Cvel) # скорость автомобиля
Car_pos,_ = DataFrame2Array(Cpos); # положение автомобиля
Radar_vel,_ = DataFrame2Array(Rvel) # скорость радара
Radar_pos,_ = DataFrame2Array(Rpos); # положение радара
5. Визуализация результатов симуляции
5.1 Спектрограмма входного сигнала
После завершения прогона модели и считывания данных в массив выполним визуализации спектрограммы зондирующего сигнала с помощью функции calc_spectrogram:
calc_spectrogram(
FMCW_signal, # сигнал после обработки (отображается со 2 импульса)
paramRadarFMCWMT.Fs/paramRadarFMCWMT.NumSweeps, # частота дискретизации
"Cпектрограмма входного сигнала";
num_pulses=4, # количество импульсов
thesh=-300 # порог, дБ
)
Спектрограмма приведенная выше, показывает, что девиация частоты составляет 150 МГц c периодом каждые 7 микросекунд, что соответствует разрешению примерно в 1 метр.
5.2 Дальностно доплеровский портрет
calc_RD_Response(RD_Response,paramRadarFMCWMT;tresh=-Inf)
На рисунке можно отметить 2 цели на расстоянии 50 и 150 метрах. Скорость целей точно определить затруднительно ввиду невысокого разрешения по скорости
5.3 Анализ точности оценирования параметров
Для более качественного анализа точности работы радара, сопоставим истинные координаты и скорости с найденными оценками.
Сначала вычислим истинные значения параметров и извлечем оценки в соответствующие переменные:
# Расчет истинных дальностей и относительный скоростей до автомобиля
true_range_car = calc_range_or_speed_object(Car_pos,Radar_pos)
true_speed_car = calc_range_or_speed_object(Radar_vel,Car_vel)
# Расчет истинных дальностей и относительный скоростей до грузовика
true_range_truck = calc_range_or_speed_object(Truck_pos,Radar_pos)
true_speed_truck = calc_range_or_speed_object(Radar_vel,Truck_vel)
# Расчет оценок дальностей и относительный скоростей до автомобиля
Range_Estimate_Car = Range_Estimate[1,1,:]
Range_Estimate_Truck = Range_Estimate[2,1,:]
# Расчет оценок дальностей и относительный скоростей до грузовика
Speed_Estimate_Car = Speed_Estimate[1,1,:]
Speed_Estimate_Truck = Speed_Estimate[2,1,:];
Отобразим результаты на графиках для каждого объекта с помощью функции plotting_result:
# графики для сравнения объекта - автомобиль
plotting_result(Range_Estimate_Car,Speed_Estimate_Car,true_range_car,true_speed_car,"автомобиль",slow_time)
# графики для сравнения объекта - грузовки
plotting_result(Range_Estimate_Truck,Speed_Estimate_Truck,true_range_truck,true_speed_truck,"грузовик",slow_time)
Анализируя полученные зависимости, можно заключить, что значения оценок радара соотвествует заявленной точности по дальности (1 метр) и скорости (4 м/с)
Заключение
В примере было рассмотрено моделирование базовой модели атомобильного радара с применением в качестве зондирующего сигнла - непрерывный ЛЧМ-сигнал. В результате работы модели была найдена оценка оносительной скорости и расстояния от радара до объектов (автомобиля и грузовика) с точностью разрешения радара - 1 метр по дальности и примерно 4 м/с по скорости.