Engee 文档
Notebook

用于估计多个目标的范围和速度的车载雷达

该示例考虑了汽车雷达系统模型的设计,用于确定多个物体的范围和速度。

使用的函数

In [ ]:
Pkg.add(["LinearAlgebra", "DSP"])
   Resolving package versions...
  No Changes to `~/.project/Project.toml`
  No Changes to `~/.project/Manifest.toml`
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 = 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)];
WARNING: using LinearAlgebra.I in module Main conflicts with an existing identifier.

1. 系统模型的结构说明

1.1模型的一般结构

下面给出了系统模型的一般框图:

image_3.png

有问题的模型具有类似的结构,如示例([car radar for detecting a single цели)](https://engee.com/helpcenter/stable/ru/interactive-scripts/radars/FMCW_Radar_Range_Estimation.html),但它有几个主要区别:
模拟2辆车的运动-一辆汽车和一辆卡车;
使用
"范围-多普勒响应"模块实现多普勒频率处理**;
*单通道处理;
*使用块-"CA CFAR2-D"使用二维平均检测器执行检测

1.2数字信号处理单元

该模型在信号处理子系统中使用联合范围和多普勒频率处理。 这样的处理使得能够在相干累加期间估计接收信号相对于探测信号的频移,然后使用处理结果来估计范围和速度。

数字信号处理子系统如下所示:

image_2.png

数字处理过程分为以下阶段:
阶段1:对接收信号进行解调,并相干累积64个脉冲。 然后将数据传送到范围-多普勒响应块以计算接收信号的范围-多普勒响应。 携带范围信息的样本传送给范围子集子系统。 它提取与calcParamFMCW文件中的预定义范围限制(从1到200m)相对应的估计数据的一部分。jl;
阶段2:检测过程正在进行中。 本例中的检测器是检测信号的CA CFAR2-D单元;
阶段3:聚类过程在
"DBSCAN Clusterer"块中执行,其中使用CA CFAR2-D块中获得的数据按范围和速度对检测单元进行分组
*;
*第4阶段:使用范围估计器块多普勒估计器计算目标范围和速度的估计。

1.3渠道和目标模型

image.png

仿真场景为以下场景:带雷达的车辆以100km/h(27.8m/s)的速度从参考点移动

观看区域内有两个目标车辆,分别是一辆乘用车和一辆卡车,每辆车都有相应的配送通道。 汽车以距离雷达50米的距离移动,并以60km/h(16.7m/s)的速度移动。 卡车位于距离雷达150米的距离处,以130km/h(36.1m/s)的速度移动。

信号传播通道为自由空间。

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 30%
Progress 36%
Progress 41%
Progress 50%
Progress 58%
Progress 70%
Progress 80%
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]:

上面显示的频谱图显示频率偏差为150MHz,周期为每7微秒,对应于大约1米的分辨率。

5.2远距离多普勒人像

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

在绘图中,您可以在50和150米的距离上标记2目标。 由于速度分辨率低,难以准确确定目标的速度

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米/秒)的规定精度

结论

在该示例中,考虑了使用连续LFM信号作为探空信号的原子雷达基本模型的建模。 作为该模型的结果,发现了从雷达到物体(汽车和卡车)的相对速度和距离的估计,雷达分辨率精度为1米,速度约为4米/秒。

示例中使用的块