exponenta event banner

Моделирование динамики движения бильярдных шаров

В этом примере показано, как моделировать открывающий снимок в бильярдной игре с помощью переменных матрицы непрерывного времени. В модели диаграмма Stateflow ® моделирует динамику гибридной системы с большим количеством разрывов. Дополнительные сведения см. в разделе Непрерывное моделирование времени в Stateflow.

При запуске моделирования пользовательский интерфейс MATLAB ® отображает таблицу пула с 15 бильярдными шариками, расположенными в треугольной стойке. Затем пользовательский интерфейс предложит выбрать начальное положение и скорость контрольного шара. Когда контрольный шар освобождается, пользовательский интерфейс анимирует движение бильярдных шаров, когда они подвергаются последовательности быстрых столкновений.

Модель состоит из:

  • Диаграмма Stateflow Init, вызывающая функцию sf_pool_plotter.m инициализировать положение и скорость контрольного шара на основе входных данных пользовательского интерфейса.

  • Пул диаграммы Stateflow, который вычисляет двумерную динамику каждого бильярдного шара.

  • График функционального блока MATLAB, который вызывает функцию sf_pool_plotter.m для анимации движения бильярдных шаров во время моделирования.

  • Блок Scope Vel, который отображает скорость каждого бильярдного шара во время открывающего выстрела.

Расчет динамики непрерывного времени

Чтобы представить динамику бильярдных шаров, график Пула делает несколько предположений.

Переменные непрерывного времени

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

$$
\left\{ \begin{array}{ll}
\dot{\mathbf{p}} = \mathbf{v} \\
\dot{\mathbf{v}} = \mathbf{F}_\mathrm{friction} +
\mathbf{F}_\mathrm{interaction},
\end{array} \right.
$$

где$\mathbf{F}_\mathrm{friction}$ и$\mathbf{F}_\mathrm{interaction}$ являются силами, вызванными трением со столом бассейна и столкновениями с другими шариками.

Для отслеживания положений и скоростей шаров диаграмма сохраняет пару матриц 16 на 2 в переменных непрерывного времени. p и v. В каждой матрице$i^\mathrm{th}$ строка представляет двумерное положение или скорость$i^\mathrm{th}$ шара.

Модель трения

Для вычисления силы трения, действующей на каждый шар, диаграмма вызывает функцию MATLAB frictionForce. Эта функция реализует упрощенную модель трения. Трение действует на каждый движущийся шар с постоянной силой, противоположной направлению движения. Поскольку трение не действует на неподвижные шарики, сила трения на каждом шарике по своей природе является модальной:

$$
\mathbf{F}_\mathrm{friction} =
\left\{ \begin{array}{ll}
-\mu g \displaystyle\frac{\mathbf{v}}{\|\mathbf{v}\|}
& \|\mathbf{v}\|>0 \\
0 & \mathrm{otherwise,}
\end{array} \right.
$$

где$\mu$ - коэффициент трения и$g$ - ускорение под действием силы тяжести.

Динамика коллизий

Чтобы определить взаимодействия, вызванные столкновениями между шарами, диаграмма вызывает функцию MATLAB interactionForce. Эта функция реализует простую модель восстанавливающей силы, когда два шара соприкасаются друг с другом. Сила взаимодействия между$i^\mathrm{th}$ шариками и$j^\mathrm{th}$ является модальной:

$$&#xA;\mathbf{F}_{\mathrm{interaction}}(i,j) =&#xA;\left\{ \begin{array}{ll}&#xA;k_p (2R-\|\Delta \mathbf{p}\|)&#xA;\displaystyle\frac{\Delta \mathbf{p}}{\|\Delta \mathbf{p}\|}&#xA;- k_v\Delta \mathbf{v} &#38; \|\Delta \mathbf{p}\| < 2R \\&#xA;0 &#38; \mathrm{otherwise,}&#xA;\end{array} \right.&#xA;$$

где:

  • $R$ - радиус каждого шара.

  • $k_p$ и$k_v$ являются константами упругости.

  • $\Delta \mathbf{p} = \mathbf{p}_i - \mathbf{p}_j$ - относительное разделение центров двух шаров.

  • $\Delta \mathbf{v} = \mathbf{v}_i - \mathbf{v}_j$ - относительная разница в скорости между двумя шариками.

Поскольку шарики могут свободно перемещаться в двух измерениях, диаграмма использует логическую матрицу 16 на 16 ball_interaction для учета всех потенциальных конфликтов. Например, при$i^\mathrm{th}$ $j^\mathrm{th}$касании шаров и значение ball_interaction(i,j) является true. В противном случае это значение равно false. Поскольку конфликты являются симметричными по своей природе, диаграмма использует только верхнюю треугольную часть матрицы.

Выполнение матричных вычислений в функциях MATLAB

Для вычисления двумерной динамики бильярдных шаров диаграмма Пула вызывает несколько функций 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 сбрасывает положение и скорость любого шара, который лежит вне границы таблицы пула.

Просмотр результатов моделирования

При запуске моделирования пользовательский интерфейс отображает стол бассейна с 15 бильярдными шариками, расположенными на одном конце стола. Чтобы указать начальное положение мяча, щелкните в любом месте таблицы пула.

Чтобы указать начальную скорость мяча, щелкните другое место на таблице пула.

Модель моделирует динамику системы и анимирует движение бильярдных шаров.

Чтобы остановить моделирование, закройте пользовательский интерфейс.

Связанные темы