Delta 机器人的动力学建模

Delta 机器人的动力学建模#

Delta 机器人 是一种三自由度的常用并联型机器人. 由于其特殊设计, 能够保证其顶板始终平行于底板, 只有三个平动自由度而无转动. 这一点很容易证明, 此处不再赘述. 因此我们将按下面的模型讨论

机器人模型

机器人有三个可以独立活动的支部, 编号为 \(1\), \(2\), \(3\), 按右手顺序排列, 彼此相隔 \(\frac{2\pi}{3}\). 我们之后的讨论将更多只限于同一个支部, 在不引起误会的情况下, 将省略下标以求简洁. 此时我们讨论的将是适用于三支的通用关系.

约定粗体 \(\mathbf{L}\) 代表向量, 非粗体的相同字母代表其模长 \(L := \|\mathbf{L}\|\). 在模型中, \(L_i\), \(i = 1,2,3\) 都是等长的, 因此都记为 \(L\); \(g\) 与 \(l\) 同理. 单位坐标轴方向为 \(\hat{\mathbf{i}}\), \(\hat{\mathbf{j}}\), \(\hat{\mathbf{k}}\); \(\hat{\cdot}\) 表示归一化. \(P\) 为关心的末端位置.

正向运动学#

正向运动学解决的问题是如何通过已知的广义坐标 \(\theta_i\), \(i = 1,2,3\) 来得到 \(P\) 的位置. 我们将从底部开始, 逐步地依次求解 \(B\), \(M\) 直到 \(P\) 的位置.

中途向量#

\(\mathbf{g}\) 与 \(B\) 的求解是极为简单的. 记方位角 \(\phi\) 为三支在水平面上的偏角, 有 \(\phi_1 = 0\), \(\phi_2 = \frac{2\pi}{3}\), \(\phi_3 = \frac{4\pi}{3}\). 于是

带有单位的物理计算

带有单位的物理计算#

Mathematica#

Mathematica 中可以带单位计算; 同样, 可以获取任意物理常数, 并以任意精度进行计算.

要使用物理常数, 首先使用 Quantity 函数获取它并保存在变量里, 接着就可以在运算中使用这一常数的带有单位的精确值. 例如

h = Quantity["PlanckConstant"]

获取了普朗克常量的值并保存在变量 h 中.

如果想要知道该常数在国际单位制下的准确值, 可以使用函数 UnitConvert. 例如

UnitConvert@Quantity["PlanckConstant"]

将给出结果

$$\frac{132521403}{200000000000000000000000000000000000000000} \mathrm{kg ~ m^2 / s}$$

要定义带有单位的变量, 依旧使用 Quantity, 只需如下所示

Quantity[600*^6, "Hz"] (* 给出 600000000 Hz *)

Quantity[1, "kg m/s^2"] (* 给出 1 kg m/s^2 *)

软件在解析单位时较慢, 但识别较为精确.

还可以使用语法 Ctrl+= 输入, 这其实是自然语言输入, 可以替换函数 Quantity, 只需按下 Ctrl+= 后输入想要的常数或带单位量即可. 例如 600*^6Hz, 1 kg m/s^2, Planck Constant 等等, 都可被正常识别.

量子力学中的角动量

量子力学中的角动量#

在量子力学中, 除了我们能够想象的沿轨道运动和绕自转轴转动的公转角动量与自转角动量, 这两者分别称为轨道角动量与自旋角动量, 对于任意 \(\mathbf{J}\), 只要其分量 \(J_\alpha\) 满足

$$ [J_\alpha, J_\beta] = \mathrm{i} \hbar \, \varepsilon_{\alpha \beta \gamma} \, J_\gamma $$

则我们称它为一种角动量. 角动量都具有以下对易关系

$$[\mathbf{J}^2, J_\alpha] = 0$$

这说明角动量的值与某一个角动量分量可以被同时测得, 一般我们选择 \(z\) 轴分量 \(J_z\).

我们将角动量值 \(\mathbf{J}^2\) 与 \(z\) 轴角动量 \(J_z\) 的共同本征态记作 \(\ket{\lambda, m}\), 其中 \(\mathbf{J}^2 \ket{\lambda, m} = \lambda \hbar^2 \ket{\lambda, m}\), \(J_z \ket{\lambda, m} = m \hbar \ket{\lambda, m}\).

阶梯算符#

定义两个重要的阶梯算符 \(J_\pm := J_x \pm \mathrm{i} J_y\). 这两个算符不是厄米算符, 因此它不能对应一种可观测的力学量. 我们可以发现它的对易关系

密度流体的动态模拟

密度流体的动态模拟#

我们将不可压缩流体的模拟分为两类, 一类聚焦于流体本身, 另一类则聚焦依托于流场的标量场. 前者称为体积流体, 如水与空气二相的模拟, 我们更关心流体本身的运动; 后者称为密度流体, 如充斥于密闭容器中的浊液的模拟, 我们关注的是溶质的物质的量密度这一标量. 需要注意的是这两个词仅为本篇文章的约定, 而非正式的学术用语.

本文讲述了不可压缩密度流体的运动学模拟. 纵览符合这一条件的流场, 如附加温度场, 容质的密度场等, 其标量场都耦合于流体的速度场. 这是指标量会被流体输运, 例如温度的对流; 标量场同时可以反过来影响速度场, 例如渗透压导致的流体运动, 但我们一般不认为它会破坏流体的不可压缩性, 否则这将导致被求解方程的形式变得极端复杂.

写出不可压缩流体的纳维 - 斯托克斯方程:

$$\nabla \cdot \mathbf{u} = 0$$

$$\frac{\mathrm{D} \mathbf{u}}{\mathrm{D} t} = -\nabla \frac{p}{\rho} + \nu \nabla^2 \mathbf{u} + \mathbf{a}$$

前者是质量守恒定律对应的连续性方程在不可压缩, 即 \(\rho \equiv \mathrm{const}\) 时的推论; 后者是牛顿第二定律. 其中 \(\nu\) 是运动粘度, \(\nu := \mu/\rho\), \(\mu\) 是动力粘度. 流体力学中, 我们一般用 \(\mathbf{u}\) 代表速度.

后式中出现的随质导数, 或称物质导数 \(\frac{\mathrm{D}}{\mathrm{D} t} := \frac{\partial}{\partial t} + (\mathbf{u} \cdot \nabla)\). 这一式中前者表示欧拉导数; 后者表示拉格朗日导数, 即由于流体的运动带来的变化, 这个效应称为移流. 将其拆开可以写为

使用泰勒展开的运动预测

使用泰勒展开的运动预测#

在 \(n\) 维空间运动的物体, 其运动方程总可以写成 \(n\) 个关于时间 \(t\) 的参数方程.

进一步地, 将关于 \(t\) 的参数方程泰勒展开为关于 \(t\) 的多项式函数, 可以显式得到其表达式, 并且可以计算出超过当前时刻, 也就是未来时刻的位置. 当超出当前时刻的时间不长, 运动轨迹是平滑的且分辨率足够高时, 可以认为此级数收敛于实际的位置.

泰勒展开所需的各阶导数可以通过数值计算获得.

参数获取#

假如我们已经获得位置关于时间的一系列数据 \(\{r_n\}\), 其中 \(r_n\) 是当前时刻的数据. 它也可以被记作 \(r_n^{(0)}\). 对应的时刻记为 \(t_n\), 或 \(t_n^{(0)}\).

根据函数导数的公式, 自然地我们想到当前时刻位置的一阶导数为 \(r_n^{(1)} = \frac{r_n - r_{n-1}}{\Delta t_n}\), 其中 \(\Delta t_n := t_n - t_{n-1}\), 以及过去时刻的导数同理.

于是, 我们获得了 \(n-1\) 个一阶导数组成的序列 \(\{r_n^{(1)}\}\). 进一步可以计算二阶乃至 \(n-1\) 阶导数:

$$r_n^{(m)} = \frac{r_n^{(m-1)} - r_{n-1}^{(m-1)}}{\Delta t_n^{(m-1)}}$$$$\Delta t_n^{(m)} = \frac{\Delta t_n^{(m-1)} + \Delta t_{n-1}^{(m-1)}}{2}$$

另外 \(\Delta t_n^{(0)} := \Delta t_n\).

抛体运动弹道解算

抛体运动弹道解算#

模型#

本文考虑使用 线性阻力 模型. 事实上, 在空气中运动的阻力应该由 二次阻力 描述, 关于二者的对比将在 后文 给出.

之所以使用线性阻力, 是因为如此一来物体的运动微分方程

$$m \dot{\mathbf{v}} = -k \mathbf{v} - m g \hat{\mathbf{j}}$$

有封闭解. 进一步令 \(\mu := \frac{k}{m}\), 上式化为

$$\dot{\mathbf{v}} = -\mu \mathbf{v} - g \hat{\mathbf{j}}$$

容易解得

$$\mathbf{v} = \mathrm{e}^{-\mu t} \mathbf{v}_0 - \mu^{-1} (1-\mathrm{e}^{-\mu t}) g \hat{\mathbf{j}}$$

积分得

$$ \mathbf{r} = \mathbf{r}_0 - \mu^{-1} (1-\mathrm{e}^{-\mu t}) \mathbf{v}_0 - \mu^{-2} (\mu t + \mathrm{e}^{-\mu t} - 1) g \, \hat{\mathbf{j}} $$

这就是线性阻力情况下的运动方程. 它也可以很轻松地分解为两个方向来运算.

与二次阻力的对比#

当速度较大 (\(\sim 20 ~ \mathrm{m/s}\)) 时, 弹丸在空气中运动的 雷诺数 很大, 并不适用于线性阻力. 但是在上升过程中, 速度逐渐下降, 雷诺数也逐渐变小, 于是在上升阶段用线性阻力模型的误差也不是很大.