机械臂运动学:从舵机 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
常见问题
常见问题解答
正运动学和逆运动学有什么区别?
正运动学回答的是“给定这些关节角,工具在哪里?”它是一次直接计算,永远只有唯一的答案,而且确实很简单。逆运动学回答的是那个有用的问题——“要把工具放到这里,我需要哪些角度?”——而它在各方面都更难。它可能有两个解;如果目标超出可达范围,就一个解都没有;如果机械臂的关节数多于任务所约束的数目,还会有无穷多个解。机械臂控制中每一个有意思的问题,都在逆运动学这一边。
为什么我的机械臂去够背后的目标时方向是反的?
几乎可以肯定你用的是 atan() 而不是 atan2()。普通的 atan() 只接收一个比值,无法区分前方的目标和它在背后的镜像,因为两者算出的商相同——所以机械臂在两个象限里能正确到达,在另外两个象限里则是镜像。atan2() 分别接收两个分量,能分辨全部四个象限。这是第一版逆运动学实现里最常见的单一缺陷,它的表现是:机械臂一切正常,直到你让它去够背后的东西。
逆运动学中的肘上和肘下是什么意思?
对于二连杆机械臂,几乎每个可达点都能用两种不同的方式到达——肘部向上弯或向下弯——而数学会把两个解都返回,因为两个都是对的。你想要哪一个,取决于机械臂的周围环境:其中一个可能会撞到桌子、撞到工件,或者把线缆拧住。关键是要有意识地、始终如一地做出选择,因为在路径中途悄悄地在两个分支之间切换,会让机械臂做出一次幅度大、速度快、毫无计划的翻转。
为什么我的逆运动学代码会返回 NaN?
因为目标比连杆能到达的距离更远,余弦定理算出了一个超出 acos() 所接受的 −1 到 1 范围的参数。这个 NaN 随后会直接作为一个垃圾角度流进舵机指令,这就是为什么一个不可达的目标常常引发一次剧烈的运动,而不是拒绝移动。要在做三角计算之前先检查可达性——把到目标的距离与连杆长度之和、之差作比较——并把“不可达”作为一个真正的结果返回,而不是等 acos() 自己去发现它。
机械臂的奇异点是什么?
一种位形:在这种位形下,无论关节怎么动,机械臂都会暂时失去让工具朝某个方向移动的能力。对二连杆机械臂来说,最明显的一个就是完全伸直:机械臂笔直伸出时,不可能让工具再往外移,而哪怕沿那个方向稍微移动一点,也需要关节角发生巨大的变化。实际的后果是,一条经过完全伸直附近的平滑工具路径,会变成一次剧烈的关节运动。要把规划路径留在工作空间边界之内的一段余量里,而不是贴着边界走。
为什么我的机械臂落不到数学算出的位置上?
三个原因,大致按可能性排序。标定:舵机的零位就是它的舵盘碰巧被装上的那个位置,而且它的转向可能与你的约定相反,所以每个关节都需要一个偏移,可能还需要一次符号翻转。重力:一只握住完全伸直的连杆的业余舵机处在最差的机械杠杆比上,会直接下垂到指令角度之下。还有背隙:肩部四度的间隙驱动一根 150 mm 的连杆,到了夹爪端就是超过 10 mm 的误差,而且它的符号会随你接近的方向而改变。