二维逆运动学 – 数学

 

介绍

我们习惯于与周围的世界互动,因此很容易低估移动我们的手和手臂到底有多复杂。在学术文献中,控制机械臂的任务被称为逆运动学。运动学代表运动而反向是指我们通常不控制手臂本身的事实。我们控制的是旋转每个关节的电机。反向运动学是决定如何驱动这些电机将手臂移动到某个位置的任务。就其一般形式而言,这是一项极具挑战性的任务。为了感受它的挑战性,您可以考虑 QWOPGIRP 甚至 Lunar Lander 等游戏,在这些游戏中,您不决定去哪里,而是决定激活哪些肌肉(或推进器)。

控制移动执行器的任务甚至早于机器人领域。几个世纪以来,数学家和工程师一直在开发无数的解决方案,这并不奇怪。大多数 3D 建模软件和游戏引擎(包括 Unity)都带有一组工具,可以绑定类人和类狗的生物。对于所有不同的设置(如机械臂、尾巴、触手、翅膀等),通常不提供内置解决方案。

这就是为什么在之前关于程序动画和逆向运动学的系列中,我介绍了一个非常通用且有效的解决方案,它可能适用于任何设置。但这种力量是有代价的:效率。该系列受到的主要批评之一是,它太耗时且昂贵,无法同时用于数百个角色。这就是为什么我决定开始一个新系列,专门研究具有两个自由度的手臂的反向运动学。您将在本教程中发现的技术非常高效,并且可以同时在数十个(如果不是数百个)字符上运行。

逆向运动学

让我们想象一个有两个节段和两个关节的机械臂,如下图所示。在手臂的末端,有我们想要控制的末端执行器。我们无法直接控制末端执行器的位置;我们只能旋转关节。逆运动学的问题是找到旋转关节以将末端执行器移动到所需位置的最佳方法。

这个新系列中提出的解决方案仅适用于具有两个关节的机械臂。在学术文献中经常说,这些机械臂有两个自由度。通过查看下图,其原因将非常清楚。具有两个自由度的机械臂可以建模为三角形,这是几何学中研究最多的几何图形之一。

让我们先把问题形式化一点。两个关节 一个 B 和(均为黑色)可以分别旋转一个(蓝色)和B(绿色)度。这会导致末端执行器移动到一个位置C

内角

我们可以使用这三个点一个BC构造一个具有内角的三角形\阿尔法\试用版\伽马,如下图所示。

虽然这三个角度是未知的,但我们知道所有边的长度。

  • 该段\overline{AB}表示手臂并具有长度c;
  • 该段\overline{BC}代表前臂,长度一个;
  • 该段\overline{CA}表示肩关节和手之间的距离,并具有长度b

知道三角形的三个边就足以找到它的所有角度。这要归功于余弦定律,这是毕达哥拉定理对不一定成直角的三角形的推广。

控制机械臂所需的两个角度是 \阿尔法 和 \试用版。让我们从 \阿尔法开始,它可以使用余弦定律计算:\阿尔法

 \begin{方程*} a^2 = b^2 + c^2 - 2 bc \cos{\alpha} \end{方程*}    (1)

我们可以参考(1)来提取\cos\alpha

  \[ \begin{split} \cos{\alpha} & =\frac{a^2-b^2-c^2}{-2bc} = \\ & =\boxed{\frac{b^2+c^2-a^2}{2bc}} \end{split} \]

现在需要的是使用反余弦函数\cos^{-1}(也称为弧线)来找到\阿尔法

 \begin{equation*} \alpha = \cos^{-1}{\left(\boxed{\frac{b^2+c^2-a^2}{2bc}}\right)} \end{equation*}    (2)

用同样的程序,我们可以再次应用余弦定律来发现\试用版

  \[b^2 = a^2 + c^2 - 2ac \cos{\beta}\]

  \[\cos{\beta}=\frac{a^2 + c^2 -b^2}{2ac}\]

 \begin{equation*} \beta=\cos^{-1}{\left(\frac{a^2 + c^2 -b^2}{2ac}\right)} \end{equation*}    (3)

❓给我看看余弦定律的推导!

该段h将三角形\overset{\triangle}{ABC}分为两个直角三角形:\overset{\triangle}{ABH}和 \overset{\triangle}{BCH}。这个证明是将毕达哥拉定理应用于两个三角形的自然结果:

 \begin{equation*} \begin{split} \overset{\triangle}{ABH}: & \\ & c^2 = h^2 + \left(b-d\right)^2 \\ & h^2 = \boxed{ c^2 - \left(b-d\right)^2} \end{split} \end{equation*}    (4)

\begin{equation*} \begin{split} \overset{\triangle}{BCH}: & \\ & a^2 = d^2 + h^2 \\ & h^2 = \boxed{a^2 -d^2} \end{split} \end{equation*}    (5)

4) 和 (5) 现在都用 表示。h^2我们可以将它们等同于获得:

  \[ \begin{split} \boxed{a^2 -d^2} & = \boxed{c^2 - \left(b-d\right)^2} \\ a^2 - d^2 &= c^2 - \left(b^2 + d^2 - 2 bd\right) \\ a^2 - d^2 & = c^2 - b^2 - d^2 + 2 bd \\ a^2 \xcancel{- d^2} & = c^2 - b^2 \xcancel{- d^2} + 2 bd\\ a^2 & = c^2 - b^2 + 2 bd \\ \end{split} \]

可以重新命名为:

\begin{equation*}  c^2=a^2+b^2-2bd \end{equation*}    (6)

等式(6)是余弦定律在欧几里得的命题12中从《元素》第2卷中转录的方式。

为了得到方程的现代形式,我们需要应用一些三角学。由于(5)是直角三角形,我们可以将线段d表示为:

\begin{equation*}  d = a \sin{\delta} \end{equation*}    (7)

通过记住三角形的角总和180^{\circ}为(或等效的\pi弧度)可以找到:\delta

 \begin{方程*} \begin{align} \delta + \gamma + \frac{\pi}{2} = \pi \\ \delta = \pi - \frac{\pi}{2} - \gamma \\ \delta = \frac{\pi}{2} - \gamma \end{align} \end{方程*}    (8)

\delta代入(7),我们得到:

 \begin{equation*} \begin{split} d & = a \sin{\delta}\\ d & = a \boxed{\sin{\left(\frac{\pi}{2} - \gamma\right)}}\\ d & = a \boxed{\cos{\gamma}} \end{split} \end{equation*}    (9)

最后一步是众所周知的协同功能恒等式的结果,该恒等式指出:

  \[ \sin\left(\frac{\pi}{2} - \gamma\right) = \cos{\gamma} \]

我们现在可以使用(9)来代替d6),这给了我们余弦定律的现代形式:

 \begin{equation*}  \begin{split} c^2&=a^2+b^2-2b\boxed{d} \\ c^2&=a^2+b^2-2b \boxed{a \cos{\gamma}} \\ c^2&=a^2+b^2-2ab \cos{\gamma} \end{split} \end{equation*}    (10)

关节角度

使用余弦定律,我们计算了 \阿尔法 和 \试用版的值,它们是机械臂创建的三角形的内角。但是,我们真正需要的角度是一个(蓝色)和B(绿色)。

 

让我们从计算开始B,这更容易。从上图可以明显看出,\试用版B和为180^{\circ}(等于\圆周率弧度)。这意味着:

 \begin{equation*}  \begin{split} \beta + B = \pi \\ B = \pi - \beta \end{split} \end{equation*}    (11)

计算一个没有太大区别。这里唯一的区别是我们需要考虑A'(紫色),这是段\overline{AC}的角度。这可以使用 arcotangent 函数\tan^{-1}计算:

 \begin{equation*} A' = \tan^{-1}{\left(\frac{C_Y-A_Y}{C_X-A_X}\right)} \end{equation*}    (12)

这导致:

\begin{方程*} A = \alpha + A' \end{方程*}    (13)

角度的符号一个A'并且大多B是任意的,取决于每个关节的运动方式。

❓多种解决方案?

逆运动学问题通常有几种解。即使在这种情况下只有两个自由度,我们也有两个不同的解决方案。

 

虽然角度A确实B不同,但推导基本保持不变,唯一的例外是 (13) 和 (11)。

下一步...

这篇文章结束了对具有两个自由度的机械臂的逆运动学数学的介绍。

下一篇文章将探讨如何使用推导的方程在Unity中有效地移动机械臂。

您可以在此处阅读此在线课程的其余部分:

此外,还提供以 3D 为重点的后续产品:

本教程中介绍的线条艺术动物的灵感来自WithOneLine的作品。

下载

您可以下载本教程中使用的所有资源,以便为 Unity 提供功能齐全的机械臂。

posted @ 2024-03-15 10:21  soliang  阅读(62)  评论(0编辑  收藏  举报