两台 AGV 在一条 2.6 米宽的通道里迎面相遇,各自停了十秒,谁也不退,最后是现场人员手动遥控挪开了一台。车没坏,导航没丢,电池也有电,问题出在一条更底层的地方:这条通道,从来没有定过"谁先走"。这种 AGV 调度死锁,是多车混跑仓库里最常见、却最少被认真讨论的故障类型——它不属于硬件故障,不属于导航故障,它属于系统设计里没人愿意认领的灰色地带。

从研究的角度看,AGV 调度死锁的本质和计算机科学里经典的"死锁"几乎同构。1971 年 Coffman 提出的死锁四个必要条件——互斥、占有并等待、不可剥夺、循环等待——放在仓库里逐条对照:通道一次只能过一台车是互斥,每台车都抱着自己已占的路段不放是占有并等待,没有外部力量能强制挪走一台车是不可剥夺,几台车在路口互相等对方先动就是循环等待。四个条件同时成立,系统就僵住了。理解这一点很重要,因为它意味着死锁不是"运气不好",而是可预测、可建模、可预防的系统行为。

死锁是怎么发生的:AGV 调度死锁的三种典型场景

第一种场景是窄通道迎面相遇。2024 年,我在一家长三角汽车零部件厂的车间里看到这一幕:三十多台背负式 AGV 负责车间内的料车配送,其中一条连接两个工位的主通道只有 2.8 米宽,没有设单行道。早班换班时段配送任务集中,两台满载料车的 AGV 在通道中段迎面相遇,各自触发避障停车,然后各自等待对方让行。调度系统当时只有"停车避让"逻辑,没有更进一步的解死锁策略,两台车就这么对峙了将近四分钟,直到班组长介入。类似的通道在该车间有六条,意味着这不是孤立事件,而是一个结构性隐患。

第二种场景是十字路口的循环等待。这是更隐蔽的一种。某电商大促仓里,四台搬运 AGV 在同一时刻从四个方向进入一个十字路口,每台车的右手边都恰好被另一台车挡住——A 等 B,B 等 C,C 等 D,D 等 A,完美的循环等待。单看每台车的决策都是"合理"的:避障停车、等待对方先行。但从系统视角看,这是一个稳定的僵持态,不会有任何一台车自己打破它。这类场景在车队规模超过二十台、路口密度高的仓里,会从"小概率事件"变成"每周都会发生几次"的日常运维问题。

第三种场景发生在充电区,我把它叫做"返充潮"。还是上面那个电商仓:40 台搬运 AGV,8 个充电桩。大促期间任务排得满,很多车电量同时掉到阈值以下,调度系统按默认策略让它们一起返充,结果七八台车同时挤进充电区入口,互相挡住去路——想充电的进不去,充完电的出不来。充电区本身不是瓶颈,瓶颈是进出通道的路权没设计好。这个案例的教训很实在:死锁分析不能只看主干道,充电区、缓存区、换电站这些"辅助区域"同样需要路权规则。

AGV 在货架通道中行驶

路权规则:让谁先走的三个设计

路权规则是交通管制的底层逻辑,相当于给每台车发一本"交规"。行业里主流的做法有三种,各自对应不同的取舍。

第一种是固定路权,也就是把主干道设计成单向环路。所有 AGV 沿顺时针(或逆时针)方向行驶,窄通道只允许一个方向通过。这套规则的最大优点是简单到不可能出错——只要地图设计得当,迎面相遇和循环等待在结构上就被消除了。代价是路径变长:有些任务本来直线 30 米就能到,绕环路可能要走 80 米。对于路线固定的产线配送仓,这个代价可以接受;对于任务目的地频繁变化的电商仓,绕行带来的效率损失就很可观。

第二种是优先级让行。规则很简单:重载车优先于空载车,执行高优先级任务的车优先于普通任务,低电量返充的车优先于一切(因为它再不动就趴窝了)。这套规则灵活,路径不用绕,但它把复杂性转移到了"优先级怎么定"上。优先级定得太粗,会出现低优先级任务长期被饿死;定得太细,调度系统又难以维护。更重要的是,优先级规则本身并不能完全消除死锁——两台同优先级的车迎面相遇,依然需要兜底策略。

第三种是会让点设计。在无法避免的窄通道上,每隔一段距离设置一个避让凹位(passing bay),宽度足够两台车错开。当两台车需要会车时,系统指定其中一台退入会让点,另一台通过后再继续行驶。这是港口和矿山无人驾驶里常用的思路,搬到仓库里同样有效。它的代价是空间:每个会让点要吃掉一到两个托盘位的面积,在寸土寸金的仓库里,这是要跟仓储规划部门"抢地盘"的。

三种交通管制策略的代价对比

在路权规则之上,调度系统还需要一套交通管制策略来动态执行。三种主流策略的对比如下:

策略 原理 优点 代价与局限 适合的车队
静态分区(区域锁) 共享路段一次只允许一台车进入 实现极其简单,结构上杜绝死锁 通道利用率低,车队大时排队严重 20 台以下、路线固定
预约制(时隙预留) 进入路口或窄道前提前申请占用时隙 公平,不会出现任务饿死 通信开销大,路径刚性,突发任务难插队 中型车队、路线半固定
动态优先级 + 重规划 实时计算路径,冲突时让高优先级车先行或绕行 系统吞吐最高 算法复杂,对算力和调试能力要求高 大型车队、任务变化频繁

这张表的关键信息不在"谁最好",而在"代价转移到了哪里"。静态分区把代价转嫁给了通道利用率,预约制把代价转嫁给了系统刚性,动态调度把代价转嫁给了算法复杂度和调试成本。选型时真正要问的不是"哪个策略最先进",而是"我们团队付得起哪种代价"。我见过不少项目选了动态调度,最后因为没有人能调通冲突场景,又退回了静态分区——技术选型如果超出了团队的运维能力,再先进的策略也只是纸面方案。

一个反常识的发现:加车不一定提速

这里有一个反常识的判断:车队规模扩大带来的吞吐提升,会被死锁等待时间部分甚至全部吃掉。根据我接触到的几个项目复盘数据,一个常见的模式是——车队从 24 台加到 36 台,理论运力提升 50%,但实际系统吞吐只提升了不到 20%,而车辆因等待路权而停滞的时间占比从 3% 上升到了 11%。也就是说,后加的 12 台车,有相当一部分时间花在了"等别人让路"上。

这个现象的归因并不复杂:AGV 车队的真实瓶颈往往不是单车速度,而是冲突路段的路权分配效率。单车从 1.2 米/秒提速到 1.5 米/秒,收益是线性的;但把路口等待时间砍掉一半,收益可能是非线性的,因为等待会传染——一台车堵住路口,后面排队的三台车也跟着停,整条动线都慢下来。所以在评估"要不要加车"之前,更值得先回答的问题是:现有车队的路权等待时间占比是多少?如果已经超过 8% 到 10%,加车的边际收益会很低,优先该做的是优化交通管制,而不是采购新车。

从趋势上看,行业正在往"开放调度"的方向走。VDA 5050 标准(由德国汽车工业协会自 2019 年起推动的 AGV 车队管理接口标准)统一了上层调度系统与不同品牌 AGV 之间的通信接口,这意味着"一个仓库跑三个品牌 AGV"的多品牌混跑正在从特例变成常态。当车队不再是单一厂商的封闭系统,交通管制就不能再依赖某一家厂商的私有调度逻辑,而需要一套独立于车体的、中立的调度层。

这就引出一个开放式的问题:当一个仓库里同时跑着三个品牌的 AGV,路权规则到底该由谁来定?是 WMS 厂商、机器人厂商,还是仓库自己?目前行业里还没有标准答案。但可以确定的是,谁掌握了路权规则的制定权,谁就掌握了多车混跑场景下真正的系统话语权——车体正在变成 commodity,而调度,正在变成新的护城河。

作者:陈博士|供应链行业研究员