三分钟看懂机械臂正逆解:机器人是怎么知道“手”该往哪动的?

机械臂控制里,经常会看到两个词:
正运动学(FK)
和
逆运动学(IK)
名字听起来很复杂,其实核心非常简单。
一句话理解:
正解:知道每个关节转了多少,计算机械臂末端在哪里。
逆解:知道机械臂末端想去哪里,反过来计算每个关节该转多少。
这就是机械臂正逆解最核心的区别。
一、先把机械臂想象成人的手臂
人的手臂可以简单看成:
肩膀 → 上臂 → 肘关节 → 小臂 → 手
机械臂也类似。
例如一个六轴机械臂通常拥有多个旋转关节:
关节1控制底座旋转。
关节2控制机械臂前后抬起。
关节3类似人的肘关节。
后面的几个关节主要调整机械臂末端的方向。
每个关节都有自己的角度。
只要这些关节角度发生变化,机械臂末端的位置也会发生变化。
于是就产生了两个问题:
问题1:
我已经知道每个关节的角度,机械臂的手现在在哪里?
这就是:
正运动学。
问题2:
我想让机械臂的手移动到某个位置,每个关节应该转到多少度?
这就是:
逆运动学。
二、什么是机械臂正解?
机械臂正解,也叫:
Forward Kinematics,FK。
它解决的问题是:
关节角度 → 机械臂末端位置
例如现在机械臂六个关节分别转到了不同角度。
机器人知道:
关节1转了多少度。
关节2转了多少度。
关节3转了多少度。
……
那么通过机械臂的结构和连杆长度,就可以计算:
机械臂末端当前在哪里。
例如最后可能得到:
末端距离机器人前方 50 cm。
距离机器人左侧 10 cm。
距离地面 40 cm。
同时还可以知道夹爪目前朝向哪里。
所以正运动学回答的其实就是:
“根据我现在的关节状态,我的手在哪里?”
三、为什么机械臂能算出自己的末端位置?
原因是:
机械臂每根连杆的长度都是已知的。
每个关节当前的角度也是已知的。
例如一个最简单的两关节机械臂:
第一根杆转一定角度。
第二根杆又在第一根杆的基础上继续旋转。
只要知道:
第一根杆多长。
第二根杆多长。
两个关节分别转了多少度。
就可以通过几何关系算出末端的位置。
实际六轴机械臂虽然复杂很多,但原理是一样的。
只不过二维几何问题变成了:
三维空间中的连续坐标变换。
四、机械臂里的“位姿”是什么意思?
机器人领域经常会看到一个词:
Pose,位姿。
它不是只有位置。
而是:
位置 + 姿态。
位置比较好理解,比如:
机械臂末端现在位于:
前方 50 cm。
左边 20 cm。
高度 30 cm。
但机械臂抓东西时,仅仅到达某个位置还不够。
例如抓一个杯子。
夹爪可以:
从上面往下抓。
从侧面抓。
斜着抓。
虽然夹爪中心可能位于同一个位置,但方向完全不同。
所以机械臂通常需要同时确定:
末端在哪里。
以及:
末端朝向哪里。
这两个信息合起来就是:
末端位姿。
五、什么是机械臂逆解?
逆运动学叫:
Inverse Kinematics,IK。
它和正运动学正好反过来。
正运动学是:
关节角度 → 末端位姿
逆运动学是:
末端目标位姿 → 关节角度
比如摄像头发现桌子上有一个苹果。
视觉系统告诉机械臂:
苹果在机械臂前方某个位置。
这时候机器人就知道:
“我的夹爪应该移动到这里。”
但机械臂真正能控制的不是:
“夹爪直接往这里移动。”
机器人真正能控制的是:
每一个关节电机。
所以它必须继续计算:
关节1应该转多少。
关节2应该转多少。
关节3应该转多少。
……
这个过程就是:
逆运动学。
六、举一个抓杯子的例子
假设机器人要抓桌上的杯子。
第一步:
摄像头识别杯子。
视觉算法得到杯子的位置。
第二步:
机器人确定一个抓取位置。
例如:
让夹爪移动到杯子上方。
第三步:
进行逆运动学计算。
机器人根据目标位置计算:
每个关节应该运动到什么角度。
第四步:
机械臂开始运动。
第五步:
机器人再利用正运动学计算:
当前机械臂末端实际在哪里。
因此整个过程可以简单理解成:
视觉发现目标
↓
确定机械臂末端目标位置
↓
逆运动学计算关节角度
↓
控制关节运动
↓
正运动学计算当前末端位置
↓
继续靠近目标
↓
完成抓取
这就是正逆运动学在机械臂中的典型应用。
七、为什么逆解比正解难?
因为正解通常比较直接。
如果机械臂所有关节角度都确定了,那么机械臂末端的位置基本也就确定了。
但是逆解不一样。
同一个末端位置,有时候可以通过很多种关节姿态到达。
最简单的例子就是人的手。
你把手放在桌面上的某一个位置。
此时你的肘部可以朝左。
也可以朝右。
甚至身体姿态稍微变化,手仍然能够保持在原来的位置。
机械臂也一样。
因此一个目标位置可能对应:
一组解。
也可能对应:
多组解。
甚至可能:
根本没有解。
八、什么时候逆解会无解?
例如一个机械臂最大只能伸出去 80 cm。
但你让它抓一个距离 2 米远的物体。
这显然做不到。
无论关节怎么转,机械臂都够不到。
这种情况就叫:
目标超出了机械臂的工作空间。
因此机械臂在进行逆运动学之前,经常还要考虑:
这个位置能不能到达?
关节会不会超过限位?
机械臂会不会碰到自己?
机械臂会不会撞到环境中的物体?
九、逆运动学一般怎么求?
逆运动学主要有两类方法。
第一类:解析法
解析法就是:
通过机械臂的几何结构直接推公式。
优点是:
计算非常快。
适合实时控制。
但缺点也很明显:
机械臂结构越复杂,公式越复杂。
有些机械臂甚至很难得到完整的解析解。
第二类:数值法
数值法的思路更简单。
假设机械臂现在距离目标还有一段距离。
算法先让关节稍微转一点。
然后计算:
机械臂末端是不是更接近目标了?
如果更近,就继续调整。
如果方向不对,就重新修改。
于是不断重复:
调整关节
↓
计算末端位置
↓
计算与目标的误差
↓
继续调整关节
直到机械臂末端足够接近目标位置。
所以数值逆运动学可以简单理解为:
不断调整关节,让机械臂的手一点一点靠近目标。
十、什么是雅可比矩阵?
学习机械臂逆运动学时,经常会看到一个词:
Jacobian,雅可比矩阵。
它看起来很复杂。
其实它干的事情非常简单:
描述某个关节动一点,会让机械臂末端往哪里移动多少。
例如:
关节1转一点。
机械臂末端可能向左移动。
关节2转一点。
末端可能向上移动。
关节3转一点。
末端可能向前移动。
雅可比矩阵就是把这些关系整理到一起。
于是机器人就可以反过来计算:
如果我希望机械臂末端向右移动一点,
那几个关节应该分别转多少?
因此雅可比矩阵是很多机械臂数值逆解算法的重要基础。
十一、什么是机械臂奇异点?
机械臂还有一个经常被提到的问题:
奇异点。
例如把手臂完全伸直。
此时你的手虽然还能移动,但某些方向上的运动会变得非常别扭。
机械臂也是一样。
当几个关节刚好处于某些特殊姿态时,机械臂会失去某个方向上的运动能力。
这时候逆运动学计算可能出现:
关节速度突然变大。
机械臂抖动。
轨迹不稳定。
逆解失败。
这种特殊姿态就称为:
奇异位形。
因此实际机械臂控制时,一般都会尽量避免机械臂长期运行在奇异点附近。
十二、正逆解和运动规划是一回事吗?
不是。
这是机械臂入门特别容易混淆的地方。
逆运动学解决的是:
“目标位置对应什么关节角?”
而运动规划解决的是:
“机械臂应该怎么从当前位置运动过去?”
比如:
机械臂现在在桌子左侧。
目标在桌子右侧。
逆运动学可能告诉机器人:
最终关节应该转到某个角度。
但是如果机械臂直接从当前位置转过去,
中间可能撞到桌子。
所以还需要运动规划算法寻找一条:
不会碰撞的路径。
完整流程一般是:
目标位置
↓
逆运动学
↓
得到目标关节姿态
↓
运动规划
↓
生成安全轨迹
↓
机械臂执行
因此:
IK 决定终点。
运动规划决定怎么去终点。
十三、ROS 和 MoveIt 是怎么做的?
做 ROS 机械臂开发时,经常会使用:
MoveIt。
MoveIt 已经集成了很多机械臂相关功能,例如:
正运动学。
逆运动学。
碰撞检测。
轨迹规划。
机械臂运动控制。
所以实际开发时,我们通常不需要每次都手动推导完整公式。
例如只需要告诉 MoveIt:
“我希望机械臂末端移动到这里。”
MoveIt 就可以利用逆运动学求出合适的关节状态。
然后通过运动规划寻找一条安全路径。
最后发送给机械臂执行。
这也是现在很多 ROS 机械臂项目最常见的工作流程。
十四、正解和逆解到底有什么区别?
最后可以用最简单的方式记住。
正运动学 FK
已知:
关节角度
计算:
机械臂末端在哪里。
可以理解成:
“我现在这样弯手臂,我的手在哪里?”
逆运动学 IK
已知:
机械臂末端想去哪里
计算:
每个关节应该怎么转。
可以理解成:
“我要把手伸到那里,我的肩膀、肘和手腕应该怎么转?”
十五、总结
机械臂正逆运动学其实没有名字听起来那么复杂。
正解解决的是:
关节 → 末端
逆解解决的是:
末端 → 关节
机械臂真正工作时,两者通常会同时使用。
例如抓取一个杯子:
摄像头找到杯子。
↓
确定目标抓取位置。
↓
逆运动学计算关节角。
↓
运动规划生成轨迹。
↓
机械臂执行运动。
↓
正运动学不断计算当前机械臂末端位置。
最终完成抓取。
所以只需要记住两句话:
正解:知道胳膊怎么弯,算出手在哪里。
逆解:知道手要去哪里,算出胳膊怎么弯。
理解了这两句话,机械臂正逆运动学的核心思想基本就理解了。
精辟: 正解:知道胳膊怎么弯,算出手在哪里。 逆解:知道手要去哪里,算出胳膊怎么弯。