Документация 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{угловая скорость колеса.}$

Из этих выражений мы видим, что проскальзывание равно нулю, когда скорость колеса и скорость транспортного средства равны, и проскальзывание равно единице, когда колесо заблокировано. Целевое значение проскальзывания равно 0,2, что означает, что число оборотов колеса в 0,8 раза должно превышать число оборотов в режиме без торможения при той же скорости автомобиля. Это максимизирует сцепление шины с дорогой и минимизирует тормозной путь при имеющемся трении.

Коэффициент трения между шиной и дорожным покрытием, mu, является эмпирической функцией скольжения, известной как кривая mu-скольжения. Мы создали кривые mu-скольжения, передав переменные MATLAB в блок-схему, используя таблицу поиска Simulink. Модель умножает коэффициент трения, mu, на вес колеса, чтобы получить силу трения, действующую на окружность шины. Сила трения делится на массу транспортного средства для получения замедления, которое модель интегрирует для получения скорости.

В этой модели мы использовали идеальный антиблокировочный контроллер торможения, который использует управление, основанное на разнице между фактическим и желаемым проскальзыванием. Мы устанавливаем желаемое проскальзывание на величину проскальзывания, при которой кривая mu-slip достигает максимального значения, что является оптимальным значением для минимального тормозного пути (см. примечание ниже).

Примечание: В реальном транспортном средстве пробуксовку невозможно измерить напрямую, поэтому данный алгоритм управления непрактичен. В этом примере он используется для иллюстрации концептуального построения такой имитационной модели. Реальная инженерная ценность подобного моделирования заключается в том, чтобы показать потенциал концепции управления до решения конкретных вопросов реализации.

Запуск модели с включённой АБС

Подключение бэкенда - метода этображения графики:

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

Начальные условия, определяющие включение или выключение АБС:

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

Запуск модели с выключенной АБС

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

Вывод:

В данном примере было продемонстрировано моделирование анти-блокировочной системы. Сравнение результатов тормозного пути с АБС и без неё показало что торможение с АБС наиболее эффективно.

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