Этот пример показов, как смоделировать входной снимок в бильярдной игре с помощью переменных матриц в непрерывном времени. В модели график Stateflow ® моделирует динамику гибридной системы, которая имеет большое количество разрывов. Для получения дополнительной информации см. «Моделирование в непрерывном времени» в Stateflow.
Когда симуляция начинается, пользовательский интерфейс (UI) MATLAB ® показывает стол с 15 бильярдными мячами, расположенными в треугольной стойке. Затем пользовательский интерфейс предлагает вам выбрать начальное положение и скорость ключевого мяча. Когда бильярдный мяч высвобождается, UI оживляет движение бильярдных мячей, когда они подвергаются последовательности быстрых столкновений.
Модель состоит из:
Init диаграммы Stateflow, которая вызывает функцию sf_pool_plotter.m
для инициализации положения и скорости сигнального мяча на основе входов от UI.
Пул диаграммы Stateflow, который вычисляет двумерную динамику каждого бильярдного мяча.
Блок MATLAB Function Plot, который вызывает функцию sf_pool_plotter.m
для анимации движения бильярдных мячей во время симуляции.
Блок Scope Vel, который отображает скорость каждого бильярдного мяча во время открытия выстрела.
Чтобы представлять динамику бильярдных мячей, график Пула делает несколько предположений.
Переменные непрерывного времени
График игнорирует вращение мячей, поэтому состояние системы описывается полностью положениями и скоростями мячей. Каждый мяч принят с единичной массой, поэтому его положение и скорость описываются системой дифференциальных уравнений
где и являются силами, вызванными трением со таблицей бассейна и столкновениями с другими мячами.
Чтобы отследить положения и скорости мячей, график хранит пару матриц 16 на 2 в переменных непрерывного времени p
и v
. В каждой матрице строка представляет двумерное положение или скорость мяча.
Модель трения
Чтобы вычислить силу трения, действующую на каждый мяч, график вызывает функцию MATLAB frictionForce
. Эта функция реализует упрощенную модель трения. Трение действует на каждый движущийся мяч с постоянной силой, противоположной направлению движения. Поскольку трение не действует на неподвижные мячи, сила трения на каждом мяче по своей сути является модальной:
где - коэффициент трения и является ускорением от силы тяжести.
Динамика столкновений
Чтобы определить взаимодействия, вызванные столкновениями между мячами, график вызывает функцию MATLAB interactionForce
. Эта функция реализует простую модель восстанавливающей силы, когда два мячей контактируют друг с другом. Сила взаимодействия между мячами и является модальной:
где:
- радиус каждого мяча.
и являются константами упругости.
- относительное разделение центров двух мячей.
- относительное различие в скорости между двумя мячами.
Поскольку мячи свободно перемещаются в двух размерностях, на графике используется логическая матрица 16 на 16 ball_interaction
для учета всех потенциальных столкновений. Для примера, когда мячи и касаются, значение ball_interaction(i,j)
является true
. В противном случае это значение false
. Поскольку столкновения носят симметричный характер, на графике используется только верхний треугольный фрагмент матрицы.
Чтобы вычислить двумерную динамику бильярдных мячей, график Пула вызывает несколько функций MATLAB, которые выполняют матричные вычисления.
initBalls
инициализирует положение и скорость каждого мяча на таблице пула.
frictionForce
вычисляет силу трения, действующую на каждый мяч.
interactionForce
вычисляет силу взаимодействия, действующую на каждый мяч.
isAnyBallGoingToStop
возвращает значение 1
если какой-либо мяч перестанет двигаться. В противном случае функция возвращает значение 0
.
hasBallInteractionChanged
возвращает значение 1
если какие-либо взаимодействия с мячом изменяются. В противном случае функция возвращает значение 0
.
isAnyBallNewlyPocketed
возвращает значение 1
если какой-либо мяч падает в карман. В противном случае функция возвращает значение 0
.
isAnyBallOutOfBounds
возвращает значение true
если какой-либо мяч находится вне контура таблицы пула. В противном случае функция возвращает значение false
.
nearHole
возвращает значение true
если мяч находится рядом с карманом на таблицу бассейна. В противном случае функция возвращает значение false
.
getBallInteraction
возвращает логическую матрицу, которая задает, находятся ли какие-либо мячи в контакте друг с другом.
updateStopFlags
отслеживает, какие мячи перестали двигаться, и сохраняет результат в векторе stopped
.
pocketNewBalls
устанавливает скорость каждого карманного мяча равной 0
.
resetBallsPosAndVel
устанавливает положение и скорость любого мяча, который находится вне контура таблицы пула.
Когда вы запускаете симуляцию, UI показывает таблицами бассейна с 15 бильярдными мячей, расположенными на одном конце таблицы. Чтобы указать начальное положение битого мяча, щелкните в любом месте таблицы пула.
Чтобы задать начальную скорость битого мяча, щелкните другое место на таблице пула.
Модель моделирует динамику системы и анимирует движение бильярдных мячей.
Чтобы остановить симуляцию, закройте пользовательский интерфейс.