4. 运动学基础:正运动学与逆运动学,关节空间与笛卡尔空间
各位同学,今天我们聊点硬核的——运动学。说白了,就是研究机器人怎么动起来的学问。你给机器人下指令,它得知道每个关节转多少度,手爪才能到那个位置。反过来,你告诉它手爪要去哪,它得算出关节怎么转。这就是正运动学和逆运动学要干的事。
我个人习惯把运动学比作「翻译」。关节空间和笛卡尔空间,就是两种不同的语言。关节空间说的是「关节1转30度,关节2转45度...」,笛卡尔空间说的是「手爪在X=0.5米,Y=0.3米,Z=0.2米」。机器人得在这两种语言之间来回翻译。
4.1 正运动学:从关节到末端
正运动学,就是已知每个关节的角度,求末端执行器的位置和姿态。这其实是个「正向推导」的过程。你想想看,每个关节的运动都会影响后面所有连杆的位置,就像多米诺骨牌一样。
我在项目中遇到过最典型的场景:调试六轴机器人时,我想确认某个关节角度组合下,手爪会不会撞到工作台上的夹具。这时候就得用正运动学,快速算出末端位置。
正运动学的核心是齐次变换矩阵。每个关节对应一个变换矩阵,把所有矩阵乘起来,就得到末端相对于基座的位姿。
// 一个简单的2自由度平面机器人正运动学示例
// 已知:关节角度 θ1, θ2,连杆长度 L1, L2
// 求:末端位置 (x, y)
function forwardKinematics(theta1, theta2, L1, L2) {
const x = L1 * Math.cos(theta1) + L2 * Math.cos(theta1 + theta2);
const y = L1 * Math.sin(theta1) + L2 * Math.sin(theta1 + theta2);
return { x, y };
}
// 示例:关节1转30度,关节2转45度,连杆长均为1米
const result = forwardKinematics(30 * Math.PI / 180, 45 * Math.PI / 180, 1.0, 1.0);
console.log(`末端位置: x=${result.x.toFixed(3)}, y=${result.y.toFixed(3)}`);
// 输出:末端位置: x=1.573, y=1.573
4.2 逆运动学:从末端到关节
逆运动学就麻烦多了。已知末端要到达某个位置,求每个关节该转多少度。这玩意儿没有唯一解,甚至可能无解。
为什么会这样?你想想看,一个六轴机器人,末端要到达空间中的某个点,理论上可以有无数种手臂姿势。就像你用手去够桌上的杯子,你可以肘部朝下,也可以肘部朝外——都能碰到杯子,但关节角度完全不同。
逆运动学的解法主要有两种:
- 解析法:通过几何关系直接推导出公式。速度快,但只适用于特定构型的机器人(比如前三个关节轴线交于一点)。
- 数值法:用迭代逼近的方式求解。通用性强,但计算量大,而且可能陷入局部最优。
嗯,这里要注意:数值法虽然通用,但如果你在实时控制里用,一定要控制迭代次数和收敛精度。我见过有人把迭代次数设成1000次,结果控制周期直接超时,机器人抖得像筛糠一样。
// 2自由度平面机器人的逆运动学(解析法)
// 已知:末端位置 (x, y),连杆长度 L1, L2
// 求:关节角度 θ1, θ2
function inverseKinematics(x, y, L1, L2) {
// 计算肘部角度(余弦定理)
const cosTheta2 = (x*x + y*y - L1*L1 - L2*L2) / (2 * L1 * L2);
// 检查可达性
if (Math.abs(cosTheta2) > 1) {
throw new Error('目标点不可达!');
}
const theta2 = Math.acos(cosTheta2);
const theta1 = Math.atan2(y, x) - Math.atan2(L2 * Math.sin(theta2), L1 + L2 * Math.cos(theta2));
return { theta1, theta2 };
}
// 示例:末端要去 (1.5, 1.5)
try {
const angles = inverseKinematics(1.5, 1.5, 1.0, 1.0);
console.log(`关节角度: θ1=${(angles.theta1 * 180 / Math.PI).toFixed(1)}°, θ2=${(angles.theta2 * 180 / Math.PI).toFixed(1)}°`);
} catch (e) {
console.error(e.message);
}
4.3 关节空间 vs 笛卡尔空间
这两个空间的概念,说白了就是「怎么描述机器人的运动」。
| 特性 | 关节空间 | 笛卡尔空间 |
|---|---|---|
| 描述方式 | 每个关节的角度/位移 | 末端在三维空间的位置和姿态 |
| 直观性 | 不直观,但控制简单 | 直观,但计算复杂 |
| 路径规划 | 容易产生不可预知的末端轨迹 | 末端轨迹可控,但关节可能突变 |
| 避障 | 难以判断是否碰撞 | 容易判断末端是否碰撞 |
我个人习惯这样用:
- 如果只是让机器人从A点走到B点,中间没有障碍物,用关节空间规划就够了。简单、高效。
- 如果末端要走一条精确的直线或圆弧(比如焊接、涂胶),必须在笛卡尔空间规划。
- 避障时,我通常先在笛卡尔空间规划路径,再映射回关节空间做插补。
4.4 知识体系结构图
下面这张图,是我自己总结的运动学知识体系。你看一眼就能明白各个概念之间的关系。
4.5 实际项目中的选择策略
说了这么多理论,到底怎么用?我总结了几条实战经验:
- 简单搬运:用关节空间规划。比如码垛机器人,只需要起点和终点,中间没障碍物。关节空间插补快,计算量小。
- 精密加工:必须用笛卡尔空间。比如激光切割,末端要走精确的圆弧轨迹。这时候关节空间规划出来的路径根本没法用。
- 复杂避障:先在笛卡尔空间规划路径点,再用逆运动学转成关节角度,最后在关节空间做平滑插补。这是最稳妥的做法。
嗯,运动学基础就讲到这里。记住一句话:正运动学是「已知关节求末端」,逆运动学是「已知末端求关节」。关节空间和笛卡尔空间,就是机器人的两种语言。你得学会在这两种语言之间自由切换。
可可精品资料库