Engee 文档
Notebook

防抱死制动系统仿真

本例将演示防抱死制动系统(ABS)的仿真。 该模型模拟车辆在严重制动条件下的动态行为,由可多次再现的单个车轮组成,以创建多轮车辆的模型。

模型的一般视图:

absbrake--1708524133239.png

车轮以初始角速度旋转,该初始角速度对应于在踩下制动踏板之前车辆的速度。 为了计算在方程组中定义的滑移,我们使用两种速度。 车辆的速度表示为角速度。

(等于车轮的角速度,如果没有打滑)

方程组

哪里:

  • -车辆的速度除以车轮的半径,
  • -车辆的线速度,
  • -车轮半径,
  • -车轮的角速度。

从这些表达式中,我们可以看到,当车轮速度和车辆速度相等时,滑移为零,而当车轮锁定时,滑移为一。 目标滑移值为0.2,这意味着车轮的转数应该比在相同车辆速度下的非制动模式下的转数高0.8倍。 这样可以最大限度地提高轮胎在路面上的抓地力,并在有摩擦时最大限度地减少制动距离。

轮胎与路面之间的摩擦系数mu是经验滑动函数,称为mu-滑移曲线。 我们通过使用Simulink查找表将MATLAB变量传递到流程图来创建mu-slip曲线。 该模型将摩擦系数mu乘以车轮的重量,以获得作用在轮胎圆周上的摩擦力。 摩擦力除以车辆的质量以获得减速度,模型对其进行积分以获得速度。

在这个模型中,我们使用了一个理想的防抱死制动控制器,该控制器使用基于实际和期望滑移之间的差异的控制。 我们将所需的滑移量设置为mu-滑移曲线达到最大值的滑移量,这是最小停止距离的最佳值(见下文注释)。

注意:在真实车辆中,不能直接测量滑移,因此这种控制算法是不切实际的。 在这个例子中,它被用来说明这样一个模拟模型的概念构造。 这种建模的真正工程价值是在解决具体实施问题之前展示管理概念的潜力。

在启用ABS的情况下启动模型

启用显示图形的后端方法:

In [ ]:
using Plots
gr()
Out[0]:
Plots.GRBackend()

确定ABS是打开还是关闭的初始条件:

In [ ]:
ctrl = 1.0; # АБС включена

加载和启动模型:

In [ ]:
try
    engee.close("absbrake", force=true) # закрытие модели 
    catch err # в случае, если нет модели, которую нужно закрыть и engee.close() не выполняется, то будет выполнена её загрузка после catch
        m = engee.load("$(@__DIR__)/absbrake.engee") # загрузка модели
    end;

try
    engee.run(m, verbose=true) # запуск модели
    catch err # в случае, если модель не загружена и engee.run() не выполняется, то будут выполнены две нижние строки после catch
        m = engee.load("$(@__DIR__)/absbrake.engee") # загрузка модели
        engee.run(m, verbose=true) # запуск модели
    end
Building...
Progress 0%
Progress 49%
Progress 100%
Progress 100%
Out[0]:
SimulationResult(
    "stopping distance.main_out" => WorkspaceArray{Float64}("absbrake/stopping distance.main_out")
,
    "slp" => WorkspaceArray{Float64}("absbrake/slp")

)

simout变量中提取描述制动距离和滑动的数据:

In [ ]:
data1 = collect(simout)
Out[0]:
2-element Vector{WorkspaceArray}:
 WorkspaceArray{Float64}("absbrake/stopping distance.main_out")
 WorkspaceArray{Float64}("absbrake/slp")

将数据从模型定义到相应的变量中:

In [ ]:
slp1 = collect(data1[2])
stop_distance1 = collect(data1[1])
Out[0]:
1501×2 DataFrame
1476 rows omitted
Rowtimevalue
Float64Float64
10.00.0
20.010.88
30.021.76
40.032.64
50.043.52
60.054.4
70.065.28
80.076.15999
90.087.03998
100.097.91997
110.18.79996
120.119.67994
130.1210.5599
149014.89720.743
149114.9720.743
149214.91720.743
149314.92720.743
149414.93720.743
149514.94720.743
149614.95720.743
149714.96720.743
149814.97720.743
149914.98720.743
150014.99720.743
150115.0720.743

时间滑移值的可视化:

In [ ]:
plot(slp1[:,1],slp1[:,2])
Out[0]:

在ABS关闭的情况下启动模型

In [ ]:
ctrl = 0.0;

更改模型参数:

In [ ]:
try
    engee.close("absbrake", force=true) # закрытие модели 
    catch err # в случае, если нет модели, которую нужно закрыть и engee.close() не выполняется, то будет выполнена её загрузка после catch
        m = engee.load("$(@__DIR__)/absbrake.engee") # загрузка модели
    end;

try
    engee.run(m, verbose=true) # запуск модели
    catch err # в случае, если модель не загружена и engee.run() не выполняется, то будут выполнены две нижние строки после catch
        m = engee.load("$(@__DIR__)/absbrake.engee") # загрузка модели
        engee.run(m, verbose=true) # запуск модели
    end
Building...
Progress 0%
Progress 28%
Progress 100%
Progress 100%
Out[0]:
SimulationResult(
    "stopping distance.main_out" => WorkspaceArray{Float64}("absbrake/stopping distance.main_out")
,
    "slp" => WorkspaceArray{Float64}("absbrake/slp")

)

simout变量中提取描述制动距离和滑动的数据:

In [ ]:
data2 = collect(simout)
Out[0]:
2-element Vector{WorkspaceArray}:
 WorkspaceArray{Float64}("absbrake/stopping distance.main_out")
 WorkspaceArray{Float64}("absbrake/slp")

将数据从模型定义到相应的变量中:

In [ ]:
slp2 = collect(data2[2])
stop_distance2 = collect(data2[1])
Out[0]:
1501×2 DataFrame
1476 rows omitted
Rowtimevalue
Float64Float64
10.00.0
20.010.88
30.021.76
40.032.64
50.043.52
60.054.4
70.065.28
80.076.15999
90.087.03998
100.097.91997
110.18.79996
120.119.67994
130.1210.5599
149014.89795.675
149114.9795.783
149214.91795.891
149314.92795.998
149414.93796.105
149514.94796.211
149614.95796.316
149714.96796.422
149814.97796.526
149914.98796.63
150014.99796.733
150115.0796.836

时间滑移值的可视化:

In [ ]:
plot(slp2[:,1],slp2[:,2])
Out[0]:

有和没有ABS的制动距离计算结果的比较:

In [ ]:
plotlyjs()
plot(stop_distance1[:,1], stop_distance1[:,2]./3.28084, label="Торможение с АБС", xlabel="Время, с", ylabel="Тормозной путь, м")
plot!(stop_distance2[:,1], stop_distance2[:,2]./3.28084, label="Торможение без АБС", legend=:bottomright)
Out[0]:

结论:

在本例中,演示了防堵塞系统的仿真。 有和没有ABS的制动距离的比较表明,用ABS制动是最有效的。