刚体动力学算法 Chapter 3 刚体系统动力学(2)

3.4 约束分类

运动约束可以根据其对刚体系统施加的约束性质进行分类。在每种情况下,约束都由系统的运动变量的代数方程描述,但方程的形式各不相同。如图3.1所示,有一个标准的分类层次结构。

在这里插入图片描述

图3.1:运动约束的分类

首先区分等式约束和不等式约束。前者源于两个刚体之间的永久物理接触;后者则在刚体既可以接触又可以分离时产生。不等式约束可用于描述碰撞、弹跳和失去接触等现象。它们是第11章的主题,在这里不再进一步考虑。

接下来区分完整约束和非完整约束。前者是对位置变量的约束,通常源于滑动接触(sliding contact)。后者是对速度变量的约束,通常源于滚动接触( rolling contact)。非完整约束函数 ϕ n h \phi_{n h} ϕnh在速度变量上是线性的,因此可以表达为以下形式
ϕ n h ( q , q ˙ , t ) = ϕ n h 0 + ∑ i = 1 n ϕ n h i q ˙ i (3.29) \phi_{n h}(\boldsymbol{q}, \dot{\boldsymbol{q}}, t)=\phi_{n h}^{0}+\sum_{i=1}^{n} \phi_{n h}^{i} \dot{q}_{i} \tag{3.29} ϕnh(q,q˙,t)=ϕnh0+i=1nϕnhiq˙i(3.29)

系数 ϕ n h i \phi_{nh}^i ϕnhi是位置变量和时间的函数。为了对比,一个完整约束函数 ϕ h \phi_h ϕh的时间导数为

d d t ϕ h ( q , t ) = ∂ ϕ h ∂ t + ∑ i = 1 n ∂ ϕ h ∂ q i q ˙ i (3.30) \frac{\mathrm{d}}{\mathrm{d} t} \phi_{h}(\boldsymbol{q}, t)=\frac{\partial \phi_{h}}{\partial t}+\sum_{i=1}^{n} \frac{\partial \phi_{h}}{\partial q_{i}} \dot{q}_{i} \tag{3.30} dtdϕh(q,t)=tϕh+i=1nqiϕhq˙i(3.30)

它具有相同的代数形式。因此,在速度和加速度层面上,完整约束和非完整约束之间没有区别。这两个方程的主要区别在于 方程3.29 是不可积的;也就是说, ϕ n h \phi_{nh} ϕnh 不是任何函数的导数,否则它将仅仅是通过其导数表示的完整约束。这个性质的结果是,含有非完整约束的系统具有比速度自由度更多的位置自由度,因此需要更多的位置变量而非速度变量。如果刚体系统至少包含一个非完整约束,那么它被称为非完整系统;否则,它被称为完整系统。因此,方程3.1 只能描述完整系统,而方程3.5可以描述完整系统和非完整系统。

2 { }^{2} 2鉴于约束方程在所有时间均成立,而不仅在单个时刻成立,因此方程 ϕ ˙ = 0 \dot{\phi}=0 ϕ˙=0 ϕ = 0 \phi=0 ϕ=0描述了同样的约束。

最后,还需区分的是固连约束(scleronomic constraint)与时变约束(rheonomic constraint)。固连约束只是位置变量的函数,而时变约束既与位置变量又与时间有关。固连约束产生于两个刚体之间的滑动接触。它们是典型机械系统中最简单且最常见的约束类型。时变约束可以看作是某些滑动自由度被强制作为时间的预定函数而变化的固连约束。时变约束的作用是引入运动激励;即预定运动。

在这里插入图片描述

图3.2:运动约束示例

图3.2展示了一些运动约束的示例。图(a)和(b)分别显示了一个圆柱接头和一个棱柱接头,它们都是固连约束。圆柱接头允许刚体 B 2 B_2 B2 在相对于 B 1 B_1 B1 的平移和旋转中滑动,而棱柱接头只允许相对滑动运动。因此,圆柱接头具有两个自由度的运动,而棱柱接头仅允许一个自由度的运动。如果我们将圆柱接头的一个自由度设为时间的预定函数,它就变成了一个一自由度的时变约束。如果对棱柱接头也进行同样的处理,它将成为一个零自由度的时变约束(实际上非常有用)。

运动约束几乎总是涉及两个刚体之间的关系。然而,也可能设计涉及多于两个刚体的约束,并且不能简化为一组两体约束。图3.2©给出了一个例子。该图展示了一个二维刚体系统,其中三个相同的圆形刚体受到约束,必须保持在一个无质量、零直径、非弹性的绳子的边界内。假设绳子保持紧绷,这三个刚体可以以满足方程 l 1 + l 2 + l 3 + 2 π r = p l_1+l_2+l_3+2\pi r=p l1+l2+l3+2πr=p 的任何方式自由运动,其中 p p p r r r 分别为绳子的周长和刚体的半径。

图3.2(d)显示了一个球体静止在一个平面表面上。如果这个球体被约束以无滑动地滚动,它会有三个瞬时运动自由度:可以沿两个方向滚动,也可以围绕接触点旋转。然而,通过适当的操作序列,可以使球体到达平面上的任意点,并具有任意方向。因此,它有五个位置自由度。这是非完整约束的特征。如果球体可以滑动,那么它就是一个固连约束。

从图3.2(a)和(b)中刚体的形状可以看出,它们不能被拉开;但是没有物理上的限制约束绳子松弛,或者球体与平面失去接触。如果我们对这些系统即将受到的力有足够的了解,可以确保这种情况不会发生,那么就可以将这些约束建模为等式约束;否则,必须将其建模为不等式约束。

3.5 关节约束

我们定义关节为两个刚体之间的运动约束。因此,一个关节可以对一对刚体的相对速度施加从零到六个约束。我们称这两个刚体为前驱和后继,我们说关节连接从前驱到后继。关节速度 v J \boldsymbol{v}_{\mathrm{J}} vJ 定义为后继相对于前驱的速度:

v J = v s − v p (3.31) \boldsymbol{v}_{\mathrm{J}}=\boldsymbol{v}_{s}-\boldsymbol{v}_{p} \tag{3.31} vJ=vsvp(3.31)

其中 v p \boldsymbol{v}_{p} vp v s \boldsymbol{v}_{s} vs 分别是前驱和后继刚体的速度。关节约束的一般形式是

v J = S ( q , t ) q ˙ + σ ( q , t ) (3.32) \boldsymbol{v}_{\mathrm{J}}=\boldsymbol{S}(\boldsymbol{q},t)\dot{\boldsymbol{q}}+\boldsymbol{\sigma}(\boldsymbol{q},t) \tag{3.32} vJ=S(q,t)q˙+σ(q,t)(3.32)

其中 S \boldsymbol{S} S 是关节的运动子空间矩阵, σ \boldsymbol{\sigma} σ 是偏置速度, q \boldsymbol{q} q q ˙ \dot{\boldsymbol{q}} q˙ 是关节的位置和速度变量, t t t 是时间。如果位置变量不是速度变量的积分,则必须使用不同的符号表示 q ˙ \dot{\boldsymbol{q}} q˙ q \boldsymbol{q} q。偏置速度是当 q ˙ = 0 \dot{\boldsymbol{q}}=\mathbf{0} q˙=0 v J \boldsymbol{v}_{\mathrm{J}} vJ 的值,只有在关节明确依赖于时间时(即它是一个流变或时间相关的非完整约束),它才具有非零值。如果关节不依赖于时间,则方程3.32简化为

v J = S ( q ) q ˙ (3.33) \boldsymbol{v}_{\mathrm{J}}=\boldsymbol{S}(\boldsymbol{q})\dot{\boldsymbol{q}} \tag{3.33} vJ=S(q)q˙(3.33)

方程3.32 的效果是将速度 v J − σ \boldsymbol{v}_{\mathrm{J}}-\boldsymbol{\sigma} vJσ 限制在子空间 S ⊆ R 6 S \subseteq \mathbb{R}^{6} SR6 中。如果关节允许 n f n_{f} nf 个相对运动自由度,则 dim ⁡ ( S ) = n f \operatorname{dim}(S)=n_{f} dim(S)=nf S S S 是一个 6 × n f 6 \times n_{f} 6×nf 的矩阵。( 3 ^{3} 3关节所施加的约束数为 n c = 6 − n f n_{c}=6-n_{f} nc=6nf,约束力必须位于 n c n_{c} nc 维子空间 S ⊥ ⊆ R 6 S^{\perp} \subseteq \mathbb{R}^{6} SR6 中。)

如果 n f = 0 n_{f}=0 nf=0,则 S S S 是一个 6 × 0 6 \times 0 6×0 的矩阵。这样的量遵循矩阵代数的基本规则,再加上一个额外的规则: m × 0 m \times 0 m×0 的矩阵与 0 × n 0 \times n 0×n 的矩阵的乘积是一个 m × n m \times n m×n 的零矩阵。因此, 6 × 0 6 \times 0 6×0 矩阵 S \boldsymbol{S} S 0 × 1 0 \times 1 0×1 矢量 q ˙ \dot{\boldsymbol{q}} q˙ 的乘积是一个 6 × 1 6 \times 1 6×1 的零向量。设 f J \boldsymbol{f}_{\mathrm{J}} fJ 是通过关节传递的力。我们将其定义为从前驱传递到后继的力;因此,作用在后继上的力为 f J f_{\mathrm{J}} fJ,作用在前驱上的力为 − f J -\boldsymbol{f}_{\mathrm{J}} fJ。这个力可以看作是主动力和约束力的总和。前者来自关节上(或两个刚体之间)的执行器、弹簧、阻尼器或任何其他力元件,后者是施加运动约束的力。在这一点上,我们有一个选择。约束力必须是子空间 S ⊥ S^{\perp} S 的元素,但对于主动力有两种处理方式:它可以被视为已知的空间力,或者作为映射到 R 6 \mathbb{R}^{6} R6 的子空间的广义力。我们在这里选择后者。

T T T T a T_{a} Ta 分别是约束力和主动力的子空间。根据定义, T = S ⊥ T=S^{\perp} T=S,但 T a T_{a} Ta 可以是满足 T ⊕ T a = R 6 T \oplus T_{a}=\mathbb{R}^{6} TTa=R6 的任何子空间。我们现在可以将 f J f_{\mathrm{J}} fJ 表示为

f J = T a τ + T λ (3.34) \boldsymbol{f}_{\mathrm{J}}=\boldsymbol{T}_{a}\boldsymbol{\tau}+\boldsymbol{T}\boldsymbol{\lambda} \tag{3.34} fJ=Taτ+Tλ(3.34)

其中 T a τ \boldsymbol{T}_{a}\boldsymbol{\tau} Taτ 是主动力, T λ \boldsymbol{T}\boldsymbol{\lambda} Tλ 是约束力, T a \boldsymbol{T}_{a} Ta T \boldsymbol{T} T 满足
T a T S = 1 (3.35) \boldsymbol{T}_{a}^{\mathrm{T}} \boldsymbol{S}=\mathbf{1} \tag{3.35} TaTS=1(3.35)

T T S = 0 (3.36) \boldsymbol{T}^{\mathrm{T}} \boldsymbol{S}=\mathbf{0} \tag{3.36} TTS=0(3.36)

τ \boldsymbol{\tau} τ 是对应于 q ˙ \dot{\boldsymbol{q}} q˙ 的广义力向量, λ \boldsymbol{\lambda} λ 是约束力变量的向量。根据 T a \boldsymbol{T}_{a} Ta T \boldsymbol{T} T 的性质,我们可以立即推断出:

S T f J = τ (3.37) \boldsymbol{S}^{\mathrm{T}} \boldsymbol{f}_{\mathrm{J}}= \boldsymbol{\tau} \tag{3.37} STfJ=τ(3.37)

T T v J = T T σ (3.38) \boldsymbol{T}^{\mathrm{T}} \boldsymbol{v}_{\mathrm{J}}=\boldsymbol{T}^{\mathrm{T}} \boldsymbol{\sigma} \tag{3.38} TTvJ=TTσ(3.38)

方程3.37是从通过关节传递的空间力中获取关节的广义力的公式;方程3.38是速度约束方程的隐式形式。

方程3.35的理由如下。关节传递的总功率为 f J ⋅ v J \boldsymbol{f}_{\mathrm{J}} \cdot \boldsymbol{v}_{\mathrm{J}} fJvJ,但这来自于两个独立的功率源: σ \boldsymbol{\sigma} σ τ \boldsymbol{\tau} τ。归因于 σ \boldsymbol{\sigma} σ 的功率为 f J ⋅ σ \boldsymbol{f}_{\mathrm{J}} \cdot \boldsymbol{\sigma} fJσ,因此归因于 τ \boldsymbol{\tau} τ 的功率必须为 f J ⋅ S q ˙ \boldsymbol{f}_{\mathrm{J}} \cdot \boldsymbol{S} \dot{\boldsymbol{q}} fJSq˙。现在,这第二个功率也必须等于 τ ⋅ q ˙ \boldsymbol{\tau} \cdot \dot{\boldsymbol{q}} τq˙,因为它们是关节处的广义力和速度向量,因此我们有以下功率平衡方程:

τ ⋅ q ˙ = f J ⋅ S q ˙ = τ T T a T S q ˙ (3.39) \boldsymbol{\tau} \cdot \dot{\boldsymbol{q}}=\boldsymbol{f}_{\mathrm{J}} \cdot \boldsymbol{S} \dot{\boldsymbol{q}}=\boldsymbol{\tau}^{\mathrm{T}} \boldsymbol{T}_{a}^{\mathrm{T}} \boldsymbol{S} \dot{\boldsymbol{q}} \tag{3.39} τq˙=fJSq˙=τTTaTSq˙(3.39)

但是这个方程对所有的 τ \boldsymbol{\tau} τ q ˙ \dot{\boldsymbol{q}} q˙ 必须成立,所以我们必须有 T a T S = 1 \boldsymbol{T}_{a}^{\mathrm{T}} \boldsymbol{S}=\mathbf{1} TaTS=1。关节的加速度约束方程可以直接从方程3.32和3.38通过求导得到。方程3.32的导数为
a J = S q ¨ + S ˙ q ˙ + σ ˙ = S q ¨ + ( S ∘ + v s × S ) q ˙ + ( σ ∘ + v s × σ ) = S q ¨ + S ∘ q ˙ + σ ∘ + v s × ( S q ˙ + σ ) = S q ¨ + c J + v s × v J (3.40) \begin{aligned} \boldsymbol{a}_{\mathrm{J}} & =\boldsymbol{S} \ddot{\boldsymbol{q}}+\dot{\boldsymbol{S}} \dot{\boldsymbol{q}}+\dot{\boldsymbol{\sigma}} \\ & =\boldsymbol{S} \ddot{\boldsymbol{q}}+\left(\stackrel{\circ}{\boldsymbol{S}}+\boldsymbol{v}_{s} \times \boldsymbol{S}\right) \dot{\boldsymbol{q}}+\left(\stackrel{\circ}{\boldsymbol{\sigma}}+\boldsymbol{v}_{s} \times \boldsymbol{\sigma}\right) \\ & =\boldsymbol{S} \ddot{\boldsymbol{q}}+\stackrel{\circ}{\boldsymbol{S}} \dot{\boldsymbol{q}}+\stackrel{\circ}{\boldsymbol{\sigma}}+\boldsymbol{v}_{s} \times(\boldsymbol{S} \dot{\boldsymbol{q}}+\boldsymbol{\sigma}) \\ & =\boldsymbol{S} \ddot{\boldsymbol{q}}+\boldsymbol{c}_{\mathrm{J}}+\boldsymbol{v}_{s} \times \boldsymbol{v}_{\mathrm{J}} \end{aligned} \tag{3.40} aJ=Sq¨+S˙q˙+σ˙=Sq¨+(S+vs×S)q˙+(σ+vs×σ)=Sq¨+Sq˙+σ+vs×(Sq˙+σ)=Sq¨+cJ+vs×vJ(3.40)

其中, S ∘ \stackrel{\circ}{\boldsymbol{S}} S σ ∘ \stackrel{\circ}{\boldsymbol{\sigma}} σ S \boldsymbol{S} S σ \boldsymbol{\sigma} σ 的显式导数,它们在一个后继刚体运动的坐标系中计算,且

c J = S ∘ q ˙ + σ ∘ (3.41) \boldsymbol{c}_{\mathrm{J}}=\stackrel{\circ}{\boldsymbol{S}} \dot{\boldsymbol{q}}+\stackrel{\circ}{\boldsymbol{\sigma}} \tag{3.41} cJ=Sq˙+σ(3.41)

(实际上, c J = v ∘ J \boldsymbol{c}_{\mathrm{J}}=\stackrel{\circ}{\mathrm{v}}_{\mathrm{J}} cJ=vJ)。如果 S \boldsymbol{S} S σ \boldsymbol{\sigma} σ q \boldsymbol{q} q t t t 的函数,如方程式 3.32 所示,那么 S ∘ \stackrel{\circ}{\boldsymbol{S}} S σ ∘ \stackrel{\circ}{\boldsymbol{\sigma}} σ 的一般公式为
S ∘ = ∂ S ∂ t + ∑ i = 1 n p ∂ S ∂ q i q ˙ i (3.42) \stackrel{\circ}{\boldsymbol{S}}=\frac{\partial \boldsymbol{S}}{\partial t}+\sum_{i=1}^{n_{p}} \frac{\partial \boldsymbol{S}}{\partial q_{i}} \dot{q}_{i} \tag{3.42} S=tS+i=1npqiSq˙i(3.42)

σ ∘ = ∂ σ ∂ t + ∑ i = 1 n p ∂ σ ∂ q i q ˙ i (3.43) \stackrel{\circ}{\boldsymbol{\sigma}}=\frac{\partial \boldsymbol{\sigma}}{\partial t}+\sum_{i=1}^{n_{p}} \frac{\partial \boldsymbol{\sigma}}{\partial q_{i}} \dot{q}_{i} \tag{3.43} σ=tσ+i=1npqiσq˙i(3.43)

在继续之前,读者应该记住上述相对复杂的方程适用于一般情况,在实践中几乎从不需要。这部分是因为大多数常见关节类型具有 S ∘ = 0 \stackrel{\circ}{\boldsymbol{S}}=\mathbf{0} S=0 σ = 0 \boldsymbol{\sigma}=\mathbf{0} σ=0(暗示 c J = 0 \boldsymbol{c}_{\mathrm{J}}=\mathbf{0} cJ=0)的性质,也部分是因为当我们在关节中遇到显式的时间依赖性(即 σ ≠ 0 \boldsymbol{\sigma} \neq \mathbf{0} σ=0)的罕见情况时,几乎总能通过第9章的混合动力学算法来实现时间相关项,而不是使用 σ \boldsymbol{\sigma} σ

最后,隐式加速度约束方程可以通过对方程3.38求导数或将方程3.40乘以 T T \boldsymbol{T}^{\mathrm{T}} TT 来得到。两种方法得到的结果相同,但后者更简单:

T T a J = T T ( S q ¨ + c J + v s × v J ) = T T ( c J + v s × v J ) . (3.44) \begin{aligned} \boldsymbol{T}^{\mathrm{T}} \boldsymbol{a}_{\mathrm{J}} & =\boldsymbol{T}^{\mathrm{T}}\left(\boldsymbol{S} \ddot{\boldsymbol{q}}+\boldsymbol{c}_{\mathrm{J}}+\boldsymbol{v}_{s} \times \boldsymbol{v}_{\mathrm{J}}\right) \\ & =\boldsymbol{T}^{\mathrm{T}}\left(\boldsymbol{c}_{\mathrm{J}}+\boldsymbol{v}_{s} \times \boldsymbol{v}_{\mathrm{J}}\right) . \end{aligned} \tag{3.44} TTaJ=TT(Sq¨+cJ+vs×vJ)=TT(cJ+vs×vJ).(3.44)

在这里插入图片描述

图3.3:定义主动力子空间

例3.2 我们来看如何定义主动力子空间。图3.3显示了一个系统,它由一个移动的刚体 B B B 和一个通过齿轮和传动装置驱动该关节的电机 M M M 组成,关节连接着固定的基座。在坐标系中也显示了 x x x轴和 y y y轴,其中 z z z轴与关节的旋转轴对齐。用这些坐标表示,关节的运动和约束力子空间矩阵为
S = [ 0 0 1 0 0 0 ]  and  T = [ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 ] \boldsymbol{S}=\left[\begin{array}{c} 0 \\ 0 \\ 1 \\ 0 \\ 0 \\ 0 \end{array}\right] \quad \text { and } \quad \boldsymbol{T}=\left[\begin{array}{ccccc} 1 & 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 & 1 \end{array}\right] S= 001000  and T= 100000010000000100000010000001

严格来说, S \boldsymbol{S} S T \boldsymbol{T} T 的取值不止这些,因为任何两个张成正确子空间的矩阵都可以。

主动力通过齿轮接触点传递到刚体 B B B,它是一个在 y y y 方向上大小为 f f f 的线性力。接触点的坐标为 ( − r , 0 , 0 ) (-r, 0, 0) (r,0,0),其中 r r r 是齿轮的半径,所以主动力的 Plücker 坐标为 f = [ 0 0 − r f 0 f 0 ] T \boldsymbol{f}=\left[\begin{array}{llllll}0 & 0 & -r f & 0 & f & 0\end{array}\right]^{\mathrm{T}} f=[00rf0f0]T。现在,在这个例子中 τ \boldsymbol{\tau} τ 只是一个标量,所以如果 f = T a τ \boldsymbol{f}=\boldsymbol{T}_{a} \boldsymbol{\tau} f=Taτ,那么 T a \boldsymbol{T}_{a} Ta 就是 f \boldsymbol{f} f 的标量倍数。根据式3.35, T a \boldsymbol{T}_{a} Ta 必须满足 T a T S = 1 \boldsymbol{T}_{a}^{\mathrm{T}} \boldsymbol{S}=\mathbf{1} TaTS=1,所以解可以简单地表示为

T a = f / ( f T S ) = [ 0 0 1 0 − 1 / r 0 ] \boldsymbol{T}_{a}=\boldsymbol{f} /\left(\boldsymbol{f}^{\mathrm{T}} \boldsymbol{S}\right)=\left[\begin{array}{c} 0 \\ 0 \\ 1 \\ 0 \\ -1 / r \\ 0 \end{array}\right] Ta=f/(fTS)= 00101/r0

注意到 T a \boldsymbol{T}_{a} Ta ( T a ) \left(\boldsymbol{T}_{a}\right) (Ta) 的值都依赖于 r r r。这种依赖关系对运动方程没有影响,但它确实影响了约束力的值。从物理上讲,约束力来自关节的轴承。因此,如果任务是模拟系统的运动,那么 r r r 是无关紧要的;但如果任务是为关节选择适当的轴承,那么必须考虑 r r r 的值。

在这里插入图片描述

图3.4:受约束的刚体

3.6 刚体的约束动力学

考虑图3.4所示的刚体。该刚体通过一个具有运动子空间 S ⊆ M 6 S \subseteq \mathrm{M}^{6} SM6 的关节连接到一个固定基座。关节对刚体的运动施加 n c n_{c} nc 个约束,使其具有 n f n_{f} nf 个自由度,其中 n f = dim ⁡ ( S ) n_{f}=\operatorname{dim}(S) nf=dim(S) n c = 6 − n f = dim ⁡ ( S ⊥ ) n_{c}=6-n_{f}=\operatorname{dim}\left(S^{\perp}\right) nc=6nf=dim(S)。这个刚体上有三个力:一个施加力 f \boldsymbol{f} f,一个约束力 f c \boldsymbol{f}_{c} fc,一个重力 f g \boldsymbol{f}_{g} fg(未显示)。因此,该刚体的运动方程为
f + f c + f g = I a + v × ∗ I v \boldsymbol{f}+\boldsymbol{f}_{c}+\boldsymbol{f}_{g}=\boldsymbol{I} \boldsymbol{a}+\boldsymbol{v} \times{ }^{*} \boldsymbol{I} \boldsymbol{v} f+fc+fg=Ia+v×Iv

其中, I \boldsymbol{I} I a \boldsymbol{a} a v \boldsymbol{v} v 分别表示刚体的惯性、加速度和速度。我们对单独的项 f g \boldsymbol{f}_{g} fg v × ∗ I v \boldsymbol{v} \times^{*} \boldsymbol{I} \boldsymbol{v} v×Iv 不感兴趣,因此将它们合并为一个偏置力项 p = v × ∗ I v − f g \boldsymbol{p}=\boldsymbol{v} \times^{*} \boldsymbol{I} \boldsymbol{v}-\boldsymbol{f}_{g} p=v×Ivfg 。受约束刚体的运动方程可以写成如下形式:

f + f c = I a + p (3.45) \boldsymbol{f}+\boldsymbol{f}_{c}=\boldsymbol{I} \boldsymbol{a}+\boldsymbol{p} \tag{3.45} f+fc=Ia+p(3.45)

其中满足约束条件:

v ∈ S  and  f c ∈ S ⊥ (3.46) \boldsymbol{v} \in S \quad \text { and } \quad \boldsymbol{f}_{c} \in S^{\perp} \tag{3.46} vS and fcS(3.46)

我们寻求这个方程组的解,其中加速度为施加力的函数。需要注意的是, f c \boldsymbol{f}_{c} fc 是一个未知量,并且必须在解的过程中进行求解 和/或 消除。

方法1

我们引入一个 6 × n f 6 \times n_{f} 6×nf 的矩阵 S \boldsymbol{S} S,它张成了子空间 S S S。利用这个矩阵,方程3.46 中的约束方程可以写成如下形式:

v = S q ˙ (3.47) \boldsymbol{v}=\boldsymbol{S} \dot{q} \tag{3.47} v=Sq˙(3.47)

S T f c = 0 (3.48) \boldsymbol{S}^{\mathrm{T}} \boldsymbol{f}_{c}=\mathbf{0} \tag{3.48} STfc=0(3.48)

加速度约束为

a = ( S q ¨ + S ˙ q ˙ ) (3.49) \boldsymbol{a}=(\boldsymbol{S} \ddot{\boldsymbol{q}}+\dot{\boldsymbol{S}} \dot{\boldsymbol{q}}) \tag{3.49} a=(Sq¨+S˙q˙)(3.49)

其中 q ˙ \dot{\boldsymbol{q}} q˙ q ¨ \ddot{\boldsymbol{q}} q¨ 分别是关节速度和加速度变量的向量。方程3.48 暗示了我们可以通过两边同时乘以 S T S^{\mathrm{T}} ST 来消除 方程3.45 中的 f c \boldsymbol{f}_{c} fc,得到

S T f = S T ( I a + p ) (3.50) \boldsymbol{S}^{\mathrm{T}} \boldsymbol{f}=\boldsymbol{S}^{\mathrm{T}}(\boldsymbol{I} \boldsymbol{a}+\boldsymbol{p}) \tag{3.50} STf=ST(Ia+p)(3.50)

将 方程3.49 代入这个方程可以得到

S T f = S T ( I ( S q ¨ + S ˙ q ˙ ) + p ) \boldsymbol{S}^{\mathrm{T}} \boldsymbol{f}=\boldsymbol{S}^{\mathrm{T}}(\boldsymbol{I}(\boldsymbol{S} \ddot{\boldsymbol{q}}+\dot{\boldsymbol{S}} \dot{\boldsymbol{q}})+\boldsymbol{p}) STf=ST(I(Sq¨+S˙q˙)+p)

可以按照如下方式求解 q ¨ \ddot{\boldsymbol{q}} q¨

q ¨ = ( S T I S ) − 1 S T ( f − I S ˙ q ˙ − p ) (3.51) \ddot{\boldsymbol{q}}=\left(\boldsymbol{S}^{\mathrm{T}} \boldsymbol{I} \boldsymbol{S}\right)^{-1} \boldsymbol{S}^{\mathrm{T}}(\boldsymbol{f}-\boldsymbol{I} \dot{\boldsymbol{S}} \dot{\boldsymbol{q}}-\boldsymbol{p}) \tag{3.51} q¨=(STIS)1ST(fIS˙q˙p)(3.51)

表达式 S T I S \boldsymbol{S}^{\mathrm{T}} \boldsymbol{I} \boldsymbol{S} STIS 是一个 n f × n f n_{f} \times n_{f} nf×nf 的对称且正定矩阵,因此可以保证其可逆性。找到 q ¨ \ddot{\boldsymbol{q}} q¨ 的表达式后,最后一步是将方程3.51代回方程3.49,得到

a = S ( S T I S ) − 1 S T ( f − I S ˙ q ˙ − p ) + S ˙ q ˙ (3.52) \boldsymbol{a}=\boldsymbol{S}\left(\boldsymbol{S}^{\mathrm{T}} \boldsymbol{I} \boldsymbol{S}\right)^{-1} \boldsymbol{S}^{\mathrm{T}}(\boldsymbol{f}-\boldsymbol{I} \dot{\boldsymbol{S}} \dot{\boldsymbol{q}}-\boldsymbol{p})+\dot{\boldsymbol{S}} \dot{\boldsymbol{q}} \tag{3.52} a=S(STIS)1ST(fIS˙q˙p)+S˙q˙(3.52)

这个方程可以写成如下形式:

a = Φ f + b (3.53) a=\boldsymbol{\Phi} \boldsymbol{f}+\boldsymbol{b} \tag{3.53} a=Φf+b(3.53)

其中

Φ = S ( S T I S ) − 1 S T (3.54) \boldsymbol{\Phi}=\boldsymbol{S}\left(\boldsymbol{S}^{\mathrm{T}} \boldsymbol{I} \boldsymbol{S}\right)^{-1} \boldsymbol{S}^{\mathrm{T}} \tag{3.54} Φ=S(STIS)1ST(3.54)

b = S ˙ q ˙ − Φ ( I S ˙ q ˙ + p ) (3.55) \boldsymbol{b}=\dot{\boldsymbol{S}} \dot{\boldsymbol{q}}-\boldsymbol{\Phi}(\boldsymbol{I} \dot{\boldsymbol{S}} \dot{\boldsymbol{q}}+\boldsymbol{p}) \tag{3.55} b=S˙q˙Φ(IS˙q˙+p)(3.55)

Φ \boldsymbol{\Phi} Φ 是约束刚体的表观逆惯性矩阵( apparent inverse inertia), b \boldsymbol{b} b 是其偏置加速度,即在 f = 0 \boldsymbol{f}=\mathbf{0} f=0 时的加速度。表观逆惯性矩阵描述了加速度对施加力变化的响应方式。它是一个对称、正半定矩阵,具有以下特性: range ⁡ ( Φ ) = S , null ⁡ ( Φ ) = S ⊥ \operatorname{range}(\boldsymbol{\Phi})=S, \operatorname{null}(\boldsymbol{\Phi})=S^{\perp} range(Φ)=S,null(Φ)=S rank ⁡ ( Φ ) = n f \operatorname{rank}(\boldsymbol{\Phi})=n_{f} rank(Φ)=nf

方法2

解决 方程3.45 和 方程3.46 的另一种方法是引入一个 6 × n c 6 \times n_{c} 6×nc 的矩阵 T \boldsymbol{T} T,它张成了子空间 S ⊥ S^{\perp} S。利用这个矩阵,约束方程可以写成如下形式:

T T v = 0 (3.56) \boldsymbol{T}^{\mathrm{T}} \boldsymbol{v}=\mathbf{0} \tag{3.56} TTv=0(3.56)

f c = T λ (3.57) \boldsymbol{f}_{c}=\boldsymbol{T} \boldsymbol{\lambda} \tag{3.57} fc=Tλ(3.57)

其中 λ \boldsymbol{\lambda} λ 是约束力变量的向量,加速度约束为

T T a + T ˙ T v = 0 (3.58) \boldsymbol{T}^{\mathrm{T}} \boldsymbol{a}+\dot{\boldsymbol{T}}^{\mathrm{T}} \boldsymbol{v}=\mathbf{0} \tag{3.58} TTa+T˙Tv=0(3.58)

将 方程3.57 代入 方程3.45 中得到

f + T λ = I a + p (3.59) \boldsymbol{f}+\boldsymbol{T} \boldsymbol{\lambda}=\boldsymbol{I} \boldsymbol{a}+\boldsymbol{p} \tag{3.59} f+Tλ=Ia+p(3.59)

然后可以将方程3.58和3.59合并为一个方程,

[ I T T T 0 ] [ a − λ ] = [ f − p − T ˙ T v ] (3.60) \left[\begin{array}{cc} \boldsymbol{I} & \boldsymbol{T} \\ \boldsymbol{T}^{\mathrm{T}} & \mathbf{0} \end{array}\right]\left[\begin{array}{c} \boldsymbol{a} \\ -\boldsymbol{\lambda} \end{array}\right]=\left[\begin{array}{c} \boldsymbol{f}-\boldsymbol{p} \\ -\dot{\boldsymbol{T}}^{\mathrm{T}} \boldsymbol{v} \end{array}\right] \tag{3.60} [ITTT0][aλ]=[fpT˙Tv](3.60)

可以求解 a \boldsymbol{a} a λ \boldsymbol{\lambda} λ 。这个方程中的系数矩阵是对称且非奇异的,但不一定是正定矩阵。

方法3

第三种可能性是推导出用广义坐标表示的运动方程。向量 q ˙ \dot{\boldsymbol{q}} q˙ q ¨ \ddot{\boldsymbol{q}} q¨ 可以用作约束刚体的广义速度和加速度变量,因此 方程3.51 已经给出了广义加速度作为施加的空间力 f \boldsymbol{f} f 的函数。设 τ \boldsymbol{\tau} τ 表示作用在刚体上的广义力。要使 τ \boldsymbol{\tau} τ 等效于 f \boldsymbol{f} f,两个力必须对 S S S 中的任何速度都提供相同的功率。 τ \boldsymbol{\tau} τ 提供的功率为 τ T q ˙ \boldsymbol{\tau}^{\mathrm{T}} \dot{\boldsymbol{q}} τTq˙,而 f \boldsymbol{f} f 提供的功率为 f T v \boldsymbol{f}^{\mathrm{T}} \boldsymbol{v} fTv ,因此我们有以下关系:
τ T q ˙ = f T v = f T S q ˙ \boldsymbol{\tau}^{\mathrm{T}} \dot{\boldsymbol{q}}=\boldsymbol{f}^{\mathrm{T}} \boldsymbol{v}=\boldsymbol{f}^{\mathrm{T}} \boldsymbol{S} \dot{\boldsymbol{q}} τTq˙=fTv=fTSq˙

但这个方程必须对所有的 q ˙ \dot{\boldsymbol{q}} q˙都成立,因此有

τ = S T f (3.61) \boldsymbol{\tau}=\boldsymbol{S}^{\mathrm{T}} \boldsymbol{f} \tag{3.61} τ=STf(3.61)

将这个方程代入方程3.51中得到

q ¨ = ( S T I S ) − 1 ( τ − S T ( I S ˙ q ˙ + p ) ) , \ddot{\boldsymbol{q}}=\left(\boldsymbol{S}^{\mathrm{T}} \boldsymbol{I} \boldsymbol{S}\right)^{-1}\left(\boldsymbol{\tau}-\boldsymbol{S}^{\mathrm{T}}(\boldsymbol{I} \dot{\boldsymbol{S}} \dot{\boldsymbol{q}}+\boldsymbol{p})\right), q¨=(STIS)1(τST(IS˙q˙+p)),

这是约束刚体的运动方程,通过广义坐标表示。它可以写成标准形式

H q ¨ + C = τ (3.62) \boldsymbol{H} \ddot{\boldsymbol{q}}+\boldsymbol{C}=\boldsymbol{\tau} \tag{3.62} Hq¨+C=τ(3.62)

其中

H = S T I S (3.63) \boldsymbol{H}=\boldsymbol{S}^{\mathrm{T}} \boldsymbol{I} \boldsymbol{S} \tag{3.63} H=STIS(3.63)

是广义惯性矩阵,而

C = S T ( I S ˙ q ˙ + p ) (3.64) \boldsymbol{C}=\boldsymbol{S}^{\mathrm{T}}(\boldsymbol{I} \dot{\boldsymbol{S}} \dot{\boldsymbol{q}}+\boldsymbol{p}) \tag{3.64} C=ST(IS˙q˙+p)(3.64)

是广义偏置力。方程3.61 意味着从 f \boldsymbol{f} f τ \boldsymbol{\tau} τ 的转换会导致少量的信息丢失。无限多个不同的 f \boldsymbol{f} f 值映射到相同的 τ \boldsymbol{\tau} τ 值,从而产生相同的加速度,但每个 f \boldsymbol{f} f 向量的值不同。如果只知道 τ \boldsymbol{\tau} τ,那么可以计算出 f + f c \boldsymbol{f}+\boldsymbol{f}_{c} f+fc 的值,但无法得到各个向量的值。如果目标是进行运动模拟,则丢失的信息无关紧要;但如果目标是设计一个机械系统,则丢失的信息与计算关节轴承上的动态负载力等任务相关。

3.7 多体系统动力学

本章的最后部分将为包含多个刚体和关节的系统推导出一个运动方程。这个分析展示了 第3.5节 和 第3.6节 中与关节相关的内容与 第3.2节 中的广义约束之间的联系,说明了如何从前者构建后者。

假设我们有一个包含以下元素的刚体系统:

  • 一个固定基座,我们将其视为 0 号刚体;
  • N B N_{B} NB 个移动刚体,它们被编号为 1 到 N B N_{B} NB
  • 以及 N J N_{J} NJ 个关节,它们被编号为 1 到 N J N_{J} NJ
  • 对于每个关节 j j j,我们定义 p ( j ) p(j) p(j) s ( j ) s(j) s(j) 为该关节的前驱刚体和后继刚体的编号。
  • 这组 2 N J 2N_{J} 2NJ 个数字定义了系统的连接性。在以下分析中,我们对连接性不加限制。

在制定运动方程时,我们将遵循 第3.6节 中的方法2,但由于当前系统复杂性更高,可能需要额外的步骤。

步骤1:刚体的运动方程

我们假设只有重力 f g i \boldsymbol{f}_{gi} fgi 和连接在刚体 i i i 上的关节力对刚体 i i i 起作用。那么刚体 i i i 的运动方程可以写成:

f i = I i a i + p i \boldsymbol{f}_{i}=\boldsymbol{I}_{i}\boldsymbol{a}_{i}+\boldsymbol{p}_{i} fi=Iiai+pi

其中, f i \boldsymbol{f}_{i} fi 是作用在刚体 i i i 上的关节力的总和, p i = v i × ∗ I i v i − f g i \boldsymbol{p}_{i}=\boldsymbol{v}_{i}\times ^{*}\boldsymbol{I}_{i}\boldsymbol{v}_{i}-\boldsymbol{f}_{gi} pi=vi×Iivifgi 是偏置力。所有 N B N_{B} NB 个刚体的方程可以组合成一个单一的方程:

[ f 1 f 2 ⋮ f N B ] = [ I 1 0 ⋯ 0 0 I 2 ⋯ 0 ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ I N B ] [ a 1 a 2 ⋮ a N B ] + [ p 1 p 2 ⋮ p N B ] (3.65) \left[\begin{array}{c} \boldsymbol{f}_{1} \\ \boldsymbol{f}_{2} \\ \vdots \\ \boldsymbol{f}_{N_{B}} \end{array}\right]=\left[\begin{array}{cccc} \boldsymbol{I}_{1} & \mathbf{0} & \cdots & \mathbf{0} \\ \mathbf{0} & \boldsymbol{I}_{2} & \cdots & \mathbf{0} \\ \vdots & \vdots & \ddots & \vdots \\ \mathbf{0} & \mathbf{0} & \cdots & \boldsymbol{I}_{N_{B}} \end{array}\right]\left[\begin{array}{c} \boldsymbol{a}_{1} \\ \boldsymbol{a}_{2} \\ \vdots \\ \boldsymbol{a}_{N_{B}} \end{array}\right]+\left[\begin{array}{c} \boldsymbol{p}_{1} \\ \boldsymbol{p}_{2} \\ \vdots \\ \boldsymbol{p}_{N_{B}} \end{array}\right] \tag{3.65} f1f2fNB = I1000I2000INB a1a2aNB + p1p2pNB (3.65)

我们可以更简洁地表示这个方程为:

f = I a + p (3.66) \boldsymbol{f}=\boldsymbol{I}\boldsymbol{a}+\boldsymbol{p} \tag{3.66} f=Ia+p(3.66)

其中, f \boldsymbol{f} f a \boldsymbol{a} a p \boldsymbol{p} p 6 N B 6 N_{B} 6NB 维向量, I \boldsymbol{I} I 是一个 6 N B × 6 N B 6 N_{B} \times 6 N_{B} 6NB×6NB 的分块对角矩阵。为了完整起见,我们还定义 v = [ v 1 T v 2 T ⋯ v N B T ] T \boldsymbol{v}=\left[\begin{array}{lll}\boldsymbol{v}_{1}^{\mathrm{T}} & \boldsymbol{v}_{2}^{\mathrm{T}} \cdots \boldsymbol{v}_{N_{B}}^{\mathrm{T}}\end{array}\right]^{\mathrm{T}} v=[v1Tv2TvNBT]T,其中 v i \boldsymbol{v}_{i} vi 是刚体 i i i 的速度,因为在关节约束方程中会用到这个向量。

步骤2:由刚体运动求得关节运动

方程3.66 中的向量 a \boldsymbol{a} a 是刚体加速度的向量;但是关节所施加的约束是以关节速度和加速度来表达的。因此,我们需要一个以刚体运动来表达关节运动的公式。设 v J j \boldsymbol{v}_{\mathrm{J}j} vJj a J j \boldsymbol{a}_{\mathrm{J}j} aJj 分别表示关节 j j j 处的速度和加速度, v J \boldsymbol{v}_{\mathrm{J}} vJ a J \boldsymbol{a}_{\mathrm{J}} aJ 是由 v J 1 ⋯ v J N J \boldsymbol{v}_{\mathrm{J}1}\cdots\boldsymbol{v}_{\mathrm{J}N_{J}} vJ1vJNJ a J 1 ⋯ a J N J \boldsymbol{a}_{\mathrm{J}1}\cdots\boldsymbol{a}_{\mathrm{J}N_{J}} aJ1aJNJ 连接而成的 6 N J 6 N_{J} 6NJ 维向量。根据定义, v J j \boldsymbol{v}_{\mathrm{J}j} vJj a J j \boldsymbol{a}_{\mathrm{J}j} aJj 是关节的下一刚体相对于前一刚体的速度和加速度,因此有:

v J j = v s ( j ) − v p ( j ) \boldsymbol{v}_{\mathrm{J}j}=\boldsymbol{v}_{s(j)}-\boldsymbol{v}_{p(j)} vJj=vs(j)vp(j)

以及

a J j = a s ( j ) − a p ( j ) \boldsymbol{a}_{\mathrm{J}j}=\boldsymbol{a}_{s(j)}-\boldsymbol{a}_{p(j)} aJj=as(j)ap(j)

这些方程可以汇集在一起并表示为:
v J = [ v J 1 ⋮ v J N J ] = [ v s ( 1 ) − v p ( 1 ) ⋮ v s ( N J ) − v p ( N J ) ] = P T v (3.67) \boldsymbol{v}_{\mathrm{J}}=\left[\begin{array}{c} \boldsymbol{v}_{\mathrm{J} 1} \\ \vdots \\ \boldsymbol{v}_{\mathrm{J} N_{J}} \end{array}\right]=\left[\begin{array}{c} \boldsymbol{v}_{s(1)}-\boldsymbol{v}_{p(1)} \\ \vdots \\ \boldsymbol{v}_{s\left(N_{J}\right)}-\boldsymbol{v}_{p\left(N_{J}\right)} \end{array}\right]=\boldsymbol{P}^{\mathrm{T}} \boldsymbol{v} \tag{3.67} vJ= vJ1vJNJ = vs(1)vp(1)vs(NJ)vp(NJ) =PTv(3.67)

a J = [ a J 1 ⋮ a J N J ] = [ a s ( 1 ) − a p ( 1 ) ⋮ a s ( N J ) − a p ( N J ) ] = P T a (3.68) \boldsymbol{a}_{\mathrm{J}}=\left[\begin{array}{c} \boldsymbol{a}_{\mathrm{J} 1} \\ \vdots \\ \boldsymbol{a}_{\mathrm{J} N_{J}} \end{array}\right]=\left[\begin{array}{c} \boldsymbol{a}_{s(1)}-\boldsymbol{a}_{p(1)} \\ \vdots \\ \boldsymbol{a}_{s\left(N_{J}\right)}-\boldsymbol{a}_{p\left(N_{J}\right)} \end{array}\right]=\boldsymbol{P}^{\mathrm{T}} \boldsymbol{a} \tag{3.68} aJ= aJ1aJNJ = as(1)ap(1)as(NJ)ap(NJ) =PTa(3.68)

其中

P i j = { 1 6 × 6  if  i = s ( j ) − 1 6 × 6  if  i = p ( j ) 0 6 × 6  otherwise.  (3.69) \boldsymbol{P}_{i j}=\left\{\begin{array}{cc} \mathbf{1}_{6 \times 6} & \text { if } i=s(j) \\ -\mathbf{1}_{6 \times 6} & \text { if } i=p(j) \\ \mathbf{0}_{6 \times 6} & \text { otherwise. } \end{array}\right. \tag{3.69} Pij= 16×616×606×6 if i=s(j) if i=p(j) otherwise. (3.69)

矩阵 P \boldsymbol{P} P 是一个 6 N B × 6 N J 6 N_{B} \times 6 N_{J} 6NB×6NJ 的矩阵,按照每个刚体和关节的对应关系组织为一个 N B × N J N_{B} \times N_{J} NB×NJ 的分块矩阵,其中每个分块是一个 6 × 6 6 \times 6 6×6 的矩阵。它将收集到的刚体速度和加速度的向量 ( v (\boldsymbol{v} (v a ) \boldsymbol{a}) a)映射到收集到的关节速度和加速度的向量 ( v J \left(\boldsymbol{v}_{\mathrm{J}}\right. (vJ a J ) \left.\boldsymbol{a}_{\mathrm{J}}\right) aJ) P \boldsymbol{P} P 的每一行对应一个刚体,每一列对应一个关节。(请注意,我们使用 i i i 作为刚体编号索引, j j j 作为关节编号索引。)每一列最多包含两个非零分块:在对应于关节的后继刚体的行中为 1 \mathbf{1} 1,在对应于关节的前驱刚体的行中为 − 1 \mathbf{- 1} 1。如果一个关节连接两个运动刚体,则它的列中将恰好有两个非零分块,正如上述描述的那样。

4 { }^{4} 4 严格来说,我们指的是分块行,列也是类似的。然而,如果关节连接或来自固定基座(刚体0),那么它的列将只包含一个非零分块:在与其连接到/来自的运动刚体的行中适当的位置为 1 \mathbf{1} 1 − 1 \mathbf{- 1} 1。每一行 i i i 都包含一个 1 \mathbf{1} 1,表示具有刚体 i i i作为它的后继的每个关节,以及一个 − 1 \mathbf{- 1} 1,表示具有刚体 i i i作为它的前驱的每个关节。

步骤3:由关节力求得刚体力

f J j \boldsymbol{f}_{\mathrm{J} j} fJj 是通过关节 j j j 传输的力, f J \boldsymbol{f}_{\mathrm{J}} fJ 是通过连接关节的向量 f J 1 ⋯ f J N J f_{\mathrm{J}1} \cdots f_{\mathrm{J}N_{J}} fJ1fJNJ 所形成的 6 N J 6 N_{J} 6NJ 维向量。根据定义, f J j \boldsymbol{f}_{\mathrm{J} j} fJj 是通过关节 j j j从刚体 p ( j ) p(j) p(j) 传输到刚体 s ( j ) s(j) s(j) 的力。如果我们定义集合 s − 1 ( i ) s^{-1}(i) s1(i) p − 1 ( i ) p^{-1}(i) p1(i) 为具有刚体 i i i 作为其后继或前驱的所有关节的集合,那么向量 f i \boldsymbol{f}_{i} fi(之前定义为作用在刚体 i i i 上的所有关节力的总和)可以按照以下方式表示:

f i = ∑ j ∈ s − 1 ( i ) f J j − ∑ j ∈ p − 1 ( i ) f J j 。 \boldsymbol{f}_{i}=\sum_{j \in s^{-1}(i)} \boldsymbol{f}_{\mathrm{J} j}-\sum_{j \in p^{-1}(i)} \boldsymbol{f}_{\mathrm{J} j}。 fi=js1(i)fJjjp1(i)fJj

然而,将这个表达式与 P \boldsymbol{P} P的第 i i i行的描述进行对比,可以清楚地看出我们也可以将 f i \boldsymbol{f}_{i} fi表示为:

f i = ∑ j = 1 N J P i j f J j \boldsymbol{f}_{i}=\sum_{j=1}^{N_{J}} \boldsymbol{P}_{i j} \boldsymbol{f}_{\mathrm{J} j} fi=j=1NJPijfJj

因此,
f = P f J (3.70) \boldsymbol{f}=\boldsymbol{P} \boldsymbol{f}_{\mathrm{J}} \tag{3.70} f=PfJ(3.70)

步骤4:运动约束

T j \boldsymbol{T}_{j} Tj 是一个 6 × n c j 6 \times n_{c j} 6×ncj 的矩阵,它构成了关节 j j j 的运动子空间 S j ⊥ S_{j}^{\perp} Sj,其中 n c j n_{c j} ncj 表示关节 j j j 所施加的约束数量。那么,关节 j j j 的速度约束方程可以写成:

T j T v J j = 0 , \boldsymbol{T}_{j}^{\mathrm{T}} \boldsymbol{v}_{\mathrm{J} j}=\mathbf{0}, TjTvJj=0,

加速度约束方程为:

T j T a J j + T ˙ j T v J j = 0. \boldsymbol{T}_{j}^{\mathrm{T}} \boldsymbol{a}_{\mathrm{J} j}+\dot{\boldsymbol{T}}_{j}^{\mathrm{T}} \boldsymbol{v}_{\mathrm{J} j}=\mathbf{0} . TjTaJj+T˙jTvJj=0.

将所有的加速度约束方程集合起来得到:

T T a J + T ˙ T v J = 0 (3.71) \boldsymbol{T}^{\mathrm{T}} \boldsymbol{a}_{\mathrm{J}}+\dot{\boldsymbol{T}}^{\mathrm{T}} \boldsymbol{v}_{\mathrm{J}}=\mathbf{0} \tag{3.71} TTaJ+T˙TvJ=0(3.71)

其中 T \boldsymbol{T} T 是一个 6 N J × n c 6 N_{J} \times n_{c} 6NJ×nc 的分块对角矩阵,其第 j j j 个对角块为 T j \boldsymbol{T}_{j} Tj n c n_{c} nc 是由所有关节施加的约束总数,可以表示为 n c = ∑ j = 1 N J n c j n_{c}=\sum_{j=1}^{N_{J}} n_{c j} nc=j=1NJncj。将 方程3.71 与 方程3.67 和 方程3.68 相结合,得到对刚体加速度的以下约束:

T T P T a + T ˙ T P T v = 0 (3.72) \boldsymbol{T}^{\mathrm{T}} \boldsymbol{P}^{\mathrm{T}} \boldsymbol{a}+\dot{\boldsymbol{T}}^{\mathrm{T}} \boldsymbol{P}^{\mathrm{T}} \boldsymbol{v}=\mathbf{0} \tag{3.72} TTPTa+T˙TPTv=0(3.72)

步骤5:约束力

f J j \boldsymbol{f}_{\mathrm{J} j} fJj 是主动力和约束力的叠加,可以表示为:

f J j = T a j τ j + T j λ j \boldsymbol{f}_{\mathrm{J} j}=\boldsymbol{T}_{a j} \boldsymbol{\tau}_{j}+\boldsymbol{T}_{j} \boldsymbol{\lambda}_{j} fJj=Tajτj+Tjλj

(参见方程3.34)。在这个方程中, T a j \boldsymbol{T}_{a j} Taj 是一个 6 × n f j 6 \times n_{f j} 6×nfj 的矩阵,它构成了关节 j j j 的主动力子空间; τ j \boldsymbol{\tau}_{j} τj 是一个 n f j n_{f j} nfj 维向量,表示关节 j j j 处的广义力; λ j \boldsymbol{\lambda}_{j} λj是一个 n c j n_{c j} ncj 维向量,表示约束力变量; n f j = 6 − n c j n_{f j}=6-n_{c j} nfj=6ncj表示关节 j j j允许的运动自由度数量。将所有关节的方程结合起来,我们有:

f J = T a τ + T λ (3.73) \boldsymbol{f}_{\mathrm{J}}=\boldsymbol{T}_{a} \boldsymbol{\tau}+\boldsymbol{T} \boldsymbol{\lambda} \tag{3.73} fJ=Taτ+Tλ(3.73)

其中 τ \boldsymbol{\tau} τ λ \boldsymbol{\lambda} λ 分别是由 τ 1 ⋯ τ N J \boldsymbol{\tau}_{1} \cdots \boldsymbol{\tau}_{N_{J}} τ1τNJ λ 1 ⋯ λ N J \boldsymbol{\lambda}_{1} \cdots \boldsymbol{\lambda}_{N_{J}} λ1λNJ 拼接而成的向量, T a \boldsymbol{T}_{a} Ta 是一个分块对角矩阵,其第 j j j 个对角块为 T a j \boldsymbol{T}_{a j} Taj

步骤6:最终方程

将 方程3.70 和 方程3.73 代入 方程3.66,得到以下运动方程:

P ( T a τ + T λ ) = I a + p \boldsymbol{P}\left(\boldsymbol{T}_{a} \boldsymbol{\tau}+\boldsymbol{T} \boldsymbol{\lambda}\right)=\boldsymbol{I} \boldsymbol{a}+\boldsymbol{p} P(Taτ+Tλ)=Ia+p

将这个方程与方程3.72结合,得到:

[ I P T T T P T 0 ] [ a − λ ] = [ P T a τ − p − T ˙ T P T v ] (3.74) \left[\begin{array}{cc} \boldsymbol{I} & \boldsymbol{P} \boldsymbol{T} \\ \boldsymbol{T}^{\mathrm{T}} \boldsymbol{P}^{\mathrm{T}} & \mathbf{0} \end{array}\right]\left[\begin{array}{c} \boldsymbol{a} \\ -\boldsymbol{\lambda} \end{array}\right]=\left[\begin{array}{c} \boldsymbol{P} \boldsymbol{T}_{a} \boldsymbol{\tau}-\boldsymbol{p} \\ -\dot{\boldsymbol{T}}^{\mathrm{T}} \boldsymbol{P}^{\mathrm{T}} \boldsymbol{v} \end{array}\right] \tag{3.74} [ITTPTPT0][aλ]=[PTaτpT˙TPTv](3.74)

这是原始刚体系统的运动方程。未知数为 a \boldsymbol{a} a λ \boldsymbol{\lambda} λ,此方程可以唯一地求解出 a \boldsymbol{a} a。如果系数矩阵是非奇异的,那么 λ \boldsymbol{\lambda} λ 也是唯一确定的。通过将这里的方程与第3.2节中的方程进行比较,可以看出 T T P T \boldsymbol{T}^{\mathrm{T}} \boldsymbol{P}^{\mathrm{T}} TTPT − T ˙ T P T v -\dot{\boldsymbol{T}}^{\mathrm{T}} \boldsymbol{P}^{\mathrm{T}} \boldsymbol{v} T˙TPTv 在这里相当于 方程3.11 中的 K \boldsymbol{K} K k \boldsymbol{k} k I , a \boldsymbol{I}, \boldsymbol{a} I,a p \boldsymbol{p} p 在这里相当于方程3.14中的 H , q ¨ \boldsymbol{H}, \ddot{\boldsymbol{q}} H,q¨ C \boldsymbol{C} C P T a τ \boldsymbol{P} \boldsymbol{T}_{a} \boldsymbol{\tau} PTaτ P T λ \boldsymbol{P} \boldsymbol{T} \boldsymbol{\lambda} PTλ 在这里相当于 方程3.14 中的 τ \boldsymbol{\tau} τ τ c \boldsymbol{\tau}_{c} τc,整个 方程3.74 相当于 方程3.17。

讨论

方程3.74 是动力学算法的可行基础,但在设计算法的过程中还有一些细节需要解决。例如,速度和加速度变量明显是各个刚体速度和加速度向量的普吕克坐标,但在哪个坐标系中?文章中没有提及位置变量,也没有说明如何计算 I , T , T a τ \boldsymbol{I}, \boldsymbol{T}, \boldsymbol{T}_{a} \boldsymbol{\tau} I,T,Taτ T ˙ T v \dot{\boldsymbol{T}}^{\mathrm{T}} \boldsymbol{v} T˙Tv。另一个问题是如何求解 方程3.74。系数矩阵很大,但也是稀疏的,使用稀疏分解过程将极大地提高效率。然而,如果 方程3.72 中的约束不是线性无关的,那么系数矩阵将是奇异的,在这种情况下,需要使用能处理奇异矩阵的求解过程。最后,还有约束稳定化的问题:由于数值舍入和截断误差,在模拟过程中可能会导致位置和速度约束中积累错误。这个问题在 第8.3节 中进行了讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值