Моделирование антиблокировочной системы
В данном примере будет продемонстрировано моделирование антиблокировочной тормозной системы (ABS). Модель имитирует динамическое поведение транспортного средства в условиях резкого торможения и представляет собой одно колесо, которое может быть воспроизведено несколько раз для создания модели многоколесного транспортного средства.
Общий вид модели:
Колесо вращается с начальной угловой скоростью, которая соответствует скорости транспортного средства до нажатия на педаль тормоза. Для расчета проскальзывания, которое определяется в блоке уравнений, мы используем две скорости. Скорость транспортного средства выражается в виде угловой скорости.
Блок уравнений
где:
Из этих выражений мы видим, что проскальзывание равно нулю, когда скорость колеса и скорость транспортного средства равны, и проскальзывание равно единице, когда колесо заблокировано. Целевое значение проскальзывания равно 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])
Запуск модели с выключенной АБС
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])