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

所考虑的模型与示例([单目标车辆雷达]](https://engee.com/helpcenter/stable/ru/interactive-scripts/radars/FMCW_Radar_Range_Estimation.html)中的结构类似,但有一些主要区别:

  • 模拟两辆汽车(一辆轿车和一辆货车)的运动;
  • 使用 "测距-多普勒响应 " 块实现多普勒频率处理;
  • 单通道处理;
  • 使用**"CA CFAR 2-D" **块,使用二维平均检测器进行检测。

1.2 数字信号处理单元(信号处理)

模型在信号处理子系统中使用测距和多普勒频率综合处理。这种处理方法可以估算相干累积时间内接收信号相对于探测信号的频移,然后利用处理结果进行测距和速度估算。

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

image_2.png

数字处理过程分为以下几个阶段:

  • 第 1 阶段:接收信号的解调和 64 个脉冲的相干累积。然后将数据传输到测距-多普勒响应块,以计算接收信号的测距-多普勒端口。携带测距信息的计数被传送到测距子集子系统。它提取部分估计数据,这些数据与 calcParamFMCW.jl文件中预定义的范围限制(1 至 200 米)相对应;
  • 第 2 步:执行探测过程。本例中的检测器是CA CFAR 2-D 单元,用于检测信号;
  • 第 3 步:在"DBSCAN 聚类器 "块中执行聚类过程,利用在CA CFAR 2-D 块中获得的数据将检测单元聚类为测距组和测速组;
  • 第 4 步:使用测距估计器*和多普勒估计器*程序块计算目标的测距和速度估计值。

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

提取模拟结果

让我们从工作区中记录的变量中提取模拟结果到数组中,以便进一步可视化:

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 兆赫,周期为每 7 微秒一次,相当于约 1 米的分辨率。

5.2 范围多普勒图

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

图中可以看到距离 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 米/秒)方面与所宣称的精度相符

结论

在示例中,我们考虑了使用连续 LFM 信号作为探测信号的汽车雷达基本模型的建模问题。通过建模,我们估算出了雷达到目标(汽车和卡车)的正向速度和距离,雷达分辨率精度为:测距 1 米,速度约 4 米/秒。