这个例子展示了如何通过使用连续时间矩阵变量来建模台球游戏中的开场射门。在模型中,Stateflow®图表模拟了具有大量不连续的混合系统的动态。有关更多信息,请参见状态流中的连续时间建模.
当模拟开始时,MATLAB®用户界面(UI)显示一个台球桌,15个台球排列在一个三角形的架子上。然后UI会提示你选择主球的初始位置和速度。当主球被释放时,UI将使台球的运动动画化,因为它们经历了一系列快速碰撞。
该模型包括:
状态流图Init,它调用该函数sf_pool_plotter.m
根据UI的输入初始化主球的位置和速度。
状态流图池,计算每个台球的二维动态。
MATLAB函数块图,其中调用函数sf_pool_plotter.m
在模拟过程中使台球的运动动画化。
Scope块Vel,用于显示每个台球在开始射击时的速度。
为了表示台球的动态,台球图做了几个假设。
连续时间变量
这个图表忽略了球的旋转,所以系统的状态完全由球的位置和速度来描述。假设每个球都有单位质量,所以它的位置和速度用微分方程组来描述
在哪里而且是与台球桌的摩擦和与其他球的碰撞所产生的力。
为了跟踪球的位置和速度,图表在连续时间变量中存储了一对16 × 2矩阵p
而且v
.在每个矩阵中,的二维位置或速度球。
摩擦模型
为了计算作用在每个球上的摩擦力,图表调用MATLAB函数frictionForce
.这个函数实现了一个简化的摩擦模型。摩擦力以与运动方向相反的恒定力作用于每个运动的球。因为摩擦力不作用于静止的球,所以每个球上的摩擦力具有固有的模态:
在哪里摩擦系数和是重力引起的加速度。
碰撞动力学
为了确定由球之间的碰撞引起的相互作用,图表调用MATLAB函数interactionForce
.当两个球相互接触时,这个函数实现了一个简单的恢复力模型。相互作用力而且Balls是modal:
地点:
是每个球的半径。
而且是弹性常数。
是两个球中心的相对距离。
是两个球之间速度的相对差。
因为球在二维空间中可以自由移动,所以图表使用了16 × 16布尔矩阵ball_interaction
来解释所有潜在的碰撞。例如,当而且球是摸的,值的ball_interaction (i, j)
是真正的
.否则,该值为假
.因为碰撞本质上是对称的,所以图表只使用了矩阵的上三角形部分。
为了计算台球的二维动态,Pool图表调用了几个执行矩阵计算的MATLAB函数。
initBalls
初始化台球桌上每个球的位置和速度。
frictionForce
计算作用在每个球上的摩擦力。
interactionForce
计算作用在每个球上的相互作用力。
isAnyBallGoingToStop
返回值为1
如果有球停止运动。否则,函数返回值0
.
hasBallInteractionChanged
返回值为1
如果任何球的相互作用发生变化。否则,函数返回值0
.
isAnyBallNewlyPocketed
返回值为1
如果有球掉在口袋里。否则,函数返回值0
.
isAnyBallOutOfBounds
返回值为真正的
如果有球在台球桌边界外。否则,函数返回值假
.
nearHole
返回值为真正的
如果球在台球桌的口袋附近。否则,函数返回值假
.
getBallInteraction
返回一个布尔矩阵,指定是否有球相互接触。
updateStopFlags
跟踪哪些球已经停止移动,并将结果存储在向量中停止
.
pocketNewBalls
设置每个口袋球的速度为0
.
resetBallsPosAndVel
重置位于台球桌边界外的任何球的位置和速度。
当您开始模拟时,一个UI显示了一个台球桌,桌子的一端排列着15个台球。要指定主球的初始位置,请单击台球桌上的任意位置。
要指定主球的初始速度,请单击台球桌上的另一个点。
该模型模拟了系统的动力学,并使台球的运动具有动画效果。
若要停止模拟,请关闭UI。