教程 · 中级 · 25 分钟
在边缘处停车:响应延迟与制动距离
悬崖传感器只能为你争取固定的几毫米。它们花在哪:一部分是耗在延迟上的反应距离,另一部分是地面收取的制动距离。
预算是毫米,不是毫秒
一台带朝下传感器的机器人只得到一条信息——白,现在——以及一段固定的距离让它据此动作。一台迷你相扑的场地给 25 mm 的边界。桌边给你传感器前装偏移恰好是多少。反正是一个距离,而机器人花掉它的方式有两种非常不同的方式:
overshoot = v × t_latency + v² / (2a)
第一项在任何刹车开始之前就已经付清了。第二项是地面在刹车开始之后收的账。
随着速度上升,它们的行为完全不同,而知道自己正在付的是哪一项,就是“一个下午修好”和“白重写一遍控制环”之间的区别。
延迟到底花在哪里
“延迟”不是传感器。它是从光子变化到轮胎朝另一个方向出力之间的所有环节,而它几乎总是被一个没人测过的项主导:
| 阶段 | 典型 |
|---|---|
| 红外发射管与光敏三极管稳定 | 约 1 ms |
| 等待循环的下一遍 | 最多 20 ms |
| 决策与 PWM 写入 | <1 ms |
| 电机电流真正反转 | 约 3 ms |
| 转矩到达轮子前先跨过减速箱背隙 | 约 1 ms |
| 合计最坏 | 约 25 ms |
循环周期占了其中五分之四,而它是唯一一行你能白赚的。
**一颗你以 50 Hz 读取的传感器,就是一颗你每次都无视它 20 ms 的传感器。**常见原因不是处理器慢——是阻塞调用。超声波传感器上一次 pulseIn() 就是最长 30 ms 的彻底失明,而舵机的一个 delay(20) 是同一件事换个写法。在一个非阻塞循环里每一遍都读那颗边缘传感器不花任何代价,却能砍掉大部分反应距离。
最后一行是最让人意外的那一行。反转电机并不会反转轮子,直到齿轮越过它们的空行程,所以减速箱背隙在最糟糕的时刻变成了免费行程:32 mm 轮子上 4° 的输出空行程,就是在任何刹车转矩到来之前 1.1 mm 的滑行。
刹车是摩擦问题,不是电机问题
第二项看起来应该取决于电机有多强。它并不。
那些能输出 25 N 推力的同一批电机,能以 50 m/s² 减速一台 500 g 的机器人。而地面只允许 µg——硅胶上 11.8 m/s²,硬塑料上 6.9 m/s²。传动拥有四倍于它被允许使用的权限,所以停车距离完全由轮胎定下,而更大的电机一点都缩不了它。
这就是下面那一栏有两条曲线而不是一条的原因。在 25 ms 延迟下,从塑料换成硅胶把安全速度从 0.79 提到 0.98 m/s——24% 的提升,而这个零件还同时多给了你 72% 的推力。
有一处诚实的修正:拖着一台静止的机器人量到的 µ 是静摩擦系数,而一次硬反转会让轮子打滑,于是你落到动摩擦系数上——通常低 10–20%。把算出来的速度当成乐观上界,按它的 80% 跑。
哪一项占主导,以及因此该修什么
把两项设成相等,交点很干净:
v × t = v² / 2a → v = 2at
25 ms、µ 1.2 时是 0.59 m/s。
- **在它之下,你受延迟限制。**把循环周期减半买到的东西比任何轮胎都多。搜索型机器人都活在这个区间,这也是好消息:修法是一个软件改动。
- **在它之上,你受附着力限制。**附着力和质量分布比循环频率重要得多,而过了某个点,唯一的答案就是慢下来。
大多数从东西上掉下去的机器人都在第一个区间,却被当成第二个区间在整定。
多给自己几毫米
预算不是固定的。它等于边界宽度加上传感器装在轮子前面的距离,而第二项是一个免费的设计变量:
budget = border + sensor lead
一颗装在驱动轴前方 40 mm 的传感器,把 25 mm 的边界变成 65 mm 的停车空间,那就是 0.60 m/s 和 0.98 m/s 之间的差别。如果你有目标速度,就反着解:
budget = v·t + v²/(2a)
前装距离有几个实际限制:
- **它必须看得见边界,而不是边界外面的场地。**装得太靠前,它就在机器人还安全的时候看着线外面,那只会白白损失速度。
- **装低,并给它加罩。**一颗 3 mm 高的红外反射传感器读的是表面;15 mm 高时它读的是表面加上房间的灯光。这和循迹车面临的阈值与标定问题是同一个,而失效模式糟糕得多。
- **在前角各放一颗。**一颗居中的传感器告诉你边缘在前方某处。两颗告诉你该朝哪边转开,而且不增加任何延迟。
- **别忘了后面。**一台被推着往后走的机器人是朝着错误方向越过边界的,而前传感器永远看不到。
先倒车,再转弯
在固定预算之下,操作顺序比整定更重要。
**立刻全速倒车。**不要滑行——滑行的机器人只靠滚动阻力减速,那只是 µg 的一个小零头,超出量大约会变成三倍。也不要温柔地刹车:这是唯一一个运动曲线属于错误直觉的时刻,因为这里的约束是距离而不是平顺。
**停下之后再转。**还在往前移动时转弯,会把你的直线问题变成一段圆弧,而它把机器人的一个角甩得比中心更远。先停下,再重新定向——并且记住原地转向这全程都在横向刮擦轮胎。
**把检测锁存。**一个白样本就够了。等两次连续读数确认它,会让你的最坏反应距离翻倍,而它防掉的那个误报,代价远比摔下去便宜。
自己量你的延迟
表里那个数是起始估计。你自己的大约十五分钟就能量出来。
**从里面量。**在传感器越过阈值时记一次 micros(),在写反向 PWM 的那一行再记一次。这抓到软件那一半,也就是你能修的那一半。打印一百次检测里见到的最坏值,而不是平均值——最坏情况才是决定机器人会不会掉下去的那个。
**从外面量。**用手机以 240 fps 拍下来。数传感器越过线和轮子明显反转之间的帧数;每帧 4.2 ms。这能抓到软件看不见的电气和机械延迟,也是确认总延迟的唯一办法。
**端到端。**以已知速度朝一条胶带线开过去,量机器人停在它前面多远。减掉算出来的刹车距离 v²/2a,剩下的就是 v × t——总延迟,用一把尺子量出来的。
最后一种只花五分钟,而且值得在任何整定之前做,因为它告诉你那两项里你实际在付哪一项。
出问题时
| 现象 | 通常原因 |
|---|---|
| 慢速可靠停住、速度一快就掉 | 这是设计如此——你超出了预算允许的速度 |
| 每次都超出同一个量 | 延迟;端到端量出来,缩短循环 |
| 超出量忽大忽小 | 某处有阻塞调用——循环周期不是你以为的那个 |
| 看线看得晚 | 传感器装得太高或太后,或者阈值是照另一个房间设的 |
| 报出并不存在的边界 | 地面反光或有环境红外;给传感器加罩并重新标定 |
| 及时停住了却又开出去 | 转开那一步发生在还在移动时;先完全停下 |
| 往后掉下去 | 没有后方传感器 |
同一套算术也覆盖桌边机器人、躲楼梯的吸尘器和障碍停车——变的只是预算。避障模拟器暴露的正是这套停车距离几何,只是把朝下传感器换成前视的;而迷你相扑项目是它必须对一个试图让你失败的对手起作用的场合。
探索关联图谱
本教程所属的搭建
包含本教程的项目和学习路线。
延伸阅读