一个滚动的圆盘,用凯恩的方法#

在这里,滚动圆盘的运动学定义是从接触点向上形成的,无需引入广义速度。描述这个系统只需要3个配置和3个速度变量,以及圆盘的质量和半径,以及局部重力(注意质量会下降)。:

>>> from sympy import symbols, sin, cos, tan
>>> from sympy.physics.mechanics import *
>>> q1, q2, q3, u1, u2, u3  = dynamicsymbols('q1 q2 q3 u1 u2 u3')
>>> q1d, q2d, q3d, u1d, u2d, u3d = dynamicsymbols('q1 q2 q3 u1 u2 u3', 1)
>>> r, m, g = symbols('r m g')
>>> mechanics_printing(pretty_print=False)

运动学是由一系列简单的旋转形成的。每个简单的旋转都会创建一个新帧,下一个旋转由新帧的基向量定义。本例使用3-1-2系列旋转,或Z、X、Y系列旋转。角速度是用第二个框架的基础(倾斜的框架)来定义的;正是因为这个原因,我们定义了中间帧,而不是使用物体三个方向。:

>>> N = ReferenceFrame('N')
>>> Y = N.orientnew('Y', 'Axis', [q1, N.z])
>>> L = Y.orientnew('L', 'Axis', [q2, Y.x])
>>> R = L.orientnew('R', 'Axis', [q3, L.y])
>>> w_R_N_qd = R.ang_vel_in(N)
>>> R.set_ang_vel(N, u1 * L.x + u2 * L.y + u3 * L.z)

这是平移运动学。我们创建一个N中没有速度的点,这是圆盘和地面之间的接触点。接下来,我们形成从接触点到圆盘质心的位置向量。最后我们得到了圆盘的速度和加速度。:

>>> C = Point('C')
>>> C.set_vel(N, 0)
>>> Dmc = C.locatenew('Dmc', r * L.z)
>>> Dmc.v2pt_theory(C, N, R)
r*u2*L.x - r*u1*L.y

这是形成惯性并矢的一种简单方法。圆盘的惯性在倾斜的框架内不会随着圆盘的滚动而改变;这将使方程最终变得更简单。:

>>> I = inertia(L, m / 4 * r**2, m / 2 * r**2, m / 4 * r**2)
>>> mprint(I)
m*r**2/4*(L.x|L.x) + m*r**2/2*(L.y|L.y) + m*r**2/4*(L.z|L.z)

运动微分方程;广义坐标时间导数与广义速度的关系。:

>>> kd = [dot(R.ang_vel_in(N) - w_R_N_qd, uv) for uv in L]

创建力列表;它是圆盘质心处的重力。然后我们通过为“质心”(center of mass)属性指定一个点,为“帧”(frame)属性指定一个参考帧,以及“质量”(mass)和“惯性”(inertia)来创建圆盘。然后我们形成尸体名单。:

>>> ForceList = [(Dmc, - m * g * Y.z)]
>>> BodyD = RigidBody('BodyD', Dmc, R, m, (I, Dmc))
>>> BodyList = [BodyD]

最后,我们用和以前一样的步骤,形成运动方程。指定惯性系,提供广义坐标和速度,提供运动学微分方程字典,从力列表计算Fr,从实体列表计算Fr*,计算质量矩阵和力项,然后求解u点(广义速度的时间导数)。:

>>> KM = KanesMethod(N, q_ind=[q1, q2, q3], u_ind=[u1, u2, u3], kd_eqs=kd)
>>> (fr, frstar) = KM.kanes_equations(BodyList, ForceList)
>>> MM = KM.mass_matrix
>>> forcing = KM.forcing
>>> rhs = MM.inv() * forcing
>>> kdd = KM.kindiffdict()
>>> rhs = rhs.subs(kdd)
>>> rhs.simplify()
>>> mprint(rhs)
Matrix([
[(4*g*sin(q2) + 6*r*u2*u3 - r*u3**2*tan(q2))/(5*r)],
[                                       -2*u1*u3/3],
[                          (-2*u2 + u3*tan(q2))*u1]])