Документация Engee

Моделирование антиблокировочной системы

В данном примере будет продемонстрировано моделирование антиблокировочной тормозной системы (ABS). Модель имитирует динамическое поведение транспортного средства в условиях резкого торможения и представляет собой одно колесо, которое может быть воспроизведено несколько раз для создания модели многоколесного транспортного средства.

Общий вид модели:

absbrake—​1708524133239.png

Колесо вращается с начальной угловой скоростью, которая соответствует скорости транспортного средства до нажатия на педаль тормоза. Для расчета проскальзывания, которое определяется в блоке уравнений, мы используем две скорости. Скорость транспортного средства выражается в виде угловой скорости.

равнаугловойскоростиколесаеслинетпробуксовки

Блок уравнений

где:

  • скоростьтранспортногосредстваделеннаянарадиусколеса

  • линейнаяскоростьтранспортногосредства

  • радиусколеса

  • угловаяскоростьколеса

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

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

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

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

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

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

using Plots
gr()
Plots.GRBackend()

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

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

Загрузка и запуск модели:

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%
Dict{String, DataFrames.DataFrame} with 2 entries:
  "slp"                 => 1501×2 DataFrame…
  "stopping distance.1" => 1501×2 DataFrame…

Выделение из переменной simout данных, описывающих тормозной путь и скольжение:

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

Определение данных из модели в соответствующие переменные:

slp1 = collect(data1[2])
stop_distance1 = collect(data1[1])
1501×2 DataFrame
  Row │ time   value
      │ Any    Any
──────┼────────────────
    1 │ 0.0    0.0
    2 │ 0.01   0.88
    3 │ 0.02   1.76
    4 │ 0.03   2.64
    5 │ 0.04   3.52
    6 │ 0.05   4.4
    7 │ 0.06   5.28
    8 │ 0.07   6.15999
    9 │ 0.08   7.03998
   10 │ 0.09   7.91997
   11 │ 0.1    8.79996
  ⋮   │   ⋮       ⋮
 1492 │ 14.91  720.746
 1493 │ 14.92  720.746
 1494 │ 14.93  720.746
 1495 │ 14.94  720.746
 1496 │ 14.95  720.746
 1497 │ 14.96  720.746
 1498 │ 14.97  720.746
 1499 │ 14.98  720.746
 1500 │ 14.99  720.746
 1501 │ 15.0   720.746
      1480 rows omitted

Визуализация величины скольжения по времени:

plot(slp1[:,1],slp1[:,2])

interactive-scripts/images/controls_absbrake/127d8f8981bdcfb7957968f8e1d0d5f1d9784129

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

ctrl = 0.0;

Изменение параметра модели:

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%
Dict{String, DataFrames.DataFrame} with 2 entries:
  "slp"                 => 1501×2 DataFrame…
  "stopping distance.1" => 1501×2 DataFrame…

Выделение из переменной simout данных, описывающих тормозной путь и скольжение:

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

Определение данных из модели в соответствующие переменные:

slp2 = collect(data2[2])
stop_distance2 = collect(data2[1])
1501×2 DataFrame
  Row │ time   value
      │ Any    Any
──────┼────────────────
    1 │ 0.0    0.0
    2 │ 0.01   0.88
    3 │ 0.02   1.76
    4 │ 0.03   2.64
    5 │ 0.04   3.52
    6 │ 0.05   4.4
    7 │ 0.06   5.28
    8 │ 0.07   6.15999
    9 │ 0.08   7.03998
   10 │ 0.09   7.91997
   11 │ 0.1    8.79996
  ⋮   │   ⋮       ⋮
 1492 │ 14.91  795.891
 1493 │ 14.92  795.998
 1494 │ 14.93  796.105
 1495 │ 14.94  796.211
 1496 │ 14.95  796.316
 1497 │ 14.96  796.421
 1498 │ 14.97  796.526
 1499 │ 14.98  796.63
 1500 │ 14.99  796.733
 1501 │ 15.0   796.836
      1480 rows omitted

Визуализация величины скольжения по времени:

plot(slp2[:,1],slp2[:,2])

interactive-scripts/images/controls_absbrake/f1f97ca78c75131be49a3750e5b543f9df556362

Сравнение результатов расчёта тормозного пути с АБС и без неё

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

interactive-scripts/images/controls_absbrake/adf8d99a17723958f6b5f63fff91bcf3d670ba1f

Вывод

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