想象一支三人探险队,在夜色降临前被派进一座完全陌生的废弃商场。他们每人手里只有一盏手电筒、一支粉笔、一张黑色画板,以及对讲机。目标是天亮前画出一张完整地图。没有人俯瞰全局,没有人预先知道路怎么走。他们只能在走过的地方用粉笔做记号,在自己的画板上一点点涂出走廊和房间;遇到岔路口,则需要通过简短的对讲机对话决定“谁去左边,谁去右边”,避免两个人钻同一个黑房间。最后,三个人回到大厅,把各自的局部小图对准同一个柱子、同一个楼梯口,拼成一张完整地图。 这正是“多智能体协同探索与地图共享”要解决的问题:多个机器人如何在未知环境中分工、通信、拼图,用有限的感知和带宽,换全局更高的探索效率。这篇文章会用“夜探商场探险队”的比喻,把这个领域的关键思想拆解成七块:协同探索、通信设计、地图融合、架构对比、评估指标、部署限制,还有应用与局限。
对 AI 从业者而言,理解多智能体协同建图,等于理解无人系统如何用协作弥补单机感知的不足,是空间智能、机器人和具身智能落地的关键能力。
目录
可视化演示
动态演示多智能体协同探索与地图共享完的核心机制,通过基础/核心/应用/扩展四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
多智能体协同探索与地图共享完:多智能体 多智能体协同探索的动机与挑战 协同探索策略与任务分配 核心机制可视化 多智能体协同探索与地图共享完整体架构与关键组件
协同探索策略:先找门缝,再派人过去
夜探商场时,队长最常说的一句话是:“别闷头走,先看哪里有门缝亮光。”门缝就是地图上“已知走廊”与“未知黑暗房间”交界的地方。机器人学里把这个位置叫做前沿。前沿是所有探索任务的起点:没有已验证的通道,就没有值得去的目标;盲目乱逛只会浪费手电筒电量。
但商场里会有许多门缝,三个队员不可能同时去同一个门口。于是每个人开始估算:门后看起来有多大?我走过去要多久?这个“收益/成本”的直觉,正是协同探索的分配准则。把第 \(i\) 个机器人派往第 \(j\) 个前沿的决策公式可以写成:
\[
\psi^{*} = \arg\max_{(i,j)} \frac{g(F_j)}{d(\mathbf{p}_i, F_j)}
\]
1. 候选配对 \((i,j)\):把每个机器人和每个前沿点两两组合,相当于把所有“谁去哪个门缝”的可能性摆上桌面。
2. 分子 \(g(F_j)\):表示前沿 \(F_j\) 背后的未知区域大小,也可以理解为“信息增益”,门后房间越大,画出来的新地图就越多。
3. 分母 \(d(\mathbf{p}_i, F_j)\):机器人当前位置 \(\mathbf{p}_i\) 到前沿的距离或预计行驶成本,路越远,消耗的电池和时间越多。
4. 整体取舍与 \(\arg\max\):在全部组合中,选收益/成本比值最大的那一组,就是队长口中“收益最大的一笔买卖”。
真实系统中,这样的分配往往通过“市场拍卖”实现:每个机器人对每个前沿报一个出价,再由共识机制或中央调度器选出最高价组合。通过这种贪心分配与角色分工,队伍能快速铺满不同区域,避免重复覆盖,提升整体探索效率。探险队的粉笔和画板,也就从“各自为战”变成了“协同画图”。
通信机制设计:对讲机不能一直说
三个队员相隔很远,对讲机频道只有一条。如果每个人都把一张完整的设计图每隔一秒播报一遍,频道马上就会挤满杂音,真正的关键信息反而传不出去。所以队长定下规矩:只在发现大走廊、路过岔路口或者每隔五分钟时,用短句说一句重点。这就是通信机制设计的直觉——有限带宽下,必须节制地通信。
在机器人系统中,每台机器人都有自己的局部地图,地图会不断增长。若每次同步都把完整地图发出去,通信量会迅速爆炸。假设系统中每秒钟可分配给地图共享的带宽预算是 \(B_{\text{budget}}\),一次同步平均要发送的地图增量是 \(\Delta S_{\text{map}}\),那么同步频率不能超过:
\[
f_{\text{sync}} \le \frac{B_{\text{budget}}}{\Delta S_{\text{map}}}
\]
1. 同步频率 \(f_{\text{sync}}\):每秒能进行的地图同步次数,相当于对讲机每秒钟能喊几句话。
2. 通信预算 \(B_{\text{budget}}\):每秒专用于地图共享的带宽,扣除握手、重传等开销后的有效容量。
3. 地图增量 \(\Delta S_{\text{map}}\):一次同步需要传输的“新画出来的内容”,而不是整张地图。
4. 不等式关系 \(\le\):如果实际同步频率超过这个上限,就相当于对讲机喊得太密,信道拥塞,信息反而传不到。
工程上,常见的做法是发送压缩后的栅格图增量、只交换稀疏路标,或者采用事件触发通信:只有当机器人发现新的闭环、遇到大分叉时才广播。通信拓扑也可以是广播、对等转发或小组群聊。总之,少说、说重点,才能让团队地图在有限带宽下慢慢汇合。
地图融合方法:先对齐,再叠图
夜晚过去一半,三个队员终于回到大厅。大家把画板拼在一起,发现如果直接叠图,走廊会错位、墙体会断开。原因很简单:每个人都是从自己的起点开始画,坐标原点不同,角度也不同。必须先找到共同的参照物——比如同一根柱子、同一段楼梯——把两张图旋转和移动到同一坐标系下,才能谈合并。这个“对齐”过程叫位姿配准。
对齐之后,地图上的每个格子可能被多人观察过。一个人说“这里有墙”,另一个人也说“这里有墙”,那这里真的有墙的概率就更大。机器人地图通常用占据栅格保存这种不确定性:每个格子存一个对数几率 \(\ell\),有新观测时就做贝叶斯更新:
\[
\ell_t(m_{ij}) = \ell_{t-1}(m_{ij}) + \log \frac{p(z_t \mid m_{ij})}{1 - p(z_t \mid m_{ij})}
\]
1. 当前对数几率 \(\ell_t(m_{ij})\):第 \(t\) 轮融合后,格子 \(m_{ij}\) 被占据的置信度。
2. 历史对数几率 \(\ell_{t-1}(m_{ij})\):之前所有观测累积下来的先验置信度,相当于团队之前对这块区域的旧印象。
3. 观测似然比 \(\log \frac{p(z_t \mid m_{ij})}{1 - p(z_t \mid m_{ij})}\):当前传感器是否“支持该格子被占据”的证据强度。若 \(p\) 接近 1,新证据会大幅提高占用置信度。
4. 叠加更新 \(+\):把旧印象和新证据相加,多智能体地图融合的增量更新由此完成。
实际系统中,局部地图先通过特征匹配或 ICP 估计相对位姿,把多张地图变换到全局坐标系,再对同一个栅格做增量融合。这个过程就像探险队先找到统一的地标,再各自把画板旋转到同一方向,最后才能重叠成一张可信的大地图。
系统架构对比:队长、微信群和小组长
在协同探索中,信息怎么流通,决定了这支探险队是高效还是混乱。第一种模式是“队长中心制”:每个队员把位置和地图都发给队长,队长统一分配任务。这种架构信息最全,决策最直接,但队长一旦对讲机没电,整个队伍就会陷入瘫痪。第二种模式是“微信群模式”:所有队员互相传话,没有中心节点。它更抗故障,但每个人都要处理大量消息,且很难保证大家看到同一版本的地图。第三种是“小组长模式”:三个小队先内部汇总,再由小组长之间协商,是前两者的折中。
如果采用去中心化的全互联结构,n 个机器人两两之间都要通信,链路数量会随机器人数量快速膨胀:
\[
N_{\text{links}} = \frac{n(n-1)}{2}
\]
1. 链路总数 \(N_{\text{links}}\):去中心化架构中所有机器人两两之间需要维护的连接条数。
2. 机器人数量 \(n\):队伍中的智能体个数,例如 5 台机器人。
3. 两两组合 \((n(n-1))/2\):从 n 个节点中选 2 个节点的组合数,对应数学中的 C(n,2)。
中心化架构只需要 n 条链路基到中心,通信规模小,但存在单点故障风险;去中心化架构没有单一队长,鲁棒性更强,但需要处理更多通信并解决地图一致性。混合架构则通过“小组长”把机器人分成簇,簇内中心汇总、簇间协商,在鲁棒性和通信开销之间取平衡。探险队选哪种“指挥方式”,本质上是在回答:你能接受一个坏掉的对讲机,还是能接受一片嘈杂的频道?
评估指标:不只看谁先画完
三张画板最终拼在一起时,验收的不只是“画完没有”,还要问:有没有漏掉某个小仓库?大家是不是走了很多冤枉路?对讲机是不是被废话塞满了?如果两个队员都画了同一个走廊,说明他们的工作重复了。也就是说,协同探索的优劣必须用多个指标综合衡量。
最直观的指标是覆盖率,即已探索面积占总面积的比例。设 \(A_{\text{total}}\) 为地图总面积,\(\mathcal{E}_t\) 为时刻 \(t\) 已探索的格子集合,则:
\[
C(t) = \frac{1}{A_{\text{total}}}\sum_{c \in \mathcal{E}_t} \mathrm{area}(c)
\]
1. 覆盖率 \(C(t)\):时刻 \(t\) 的探索完成比例,介于 0 到 1 之间。
2. 总面积 \(A_{\text{total}}\):整个可探索空间的大小,作为覆盖率的分母。
3. 已探索格子集合 \(\mathcal{E}_t\):截止当前时刻,所有被任何机器人观测过的格子。
4. 求和 \(\sum_{c \in \mathcal{E}_t} \mathrm{area}(c)\):把这些格子的面积全部加起来,得到已探索面积。
除了覆盖率,还要看通信开销、总任务时间和鲁棒性。通信开销类似“对讲机话费”,任务时间类似“天亮前能否完工”,鲁棒性则类似“某位队员摔倒后地图会不会丢失”。好的协同探索算法,不是单点最优,而是在覆盖率、通信、时间和抗故障之间寻找平衡。
部署限制:电池、距离和坏对讲机
商场里的探险队很快发现,现实比想象残酷:手电筒会越来越暗,对讲机距离有限,卷帘门可能突然降下,甚至有个队员在湿滑走廊里摔了一跤。这些都不是算法论文里最亮眼的部分,却往往决定系统能不能真正落地。对机器人团队来说,最大的两个限制是能耗和通信半径。
通信半径可以用一个简单的关系描述:两个节点只有距离足够近时才能直接通信。设机器人 \(i\) 和 \(j\) 在时刻 \(t\) 的距离为 \(d_{ij}(t)\),通信半径为 \(R_{\text{comm}}\),则:
\[
\text{link}_{ij}(t) = \begin{cases} 1, & d_{ij}(t) \le R_{\text{comm}} \\ 0, & d_{ij}(t) > R_{\text{comm}} \end{cases}
\]
1. 链路状态 \(\text{link}_{ij}(t)\):值为 1 表示此刻可以通信,值为 0 表示不能。
2. 距离 \(d_{ij}(t)\):两台机器人在当前时刻的空间距离。
3. 判断条件 \(d_{ij}(t) \le R_{\text{comm}}\):距离不超过通信半径,链路有效。
4. 分段取值:超过半径则链路断开,这会影响地图同步和任务协调。
部署时还需要考虑机器人的运动能力、传感器噪声、动态障碍物以及掉线后的容错设计。比如某台机器人失联,其他成员能否接管它的区域?这就是“坏对讲机”后的应急预案。真实系统里,这些约束往往比算法本身更决定协同探索的成败。
应用与局限:把地图送给搜救队
天亮了,三位探险队员把拼好的购物中心地图交给赶来的搜救队:哪里能走、哪里是死路、哪里有开阔区域,一目了然。这就是多智能体协同探索最典型的价值——快速为人类提供未知环境的结构信息。灾后搜救中,几架无人机和地面机器人可以先于人类进入废墟,一边探测生命迹象,一边共享地图,让救援队精准规划路线;智慧仓储中,多台盘点机器人互相共享已检查货架,避免重复清点;深空探测中,月球车或火星车群体也能在没有 GPS 的环境中互相定位、接力建图。
但这项技术也有明确边界。地图只是“此刻的估计”,不是永远正确的真值:门可能被风吹关上,临时堆放的纸箱会改变通道,昏暗灯光会让传感器误判。多智能体协同探索依然依赖电池、通信和传感器质量,一旦这些物理资源枯竭,再聪明的算法也无济于事。探险队能画完商场,靠的从来不只是粉笔,还有合理的分工、节制的对讲,以及愿意在摔倒后重新站起来继续画图的容错机制。
AI 应用场景
灾后搜救中的协同侦察
阶段:环境感知与协同规划
解决的问题:传统搜救中,地面人员进入废墟有二次坍塌风险,且单台无人机视野有限。多智能体可以先建立粗略地图,划分区域并行搜索,实时共享已探区域和疑似生命迹象位置,减少重复搜索并缩短救援窗口。
具体案例:在地震后的内部结构不明建筑中,三台小型无人机分别从入口、窗户和破洞进入,各自构建局部占据栅格地图,通过对讲机式稀疏通信交换关键路标,最终在地面站融合成一张统一的三维废墟地图,标出可通行通道和疑似被困者位置。
智慧仓储中的盘点机器人地图共享
阶段:多机任务分配与地图融合
解决的问题:大型仓库中,多台盘点机器人若各自独立扫描,容易重复经过同一货架,浪费电量和时间。通过前沿式任务分配,机器人优先前往尚未被同伴覆盖的通道,并共享更新后的货架地图,提升盘点覆盖率。
具体案例:某电商仓库用 5 台移动盘点机器人对 2 万平方米库区做夜间盘点,每台机器人维护局部地图,每 30 秒只交换一次地图增量。系统实时统计覆盖率,当某一区域长期无人前往时,自动重新调度最近的机器人补位。
深空探测中的多车互援制图
阶段:状态估计与协同定位
解决的问题:月球表面没有 GPS,单台月球车遇到沙坑或陡坡容易受困。多辆月球车通过相互观测作为移动信标,结合共享的地图特征完成协同定位,既能扩大探测范围,又能在其中一辆车故障时由其他车提供地图和路径支援。
具体案例:在模拟月面试验场中,两辆月球车分别从着陆器两侧出发,交换环形山边缘的几何特征,通过前端里程计和相对观测完成位姿配准,最终合成了比单车探索面积大 1.6 倍的全局地质图。
Python 演示
"""Multi-agent frontier exploration and map sharing demo."""import random class GridMap: def __init__(self, w, h, obstacles=None): self.w = w self.h = h # 0=unknown, 1=free, 2=obstacle self.cells = [[0 for _ in range(w)] for _ in range(h)] for x, y in (obstacles or []): if 0 <= x < w and 0 <= y < h: self.cells[y][x] = 2 def occupied(self, x, y): return x < 0 or y < 0 or x >= self.w or y >= self.h or self.cells[y][x] == 2 def frontier_cells(self): result = [] for y in range(self.h): for x in range(self.w): if self.cells[y][x] != 0: continue for dx, dy in ((1, 0), (-1, 0), (0, 1), (0, -1)): nx, ny = x + dx, y + dy if 0 <= nx < self.w and 0 <= ny < self.h and self.cells[ny][nx] == 1: result.append((x, y)) break return result class Agent: def __init__(self, x, y, w, h): self.x = x self.y = y self.map = GridMap(w, h) self.map.cells[y][x] = 1 def sense(self, world, radius=2): for dy in range(-radius, radius + 1): for dx in range(-radius, radius + 1): gx, gy = self.x + dx, self.y + dy if 0 <= gx < world.w and 0 <= gy < world.h: value = world.cells[gy][gx] if value != 0: self.map.cells[gy][gx] = value def move_toward(self, target): tx, ty = target best = None best_dist = 1e9 for dx, dy in ((1, 0), (-1, 0), (0, 1), (0, -1)): nx, ny = self.x + dx, self.y + dy if self.map.occupied(nx, ny): continue dist = (nx - tx) ** 2 + (ny - ty) ** 2 if dist < best_dist: best_dist = dist best = (nx, ny) if best is None: return False self.x, self.y = best return True def share_with(self, other): for y in range(self.map.h): for x in range(self.map.w): v = other.map.cells[y][x] if v != 0 and self.map.cells[y][x] != 2: self.map.cells[y][x] = v def main(): random.seed(7) world = GridMap(24, 16, obstacles=[(5, 3), (6, 3), (7, 3), (18, 10), (19, 10), (20, 10)]) for y in range(world.h): for x in range(world.w): if world.cells[y][x] != 2: world.cells[y][x] = 1 agents = [Agent(2, 2, 24, 16), Agent(21, 2, 24, 16), Agent(2, 13, 24, 16)] for t in range(120): for a in agents: a.sense(world) if t % 5 == 0: for i, a in enumerate(agents): for b in agents[i + 1:]: a.share_with(b) b.share_with(a) for a in agents: frontier = a.map.frontier_cells() if not frontier: continue target = min(frontier, key=lambda p: (p[0] - a.x) ** 2 + (p[1] - a.y) ** 2) moved = a.move_toward(target) if not moved: for dx, dy in ((1, 0), (-1, 0), (0, 1), (0, -1)): if not a.map.occupied(a.x + dx, a.y + dy): a.x += dx a.y += dy break merged = agents[0].map covered = sum(1 for row in merged.cells for v in row if v != 0) total = sum(1 for row in world.cells for v in row) print("coverage after 120 steps: {:.1f}%".format(covered * 100.0 / total)) if __name__ == "__main__": main()
self.cells = [[0 for _ in range(w)] for _ in range(h)]初始化栅格地图,0 表示未知区域,这是探索前“画板空白”的起点。for dx, dy in ((1, 0), (-1, 0), (0, 1), (0, -1)):检查上下左右四个邻居,这是前沿检测的基本操作。if 0 <= nx < self.w and 0 <= ny < self.h and self.cells[ny][nx] == 1:只把“未知但挨着已知可通行区域”的格子视为前沿。self.map.cells[y][x] = 1机器人出生点标记为已探索,相当于探险队员在自己画板上画下“我在这里”。value = world.cells[gy][gx]从全局真值地图中读取传感器范围内的真实环境信息。if value != 0:只把有明确信息的世界覆盖到局部地图,避免把探索过的区域又改回未知。if t % 5 == 0:每 5 个时间步做一次地图同步,模拟“对讲机每隔一段时间喊一句”。a.share_with(b)把另一台机器人的局部地图合并进自己的地图。target = min(frontier, key=lambda p: (p[0] - a.x) ** 2 + (p[1] - a.y) ** 2)选择离自己最近的前沿作为下一步目标。covered = sum(1 for row in merged.cells for v in row if v != 0)统计最终已探索格子数,计算覆盖率。
常见误区
误区我以为只要所有机器人把地图发到同一个群,系统就会自动得到一张完整准确的全局地图,就像群里发几张照片大家自动对齐。
正解地图融合需要先做位姿配准,也就是确定每张局部图之间的旋转和平移。直接用不同坐标系的图叠到一起,墙会错位,走廊会断开。真实的融合还要处理传感器噪声和动态障碍,并不是简单叠加。
为何常见:人们看演示视频时,往往看到“最终地图”而忽略后台的坐标变换,误以为共享数据就是融合数据。
误区我觉得机器人之间应该尽量不停发消息,保证大家永远都知道别人在哪,通信越多越不容易出错。
正解通信带宽和能量都有限,频繁广播会占满信道,造成延迟和丢包。更高效的做法是发送地图增量、压缩路标,或者等到关键事件发生时才同步,类似对讲机只喊重点,才能让关键信息真正传到。
为何常见:无线通信在日常生活中看似“免费”,让人忽略了机器人场景下的带宽、功耗和干扰限制。
误区我认为只要每台机器人各自随便走走,尽量多逛一些区域,最后把数据汇总就能得到完整地图。
正解没有全局任务分配,多台机器人很可能探索同一个走廊,浪费电量和时间。协同探索需要通过前沿选择和收益/成本分配,让机器人自动分散到不同区域,从系统层面避免重复覆盖。
为何常见:单机器人探索的经验容易迁移到多机器人场景,但多机器人系统的瓶颈不是“感知”而是“协调”。
误区我觉得有一个中心节点统一指挥最清楚,中心肯定比“群聊”更可靠。
正解中心节点一旦失效,整个团队就失去指挥;去中心化架构虽然消息更杂,但没有单点故障,局部掉线后其他机器人仍能继续探索。可靠性的本质是能否容忍节点失败,而不是谁看起来更统一。
为何常见:人类组织里分工明确很重要,但机器人通信环境更恶劣,中心节点失联的概率不可忽视。
误区我以为栅格地图画出来之后,墙就是墙、空就是空,它就是在完美复刻真实环境。
正解占据栅格地图保存的是“概率”,而不是绝对真相。传感器有噪声,环境也可能动态变化,比如门被风吹动、货物被移走。地图更新需要不断融合新证据,才能逐渐逼近真实状态。
为何常见:可视化时栅格看起来非常清晰精确,容易让人忘记它只是对不确定世界的一种统计建模。
面试题
Q1. 多智能体探索中的“前沿”通常指?
- A.已探索区域的几何中心
- B.已知与未知区域的交界← 正确答案
- C.所有完全未知的区域
- D.机器人当前所在的点
答案:B。前沿必须是“未知但紧邻已知”的格子,这样机器人才有路径可以抵达。中心是已知区域,完全未知区域可能不可达,当前位置是已知点,都不构成探索目标。
Q2. 多智能体共享地图的首要目标是?
- A.减少重复探索与覆盖← 正确答案
- B.让每台机器人都有电脑
- C.增加无线通信的数据量
- D.让地图的配色更统一
答案:A。共享地图的核心价值是让机器人知道同伴已经探索过哪里,从而更合理地分配前沿目标,减少重复劳动,而不是为了通信而通信或美化地图。
Q3. 占据栅格地图的格子主要记录?
- A.该点与机器人的距离
- B.该点被占据的概率← 正确答案
- C.经过该点的机器人编号
- D.该点被访问的时间戳
答案:B。占据栅格地图的核心是每个格子保存被占据的概率或对数几率,用来表达环境不确定性。距离、编号和时间戳都不是格子本身要维护的信息。
Q4. 融合两幅局部地图前必须做?
- A.压缩成同一个图片格式
- B.估计相对位姿并配准← 正确答案
- C.删除所有未知区域
- D.统一地图的颜色
答案:B。不同机器人建立地图时的坐标原点不同,必须先通过特征匹配或相对观测估计旋转和平移,把地图变换到同一坐标系,合并才有意义。
Q5. 去中心化架构最主要的优点是?
- A.避免单点故障← 正确答案
- B.不需要任何通信
- C.地图永远完全一致
- D.不需要感知周围环境
答案:A。去中心化没有单一中心节点,任意一台机器人掉线都不会让系统崩溃。但它仍然需要通信,也不保证地图完全一致,更不可能不感知环境。
Q6. 以下哪些常作为协同探索的评估指标?
- A.覆盖率← 正确答案
- B.通信开销← 正确答案
- C.总任务时间← 正确答案
- D.电池生产厂家
答案:ABC。覆盖率描述探索进度,通信开销衡量资源消耗,总任务时间衡量效率,这些都是核心指标。电池生产厂家与算法性能无关。
Q7. “信息增益除以行驶成本”越大意味着?
- A.单位成本获得更多新地图← 正确答案
- B.单位成本获得的奖励越小
- C.机器人应该尽量绕路探索
- D.说明这个前沿无法到达
答案:A。比值越大,说明每付出单位路程就能得到更多未知区域。协同探索会优先选择这个大比值的前沿;绕路会增大分母,不可达点则不参与计算。
Q8. 带宽受限时,常见的通信策略有?
- A.只发送压缩地图增量← 正确答案
- B.降低地图同步频率← 正确答案
- C.交换稀疏关键路标← 正确答案
- D.彻底关闭所有通信链路
答案:ABC。压缩增量、降低频率、交换关键路标都能在有限带宽下保持协同。彻底关闭通信会让各机器人失去协调,无法共享地图。
Q9. 中心化协同架构最主要的短板是?
- A.信息汇总更加复杂
- B.存在单点故障风险← 正确答案
- C.通信链路完全对称
- D.地图必然不一致
答案:B。中心化架构把所有关键决策和地图汇总放在中心节点,中心一旦失效,整个团队就会失去协同能力。去中心化架构虽然通信复杂,但没有单点故障。
Q10. 地图融合中的常见难点包括?
- A.相对位姿估计← 正确答案
- B.动态障碍物处理← 正确答案
- C.通信时延补偿← 正确答案
- D.地图颜色美观设计
答案:ABC。融合地图必须先解决“地图之间怎么对齐”,还要处理环境中移动物体带来的冲突,以及延迟到达的旧地图信息。颜色美观不是地图融合的难点。