首页 / 驱动算法

机械臂与仿生臂:关节执行器、运动学与灵巧操作

机械臂的每个关节,就是一台 FOC 伺服 + 减速器 + 编码器的组合(衔接减速器篇力觉篇);仿生臂则向人手学习——腱驱动、弹性串联、欠驱动耦合。本文从关节执行器讲到整机运动学(正/逆解、工作空间),再对比工业机械臂与人臂的自由度分布与仿生设计,配平面臂正运动学交互演示和可编译 C 代码。

1. 从关节到整机:机械臂的组成

一台六轴机械臂拆开看,核心单元是关节执行器——一个"电机 + 减速器 + 编码器 + 驱动器"的模组,外加连杆和末端执行器。关节模组在电机侧看就是一台伺服(FOC 电流环/速度环/位置环,见站内驱动算法系列),在连杆侧看却要面对大惯量、强耦合与自重负载:

部件作用与 FOC/伺服的关系
电机产生驱动力矩无框力矩电机/伺服电机,FOC 控制,电流环带宽决定关节带宽
减速器放大转矩、降低转速、提高分辨率谐波/RV/行星(见减速器篇),减速比 50~160 常见
编码器电机侧/输出侧角度反馈磁编/光编/绝对值,双编码器方案可辨识减速器误差
驱动器功率变换与控制CANopen/EtherCAT 总线伺服(见 CANopen 专题)
力矩/力传感器关节输出力矩或末端力反馈力控与柔顺(见力觉篇

关节模组性能的三个硬指标:减速比×电机转矩(负载能力)、输出侧分辨率(编码器位数×减速比,决定重复定位精度)、带宽(电流环→速度环→位置环层层变慢,最终关节带宽通常只有 1~10Hz)。

2. 自由度与构型:机械臂 vs 人臂

自由度(DOF)决定机械臂能完成什么运动。工业六轴与人臂的自由度分布对比:

部位工业 6 轴人臂(上肢)备注
肩/腰部1(腰转)3(屈伸/外展内收/内旋外旋,球窝关节)人肩是球窝,机械臂用多轴叠加近似
肩(俯仰)1(肩俯仰)工业臂把肩展开为 1~2 个正交轴
1(肘俯仰)1(屈伸)+ 前臂旋前旋后 1前臂旋前旋后独立于肘
3(俯仰/偏摆/滚转,球腕)2(屈伸/尺桡偏)人腕缺滚转,靠前臂旋前补
—(末端法兰)20+(灵巧手)灵巧手是独立子系统(见第 5 节)

关键概念:任务空间(笛卡尔 6 维:位置 3 + 姿态 3)需要至少 6 个关节 DOF;7 轴冗余臂多出 1 个自由度,用于"同一个末端位姿保持时改变肘部位置"(零空间运动),这在狭窄空间作业与避障中非常有用。少于 6 DOF 的构型(如 SCARA 4 轴、Delta 3 轴)则靠特殊构型换取速度/刚度/成本。

3. 正运动学:从关节角到末端位姿

正运动学(FK):已知关节角,求末端位置。工业臂用 DH 参数(连杆长度 a、偏置 d、扭角 α、关节角 θ)建立相邻坐标系变换,串联相乘得末端位姿矩阵。平面臂是最直观的入门模型:

2 连杆平面臂正运动学(几何法)

x = l1cosθ1 + l2cos(θ12)

y = l1sinθ1 + l2sin(θ12)

3 连杆加一段:x += l3cos(θ123),y 同理;末端姿态角 φ = θ123

正运动学是"确定性"的:每个关节角组合唯一对应一个末端位姿,公式可直接编程(见第 8 节代码与第 7 节演示)。

4. 逆运动学:从末端位姿到关节角

逆运动学(IK)是控制的难点:给定末端目标,反解关节角。解析法(几何/代数推导出闭式解)快且确定,但只在特定构型成立;数值法(雅可比迭代、阻尼最小二乘)通用但慢、可能陷入局部解。2 连杆平面臂有优雅的几何闭式解:

2 连杆逆运动学(肘上/肘下两解)

cosθ2 = (x² + y² − l1² − l2²) / (2 l1 l2) ← 目标可达要求 |c| ≤ 1

θ2 = atan2(±√(1−c²), c) ← ± 对应肘上/肘下

θ1 = atan2(y, x) − atan2(l2sinθ2, l1+l2cosθ2)

3 连杆带姿态角 φ 时:先按 (x−l₃cosφ, y−l₃sinφ) 解 2 连杆,再 θ3 = φ − θ1 − θ2

ℹ️ 可达、奇异与多解

IK 前先判可达性:目标到原点距离必须在 [|l₁−l₂|, l₁+l₂] 内(|c|≤1)。奇异:末端靠近工作空间边界或两杆伸直(θ₂=0)时雅可比降秩,关节速度趋向无穷——控制上要做奇异规避与阻尼。多解:2 连杆有两个解(肘上/肘下),六轴臂可达 8~16 组解,需按关节限位、避障、连续性原则选一组。

5. 仿生臂设计:向人手学习

仿生臂与工业臂的分水岭不在"长得像",而在驱动架构——工业臂每个关节一个"大而强"的执行器(刚性、高精度、重),仿生臂追求"小而灵":

设计原理收益代价
腱驱动(Tendon)电机放在基座/近端,通过腱索(绳)把力传到远端关节远端质量小、惯量低、动态好腱摩擦/弹性/张力管理复杂,需张力传感器
串联弹性(SEA)电机与负载之间串一个弹性元件输出力精确可控、抗冲击、本质柔顺安全带宽下降、位置精度妥协
变刚度(VSA)两个电机独立控制位置与刚度低速高刚度定位、高速低刚度缓冲,兼顾两者双电机、控制复杂
欠驱动手(Underactuated)少于关节数的电机 + 耦合/差动机构手指自适应包络抓取、控制简单、重量轻无法独立控制每个关节

灵巧手的核心权衡是驱动数量 vs 自由度:人手 20+ DOF 由肌肉驱动,仿生手若每自由度一个电机,手本身就会又重又大。主流方案是欠驱动——如腱驱动欠耦合(几根腱驱动多关节,抓握时指节自动贴合物体)或直驱微型电机(每指 1~2 个电机 + 连杆机构)。无论哪种,最终执行器还是微型伺服(空心杯/无框电机 + 小型行星减速 + 磁编),FOC 电流环照常用。

6. 关节与笛卡尔控制:重力补偿、阻抗与零空间

机械臂控制比单轴伺服多三层问题:自重负载(重力矩随姿态变化,需实时前馈补偿)、多轴耦合(关节间惯性/科氏耦合)、人机交互(协作场景需柔顺)。三层控制架构:

  1. 关节层:每个关节的伺服环(位置/速度/力矩),电机侧三环带宽决定响应上限
  2. 笛卡尔层:把末端目标位置/速度/力映射到关节(IK + 雅可比 + 阻抗控制),重力补偿在此层叠加到各关节力矩指令
  3. 任务层:轨迹规划、避障、零空间冗余利用(7 轴臂在末端位姿不变时调整肘位)

力控/柔顺的核心是 阻抗控制:把机器人末端等效成"弹簧-阻尼"系统,位置偏差产生期望力(阻抗),力偏差产生位置修正(导纳)。实现上衔接力觉篇:关节力矩传感器测输出扭矩 → 力矩环叠加在电流环外;末端六维力传感器 → 笛卡尔导纳控制。安全逻辑上,协作机器人通常限定 关节力矩上限 + 末端速度上限 + 功率上限,触发即停机——这是"碰撞检测"的最简实现。

7. 交互式演示:平面机械臂正运动学

拖动关节角滑块,实时计算并绘制 2/3 连杆平面臂的姿态;勾选"轨迹"记录末端路径,直观看出工作空间与"肘上/肘下"两个 IK 解对应的姿态。杆长滑块可改变构型。

平面机械臂正运动学演示(2/3 连杆)
末端坐标与姿态角实时计算:x = l1·cosθ1 + l2·cos(θ1+θ2)(+l3·cos(θ1+θ2+θ3))。

观察要点:2 连杆时末端可达范围是半径为 l₁+l₂ 的圆盘(内圈 |l₁−l₂| 为不可达盲区);3 连杆增加一个自由度后,同一末端位置可有多种"肘部姿态"组合——这就是冗余与零空间概念的雏形。

8. 运动学 C 代码(正/逆解)

下面是可编译的平面臂运动学库:2 连杆正/逆解(含肘上肘下双解)、3 连杆正解与带姿态的逆解。可直接移植进机器人控制器,或用于上位机仿真验证。

/* robot_kinematics.c —— 2/3 连杆平面机械臂运动学 * 编译:gcc -o robot_kinematics robot_kinematics.c -lm * 运行:./robot_kinematics * 说明:角度单位弧度;ik2 的 elbow=+1 肘上 / -1 肘下 */ #include <stdio.h> #include <math.h> #define D2R(d) ((d) * M_PI / 180.0) #define R2D(r) ((r) * 180.0 / M_PI) /* 2 连杆正运动学 */ void fk2(double l1, double l2, double t1, double t2, double *x, double *y) { *x = l1 * cos(t1) + l2 * cos(t1 + t2); *y = l1 * sin(t1) + l2 * sin(t1 + t2); } /* 2 连杆逆运动学:返回 0 可达 / -1 不可达 */ int ik2(double l1, double l2, double x, double y, int elbow, double *t1, double *t2) { double d2 = x*x + y*y; double c2 = (d2 - l1*l1 - l2*l2) / (2.0 * l1 * l2); if (c2 < -1.0 || c2 > 1.0) return -1; /* 不可达:超出工作空间 */ double s2 = elbow * sqrt(fmax(0.0, 1.0 - c2*c2)); *t2 = atan2(s2, c2); *t1 = atan2(y, x) - atan2(l2 * s2, l1 + l2 * c2); return 0; } /* 3 连杆正运动学(含末端姿态角 phi) */ void fk3(double l1, double l2, double l3, double t1, double t2, double t3, double *x, double *y, double *phi) { *phi = t1 + t2 + t3; *x = l1*cos(t1) + l2*cos(t1+t2) + l3*cos(*phi); *y = l1*sin(t1) + l2*sin(t1+t2) + l3*sin(*phi); } /* 3 连杆逆运动学:给定末端 (x,y) 与姿态 phi,elbow 选肘解 */ int ik3(double l1, double l2, double l3, double x, double y, double phi, int elbow, double *t1, double *t2, double *t3) { /* 腕点 = 末端沿 phi 方向退回 l3 */ double wx = x - l3 * cos(phi); double wy = y - l3 * sin(phi); if (ik2(l1, l2, wx, wy, elbow, t1, t2) < 0) return -1; *t3 = phi - *t1 - *t2; return 0; } int main(void) { /* 例:l1=l2=100mm,关节角 45°/-60° */ double x, y, t1, t2; fk2(100, 100, D2R(45), D2R(-60), &x, &y); printf("FK(45,-60) -> (%.1f, %.1f) mm\n", x, y); /* 逆解验证:肘上/肘下两解,回代应重合 */ ik2(100, 100, x, y, +1, &t1, &t2); printf("IK elbow=+1 -> θ1=%.1f° θ2=%.1f°\n", R2D(t1), R2D(t2)); ik2(100, 100, x, y, -1, &t1, &t2); printf("IK elbow=-1 -> θ1=%.1f° θ2=%.1f°\n", R2D(t1), R2D(t2)); /* 3 连杆:FK + IK 互逆验证(姿态 90°) */ double phi, x3, y3, a1, a2, a3; fk3(100, 80, 60, D2R(30), D2R(20), D2R(40), &x3, &y3, &phi); printf("FK3(30,20,40) -> (%.1f, %.1f) mm, φ=%.0f°\n", x3, y3, R2D(phi)); ik3(100, 80, 60, x3, y3, phi, +1, &a1, &a2, &a3); printf("IK3 -> θ1=%.1f° θ2=%.1f° θ3=%.1f°(应回到 30/20/40)\n", R2D(a1), R2D(a2), R2D(a3)); return 0; }

9. 工程要点

10. 小结

机械臂与仿生臂的差距不在"像不像人",而在驱动架构与控制的取舍:工业臂用刚性大执行器换精度与负载,仿生臂用腱驱动/弹性/欠驱动换轻量与安全。共通的内核仍是站内反复强调的三件事——关节就是伺服(FOC + 减速器 + 编码器)、运动学是几何(FK/IK 可精确计算)、柔顺靠力控(力矩环/阻抗,见力觉篇)。把这三层打通,六轴机械臂和五根手指的灵巧手在控制上就是同一套方法论。