做一台迷你相扑机器人:抓地、铲子与边缘感知
一台迷你相扑机器人:能搜索对手、把对手推出场地,并在白边处自己停住,而不是一头冲出场外。
做的是什么
两车一场,除彼此和地面传感器啥都不指。最后还在里面赢。
这是本站最简单的目标,但它并不像看上去那么容易,因为相扑是唯一一台机械结构决定胜负、而代码只需要别把这优势丢掉的机器人。其它每一个项目都奖励更好的算法;这一个奖励一个更锋利的铲子。
这种颠倒值得体验一次。它也是下面这个制作顺序第一天全花在算术上、最后一天才谈行为的原因,而这与大多数人的开局正好相反。
定胜负的三个数
**推力 5.9 N,电机能 25 N。**500 g 车硅胶胎摩擦限四倍。传动永远不是约束,顶格重量全压驱动轮,电机预算买减速比不买功率。
**一个能把对手抬起 40% 的铲子,能给你 2.3 倍于对手的推力。**你从对手身上卸下的重量落到了自己身上,所以这个比值是 (1+f)/(1−f),而且它上升得很陡。没有任何其它单一改动能接近这个效果。
**你能跑到大约 0.8 m/s。**不是因为电机不够用,而是因为25 mm 白边加上 25 ms 延迟就是全部的刹车空间了。大多数第一台机器人都按两倍的速度来做减速比,结果输在边界上,而不是输给对手。
三句整设计。下面怎么到。
物料单
迷你相扑有正式的级别规定:启动时占地 10 × 10 cm,限重 500 g,在一个 77 cm 的场地里对战,带 2.5 cm 宽的白边。规则直接塑造了物料清单。
| 零件 | 数量 | 约价 | 说明 |
|---|---|---|---|
| Arduino Uno 或 Nano | 1 | $5 | Nano 10 cm 占地舒服得多 |
| 红外反射传感器 | 2–4 | $5 | **边缘检测。**前角最少各一 |
| VL53L0X | 2–3 | $10–15 | 对手检测。场里窄波束胜声呐 |
| N20 编码器电机 | 2 | $16 | 大扭矩减速比——1:100 或更慢。速度不是目标 |
| TB6612FNG | 1 | $3 | |
| 带钢铲的底盘 | 1 | $10–25 | 铲子就是武器;而钢本身也是压舱配重 |
| 电池包 | 1 | $10 | 也是有用 mass——压驱动轮 |
| 硅胶或高抓地轮胎 | 2 | $5 | 这张清单里性价比最高的升级 |
合计约 $65–90。
有两点不是“能跑就行”,而是直接决定胜负的。
**重量压驱动轮,顶格。**推力是摩擦,摩擦系数乘正压力。驱动胎上每克外浪费,相扑车精确 500 g 跑,几乎全压两轮。
**轮胎比电机重要。**一台已经达到附着力极限的机器人,再加大扭矩也没有意义——轮子只会打滑。从硬塑料(μ 约 0.4)换成硅胶(μ 1.2 或更高),花五块钱就能把可用的推力提高到大约三倍,这是任何电机升级都比不了的。
制作顺序
**1——先定质量和轮胎。**在还没有一行代码的时候,它们就已经决定了你的推力。目标瞄 500 g 上限,质量尽量低并且压在驱动轮上方;用硅胶或软聚氨酯轮胎,不要用底盘套件自带的那套。μ 1.2 对 μ 0.7 意味着多 72% 的推力,而代价只是一副轮子的钱。
**2——按扭矩选减速比,并检查堵转电流。**相扑机器人工作在电机曲线的扭矩端,轮速大约 0.8 m/s,而不是底盘套件假设的 1.5。然后算出两台电机堵转时吃多少电流——大约 3 A——并按这个值给电池包做预算,而不是按巡航电流。整整一回合就是一次持续的堵转。
**3——让它独自在场地里能在白边处停住。**这就是那个里程碑。在两个前角装上反射传感器,尽可能靠前,只要还能看见白线就行,并且要按真实场地标定,而不是按你的书桌标定。朝着白边全速冲五十遍,从各个角度都试。在这变得无聊而可靠之前,根本不用谈加入对手——一台自己开出场地的机器人,不被推也会输。
**4——每次主循环都读边缘传感器。**你反应距离里有五分之四是在等下一次循环迭代,而一次阻塞式的测距读取,恰好在最不该失明的时刻造成 20 ms 的盲区。非阻塞计时是最便宜的提速手段。
5——对手感知加。VL53L0X 朝前,可选两外八字 45°。窄波束要紧:场里超声波大都找场。
**6——把行为写成显式的状态。**搜索、冲锋、推挤、撤退,同时让边缘反射抢占它们全部。这是有限状态机的一个教科书式案例,因为边缘检查必须在每个状态里都运行,而且代码里不能有任何一条绕过它的路径。
**7——最后再做铲子,而且永远迭代它。**它是杠杆率最高的部分,同时也是最容易改动的部分。
行为,一段话
从一个强制延迟开始——大多数规则要求五秒。然后搜索:原地旋转,或者走一小段弧线,直到前方传感器报告约 40 cm 内有东西。冲锋:全功率直冲过去。推挤:一直推,直到测距距离变大(说明对手动了)或者你检测到了边界。撤退:任何边缘检测都要触发——先全速倒车,停稳,再转回场地中心。撤退的优先级高于其它一切,在任何状态下、任何时刻都成立。
微妙之处在于,从前方传感器看,“正在推”和“被卡住”长得一模一样。如果你有编码器,那么满指令下轮速为零就意味着堵转,而这就是你后撤、换个角度重新接近的信号,而不是一直磨到电池耗尽。
真正要紧的硬件注意事项
**铲尖决定胜负。**薄钢片或铝片磨出刃口,用一个刚性支撑把它撑在离地零点几毫米的高度。如果装在柔性支架上,它会从对手身上翘过去而不是钻到下面,这会让整个重量转移计算的符号反过来。
**前沿低。**对手铲前沿上推力,掀多少看重心高出多少。高车推不赢的车掀。
**能不用万向轮就不用。**压在自由滚动轮子上的重量不产生任何牵引力。两个驱动轮加一个低摩擦的滑块——一个 PTFE 按钮或一颗圆头螺丝——能让几乎全部的质量都干上活。
**保护好走线。**这是本站唯一一台会被蓄意撞击的机器人。露在外面的东西都会挨撞;插在接插件上的东西都会松脱。
**用金属减速箱。**在一台正常工作状态就是堵转的机器人上,塑料齿轮会崩齿;而在比赛中途减速箱崩掉,和电池没电看起来毫无区别。
做好长什么样
| 测量 | 典型 | 竞技 |
|---|---|---|
| 质量 | 400–500 g | 499 g——正好卡在极限 |
| 驱动轮载荷比 | 70% | 90% 起 |
| 轮胎摩擦系数 | 0.6–0.8(橡胶) | 1.2–1.5(硅胶) |
| 推力 | 2.5–4 N | 6–7 N |
| 边缘检测反应时间 | 60–100 ms | 30 ms 以下 |
| 全速停车距离 | 8–15 cm | 5 cm 以下 |
| 对手检测距离 | 30–40 cm | 60–80 cm |
边缘反应时间是决定胜负的那个数,它的影响比推力更大。场地的白边宽 2.5 cm。一台以 0.5 m/s 行进的车跨过这条白边只要 50 ms——所以 100 ms 的反应时间意味着,机器人还没决定完要停,就已经出场了。
这份预算可以拆成传感器读取时间、主循环周期和刹车距离。三者都是可以攻的:边缘传感器的轮询频率要比其它部分高得多,控制循环要尽量紧凑,并且要刹车而不是滑行——通过 H 桥把电机短路掉的停车效果比单纯断电要强得多。
附着力天花板算术说。500 g 两驱动轮硅胶胎 μ = 1.4:
maximum pushing force = 0.5 kg x 9.81 x 1.4 = 6.9 N
之外轮子空转不管电机扭矩——相扑车附着问题穿电机问题衣服。
坏了看哪
| 现象 | 一般 |
|---|---|
| 自己开出了场地 | 速度超出了白边预算,或者边缘传感器轮询得太慢 |
| 轮子转,车不动 | 附着力到顶了,这是设计如此——加质量或换轮胎 |
| 输给一台性能相当的机器人 | 对方的铲子插到了你的下面;这是离地间隙问题,不是功率问题 |
| 推挤中途复位 | 堵转电流让电源轨下垂——按堵转做预算 |
| 不存在白边却看见了白边 | 环境红外或者场地反光;给传感器加遮罩并重新标定 |
| 追着场地墙壁跑而不追对手 | 波束太宽——这正是飞行时间传感器能解决的问题 |
| 倒着掉了出去 | 后面没有边缘传感器 |
| 在线上停了,却又开了出去 | 还没停稳就开始转弯;先完全停住 |
这八条里有六条是机械或传感故障,微型迷宫鼠呈现的是同样的分布、同样的原因:算法只是小头。
如果你只想要传感和刹车几何、而不想要机械上的军备竞赛,避障模拟器会用同样的停车距离算术配一个前向传感器来跑,而避障机器人是更温和的版本,硬件大部分相同。至于这一切底下的传动理论,电机控制路线从选型开始,到里程计结束。
项目路线图
搭建路径
沿着技术树,从零件一路走到一台能正常工作的机器人。每个节点在其前置条件完成后解锁,你的进度会保存在这台设备上。
已完成 0 / 18
元器件
- 控制器Arduino Uno对新手失误很宽容的 8 位开发板,大多数人正是通过它认识机器人的。
- 传感器红外反射传感器阵列一排红外“眼睛”,告诉机器人那条线在哪里。
- 传感器VL53L0X ToF 激光测距传感器激光飞行时间测距——在声呐太粗糙的地方,给出一束又窄又精确到毫米的光。
- 执行器N20 编码器减速电机带金属减速箱的微型电机,尾部装有编码器,让机器人知道自己实际走了多远。
- 驱动器TB6612FNG 电机驱动板MOSFET 构成的 H 桥,把你花钱买来的电压真正留给电机。
- 底盘两轮驱动机器人底盘一块甲板:两个电机、一个自由万向轮和你的全部电子元件都固定在它上面。
- 电源机器人电池与电源包能正常运行的机器人和不停复位的机器人,差别就在它身上。
本路径中的教程
- 中级 · 25 分钟机器人能推多大力:取决于附着力与自重推力由两个天花板决定,而对小型机器人来说,地面几乎总是更低的那一个。
- 中级 · 25 分钟在边缘处停车:响应延迟与制动距离机器人看到边线后还会冲出多远,以及能让它及时停下的速度是多少。
- 入门 · 阅读约 17 分钟用有限状态机(FSM)实现机器人行为用显式的状态、事件、状态迁移、超时和恢复机制,取代纠缠不清的机器人条件判断。
- 入门 · 20 分钟读取用于循迹的红外反射传感器阵列把一排红外传感器的读数变成一个平滑的线位置,用它来控制转向。
- 中级 · 35 分钟如何选择直流减速电机:扭矩、转速与堵转算出机器人真正需要的扭矩和转速,再拿这些实际数字去对照数据手册。
常见问题解答
什么是迷你相扑?
一种机器人格斗级别:两台自主机器人在圆形场地里设法把对方推出去,不允许使用武器,也不允许造成接触损伤。迷你相扑把机器人限制在 500 克以内、占地 10 × 10 厘米,高度不限;场地是一块直径 77 厘米的黑色圆盘,边缘涂有 25 毫米宽的白边。一台机器人的车身碰到场外地面时回合即告结束,而这种情况更多是它自己开出了边缘,而不是被对手推出去。
既然重的机器人推得更狠,为什么还要限重?
限重正是为了这一点。小型机器人的推力受摩擦限制——它等于摩擦系数乘以驱动轮上承担的重量,而这个数只有电机所能提供的四分之一左右。限制质量就限制了推力,这样这个级别就不会变成比谁买的电机更大。这也意味着每一台参赛机器人都应该做到限重上限,因为在规则之内,质量就是资源,少 100 克就等于让出 20% 的推力。
电机上需要装编码器吗?
第一台机器人不需要。相扑没有里程计的需求——机器人不需要知道自己在场地上的哪个位置,只需要知道自己是不是快要出界。编码器以后会派上用场:用来判断你是顶着对手堵转了,还是在自由行驶,这确实是两种不同的状态,你的行为代码也会想知道。先不装,等状态机需要这个信息时再加上。
找对手用超声波还是飞行时间传感器?
在场地里,用飞行时间传感器。超声波波束会扩散约 15 度,并且会被地面和附近任何表面反射,所以正在搜索的机器人会找到墙、桌子和自己场地的边。VL53L0X 的探测锥很窄,大约 20 毫秒完成一次读取,而且没有声学干扰。经典的替代方案是一对向外斜装的短距模拟红外传感器,它们便宜又快,但看见深色对手要比看见浅色对手晚得多。
机器人到底应该开多快?
比你想要的慢。在 25 毫秒感知到刹车延迟、硅胶轮胎的条件下,边缘传感器位于轮轴前方 40 毫米的机器人,最快大约能跑到每秒 0.98 米,再快就无法在白边内停住——而且急速反转会让车轮打滑,落到更低的动摩擦系数上,所以每秒 0.8 米左右才是实在的数字。大多数第一台机器人都按每秒一米半来设计,结果每一回合都输给了边界,而不是输给对手。
为什么我的机器人会输给一台看起来一模一样的机器人?
几乎总是因为前沿。质量相同、抓地力相同的两台机器人推力相当,直到其中一台插到另一台底下;把对手 40% 的重量抬起来,你的推力就会变成对方的 2.3 倍——因为你抬起的重量既加到了你的牵引力上,又从对方的牵引力里扣掉了。这个效果比你能做的任何电机、轮胎或电池改动都大,而它取决于铲尖处零点几毫米的离地间隙。