做一台知道自己抓空了的抓取搬运机器人
一只机械臂:能从托盘里拣起零件、分拣进两个料盒,检测出空抓并重试,还会记录成功完成了多少个循环。
做的是什么
一只负责清空托盘的机械臂。零件根据你能辨认的某种特征——大小、颜色、来自哪个夹具——被送进两个料盒中的一个;机器在托盘清空或出故障之前一直无人值守地运行,出故障时它会停下来,并说明自己停在了哪个状态。
机器人本身不是有意思的部分。四自由度机械臂套件才四十英镑,运动学不过是一页三角函数。有意思的是,抓取搬运机器是按百分比来评判的,而从“视频里能跑”到“连着做了五十个”,是一个和“让它动起来”完全不同的工程问题。
两样带你过去,都在夹爪。
要紧的两个决策
1. 手指不能硬
这一点最出人意料,所以在你动手打印任何东西之前,值得先把它讲明白。
夹爪旋钮是位置——舵机角。物体极限是力:掉的下限,烂的上限。两者汇率舵盘到物体间一切串联刚度 k,实际瞄的窗口是
window (mm) = ( min(F_crush, F_servo) − F_slip ) / k
刚性打印手指的刚度大约是 25 N/mm。一只玩具级舵机在 30 mm 力臂上,指尖的分辨率约为 0.524 mm。拿一颗草莓代入这些数字,可用窗口是 0.108 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 |
舵盘手指间 40p 拉簧问题消失。用你自己的物体和你自己的力臂,先在实验台上完成选型,再去消耗打印耗材,舵机夹爪力、堵转与柔顺里有完整论证。
2. 必须有验证步
循环是接近、下降、抓取、验证、抬起、搬运、放置。没有验证状态,每一次失败都是无声的:夹爪合拢在空气上,机械臂把空气搬过整张桌子,然后在料盒上方张开,而计数器说它成功了。
在一根手指内侧装一个杠杆微动开关只要五便士和一个输入引脚,而它是整台机器中性价比最高的零件。在 300–400 ms 的停留时间之后读它——柔顺的手指在合拢之后会振铃,在振铃期间采样等于抛硬币——对连续三次读数做消抖,并给状态机加一个带有限次重试的 RECOVER 状态。状态机教程全套。
制作按序
- **定末端执行器。**零件扁平从上够得着,吸盘小泵先询价——打印啥都打不过。不然两指。夹爪类型与夹持力。
- **测量你的物体。**用厨房秤称质量,用同一台秤压碎几个可以牺牲的零件来测压碎力,用拉杆秤在垫料上拖动测 μ。这三个数字决定设计,而网上查到的数值对你的零件来说都是错的。
- **检查力封闭。**如果接触垫所在的那个面锥度超过
atan(μ),那么无论你把力加到多大都夹不住,需要改用 V 形槽或者换一个抓取点。摩擦与力封闭。 - **实验台夹爪选型。**最宽物体定力臂,窗口对舵机步查。夹爪模拟器。
- 打印夹爪柔性铰链或串联弹簧,TPU 垫,硬限位,微动开关。舵机夹爪。
- 五舵机正确接线。PCA9685 经 I²C,舵机独立轨,去耦。写固件前做,不然电源问题复位调一天。
- 写状态机,非阻塞,
VERIFY、RECOVER。抓取搬运状态机。 - 用运动曲线给加速度设上界,这样你算出来的夹持力才能在搬运过程中撑得住。
- 跑五十计数。
验收
五十次连续循环,无人值守,配一个计数器和一个记录每次故障发生在哪个状态上的故障日志。这才是交付物,而且它比一段视频的要求高得多。
| 结果 | 含义 |
|---|---|
| 高于 95% | 你已经有了一台机器。下一步是去感知位姿,而不是把它写死 |
| 80–95% | 通常是接近位姿有问题,或者验证之前的稳定时间不够 |
| 80% 下 | 一般电源,或夹持没算加速项 |
| 只有在运行后段才失败 | 舵机发热,或者接触垫变脏。两者都真实存在,而且都像幽灵一样难以捉摸 |
状态机教程失效表大多数症状对原因。
这项目不是什么
它不做视觉,也不绕开障碍。托盘在已知的位置,料盒在已知的位置,机械臂去它被指到的那个地方。这是有意为之——这个项目的要点在于抓取是一个独立的问题,而且比看上去更难,把两者混为一谈,正是最初那些抓取搬运项目做不下去的原因。
当你希望机械臂自己找到零件、而不是被告知它在哪里时,那就是相机标定与标记位姿,而且它是叠加在一个已经能工作的抓取循环之上的,不是用来替换它的。
项目路线图
搭建路径
沿着技术树,从零件一路走到一台能正常工作的机器人。每个节点在其前置条件完成后解锁,你的进度会保存在这台设备上。
已完成 0 / 21
元器件
本路径中的教程
- 入门 · 阅读约 30 分钟机器人夹爪类型,以及如何确定夹持力先选定夹爪类型,再把人人都会忘记的那一项——加速度——算进去,确定所需的夹持力。
- 中级 · 25 分钟摩擦、力封闭,以及为什么两点接触是一场赌博为什么无论夹得多紧,物体还是会被挤飞出去,以及摩擦锥到底说明了什么。
- 中级 · 30 分钟舵机夹爪的夹持力、堵转,以及为什么柔顺更胜一筹你拧的旋钮是位置,两堵墙是力,而刚度就是二者之间的汇率。
- 中级 · 阅读约 35 分钟一个经得起失败的拾取与放置状态机接近、抓取、验证、抬起、放置——以及当验证结果为否时该怎么办。
- 高级 · 阅读约 22 分钟二连杆机器人手臂的逆运动学求解二连杆臂为什么有两组解,它能到达哪里、到不了哪里,以及奇异点到底是什么。
- 中级 · 阅读约 18 分钟用 PCA9685(I²C PWM 驱动器)驱动舵机设定频率,把角度换算成脉冲宽度,只用两个 I²C 引脚驱动十六个舵机——并做好安全供电与标定。
- 中级 · 40 分钟运动曲线规划:梯形与 S 形加减速给运动加上斜坡,而不是直接下指令——梯形曲线、jerk 限制,以及 S 形曲线真正的代价。
- 入门 · 阅读约 17 分钟用有限状态机(FSM)实现机器人行为用显式的状态、事件、状态迁移、超时和恢复机制,取代纠缠不清的机器人条件判断。
- 入门 · 30 分钟为什么电机一启动,机器人就复位看起来像代码 bug 的复位,几乎总是电池的问题。先做电流预算,再测量电压跌落。
- 入门 · 30 分钟为什么 delay() 会让机器人失灵:用 millis() 计时卡在 delay() 里的机器人什么也看不见。用 millis() 取代它,并把计数回绕时的比较写对。
接线之前先练习
用在线模拟器把它调好
搭建路径会经过一个浏览器实验台。先在这里把行为调对,再把参数迁移到真实的机器人上。
常见问题解答
抓取搬运制作最难的部分是什么?
不是机械臂,也不是运动学——而是夹爪指令的是位置,物体在意的却是力。用刚性的打印手指,从掉落零件到压碎零件之间的可用窗口大约只有十分之一毫米,而业余舵机走一步,夹爪就移动大约半毫米。没有任何一条指令能落在这个窗口里。解决办法是串联一根弹簧或一个柔性铰链,它会按 1/k 的比例把窗口放大,而这正是决定整个项目成败的那个决策。打印任何东西之前,先在夹爪模拟器里完成选型。
为什么我的机械臂一动就把零件掉了?
因为你是按重量来确定夹持力的,而运动需要更大的力。所需夹持力是 m(g + a)·SF/(μ·n),在动作利落的机械臂上,加速度项比重力还大。一个静止时用 1.63 N 就能夹住 58 g 物体的抓取,在 0.9 s 内完成 250 mm 的抬升时需要 1.93 N,如果在 0.35 s 内完成则需要 2.59 N——而且它会在运动开始后大约 40 ms 就松脱,那时机械臂还没有明显移动,这就是为什么它看起来像是夹爪失灵,而不像是算术问题。用运动曲线给加速度设上界,或者夹得更紧;通常运动曲线是更便宜的解决办法。
怎么知道夹爪是否真的抓起了东西?
在一根手指的内侧面装一个杠杆微动开关,接到一个带上拉的输入引脚上。大约五十便士、一根线,而且它给出的是直接的数字答案。把它装在手指的柔顺部分上,让它在一个可重复的力下触发;在软件里对它消抖(连续三次读数,而不是一次);并在 300–400 ms 的停留之后再读取,这样你就不会在手指振铃时采样。电流检测也可以用,而且还能额外发现压碎,但它需要一个标定过的阈值,并且会随着电池电压下垂而漂移。
这个项目需要逆运动学吗?
严格来说不需要——你可以手动示教位姿并存下关节角,对于固定的托盘和两个固定的料盒,这确实就够了。一旦你想要直线式的接近和退回,就需要逆运动学,因为这些是笛卡尔空间的运动,手动示教的关节角给不了你直线。由于从斜向扑向零件会把它碰倒,沿曲线抬起又会拖着它走,大多数制作最后都会想要直线段,而这就意味着要用逆运动学。
需要几只舵机,多大的电源?
五只:底座、肩、肘、腕和夹爪。这个通道数已经超出了 Uno 自己计时的合理范围,所以要通过 I²C 使用 PCA9685。电源是人们最容易低估的部分——五只业余舵机同时运动会拉出好几安培的浪涌电流,而板载的 5 V 稳压器会欠压,让控制器在抓取中途复位。给舵机单独供电并共地,再在驱动板附近并几百微法的电容。
做到什么程度才算完成?
配着计数器和故障日志,无人值守地连续完成五十个循环。这个目标比一段成功抓取一次的视频要好得多,因为它会逼着你做出验证步、有限次重试和一个不会下垂的电源——而这恰恰是区分演示品和机器的三样东西。低于 95% 时总有一个具体的原因,而日志会告诉你它是在哪个状态失败的。