教程 · 中级 · 25 分钟

在边缘处停车:响应延迟与制动距离

悬崖传感器只能为你争取固定的几毫米。它们花在哪:一部分是耗在延迟上的反应距离,另一部分是地面收取的制动距离。

预算是毫米,不是毫秒

一台带朝下传感器的机器人只得到一条信息——白,现在——以及一段固定的距离让它据此动作。一台迷你相扑的场地给 25 mm 的边界。桌边给你传感器前装偏移恰好是多少。反正是一个距离,而机器人花掉它的方式有两种非常不同的方式:

overshoot = v × t_latency  +  v² / (2a)

第一项在任何刹车开始之前就已经付清了。第二项是地面在刹车开始之后收的账。

随着速度上升,它们的行为完全不同,而知道自己正在付的是哪一项,就是“一个下午修好”和“白重写一遍控制环”之间的区别。

上下两幅堆叠图。上面一幅是越过线的超出量(毫米)对速度的曲线,画成两段堆叠的填充带:下面一条琥珀色带是反应距离,线性增长;上面一条青色带是刹车距离,按平方增长。水平虚线标出仅边界的 25 毫米,以及含前装 40 毫米传感器的 65 毫米,并有一个箭头标出总曲线越过 65 毫米处的 0.98 米每秒。下面一幅是总感知到刹车延迟从零升到 60 毫秒过程中,最快安全速度的下降,分别给出摩擦系数 1.2 的硅胶胎和摩擦系数 0.7 的塑料轮。
上:延迟 25 ms、µ 1.2 时,一台跑 1 m/s 的机器人会越过线67 mm——25 mm 反应、42 mm 刹车。两条带在 0.59 m/s 处相等;在那之上刹车占主导。下:25 ms 时,硅胶能换到 0.98 m/s,硬塑料只有 0.79 m/s。 下载 SVG

延迟到底花在哪里

“延迟”不是传感器。它是从光子变化到轮胎朝另一个方向出力之间的所有环节,而它几乎总是被一个没人测过的项主导:

阶段 典型
红外发射管与光敏三极管稳定 约 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——总延迟,用一把尺子量出来的。

最后一种只花五分钟,而且值得在任何整定之前做,因为它告诉你那两项里你实际在付哪一项。

出问题时

现象 通常原因
慢速可靠停住、速度一快就掉 这是设计如此——你超出了预算允许的速度
每次都超出同一个量 延迟;端到端量出来,缩短循环
超出量忽大忽小 某处有阻塞调用——循环周期不是你以为的那个
看线看得晚 传感器装得太高或太后,或者阈值是照另一个房间设的
报出并不存在的边界 地面反光或有环境红外;给传感器加罩并重新标定
及时停住了却又开出去 转开那一步发生在还在移动时;先完全停下
往后掉下去 没有后方传感器

同一套算术也覆盖桌边机器人、躲楼梯的吸尘器和障碍停车——变的只是预算。避障模拟器暴露的正是这套停车距离几何,只是把朝下传感器换成前视的;而迷你相扑项目是它必须对一个试图让你失败的对手起作用的场合。

探索关联图谱

本教程所属的搭建

包含本教程的项目和学习路线。

延伸阅读

参考资料