向量:运动学#

本文将提供一些数学背景来描述系统的运动学以及如何在 sympy.physics.vector .

运动学导论#

第一个主题是刚体运动运动学。它是一个理想的转动物体,它有一个物体的转动惯量。刚体显然不灵活。我们可以把刚体运动分解为平移运动和旋转运动(当处理粒子时,我们只有平移运动)。旋转运动可以进一步分解为简单旋转和一般旋转。

刚体的平移定义为在运动期间主体方向不会改变的运动;或在运动期间,任何线段在运动开始时都会与自身平行。

简单旋转是指身体的方向可能改变的旋转,但在运动开始时总有一条线保持与自身平行。

一般旋转是指在运动开始时并不总是有一条直线平行于自身的旋转。

角速度#

刚体的角速度是指其方向的变化率。物体的角速度记为: \(^{{\mathbf{{N}}}}\mathbf{{\omega}}^{{\mathbf{{B}}}}\) ,或 \(\mathbf{{B}}\) 在里面 \(\mathbf{{N}}\) ,它是一个向量。注意这里使用了刚体这个术语,但是参考坐标系也可以有角速度。稍后在描述代码表示时,将进一步讨论刚体和参考坐标系之间的区别。

角速度被定义为在使定向角增加的方向上为正(对于简单旋转,或一系列简单旋转)。

B N ny nx nz nx NwB=q nx

角速度矢量表示方向的时间导数。作为一个时间导数向量量,就像向量和参考帧文档中所包含的那样,这个量(角速度)需要在参考框架中定义。这就是 \(\mathbf{{N}}\) 在上述角速度的定义中;角速度定义的框架。

角速度 \(\mathbf{{B}}\) 在里面 \(\mathbf{{N}}\) 也可以通过以下方式定义:

\[^{\mathbf{N}}\mathbf{\omega}^{\mathbf{B}}=\]

同样,物体的角速度也可以写成:

\[^{\mathbf{N}\mathbf{\omega}^{\mathbf{B}}=w}x\mathbf{\hat{B}}ux}+\]

还有一些与角速度有关的重要点。第一个是角速度的加法定理,一种将多个物体和多个框架的角速度联系起来的方法。定理如下:

\[^{\mathbf{N}\mathbf{\omega}^{\mathbf{D}}=\]

下面的示例也显示了这一点:

nx ny nz q1 q2 q3 ax bz cy A B C D N
\[\begin{split}^{\mathbf{N}\mathbf{\omega}^{\mathbf{A}}&=0\\\end{split}\]

注意角速度定义中使用的符号,这些符号与在这种情况下如何定义位移角有关。

这个定理使得定义多体系统的角速度变得容易得多,因为链中一个物体的角速度只需要定义到前一个物体上才能被完全定义(并且第一个物体需要在期望的参考系中被定义)。下图显示了一个使用这个定理可以使事情变得更简单的例子。

image/svg+xml p1 w1 w2 p2 p3 w3

这里我们可以很容易地写出物体的角速度 \(\mathbf{{D}}\) 在第一个物体的坐标系中 \(\mathbf{{A}}\)

\[^\mathbf{A}\mathbf{\omega}^\mathbf{D}=wu1\mathbf{\hat{p}}+\]

记住只在角速度下使用这个定理是非常重要的;你不能用这个定理来计算点的速度。

还有一个常用的定理:导数定理。它提供了另一种方法(可能更容易)来计算参考坐标系中向量的时间导数:

\[\frac{^{\mathbf{N}}d\mathbf{v}}{dt}=\frac{{\mathbf{B}}}d\mathbf{v}}{dt}\]

向量 \(\mathbf{{v}}\) 可以是任何向量量:位置向量、速度向量、角速度向量等,而不是取向量的时间导数 \(\mathbf{{N}}\) ,我们接受了 \(\mathbf{{B}}\) 在哪里 \(\mathbf{{B}}\) 可以是任何一个参考系或物体,通常是一个容易求导的物体 \(\mathbf{{v}}\) 在里面 (\(\mathbf{{v}}\) 通常只由属于 \(\mathbf{{B}}\) ). 然后我们加上新框架的角速度的叉积, \(^{{\mathbf{{N}}}}\mathbf{{\omega}}^{{\mathbf{{B}}}}\) 以及我们的矢量量 \(\mathbf{{v}}\) . 同样,您可以选择任何其他框架。示例如下:

角加速度#

角加速度是指角速度矢量的时间变化率。正如角速度矢量适用于物体并在帧中指定,角加速度矢量适用于物体并在帧中指定: \(^{{\mathbf{{N}}}}\mathbf{{\alpha}}^{{\mathbf{{B}}}}\) ,或角加速度 \(\mathbf{{B}}\) 在里面 \(\mathbf{{N}}\) ,它是一个向量。

角加速度的计算相对简单:

\[^{\mathbf{N}}\mathbf{\alpha}^{\mathbf{B}}=\]

注意,这可以用导数定理计算,当角速度定义在一个物体固定的框架中时,变得非常简单:

\[^{\mathbf{N}}\mathbf{\alpha}^{\mathbf{B}}&=\]

同样,这只适用于物体的角速度在物体固定部件中定义的情况。

点速度和加速度#

考虑一点, \(P\) :我们可以定义点的一些特征。首先,我们可以定义一个从其他点到 \(P\) . 其次,我们可以定义 \(P\) 在我们选择的参照系中。第三,我们可以定义 \(P\) 在我们选择的参照系中。

这三个量是:

\[\mathbf{r}^{OP}\textrm{,来自}O的位置向量\]

请注意,位置向量没有与之相关联的帧;这是因为与速度和加速度向量不同,不涉及时间导数。

对于一个简单的例子,我们可以很容易地找到这些量:

image/svg+xml P O N rOP
\[\textrm{让我们定义一下:}\]

在上面的例子中,必须理解以下要点 \(O\) 固定在参考系中 \(\mathbf{{N}}\) . 没有关于平动速度的加法定理;不过,后面将讨论替代方法。还要注意,可能并不总是需要定义每个点的位置来形成运动的动力学方程。如果不想定义点的位置向量,可以从定义速度向量开始。对于上述示例:

\[\textrm{让我们把速度向量定义为:}\]

通常会有这样的情况:一个点的速度是期望的,而相关点的速度是已知的。对于有两点固定在刚体上的情况,我们使用两点定理:

image/svg+xml N B Ofixed in N Pfixed in B Sfixed in B

假设我们知道点的速度 \(S\) 以及物体的角速度 \(\mathbf{{B}}\) ,两者都在参考框架中定义 \(\mathbf{{N}}\) . 我们可以计算出点的速度和加速度 \(P\) 在里面 \(\mathbf{{N}}\) 如下:

\[^{\mathbf{N}}\mathbf{v}^P&=^\mathbf{N}\mathbf{v}^S+\]

当两个点中只有一个固定在一个物体上时,用1点定理代替。

image/svg+xml B N Ofixed in N Pnot fixed in B Sfixed in B

这里,点的速度 \(S\) 在框架中是已知的 \(\mathbf{{N}}\) ,角速度 \(\mathbf{{B}}\)\(\mathbf{{N}}\) ,以及点的速度 \(P\) 在与身体相关的帧中是已知的 \(\mathbf{{B}}\) . 然后我们可以写出 \(P\) 在里面 \(\mathbf{{N}}\) AS:

\[^{\mathbf{N}}\mathbf{v}^P&=^\mathbf{B}\mathbf{v}^P+\]

下面是1点定理和2点定理的应用实例。

image/svg+xml N nx ny nz B O P bz by bx rOP

这个例子有一个圆盘在一个平面上平移和旋转。我们可以很容易地定义物体的角速度 \(\mathbf{{B}}\) 点的速度 \(O\)

\[^\mathbf{N}\mathbf{\omega}^\mathbf{B}&=u3\mathbf{\hat{N}}uz}=u3\]

加速度可以写成:

\[^\mathbf{N}\mathbf{\alpha}^\mathbf{B}&=\dot{u3}\mathbf{\hat{N}uz}=\]

我们可以用两点定理来计算点的速度和加速度 \(P\) 现在。

\[\begin{split}\mathbf{r}^{OP}&=r\mathbf{\hat{b}}ux}\\\end{split}\]
image/svg+xml nx ny bx by cx cy P Q O N B C

在这个例子中,我们有一个双摆。我们可以用两点定理两次求点的速度 \(Q\)\(P\) 点;点 \(O\) 的速度是零 \(\mathbf{{N}}\) .

\[\begin{split}\mathbf{r}^{OQ}&=l\mathbf{\hat{b}}ux}\\\end{split}\]
image/svg+xml O P Q nx nz ny q1 q2 cx cy cz C N

在这个例子中,我们有一个粒子在环上移动;这个环由一个可以绕环旋转的杆支撑 \(\mathbf{{\hat{{n}}_x}}\) 轴心国。首先我们用两点定理求环的中心点的速度, \(Q\) ,然后利用1点定理求出质点在环上的速度。

\[\begin{split}^\mathbf{N}\mathbf{\omega}^\mathbf{C}&=u}1\mathbf{\hat{N}}ux}\\\end{split}\]

点速度描述的最后一个主题是滚动,或者更确切地说,无滑移滚动。当且仅当每一物体上的接触点在另一帧中的速度相同时,两个物体被称为滚动而不滑动。如下图所示:

image/svg+xml A B N P Pa is the contact point on body A Pb is the contact point on body B Rolling without slip iff: NvPa = NvPb

这通常用于形成一个对象上的一个点在另一个固定对象上滚动的速度,例如在以下示例中:

运动学物理.矢量#

It should be clear by now that the topic of kinematics here has been mostly describing the correct way to manipulate vectors into representing the velocities of points. Within sympy.physics.vector there are convenient methods for storing these velocities associated with frames and points. We'll now revisit the above examples and show how to represent them in sympy.

参考坐标系创建的主题已经讨论过了。当 ReferenceFrame 但是,它使用DCM的时间导数和角速度定义自动计算帧的角速度。:

>>> from sympy import Symbol, sin, cos
>>> from sympy.physics.vector import *
>>> init_vprinting(pretty_print=False)
>>> N = ReferenceFrame('N')
>>> q1 = dynamicsymbols('q1')
>>> A = N.orientnew('A', 'Axis', [q1, N.x])
>>> A.ang_vel_in(N)
q1'*N.x

注意,角速度可以用另一种方式定义:::

>>> B = ReferenceFrame('B')
>>> u1 = dynamicsymbols('u1')
>>> B.set_ang_vel(N, u1 * B.y)
>>> B.ang_vel_in(N)
u1*B.y
>>> N.ang_vel_in(B)
- u1*B.y

在创建帧时 orientnew 打电话的时候 set_ang_vel ,角速度设置在两个相关的帧中,如上图所示。

nx ny nz q1 q2 q3 ax bz cy A B C D N

这里我们有多个物体,它们的角速度是相对的。代码为:::

>>> N = ReferenceFrame('N')
>>> A = ReferenceFrame('A')
>>> B = ReferenceFrame('B')
>>> C = ReferenceFrame('C')
>>> D = ReferenceFrame('D')
>>> u1, u2, u3 = dynamicsymbols('u1 u2 u3')
>>> A.set_ang_vel(N, 0)
>>> B.set_ang_vel(A, u1 * A.x)
>>> C.set_ang_vel(B, -u2 * B.z)
>>> D.set_ang_vel(C, u3 * C.y)
>>> D.ang_vel_in(N)
u1*A.x - u2*B.z + u3*C.y

sympy.physics.vector 求角速度时使用两帧之间的最短路径。那就意味着如果我们回去设定:

>>> D.set_ang_vel(N, 0)
>>> D.ang_vel_in(N)
0

刚才定义的路径就是使用的路径。但这可能会引起问题,因为现在角速度的定义不一致。建议您避免这样做。

点是旋转的平动模拟 ReferenceFrame . 创建 Point 有两种方法,比如 ReferenceFrame ::

>>> O = Point('O')
>>> P = O.locatenew('P', 3 * N.x + N.y)
>>> P.pos_from(O)
3*N.x + N.y
>>> Q = Point('Q')
>>> Q.set_pos(P, N.z)
>>> Q.pos_from(P)
N.z
>>> Q.pos_from(O)
3*N.x + N.y + N.z

类似 ReferenceFrame 其中,两点之间的位置向量由两点之间的最短路径(中间点的个数)求得。与旋转运动不同,点的速度没有加法定理。为了得到 Point 在一个 ReferenceFrame ,必须设置值。:

>>> O = Point('O')
>>> O.set_vel(N, u1*N.x)
>>> O.vel(N)
u1*N.x

对于平动和旋转加速度,除非用户另有设置,否则该值是通过取适当速度的时间导数来计算的。

>>> O.acc(N)
u1'*N.x
>>> O.set_acc(N, u2*u1*N.y)
>>> O.acc(N)
u1*u2*N.y

接下来是2点和1点定理的描述,如 sympy .

image/svg+xml N nx ny nz B O P bz by bx rOP

首先是平移,旋转圆盘。:

>>> N = ReferenceFrame('N')
>>> u1, u2, u3 = dynamicsymbols('u1 u2 u3')
>>> R = Symbol('R')
>>> B = ReferenceFrame('B')
>>> O = Point('O')
>>> O.set_vel(N, u1 * N.x + u2 * N.y)
>>> P = O.locatenew('P', R * B.x)
>>> B.set_ang_vel(N, u3 * B.z)
>>> P.v2pt_theory(O, N, B)
u1*N.x + u2*N.y + R*u3*B.y
>>> P.a2pt_theory(O, N, B)
u1'*N.x + u2'*N.y - R*u3**2*B.x + R*u3'*B.y

我们还将讨论1点定理的实现。

image/svg+xml O P Q nx nz ny q1 q2 cx cy cz C N

这是粒子在环上运动。:

>>> N = ReferenceFrame('N')
>>> u1, u2 = dynamicsymbols('u1 u2')
>>> q1, q2 = dynamicsymbols('q1 q2')
>>> l = Symbol('l')
>>> R = Symbol('R')
>>> C = N.orientnew('C', 'Axis', [q1, N.x])
>>> C.set_ang_vel(N, u1 * N.x)
>>> O = Point('O')
>>> O.set_vel(N, 0)
>>> Q = O.locatenew('Q', -l * C.z)
>>> P = Q.locatenew('P', R * (cos(q2) * C.x + sin(q2) * C.y))
>>> P.set_vel(C, R * u2 * (-sin(q2) * C.x + cos(q2) * C.y))
>>> Q.v2pt_theory(O, N, C)
l*u1*C.y
>>> P.v1pt_theory(Q, N, C)
- R*u2*sin(q2)*C.x + (R*u2*cos(q2) + l*u1)*C.y + R*u1*sin(q2)*C.z