机器人夹爪模拟器:夹持力与压碎极限
先找出物体会掉落与会被夹坏之间的那个力度窗口,然后再看一根刚性手指如何把这个窗口压缩到比一个舵机步距还要小。
- 类别
- 控制系统
- 时长
- 15–30 分钟
- 平台
- 浏览器 · Arduino · ESP32
01 / 从这里开始
简介
夹爪只有一个旋钮——钳口越过接触点之后还要继续闭合多少——却必须停留在两堵墙之间,而这两堵墙都是力。把位置转换成力的,是舵盘与物体之间的串联刚度,所以以毫米计的可用窗口,等于力的窗口除以这个刚度。用刚性手指时,这个实验台里每一个物体的窗口都比舵机的一个步长还窄。
Live lab / Grip force and compliance
Robot gripper simulator
Squeeze an object between two fingers and watch the window between dropping it and crushing it. Stiffen the fingers and the window shrinks below one servo step — at which point no setting works, and no amount of tuning will find one.
Left: the grasp. Each shaded wedge is a friction cone; the horizontal arrow between the contacts is the grasp line, and it must lie inside both cones or the object is ejected however hard you squeeze. The zig-zag between the dashed commanded jaw position and the pad on the object is the series compliance being deflected. Right: what you get for what you command. The green band is the usable window between the slip floor and the crush ceiling; the comb along the bottom axis is one servo step each, and a window narrower than one tooth of that comb cannot be aimed at.
- Grip force you get
- Usable window
- Slip floor / crush ceiling
- What it needs standing still
- Grip force
- 0.70 N
- Needs, on the move
- 0.29 N
- Usable window
- 7.739 mm
- One servo step
- 0.524 mm
- Settings that work
- 15
- Servo load
- 12% of stall
Every action has a button above. If you prefer the keyboard, focus the drawing and press P for the next preset, O for the next object, G for the next finger, R to reset and F for full screen; sliders respond to the arrow keys.
控件
每一个控件在收到输入时都会重新计算整个抓取,因此拖动滑块时曲线会实时跟随。没有任何需要点击开始的操作。
| 控件 | 它改变什么 |
|---|---|
| 预设 | 五种算好的情形:一种能成功,以及四种各自不同的失败方式 |
| 物体 | 载入真实物体的质量、宽度、摩擦系数、压碎极限和锥面角度 |
| 手指 | 载入串联刚度——刚性打印、泡沫垫、带弹簧或打印柔性铰链 |
| 接触后钳口闭合量 | 位置控制夹爪真正拥有的唯一旋钮 |
| 手指力臂 | 从舵盘中心到接触点。减半可得双倍力与一半行程 |
| 串联刚度 | 舵机舵盘与物体之间的一切,合并为一个弹簧 |
| 舵机堵转扭矩 | 4.8 V 下的 SG90 为 0.176 N·m;MG996R 大约是它的十倍 |
| 质量、μ、压碎力、锥度 | 当你不再相信预设之后,可以直接调整物体 |
| 提升高度和时间 | 抓取必须挺过的那次运动,按真实的 S 曲线规划 |
| 安全系数 | 2× 是工业上常用的起始值 |
左面板展示的就是抓取本身。每个阴影楔形都以接触面的法线为轴绘制,表示一个摩擦锥;两个接触点之间的虚线是抓取线——它必须同时落在两个摩擦锥之内,否则物体会被弹出。虚线所示的指令钳口位置与物体上的垫片之间那段锯齿形曲线,是被压缩的串联柔顺量:这个变形量就是夹持力。
右面板展示的是你发出指令后实际得到的结果。斜线遵循 F = k·Δc,直到舵机力竭而转为水平。绿色色带是可用窗口,底部横轴上的梳齿每一齿代表一个舵机步长,某一齿落入窗口内时就会变绿。如果没有任何一齿变绿,就说明没有任何设置能奏效。
原理
两指夹爪有一个旋钮和两堵墙,而旋钮的单位与墙的单位并不相同。
**两堵墙都是力。**在滑动下限之下物体会掉落;在压碎上限之上物体会被毁坏:
slip n·μ·N ≥ m·(g + a)·SF → N ≥ m(g + a)·SF / (μ·n)
crush N ≤ F_crush
n = 2 个接触点。加速度项不是装饰——机械臂摆动负载时会在工具端施加数个 g,而真正要紧的正是这一负载工况。舵机还加上了第三堵墙:N ≤ τ/L · k_duty,其中 L 是从舵盘中心到接触点的力臂,k_duty 则把堵转扭矩折减到电机能够承受而不致烧毁的水平。因此真正的上限是 min(F_crush, τ·k_duty/L)。
**旋钮是位置。**位置控制舵机指令的是钳口行程,而不是力。把前者转换成后者的,是舵盘与物体之间所有部件的串联刚度 k——连杆的变形、手指的变形、垫片以及物体本身:
N = k · Δc Δc = how far past first contact you drove the jaws
因此,用你真正能够指令的单位表示,可用窗口为:
Δc_window = ( min(F_crush, τ·k_duty/L) − m(g + a)·SF/(μ·n) ) / k
并且它按 1/k 缩放。这就是整个设计的要点。刚性打印手指约为 25 N/mm;泡沫垫串联约 4 N/mm;拉簧为 0.8;打印柔性铰链为 0.35。相比之下,舵机的分辨率约为一度,因此每一步使钳口移动 L·(π/180)——在 30 mm 力臂上就是 0.524 mm。把这两个数字拿来比较,结论毫无悬念:
| 手指 | k | 草莓上的窗口 | 可用的舵机位置数 |
|---|---|---|---|
| 刚性打印 | 25 N/mm | 0.108 mm | 0 |
| 刚性 + 泡沫垫 | 4 N/mm | 0.677 mm | 1 |
| 串联拉簧 | 0.8 N/mm | 3.386 mm | 7 |
| 打印柔性铰链 | 0.35 N/mm | 7.739 mm | 15 |
**第三种失效与力毫无关系。**两个带摩擦的点接触,只有在连接它们的直线同时落在两个摩擦锥之内时才能保持住。对于夹持锥面物体的平行钳口,这一条可化简为:
holds iff tan(taper) < μ
其中根本没有 N。夹得更紧没有任何帮助,从来没有帮助过,而它却是所有人最先尝试的做法。完整推导见摩擦、力封闭,以及为什么两个触点只是一场赌博。
算法
这里没有积分运算——全是代数,再加上一次对本站运动规划器的调用,使提升加速度来自真实的 S 曲线,而不是某个人的猜测。每次求值按以下顺序进行:
- 舵机的力上限。
F_stall = τ / L,然后折减:F_cont = F_stall · 0.7。 - 用 S 曲线规划器规划提升动作,并取其峰值加速度。
- 挤压。
demand = k · Δc,然后N = min(demand, F_cont)——因为舵机比弹簧先放弃。 - 需求算两遍。
needStill = m·g·SF/(μ·2)和needMoving = m·(g + a_peak)·SF/(μ·2)。两者之差就是这段运动所要付出的代价。 - **窗口。**下限
= needMoving,上限= min(F_crush, F_cont),再把两者都除以k,得到你可以指令的闭合量范围。 - 分辨率检查。
step = L·(π/180)。如果window < step就不存在任何设置,实验台会直说,而不是给出一个谁也达不到的余量。 - 力封闭,独立于以上全部计算:
tan(taper) < μ。 - 逐采样推演提升过程,把该瞬时加速度下的需求与你保持的恒定
N相比较,并记录首次失效的时刻。
第 8 步是唯一出现时间的地方,而且比较的两边都是法向力——这一点值得说明,因为一旦弄错(拿摩擦力 2μN 去比较一个已经被 μ 除过的需求)就会重复计入摩擦力,导致每一个抓取都被判定为即使静止也抓不住。
引导实验
每一个实验只隔离一个变量。按顺序运行,它们会层层递进。
1. 能成功的抓取
加载能成功的抓取——一颗草莓放在打印柔性铰链手指中,钳口越过接触点继续闭合 2 mm。夹持力 0.70 N,而需求为 0.29 N,压碎极限为 3 N。窗口为 7.739 mm,有 15 个不同的舵机位置落在窗口内。
**观察要点:**右面板的绿色色带很宽,梳状结构里有十五个齿是绿色的。这就是“设计良好”该有的样子:无论往哪个方向偏上整整一毫米,都不会有什么变化。
2. 同莓刚性手指
按 P 键,或者加载同一个草莓、但用刚性手指。物体没有任何变化,变化的是手指:刚度从 0.35 N/mm 变成了 25 N/mm。
| 柔性铰链 | 刚性 | |
|---|---|---|
| 窗口 | 7.739 mm | 0.108 mm |
| 舵机一步 | 0.524 mm | 0.524 mm |
| 可用位置数 | 15 | 0 |
| 预设闭合量下的夹持力 | 0.70 N | 4.11 N——超出压碎极限 1.4 倍 |
**观察什么:**窗口窄了 71 倍,因为 25/0.35 ≈ 71。它严格按 1/k 缩放,拖动刚度滑块、看着两个数字反向变化就能验证这一点。当窗口小到一个舵机步长以下时,梳状结构已经没有绿色的可用齿,判定结果也不再给出余量——因为确实不存在余量。
3. 意外的离合器
把手指设回刚性,用 O 键循环切换物体:木块、M6 螺栓、鸡蛋、PET 瓶、纸杯、草莓。观察可用的设置。
| 物体 | 压碎极限 | 刚性时的窗口 | 可用的位置数 | 会发生什么 |
|---|---|---|---|---|
| 木块 | 500 N | 0.127 mm | 0 | 夹住了,舵机顶死 |
| M6 螺栓 | 2000 N | 0.150 mm | 0 | 夹住了,舵机顶死 |
| 鸡蛋 | 30 N | 0.087 mm | 0 | 夹住了,舵机顶死 |
| PET 瓶 | 8 N | 0.144 mm | 0 | 夹住了,舵机顶死 |
| 纸杯 | 4 N | 0.153 mm | 0 | 压坏 |
| 草莓 | 3 N | 0.108 mm | 0 | 压坏 |
观察要点:实验台中每个物体的“可用的位置数”一栏都是零,可六个物体里却有四个夹得牢牢的。这并不矛盾——它正是业余夹爪的整个作用机理。刚性夹爪永远不会落进自己的窗口内;它会冲过头,然后卡在舵机自身 4.11 N 的力上限上,而这样能行,是因为 4.11 N 恰好低于木块、螺栓、鸡蛋和瓶子的压碎极限。舵机此时充当了一个你既没设计、也无法调整的离合器。把舵机堵转扭矩推向 MG996R 的水平,再看鸡蛋那一行也失效:大舵机反而让夹爪更糟,因为这个意外的离合器会升到物体之上。
以这种方式保持的代价体现在舵机负载读数上:长期输出堵转扭矩的 70%,对一个不转动的 SG90 来说大约相当于 0.49 A 的电流。这正是业余舵机是怎么烧坏的。
4. 使劲夹,照样丢
加载摩擦锥抓不住的锥面:在 μ 为 0.45 时,一个具有 28° 锥面的瓶子对应的摩擦锥是 ±24.2°,抓取线落在锥外。现在把钳口闭合量从 0.5 mm 拖到量程顶端。
| 闭合量 | 夹持力 | 结论 |
|---|---|---|
| 0.5 mm | 0.40 N | 弹出 |
| 6.0 mm | 4.11 N | 弹出 |
| 12.0 mm | 4.11 N | 弹出 |
**观察要点:**力大了十倍,结论却完全相同,因为 N 在 tan(taper) < μ 中被消去了。现在保持闭合量不动,改为拖动 μ。在 0.50 时摩擦锥是 ±26.6°,仍然被弹出;在 0.53 时是 ±27.9°,仍然被弹出;在 0.55 时摩擦锥达到 ±28.8°,越过了 28° 的锥度,抓取就稳住了——而且是在你恰好留在那里的那个力下稳住。拖动时注意左面板上的摩擦锥楔形是如何张开并越过虚线抓取线的。μ 相差零点零二就是全部差别,而夹紧从来就不在这个论证里。
5. 台架上选好,一动就丢
加载台架上选好,一动就丢:一颗鸡蛋放在带弹簧的手指中,静止时需求为 1.63 N,而夹持力有 1.89 N。它能夹住。让机械臂在 0.9 s 内完成 250 mm 的提升,它就夹不住了。
| 提升时间 | 峰值加速度 | 所需力 | 夹得住吗? |
|---|---|---|---|
| 0.35 s | 5.85 m/s² | 2.59 N | 否 |
| 0.60 s | 4.17 m/s² | 2.32 N | 否 |
| 0.90 s | 1.85 m/s² | 1.93 N | 否——0.04 s 时松脱 |
| 1.50 s | 0.67 m/s² | 1.74 N | 是 |
| 2.50 s | 0.24 m/s² | 1.66 N | 是 |
**观察要点:**夹持力自始至终没有变化,变化的只有这个动作本身。把提升时间从 0.9 s 放慢到 1.5 s,就修好了一个台架测试说没问题的抓取;而在 0.9 s 时,它在动作开始后 40 ms 就失效了——此时机械臂连一厘米都还没走完,这就是为什么它看起来像是夹爪“突然就掉了”。右面板上虚线静止线与实线滑动下限之间的阴影条,正是加速度让你付出的代价。
6. 力臂买了两样,卖掉一样
把物体设为木块、手指设为带垫,然后把手指力臂拖动。
| 力臂 | 连续钳口力 | 每步钳口行程 | 能夹住的最重木块 | 120° 扫掠下的钳口张开量 |
|---|---|---|---|---|
| 12 mm | 10.27 N | 0.209 mm | 264 g | 25 mm |
| 30 mm | 4.11 N | 0.524 mm | 106 g | 63 mm |
| 60 mm | 2.05 N | 1.047 mm | 53 g | 126 mm |
**观察要点:**在实验台测量的两个维度上,短力臂都更好——同一个舵机就能得到五倍力和五倍更细的分辨率。最后一列是实验台不算的,因为它只是纯算术:钳口行程是 L·θ,所以 12 mm 力臂扫过 120° 只能张开 25 mm,根本无法绕过 65 mm 的瓶子。力臂要按你需要捡起的最大物体来定,而力和分辨率只是顺带落下来的结果。这就是那笔交易,也正是像样的夹爪用连杆而不是把手指直接栓在舵盘上的原因。
7. 安全系数真正的代价
回到那个能成功的草莓加柔性铰链预设,把安全系数从 1 拖到 6。
**观察要点:**滑动下限升高,而压碎上限不动,于是窗口从 8.16 mm 收窄到 6.07 mm——可用的位置数从 16 个降到 12 个。6 倍安全系数让你付出四分之一的窗口,除此之外没有别的代价;当窗口有 8 mm 时这很便宜。而在刚性手指上只有 0.1 mm 的地方,同样的系数就是“有一个数”和“什么都没有”的区别。柔顺性正是让安全系数变得可负担的原因。
观察汇总
把以上七点合在一起看:
- **两堵墙用牛顿,一个旋钮用毫米。**换算系数就是
k,它也是夹爪中唯一可以自由选择的数值。 - **窗口按 1/k 缩放。**不是近似。刚度减半,窗口精确地翻倍。
- **墙是舵机的步长,不是你的耐心。**在
L·(π/180)以下不存在任何设置,改固件也够不着。 - **刚性夹爪靠堵转工作。**它会冲过窗口,落在舵机的力上限上,而且只有当该上限低于物体的压碎极限时才没事。大舵机会抬高这个上限,然后开始弄坏东西。
- 力封闭无视力的大小。
tan(锥度) < μ是一个几何判据,夹紧程度不在其中。 - **抓取要按运动来选型,而不是按抓取动作。**机械臂一快起来,加速度项就占据主导。
硬件落地
| 在这个实验台 | 在真实机器人上 |
|---|---|
| 一个压碎力滑块 | 一台厨房秤和几颗被压坏的草莓。自己测;预设只给量级 |
| 一个串联刚度 | 连杆变形、手指变形、垫片、舵盘花键的旷量以及物体,全部串联——合上钳口推一下,一次性测完整条链 |
| 一度的舵机分辨率 | 死区、齿轮背隙,以及自身量化可能更粗的 PWM 源。12 位 PCA9685 约 0.09° |
| 干净的 μ | 灰尘、湿草莓、油腻的螺栓。TPU 垫相对打印 PLA 大致能让 μ 翻倍 |
| 数据手册上的堵转扭矩 | 4.8 V 与 6 V 相比只有三分之一的扭矩,电池电量不足时还要更低 |
| 舵机能一直保持住 | 它会持续流过堵转电流并发热。给它一个占空比,或者加一个机械锁 |
| 物体在你以为的位置 | 并不在。这正是柔顺性同时为你买来位置公差和力公差的原因 |
光是实验 3 就值这二十分钟。每个做第一个夹爪的人,在东西打滑时都会下意识地去把手指加硬,而实验 3 就是在论证:刚度本来就是问题所在。
源代码
给夹爪选型只是四行算术,应该在打印任何东西之前先算一遍。
// --- what the servo can push with ---
const float TAU_STALL = 0.176f; // N·m, SG90 at 4.8 V — derate for 6 V, derate more when warm
const float DUTY = 0.70f; // what it can hold without cooking itself
const float LEVER_MM = 30.0f; // horn centre to the contact patch. MEASURE THIS.
float jawForceN() { return (TAU_STALL * DUTY) / (LEVER_MM / 1000.0f); }
// --- what the object demands ---
// F = m(g + a)·SF / (mu · n). `a` is the arm's peak acceleration, not zero.
float requiredN(float massKg, float mu, float peakAccel, float safety) {
return (massKg * (9.80665f + peakAccel) * safety) / (mu * 2.0f);
}
// --- the check nobody runs ---
// A servo step of one degree moves the jaws L·(pi/180). If the force window
// divided by the series stiffness is smaller than that, no command works.
bool aimable(float crushN, float slipN, float stiffnessNperMM) {
float windowMM = (min(crushN, jawForceN()) - slipN) / stiffnessNperMM;
float stepMM = LEVER_MM * (PI / 180.0f);
return windowMM > stepMM;
}
一旦算术告诉你设计可行,剩下的就是驱动本身。指令闭合位置,让柔顺量吃掉中间的差值——不要试图停在物体上:
const int OPEN_US = 1900;
const int CLOSED_US = 1300; // past contact, deliberately. The spring absorbs it.
void grip(bool closed) {
gripper.writeMicroseconds(closed ? CLOSED_US : OPEN_US);
delay(400); // it is a position loop with no feedback to you
}
这里没有力反馈,也不需要有,前提是窗口宽于一个步长。这就是柔顺性的全部论据,也正是为什么在大多数作品里,一根 40 便士的拉簧就足以替代称重传感器。当你确实想知道抓取是否成功时,最便宜的办法是在手指上加一个微动开关,而不是去做电流检测——抓取搬运状态机一文讲了这个检查该放在哪里。
硬件清单
元器件
- 一个已知堵转扭矩的业余舵机——取包装盒上的数字,并做降额
- 两根手指,以及一个你真正量过的力臂
- 一个串联的柔顺元件:泡沫垫、拉簧或打印柔性铰链
- 一种判断舵机已经到位的办法——如果你想知道抓取是否成功的话
探索关联图谱
哪里用到这个模拟器
以这个实验台为基础的项目、学习路线和教程。
继续搭建
下载资源
完成项目时可以参考本页上的这些资料。可下载的项目包只会在其源文件和版本发布之后才会添加。
常见问题
常见问题解答
机器人夹爪需要多大的夹持力?
使用标准的选型公式:F = m(g + a)·SF / (μ·n),其中 n 是接触点的数量(两指夹爪为 2),μ 是垫片处的摩擦系数,SF 是不小于 2 的安全系数,a 是机械臂施加的峰值加速度——它不为零。一颗 58 g 的鸡蛋夹在 μ 为 0.35 的橡胶垫之间、安全系数取 2 时,静止需要 1.63 N,而在 0.9 s 内提升 250 mm 的过程中需要 1.93 N。加速度项正是人们常常漏掉的那一项,这也是为什么一个在台架上测试通过的抓取,会在摆动时松手。把提升时间滑块设为 0.2 s,同样的抓取就需要 2.59 N。
为什么我的舵机夹爪总是把东西夹坏?
因为你指令的是位置,而物体在意的是力,两者之间由中间所有部件的刚度联系起来。用刚性打印手指时,这个刚度约为 25 N/mm,所以从草莓掉落到把它夹烂,整个窗口只有 0.108 mm 的钳口行程。SG90 在 30 mm 力臂上走一步,钳口就移动 0.524 mm——比窗口宽五倍。没有任何设置能奏效。串联一个柔软的元件,窗口就会按 1/k 张开:刚度为 0.35 N/mm 的打印柔性铰链能给出 7.7 mm 的窗口,以及十五个不同的舵机位置,每一个都能夹住草莓而不留下痕迹。
为什么我一使劲夹,物体反而从夹爪里蹦出去?
因为接触面的锥度超过了摩擦角,而夹得更紧并不能解决问题。两个点接触只有在连接它们的直线同时落在两个摩擦锥之内时才能保持住,对于夹持锥面物体的平行钳口,这一条可化简为 tan(锥度) < μ。法向力在这个不等式中被完全消去了。载入锥面预设:在 μ 为 0.45 时,摩擦锥为 ±24.2°,而接触面的锥度是 28°,所以物体在 0.40 N 的夹持力下被弹出,到了 4.11 N 时依然被弹出。把 μ 提高到 0.53 以上,它在任何力下都能保持住。解决办法有:增大摩擦,用 V 形槽或异形手指提供一个平行的接触面,或者增加第二条抓取轴线。
用堵转的舵机让夹爪保持闭合,会有问题吗?
会,而且这正是刚性夹爪的常态,这才是让人不安的地方。由于窗口比一个步长还窄,刚性夹爪永远落不进窗口——它会冲过头,然后卡在舵机自身的力上限上。这之所以能行,只是因为这个上限恰好低于物体的压碎力,于是舵机充当了一个你从未设计过的意外离合器。代价是舵机永远处于堵转状态:堵转扭矩的 70% 大约意味着 SG90 要持续流过 0.49 A 的电流,舵机就是这样烧坏的。而当物体比这个上限更脆弱时——纸杯 4 N、草莓 3 N——这个意外离合器就设得太高了,你会把零件毁掉。
手指力臂应该短还是长?
短力臂能同时换来力和分辨率,这一点常让人意外:在 12 mm 力臂上,SG90 能持续输出 10.3 N 的力,每步使钳口移动 0.209 mm;而在 60 mm 力臂上只有 2.05 N 和 1.047 mm。同一个舵机,力是五倍,分辨率也精细五倍。短力臂的代价是钳口行程,算法很简单,就是 L·θ:舵盘扫过 120° 时,12 mm 力臂只能让钳口张开 25 mm,60 mm 力臂则能张开 126 mm。所以力臂要按你需要捡起的最大物体来定,其余的一切都由这个选择决定。如果既要行程又要力,那正是连杆或齿条的用武之地。
真实的夹爪也是这样工作的吗?
力的算术是精确计算而不是模拟出来的——钳口力用 F = τ/L,需求用 F = m(g + a)·SF/(μ·n),力封闭用 tan(锥度) < μ,串联的一切用一个线性弹簧表示——提升加速度则来自运动曲线实验台所用的同一个 S 曲线规划器,所以它是一条真实的曲线,而不是猜测。它没有建模的是接触力学:真实的垫片不是线性弹簧,真实的压碎极限是作用在一块随挤压而增大的面积上的压强极限,而真实的物体是靠一片接触面而不是一个点夹住的。所以请把这些压碎力当作量级上的起点,再用厨房秤自己测量;要相信的是规律的形状,而不是小数点后第三位:窗口按 1/k 缩放、步长就是你撞上的那堵墙、锥度条件完全与力无关——这些都是精确的。
延伸阅读
参考资料
权威资料,帮助你越过本模拟器有限的教学模型,进一步深入学习。