Документация Engee
Notebook

Автомобильный радар для оценки дальности и скорости нескольких целей

В примере рассматривается проектирование системной модели автомобильного радара для определения дальности и скорости нескольких объектов.

Используемые функции

In [ ]:
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 = spectrogram(x[:,:,1:num_pulses][:],window_length,lap;window=kaiser(window_length,3.95),nfft=nfft,fs=fs)

    power = 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 Общая структура модели

Общая структурная схема системной модели приведена ниже:

image_3.png

Рассматриваемая модель имеет схожую структура, как в примере (автомобильный радар для обнаружения одной цели), но имеет несколько основных отличий:

  • имитирует движение 2-х транспортных средств - автомобиля и грузовика;
  • реализует обработку по доплеровской частоте с помощью блока "Range-Doppler Response";
  • одноканальная обработка;
  • выполняет обнаружение с использованием двухмерного усредняющего детектора при помощи блока - "CA CFAR 2-D"

1.2 Блок цифровой обрабоки сигнала (Signal Processing)

В модели используется совместная обработка по дальности и доплеровской частоте в подсистеме Signal Processing. Такая обработка позволяет оценить сдвиг принятого сигнала по частоте относительно зондирующего за время когерентного накопления, а затем использовать результат обработки для оценки дальности и скорости.

Подсистема цифровой обработки сигналов представлен ниже:

image_2.png

Процесс цифровой обработки разбит на следующие этапы:

  • Этап 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 Модели канала и целей

image.png

Сценарий моделирования представляет собой следующий сценарий: транспортное средство с радаром движется из точки отсчёта со скоростью 100 км/ч (27,8 м/с)

В зоне обзора присутствуют два целевых транспортных средства, представляющие собой легковой автомобиль и грузовик, у каждого транспортного средства есть соответствующий канал распространения. Автомобиль двигается на расстоянии 50 метров от радара и движется со скоростью 60 км/ч (16,7 м/с). Грузовик расположен на расстоянии 150 метров от радара и движется со скоростью 130 км/ч (36,1 м/с).

Канал распространения сигнала представлет собой свободное пространство.

2. Инициализация входных параметров

Для инициализации входных параметров модели подключим файл "calcParamFMCWMT.jl". Если требуется изменить значения параметров, то откройте данный файл и отредактируйте необходимые параметры.

In [ ]:
include("$(@__DIR__)/calcParamFMCWMT.jl") # подключение jl файла для инициализации входных параметров
paramRadarFMCWMT = calcParamFMCWMT() # создание структуры входных параметров
T = paramRadarFMCWMT.T; # шаг дискретизации модели по времени
SimT = 10*paramRadarFMCWMT.NumSweeps*paramRadarFMCWMT.T; # время симуляции модели

3. Запуск модели

Запустим расчет симуляции модели при помощи функции run_model:

In [ ]:
run_model("FMCW_Radar_Range_Estimation_MT",@__DIR__) # Запустить модель
Building...
Progress 0%
Progress 0%
Progress 0%
Progress 5%
Progress 10%
Progress 10%
Progress 15%
Progress 20%
Progress 25%
Progress 31%
Progress 38%
Progress 43%
Progress 69%
Progress 75%
Progress 89%
Progress 100%

4. Извлечение результатов симуляции

Извлечем из переменных, записанных в рабочую область, результаты симуляции в массив для дальнейшей визуализации:

In [ ]:
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:

In [ ]:
calc_spectrogram(
    FMCW_signal, # сигнал после обработки (отображается со 2 импульса)
    paramRadarFMCWMT.Fs/paramRadarFMCWMT.NumSweeps, # частота дискретизации
    "Cпектрограмма входного сигнала";
    num_pulses=4, # количество импульсов 
    thesh=-300 # порог, дБ
)
Out[0]:

Спектрограмма приведенная выше, показывает, что девиация частоты составляет 150 МГц c периодом каждые 7 микросекунд, что соответствует разрешению примерно в 1 метр.

5.2 Дальностно доплеровский портрет

In [ ]:
calc_RD_Response(RD_Response,paramRadarFMCWMT;tresh=-Inf)
Out[0]:

На рисунке можно отметить 2 цели на расстоянии 50 и 150 метрах. Скорость целей точно определить затруднительно ввиду невысокого разрешения по скорости

5.3 Анализ точности оценирования параметров

Для более качественного анализа точности работы радара, сопоставим истинные координаты и скорости с найденными оценками.

Сначала вычислим истинные значения параметров и извлечем оценки в соответствующие переменные:

In [ ]:
# Расчет истинных дальностей и относительный скоростей до автомобиля
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:

In [ ]:
# графики для сравнения объекта - автомобиль
 plotting_result(Range_Estimate_Car,Speed_Estimate_Car,true_range_car,true_speed_car,"автомобиль",slow_time)
In [ ]:
# графики для сравнения объекта - грузовки
plotting_result(Range_Estimate_Truck,Speed_Estimate_Truck,true_range_truck,true_speed_truck,"грузовик",slow_time)

Анализируя полученные зависимости, можно заключить, что значения оценок радара соотвествует заявленной точности по дальности (1 метр) и скорости (4 м/с)

Заключение

В примере было рассмотрено моделирование базовой модели атомобильного радара с применением в качестве зондирующего сигнла - непрерывный ЛЧМ-сигнал. В результате работы модели была найдена оценка оносительной скорости и расстояния от радара до объектов (автомобиля и грузовика) с точностью разрешения радара - 1 метр по дальности и примерно 4 м/с по скорости.

Блоки, использованные в примере