学习路线中级

机械臂运动学:从舵机 PWM 到逆运动学

你能让一只舵机机械臂到达你选定的点——在动手碰硬件之前,就理解正运动学和逆运动学、可达工作空间以及奇异点。

机械臂运动学是那门把机械臂必须调和的两样东西连起来的几何:它真正能指令的关节角,以及你想要它在世界中所处的工具位置。一个方向走——从角度到位置——是正运动学,而且很容易。另一个方向走——从位置到角度——是逆运动学,有意思的问题都住在这里:两个解、你够不到的边界,以及机械臂会短暂失去对某个方向控制能力的那些位姿。

这条路线从零开始建立这种理解。你从硬件入手——通过 PCA9685驱动器让一个舵机转到被指令的角度,标定等等全都包括在内。然后你学几何:二连杆臂的角度如何摆放它的工具,以及如何反过来求解以到达一个目标。最后你在模拟器里实地探索,拖动一个目标,看着求解器挑关节角、撞上工作空间边界、并把不可达的目标标出来。

按顺序走完这些节点——每完成一个就会解锁下一个,你的进度会保存在这台设备上。当你准备动手做真家伙时,这条路线会直接接进四自由度机械臂项目。

开始之前

你需要三角函数——具体来说是 sin、cos 和 atan2——以及足够的编程能力, 能写出一个返回两个值的函数。有舵机经验会有帮助,但这条路线会覆盖它。 这里没有任何内容需要实物机械臂;整套几何都可以在模拟器里学完。

你将会做到什么

  • 由二连杆臂的关节角算出工具的位置,并反过来求出到达某一点所需的关节角。
  • 在两个解——肘上和肘下——之间有意识地选择,而不是数学返回哪个就拿哪个。
  • 预测可达工作空间的边界,并在机械臂尝试移动之前就发现落在边界外的目标。
  • 在机械臂接近完全伸直时识别出奇异点:此时工具位置的一点变化就要求关节角发生巨大的变化。
  • 实测自己关节里的间隙,并说出夹爪的误差中有多少来自机构而非数学。

大家卡在哪里

**用 atan 而不是 atan2。**普通的 atan 判断不出目标在哪个象限, 所以机械臂在正前方能正确到达,在背后却会镜像。atan2 分别接收两个分量, 四个象限全都能算对。

**acos 报定义域错误。**当目标比连杆能到达的距离更远时,余弦定理会算出一个 落在 −1 到 1 之外的参数,而 acos 返回 NaN。这个 NaN 会作为一堆垃圾角度 流进舵机指令。要在三角函数之前检查可达性,而不是之后。

**把关节角和舵机角搞混。**舵机的零位就是它的舵盘被装上的那个位置, 而且它可能朝与你数学计算相反的方向转。每个关节都需要一个标定偏移, 可能还需要一次符号翻转。跳过这一步会得到一条运动平滑、却落在离目标 远远之处的机械臂。

**在伸展状态下无视重力。**几何假设机械臂会去到被指令的位置。一台业余级舵机 握住一根完全伸直的连杆时处在最差的机械杠杆比上,真实位置会下垂到指令位置 之下——在工作空间的外缘最明显。

**去整定一个机械误差。**如果机械臂从不同侧接近同一点时会落在不同位置, 那么没有任何增益能修好它:那是减速箱的间隙,被整条臂长乘了进去。 肩关节 4 度、驱动一根 150 mm 连杆,换算到夹爪端超过 10 mm。

**穿过奇异点去驱动。**在接近完全伸直时逆解会变成病态的, 一条平滑的工具路径会变成剧烈的关节运动。把路径留在边界之内一段余量, 而不要贴着边界走。

你需要什么

什么 这条路线为什么需要它 说明
sin、cos 和 atan2 整套数学工具 只要你知道 atan2 是干什么的,你就准备好了
一个能返回两个值的函数 逆解返回一对角度,而且常常是两对 元组、结构体、出参——用哪个都行
一把量角器和一把尺子 用来比较机械臂实际去了哪里与被指令去哪里 这是检验运动学实现唯一诚实的办法
一条机械臂和一块 PCA9685(可选) 硬件那一半 几何完全可以只在模拟器里学完

为什么按这个顺序

**舵机驱动排在几何之前,而且这一点并不显然。**原因是标定。一旦你能 指令一个关节并看到它实际落在哪里,你就有了把后面每一个结果都与现实对照的 办法。先学几何的话,你没有办法区分“求解器错了”和“舵盘装错了”—— 两种完全不同的故障,从房间那头看一模一样。

**接下来是机械臂类型,因为它解释了什么才叫一根“连杆”。**笛卡尔臂、 SCARA 臂和 delta 臂用完全不同的几何解决同一个问题,而看三种就能弄清楚 运动学关心的是关节的布置,而不是某一种特定的机械臂。它也顺便告诉你 为什么 SCARA 的逆解几乎不值一提,而 delta 的却不是。

**逆解排在第三,因为那时两个前提都已就位。**它是这条路线的核心, 也是唯一一个你真要在数学上花时间的节点。

**模拟器排在第四,因为它把看不见的东西变成看得见的。**可达性、 两个肘部分支和奇异点,全都是你能在纸上证明、却要一直把目标拖到工作空间 边缘、亲眼看着求解器行为改变,才会真正理解的东西。拖动也是找出工作空间 形状最快的方式——只要连杆不等长,那个形状就是一个环带而不是圆盘。

**背隙为这条路线刻意收尾。**它是那个你不再能靠更好的数学来提升机械臂 精度的点。它之前的每一个节点都在算那个正确的角度;而这一个节点讲的是 正确角度与正确位置之间的那几毫米。

检查点:如何判断一个阶段已经落地

阶段 检查内容 通过是什么样
舵机驱动 在每个关节上指令 0°、90° 和 180° 舵盘落在被指令的位置,而且你已经记下每个关节的偏移和符号
PWM 标定 找出每个舵机真实端点对应的脉冲宽度 你的最小和最大计数是每台舵机各自定的,而不是库默认值,且在限位处不会嗡嗡响
正运动学 设定已知的角度、算出工具位置、再实测 算出的和实测的相差在几毫米以内
往返 把算出的位置再喂回逆解 得到的角度和你输入的一致
象限处理 索要四个象限里的目标 四个都能到达——如果有两个出现镜像,说明你用的是 atan
可达性 请求一个远超臂展的目标 你得到一个干净的“不可达”,不是 NaN,也不是一次猛扑
工作空间形状 在模拟器里把可达边界画出来 你能描述它,并解释为什么不等长的连杆会得到一个带洞的环带
肘部分支 用两种方式到达同一个点 两种都行,你有意识地选了一种,而且能说出为什么
奇异点 沿一条经过接近完全伸直处的直线工具路径驱动 你见过关节速度的尖峰,而且现在规划时会留出余量
背隙 从各个方向接近同一个点并测量 你拿到了夹爪端的毫米数——而且它不为零

这条路线到哪里为止

这条路线覆盖的是以闭式解出的平面二连杆解——几乎每一台业余级机械臂 的肩关节和肘关节背后的几何。它是最该先学的东西,因为你可以自己推导它、 检验它,并且确切地看清每一次失败为什么发生。

它在接下来会遇到的几件事之前停下。通用 n 自由度运动学使用 Denavit–Hartenberg 参数和齐次变换矩阵来系统地描述任意关节链, 而不是手解每一种臂的几何。数值逆解——基于雅可比的迭代——是 在没有闭式解时使用的办法,而超过四五关节之后这通常就是常态; 它同时还会在奇异点附近优雅退化,而闭式解在那里直接崩溃。

冗余消解是这样一个问题:当一条臂的关节数多于任务所约束的数目, 因而存在无穷多个有效解时该怎么办——这是一个真正有趣的问题, 而这条路线永远不必面对它,因为二连杆臂恰好只有两个解。

而动力学是操作臂的另外整整一半:运动学对力、惯量, 以及一个关节能多快移动而不超调,全都只字不提。这里的一切都假设 机械臂会去到被指令的位置,而且慢到这个假设成立为止。

学习路线

路线

按顺序完成各个节点——完成一个就会解锁下一个。你的进度会保存在这台设备上。

已完成 0 / 5

100%

常见问题

常见问题解答

正运动学和逆运动学有什么区别?

正运动学回答的是“给定这些关节角,工具在哪里?”它是一次直接计算,永远只有唯一的答案,而且确实很简单。逆运动学回答的是那个有用的问题——“要把工具放到这里,我需要哪些角度?”——而它在各方面都更难。它可能有两个解;如果目标超出可达范围,就一个解都没有;如果机械臂的关节数多于任务所约束的数目,还会有无穷多个解。机械臂控制中每一个有意思的问题,都在逆运动学这一边。

为什么我的机械臂去够背后的目标时方向是反的?

几乎可以肯定你用的是 atan() 而不是 atan2()。普通的 atan() 只接收一个比值,无法区分前方的目标和它在背后的镜像,因为两者算出的商相同——所以机械臂在两个象限里能正确到达,在另外两个象限里则是镜像。atan2() 分别接收两个分量,能分辨全部四个象限。这是第一版逆运动学实现里最常见的单一缺陷,它的表现是:机械臂一切正常,直到你让它去够背后的东西。

逆运动学中的肘上和肘下是什么意思?

对于二连杆机械臂,几乎每个可达点都能用两种不同的方式到达——肘部向上弯或向下弯——而数学会把两个解都返回,因为两个都是对的。你想要哪一个,取决于机械臂的周围环境:其中一个可能会撞到桌子、撞到工件,或者把线缆拧住。关键是要有意识地、始终如一地做出选择,因为在路径中途悄悄地在两个分支之间切换,会让机械臂做出一次幅度大、速度快、毫无计划的翻转。

为什么我的逆运动学代码会返回 NaN?

因为目标比连杆能到达的距离更远,余弦定理算出了一个超出 acos() 所接受的 −1 到 1 范围的参数。这个 NaN 随后会直接作为一个垃圾角度流进舵机指令,这就是为什么一个不可达的目标常常引发一次剧烈的运动,而不是拒绝移动。要在做三角计算之前先检查可达性——把到目标的距离与连杆长度之和、之差作比较——并把“不可达”作为一个真正的结果返回,而不是等 acos() 自己去发现它。

机械臂的奇异点是什么?

一种位形:在这种位形下,无论关节怎么动,机械臂都会暂时失去让工具朝某个方向移动的能力。对二连杆机械臂来说,最明显的一个就是完全伸直:机械臂笔直伸出时,不可能让工具再往外移,而哪怕沿那个方向稍微移动一点,也需要关节角发生巨大的变化。实际的后果是,一条经过完全伸直附近的平滑工具路径,会变成一次剧烈的关节运动。要把规划路径留在工作空间边界之内的一段余量里,而不是贴着边界走。

为什么我的机械臂落不到数学算出的位置上?

三个原因,大致按可能性排序。标定:舵机的零位就是它的舵盘碰巧被装上的那个位置,而且它的转向可能与你的约定相反,所以每个关节都需要一个偏移,可能还需要一次符号翻转。重力:一只握住完全伸直的连杆的业余舵机处在最差的机械杠杆比上,会直接下垂到指令角度之下。还有背隙:肩部四度的间隙驱动一根 150 mm 的连杆,到了夹爪端就是超过 10 mm 的误差,而且它的符号会随你接近的方向而改变。