迟到六拍:车已经越线,控制器还在催它往前
把一次振荡暂停在 0.7 秒:一条轨道画真实位置,一条画收到的消息。沿这一个瞬间,找到“更用力”为什么可能更糟。
淋浴的水还凉,你把热水开大。没等那一截热水走到身边,又拧大一点。几秒后,前面几次“再热一点”一起到达,水温越过了舒服的范围。
动作在回应消息,消息却属于过去。这里先不摆满一页控制参数;只暂停在一个瞬间,看看两份位置怎样对不上。
0.7 秒,发生了哪件不对劲的事
小车的目标在 1 米处,每 0.1 秒算一次动作。下面默认停在第 7 拍:实心点是车实际的位置,空心点是控制器收到的位置。两条轨道使用同一个米制刻度,虚线是目标。
这里没有播放按钮,也没有必须完成的任务条。先拖一拍,看看谁走了,谁还留在过去。若图像不方便阅读,下方的文字始终给出同一份数值,滑块也支持方向键。
把这一拍摊成一张小票
默认设置是 K=4 /s、延迟六拍、无噪声。第 7 拍的记录可以直接读成:
| 小票上的量 | 此刻的值 | 它属于什么时间 |
|---|---|---|
| 车实际在哪 | 1.050 m | 第 7 拍,0.7 s |
| 控制器收到的位置 | 0.150 m | 第 1 拍,0.1 s |
| 算出的误差 | 1 − 0.15 = 0.850 m | 根据旧消息 |
| 速度请求 | 4 × 0.85 = 3.400 m/s | 此刻发出 |
| 限幅后的速度 | +1.500 m/s | 实际使用的命令 |
| 下一拍位置 | 1.05 + 0.1 × 1.5 = 1.200 m | 第 8 拍 |
车已经越过目标五厘米,收到的消息却说还差八十五厘米。于是它还在向前推。消息的数值可以正确,发生时间却不适合这次决定。
把“晚六拍”换成“消息及时”,仍看第 7 拍。此时位置约是 0.910 m,速度命令是 +0.360 m/s。两次轨迹不同,是因为此前的每个动作也受到了不同的消息;不是只在这一拍把一份测量换掉。
再往后拖,方向为什么会翻过来
迟到的“已经过头”终于抵达时,命令开始往回。可小车又走了一段,回头的命令仍在执行过去的误差。
- 还没到。 旧消息说距离很远,命令持续向前。
- 已经越线。 现实先改变,测量通道还没把它告诉控制器。
- 终于知道越线。 命令转向,却可能已经回应得太晚。
这个顺序足以生出一次来回追赶。要认出它,往往不必先看整条漂亮曲线,而要保留测量的时间来源。
展开两个参数,只改变 K,再回到这几拍检查。较大的 K 会把旧误差执行得更坚决,但输出仍被限制在 ±1.5 m/s;不能把这个模型的振荡直接写成“位置无限发散”。
公式只是在重写刚才的小票
目标是 ,每拍 ,延迟为 拍。无噪声时收到的位置是:
开跑前没有更早历史,所以用初始位置补齐。接着算速度,再推进位置:
K 的单位是每秒,输出是速度。文中“用力”只是比喻,模型没有质量、惯性、摩擦和电机动态,也没有连接硬件。
无延迟时,为什么靠近以后会收小步子?
暂时不触碰限幅,记误差为 。无延迟时:
本例 K=4、每拍 0.1 秒,误差乘数是 0.6。误差变小,速度请求也跟着变小。这个递推针对无延迟、未限幅的简化情形;加入延迟后,不能继续用同一条乘数解释整套系统。
看到来回摆动以后,先补哪条记录
先补收到的测量属于哪一拍,再对齐命令发出与动作执行的时刻。接着才判断,是增益、执行限制、噪声还是模型里缺少的动态在主导当前现象。
降低 K 可以减少这份模型里对旧消息的过激响应,也可能让到达变慢。滤波能减少某些噪声,同时可能增加延迟。多加一个模块前,先写下它准备解决哪一条已观察到的问题。
想继续放开参数时
完整实验台保留了曲线对照、噪声、反馈开关与 CSV 导出。它适合继续比较条件;本文先用两个位置,把迟到这一件事讲完整。
计算来源是 model.js,无第三方依赖。放大镜与原实验台使用同一个计算模型;显示到第 119 拍,下一步恰好到 12.0 s。模型的有限轨迹不是稳定性证明,也不代表某个参数能直接移植到机器人。
控制理论的后续入口是 Åström 与 Murray 的开放教材 Feedback Systems。换一种判断练习,则可以读坐标案卷:那里要问的,是消息虽然到得及时,却有没有用错方向。