当没有人发号施令时
想象十台送货机器人共用一条仓库通道。没有一台中央计算机在发号施令;就算有,依赖它也很危险:它是一个单点故障,老板一旦崩溃,所有机器人都会僵住。所以机器人必须一起把事情理清楚。这正是多机器人协调的核心——让许多机器只凭各自能收集到的有限信息,以及与邻居之间传递的消息,像一支团队那样行动。
难点在于,没有哪一台机器人能看到全局。每台都有自己的传感器、自己略有偏差的时钟,以及一个只能触及附近少数同伴的无线电。一个协调的结果——大家就集合点、速度,或谁负责哪个货架达成一致——必须从许多次小而局部的对话中浮现出来。这很像鸟群或蚁群在没有管理者的情况下完成有组织的工作。
共识:所有机器人向一致缓缓平均
没有老板也能达成一致的经典办法,是分布式共识。这个想法简单得近乎不好意思:每台机器人反复地把自己的数值,朝邻居们数值的平均稍稍挪一点。这个数值可以是目标速度、集合地点,或对出口在哪里的估计。没有哪台机器人直接算出全局平均——但只要群体保持连通,所有数值就会缓缓彼此靠拢,直到汇合。
想象一圈人,每人举着一个数字,且只能看到左右两位邻居。一轮又一轮,每个人都把自己的数字朝旁边两人挪近。尽管没人能看到整个圆圈,每个人的数字最终都收敛到同一个值。机器人做的事情一模一样,只是用无线电消息代替了举起的卡片。其中的数学不过是一次又一次地做加权平均。
# Each robot i runs this every tick:
if neighbors:
neighbor_avg = sum(neighbors) / len(neighbors)
my_value = my_value + step * (neighbor_avg - my_value)
# 'neighbors' is the list of neighbor values this robot can hear.
# step is small (e.g. 0.1). Repeat every tick; all values converge.编队控制:像大雁那样保持人字形
一旦机器人能就数值达成一致,它们就能就形状达成一致。编队控制是让团队保持期望几何图案的技艺——一条线、一个网格、一个圆,或迁徙大雁那著名的人字形——并在整个群体移动和转向时保持。每只大雁并不盯着领头雁看;它只是与身旁那只鸟保持一个固定的偏移。机器人也一样:与邻居保持一个设定的距离和角度,整体形状便会自然成形。
锚定一个编队通常有两种方式。在领导者—跟随者模式中,一台机器人选定路径,其余机器人相对于它保持各自的偏移——简单,但领导者一旦失效,编队便会瓦解。在基于共识的视角下,根本没有领导者:每台机器人都用同样的邻居平均思想,只不过它要匹配的不是邻居的精确数值,而是那个数值加上一个固定偏移(“待在我左侧两米处”)。团队便在无人主导的情况下落定成形。
任务分配:用拍卖决定谁干什么
就一个数值或一种形状达成一致是一回事;把一堆活儿分下去又是另一回事。多机器人任务分配要问的是:给定五台机器人和二十件要取的包裹,谁该去拿哪一件,才能让工作尽快完成,且不会有两台机器人去抢同一个箱子?做得糟,机器人就会相撞、重复劳动,或让任务无人认领。做得好,团队就像一间运转良好的厨房,每个人都悄无声息地站对了岗位。
一个广受青睐的妙招借鉴自经济学:举行拍卖。每项任务被拿出来竞标,每台机器人报出一个成本——通常是它需要移动的距离,或它已经有多忙。出价最低者(最便宜、最顺路的机器人)赢得这项任务。举行许多次小型拍卖,每项任务一次,整张任务清单便会在没有中央规划者的情况下自行清空。这被称为基于市场的分配,因为机器人表现得就像市场上的买家。
- 宣布:一项任务(“去取7号包裹”)被广播给团队。
- 竞标:每台机器人估算自己的成本——距离、电量、当前负载——并发出那个数值。
- 授予:出价最低者认领该任务;其余机器人放弃它,转看下一项。
- 重复:持续进行,直到每项任务都有归属;若有机器人失效或出现新任务,则重新拍卖。
为什么达成一致真的很难
纸面上,邻居平均和拍卖听起来很整洁。现实世界却乱糟糟的。消息传播需要时间——这种延迟称为时延——所以当机器人A听到机器人B的数值时,B早已挪到别处去了。更糟的是,无线消息会丢失:一个数据包凭空消失,没人察觉,直到机器人之间已渐行渐远。一致性协议必须能在陈旧的、缺失的、乱序的信息中继续运转。
两台机器人甚至会对现实本身产生分歧:A的传感器说走廊畅通,B的却说被堵住了。没有裁判来宣判谁对谁错。因此,好的协调被设计成能从容容忍分歧——随时间把分歧平均掉、在某个赢家沉默时重新拍卖,或在邻居掉出无线电范围时放松编队。目标不是完美而即时的一致,而是能从不可避免的小故障中恢复过来的一致。