Engee 文档
Notebook

防抱死制动系统建模

本例将演示防抱死制动系统(ABS)的建模。该模型模拟车辆在强制动条件下的动态行为,并代表一个车轮,可多次复制以创建多轮车辆模型。

模型概览:

absbrake_1708524133239.png

车轮旋转的初始角速度与踩下制动踏板前的车速一致。我们使用两个速度来计算滑移,滑移在方程块中定义。车速用角速度表示。

$$\omega_v = \frac{V}{R} \mbox{ (равна угловой скорости колеса, если нет пробуксовки)}$$

方程组

$$ \omega_v = \frac{V_v}{R_r}$$

$$slip=1-\frac{\omega_w}{\omega_v}$$

在哪里? -$\omega_v - \mbox{ скорость транспортного средства, деленная на радиус колеса,}$ -$V_v - \mbox{линейная скорость транспортного средства,}$ -$R_r - \mbox{ радиус колеса,}$ -$\omega_w - \mbox{угловая скорость колеса.}$

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

轮胎与路面之间的摩擦系数μ是一个经验滑移函数,称为μ滑移曲线。我们使用 Simulink 查找表将 MATLAB 变量传递到流程图中,从而创建了μ-滑移曲线。该模型将摩擦系数 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("/user/start/examples/controls/absbrake/absbrake.engee") # загрузка модели
    end;

try
    engee.run(m, verbose=true) # запуск модели
    catch err # в случае, если модель не загружена и engee.run() не выполняется, то будут выполнены две нижние строки после catch
        m = engee.load("/user/start/examples/controls/absbrake/absbrake.engee") # загрузка модели
        engee.run(m, verbose=true) # запуск модели
    end
Building...
Progress 100%
Out[0]:
Dict{String, DataFrames.DataFrame} with 2 entries:
  "slp"                 => 1501×2 DataFrame…
  "stopping distance.1" => 1501×2 DataFrame

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

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

将模型中的数据定义为相关变量:

In [ ]:
slp1 = collect(data1[2])
stop_distance1 = collect(data1[1])
Out[0]:

1,501 rows × 2 columns

timevalue
AnyAny
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
140.1311.4399
150.1412.3198
160.1513.1998
170.1614.0797
180.1714.9596
190.1815.8396
200.1916.7194
210.217.5993
220.2118.4792
230.2219.359
240.2320.2389
250.2421.1187
260.2521.9984
270.2622.8782
280.2723.7579
290.2824.6376
300.2925.5173

可视化时间滑移的幅度:

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("/user/start/examples/controls/absbrake/absbrake.engee") # загрузка модели
    end;

try
    engee.run(m, verbose=true) # запуск модели
    catch err # в случае, если модель не загружена и engee.run() не выполняется, то будут выполнены две нижние строки после catch
        m = engee.load("/user/start/examples/controls/absbrake/absbrake.engee") # загрузка модели
        engee.run(m, verbose=true) # запуск модели
    end
Building...
Progress 100%
Out[0]:
Dict{String, DataFrames.DataFrame} with 2 entries:
  "slp"                 => 1501×2 DataFrame…
  "stopping distance.1" => 1501×2 DataFrame

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

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

将模型中的数据定义为相关变量:

In [ ]:
slp2 = collect(data2[2])
stop_distance2 = collect(data2[1])
Out[0]:

1,501 rows × 2 columns

timevalue
AnyAny
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
140.1311.4399
150.1412.3198
160.1513.1998
170.1614.0797
180.1714.9596
190.1815.8396
200.1916.7194
210.217.5993
220.2118.4792
230.2219.359
240.2320.2389
250.2421.1187
260.2521.9984
270.2622.8782
280.2723.7579
290.2824.6376
300.2925.5173

可视化时间滑移的幅度:

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

有防抱死制动系统和无防抱死制动系统制动距离计算结果的比较:

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

结论

本例演示了防抱死制动系统的模拟。有防抱死制动系统和无防抱死制动系统的制动距离比较结果表明,有防抱死制动系统的制动效果最好。