1. Introduction
1.1 Dynamics Algorithms
刚体系统的动力学由其运动方程描述,该方程规定了作用在系统上的力与其产生的加速度之间的关系。我们将主要关注两种特定计算的算法:
正向动力学:计算给定刚体系统在给定外力作用下的加速度响应;
逆向动力学:计算必须施加于给定刚体系统以产生特定加速度响应的作用力。
正向动力学主要用于仿真。逆向动力学有多种用途,例如:运动控制系统、轨迹规划、机械设计,以及作为正向动力学计算的一个组成部分。在第9章中,我们将讨论第三种计算类型,称为混合动力学,其中给定部分加速度和力变量,任务是计算其余部分。
Equation of motion for a rigid-body system:
$$ \boldsymbol{\tau} = \boldsymbol{H}(\boldsymbol{q}) \ddot{\boldsymbol{q}} + \boldsymbol{C}(\boldsymbol{q}, \dot{\boldsymbol{q}}) $$
它本质上就是牛顿第二定律(F=ma)在复杂多体系统(如机器人手臂、无人机)中的高级扩展形式。这个方程描述了力(τ)如何导致运动(q̈)。你可以把它想象成机器人领域的 “F = ma”。
-
τ(Torque/Force):相当于 F。它是施加在系统关节或本体上的力或力矩向量。这是“因”,是驱动系统运动的输入。 -
q̈(Acceleration):相当于 a。它是系统的加速度向量(包括线加速度和角加速度)。这是“果”,是我们希望计算或预测的输出。 -
H(q)(Inertia Matrix):相当于 m。但它不是一个简单的质量,而是一个惯性矩阵(也称作质量矩阵)。它包含了系统的所有惯性信息(质量、转动惯量),并且这个矩阵会随着机器人姿态(即关节角度q)的改变而改变。这是因为机器人移动时,其质量分布相对于世界坐标系发生了变化。 -
C(q, q̇)(Force Vector):这是一个综合力向量,它代表了除了外部施加的力τ之外的所有其他力。它相当于F = ma中其他所有“杂项”力的集合。它包括:- 科里奥利力 (Coriolis forces) 和 离心力 (Centrifugal forces):由系统部件自身的旋转运动 (
q̇) 产生。简单说一下这两个力,科里奥利力是由多个关节同时运动时的速度耦合产生的惯性效应,离心力是由单个旋转运动的速度平方产生的惯性效应。 - 重力 (Gravity):由系统的质量和姿态 (
q) 决定。 - 摩擦力、阻尼力等其他内力。
- 科里奥利力 (Coriolis forces) 和 离心力 (Centrifugal forces):由系统部件自身的旋转运动 (
需要注意的是,
- 理论上的简化写法:
H(q)和C(q, q̇)- 这种写法暗示惯性矩阵
H和力向量C只取决于机器人当前的姿态q和速度q̇。 - 这在数学上是正确的,但隐藏了一个重要前提:这个方程是针对某一个特定的机器人而言的。
- 这种写法暗示惯性矩阵
- 实际上的精确写法:
H(model, q)和C(model, q, q̇)- 这种写法明确指出了一个更根本的事实:
H和C首先取决于你是哪个机器人(由model定义),然后才取决于你这个机器人当前的状态 (q,q̇)。 - 例子:一个工业机器人手臂和一个无人机,即使在某个瞬间摆出了一模一样的姿态 (
q) 和速度 (q̇),它们的H和C也绝对不同,因为它们的重量、结构、惯性等根本不同。这个根本性的差异就体现在model参数里。
- 这种写法明确指出了一个更根本的事实:
通过建立抽象的数学模型,我们可以编写一套通用的、强大的计算机代码,用它来计算一整大类物理系统的动力学问题,而不是为每个具体的机器人或机构都重新写一遍代码。
- 目标:我们想用计算机模拟或控制各种机器(机器人、机械等)的物理运动。
- 方法:不为每个机器都重写代码,而是追求编写通用代码。
- 实现途径:
- 第一步:抽象建模。将千差万别的物理机器,根据其连接结构抽象成两大类:运动树或闭环系统。
- 第二步:分类开发算法。针对每一类系统,去开发解决不同问题(如FD/ID)的算法。
- 最终成果:得到一个算法工具箱。当你需要分析一个新机器时,你只需要:
- a) 判断它属于哪一类(树 or 闭环)。
- b) 从工具箱里挑选适合该类别的、功能正确的算法(FD or ID)。
- c) 将你这个机器的具体参数(质量、长度等,即
model)输入到算法中,即可得到计算结果。
简而言之,这段话描述了一种高效、系统化的工程研究方法:通过分类和抽象,将复杂的物理问题转化为可管理的计算机算法问题,从而实现最大程度的代码复用和计算效率。 这本书的主要内容,就是详细介绍这些针对不同类别的、执行不同计算(FD/ID)的算法是如何实现的。
1.2 Spatial Vectors
空间向量 (Spatial Vectors)。它的目的是简化描述和计算
一个刚体在三维空间中有 6 个运动自由度:这很好理解,它可以同时在 3 个方向上移动(前后、左右、上下)和绕 3 个轴旋转(俯仰、偏航、翻滚)。
但我们通常用 3D 向量来表达它的动力学:这意味着我们需要两个独立的方程来描述一个刚体的完整运动:
传统方法的缺点:你必须同时处理两个方程和两种不同类型的物理量(力和力矩、线加速度和角加速度),这使得公式推导和计算机编程都变得复杂和冗长。
基于空间向量的解决方案:
==什么是空间向量?==它是一个 6 维(6D)向量,巧妙地将描述刚体运动的线性(移动)和角度(旋转)分量“打包”结合在一起。
空间加速度 (Spatial Acceleration) = 线加速度 (a) + 角加速度 (ω̇)
空间力 (Spatial Force) = 力 (f) + 力矩 (n)
... 同样还有空间速度、动量等。
==统一的空间运动方程:==
这个方程在形式上和 f = m a 非常相似,但它完整地描述了刚体的所有 6 个自由度的运动。我们来解析它的各个部分:
f: 空间力 。一个6D向量,包含了作用在刚体上的所有力和力矩信息。
I: 空间惯性张量 。一个6x6的矩阵,它同时包含了刚体的质量 (m)、质心位置和3D惯性张量 (I) 的所有信息。它完全定义了刚体本身的惯性属性。
a: 空间加速度 。一个6D向量,包含了质心的线加速度和刚体的角加速度。
v: 空间速度。一个6D向量,包含了刚体的线速度和角速度。
v ×* I v: 这是空间向量代数中的一种叉乘运算。它代表了离心力和哥氏力效应。在传统的3D方程里,这部分是 ω × I ω;在空间表示中,它被推广并包含了更全面的速度耦合效应。(×* 是一个符号,表示空间向量的叉乘)
空间向量表示法(Spatial Notation) 在刚体动力学中的一个巨大优势:它极大地简化了物理量的表达和运算。
例如:合并两个刚体,将两个刚体连接在一起,形成一个新的复合刚体。
如果使用传统的 3 D 矢量方法,是非常复杂的。需要计算新质心位置,新的转动惯量等,这些代数运算非常大。
在空间表示法中,每个刚体的惯性被整合为一个统一的数学对象——空间惯性张量(Spatial Inertia Tensor),它是一个 6x6 的矩阵,用 I 表示。这个矩阵已经包含了质量、质心位置和转动惯量的所有信息。
当两个刚体合并时,新刚体的总空间惯性张量就是两者惯性张量之和:
这个公式的简洁程度令人惊叹,它直接取代了传统方法中所有复杂的计算步骤。
空间向量不仅是一种数学工具,更是一种编程范式。它通过“数据类型抽象”和“专用函数库”,让程序员可以用非常简洁、直观的语法来表达复杂的物理运算,而无需牺牲任何运行效率。
在传统的3D向量方法中,要实现一个完整的刚体动力学方程是非常复杂且难以调试。
使用空间向量方法非常简单清晰。
最终结果:程序员可以用一行极其直观的代码:
f = I * a + v.cross(I * v);
总而言之,空间向量不仅是一种优雅的数学理论,更是一种强大的工程实践工具。它允许工程师和研究人员用表达力极强的代码来实现复杂的物理仿真,同时保证了专业级的运行性能,完美地平衡了开发效率与执行效率。
1.3 Units and Notation
- 单位系统:书中的公式不依赖于任何特定单位制(如英制或公制),只要求在整个计算过程中使用的单位系统是自洽的 (consistent) 的。例如,不能混合使用米和英尺。
- 明确提及:在少数必须指明单位的地方,将采用国际单位制 (SI units)。
数学符号与排版 (Mathematical Notation & Typography)
这是说明中最详细的部分,遵循了国际标准(ISO),旨在通过字体和字型来区分不同含义的符号:
-
变量 (Variables):使用_斜体_,如 ( $x, \theta, \lambda$ )。
-
常数 (Constants) 和 函数 (Functions):使用罗马正体,如 ( $\pi, \sin, \exp$ )。
-
向量 (Vectors) 和 矩阵 (Matrices):使用粗斜体。
-
向量:用小写粗斜体字母表示,如 ( $\boldsymbol{v}, \boldsymbol{f}$ )。
-
矩阵:用大写粗斜体字母表示,如 ( $\boldsymbol{M}, \boldsymbol{I}$ )。
-
特殊符号:
-
0:既表示零矩阵,也表示零向量。
-
1:表示单位矩阵 (identity matrix)。
-
⁻ᵀ:表示逆的转置,即 ( $\boldsymbol{A}{-T} = (\boldsymbol{A}{-1})^T$ )。
运算符与数组 (Operators & Arrays)
- 运算符 (Operators):像 ( $\boldsymbol{a} \times$ ) 这样的表达式代表一个算子(或运算函数),其作用是将 ( $\boldsymbol{b}$ ) 映射为 ( $\boldsymbol{a} \times \boldsymbol{b}$ )(即叉乘)。
- 数组 (Arrays):指一个有编号的列表。数组 ( $\lambda$ ) 的第 ( i ) 个元素记为 ( $\lambda(i)$ )(注意是圆括号,而非下标)。
坐标系与空间向量 (Coordinate Systems & Spatial Vectors)
这是理解本书动力学内容的关键约定:
-
坐标系标识:通过前上标或下标来指明一个量是在哪个坐标系中表示或测量的。例如,( $^A\boldsymbol{v}$ ) 表示在坐标系
{A}中测量的速度向量 ( $\boldsymbol{v}$ )。 -
空间向量标记:
-
空间向量本身(一个抽象的物理量)有时用帽子标记,如 ( $\hat{\boldsymbol{v}}$ )。
-
空间向量的坐标表示(一组数字)用下划线标记,如 ( $\underline{\boldsymbol{v}}$ )。
-
(此部分在第二章有详细解释,是本书非常重要的一个概念区分)。




