转载自公众号:敢敢AUTOHUB
1. 引言
在现代智能机器人的应用场景中,服务型机器人和配送机器人正逐步走入多楼层建筑环境。设想这样一个场景:你向家用服务机器人发出指令"帮我找到电视机",但电视机位于楼上的客厅。对于人类而言,这是一个自然而直观的任务——我们会本能地上楼、探索房间、最终找到目标物体。然而,对于当前的机器人导航系统来说,这个看似简单的任务却充满了技术挑战,特别是在陌生环境中进行导航时。
物体目标导航(Object-Goal Navigation, OGN)是机器人领域的一个核心研究方向,其目标是让机器人在未知环境中自主寻找并到达指定的目标物体。近年来,随着深度学习和计算机视觉技术的发展,OGN系统在单楼层环境中已经取得了显著进展。然而,当我们将视野扩展到多楼层建筑时,现有系统普遍暴露出严重的局限性。这些局限性不仅限制了机器人的实际应用范围,也阻碍了服务机器人在家庭、办公楼、商场等真实场景中的广泛部署。
为了量化多楼层导航问题的重要性,研究团队对两个广泛使用的OGN基准数据集进行了深入分析:HM3D(Habitat-Matterport 3D)和MP3D(Matterport3D)。这两个数据集包含了大量真实世界的室内场景扫描数据,被学术界和工业界广泛用于评估导航算法的性能。
统计结果揭示了一个令人震惊的事实:在HM3D和MP3D数据集的验证集中,超过65%的场景涉及多楼层建筑结构。更重要的是,约28%的导航任务明确要求机器人进行跨楼层移动才能到达目标物体。这意味着,如果一个导航系统无法处理多楼层场景,它将在超过四分之一的实际任务中直接失败。
这些数据清晰地表明,多楼层导航不是一个边缘化的特殊场景,而是机器人在真实世界中必须面对的普遍挑战。然而,现有的大多数OGN方法在设计时都隐含地假设机器人只在单一楼层活动,这种假设与实际应用需求之间存在着巨大的鸿沟。
针对上述挑战,来自香港科技大学(广州)、香港科技大学、新加坡国立大学和清华大学的联合研究团队提出了ASCENT(Autonomous Stair-aware Cross-floor Exploration and Navigation Technology)框架。这是首个支持在线多楼层零样本物体导航的完整系统,能够在未知的多楼层建筑中自主探索并找到目标物体,无需预先构建地图或针对特定任务进行训练。
项目主页:https://arxiv.org/html/2505.23019v4
GitHub地址:https://github.com/Zeying-Gong/ascent?tab=readme-ov-file
2.核心技术架构
ASCENT采用模块化设计,由两个相互协作的核心模块组成:多楼层抽象模块(Multi-Floor Abstraction)和粗到精推理模块(Coarse-to-Fine Reasoning)。这种设计既保证了系统的灵活性,又确保了各模块之间的高效协同。
ASCENT研发动机对比图
从系统输入输出的角度来看,ASCENT接收RGB-D相机的视觉输入,经过多楼层抽象模块构建分层的环境表示,再通过粗到精推理模块进行决策,最终输出导航动作指令。整个过程完全在线进行,机器人在探索过程中逐步建立对环境的理解,无需依赖预先构建的全局地图。
2.1 问题形式化与优化目标
在技术层面,ASCENT将物体目标导航问题形式化为一个双目标优化问题。系统需要在探索成本和目标到达成本之间寻找最优平衡:
其中, 表示导航轨迹, 表示探索成本(包括移动距离和时间), 表示到达目标的成本, 和 是权重系数。这个优化目标反映了导航任务的本质矛盾:机器人需要充分探索环境以找到目标,但又要避免无效的探索浪费时间和能量。
多楼层抽象模块主要负责降低 ,通过构建准确的环境表示和楼层连接关系,确保机器人能够高效地到达目标所在区域。粗到精推理模块则主要负责降低 ,通过智能的前沿点选择策略,避免在低价值区域浪费探索资源。
2.2 三大核心贡献
ASCENT的技术贡献可以总结为三个方面:
第一,提出了首个在线分层框架,支持在未知多楼层建筑中进行探索和导航。与需要预先构建地图的方法不同,ASCENT能够在探索过程中动态构建和更新环境表示,适应各种未知的建筑结构。
第二,设计了粗到精的前沿点推理策略,将LLM调用次数减少了90%以上。这一创新解决了基于LLM的规划方法的效率瓶颈,使得实时导航成为可能。具体而言,系统默认使用快速的VLM进行粗粒度评估,仅在必要时才调用LLM进行深度推理。
第三,在标准基准测试中取得了最先进的性能。在HM3D数据集上,ASCENT相比之前的最佳方法提升了7.1%的成功率(SR)和6.8%的路径长度加权成功率(SPL);在MP3D数据集上提升了3.4%的成功率。更重要的是,在跨楼层导航任务中,ASCENT的成功率达到33.3%,大幅超越现有方法。
3. 多楼层抽象模块:构建分层环境表示
多楼层抽象模块是ASCENT实现跨楼层导航的基础。该模块的核心思想是为每个楼层维护独立的鸟瞰图(Bird's Eye View, BEV)表示,同时建模楼层之间的连接关系。这种设计避免了将多楼层数据合并导致的空间重叠问题,为后续的规划决策提供了清晰的环境认知。
3.1 BEV地图表示:双地图协同机制
ASCENT采用两种互补的BEV地图表示来支持高效的探索和导航:
3.1.1 探索价值地图(Exploration Value Map)
探索价值地图 整合了语义相似度和空间可达性两个维度的信息。与之前的方法(如VLFM)仅考虑语义相似度不同,ASCENT引入了基于距离的探索成本,确保机器人优先探索既语义相关又空间可达的区域。
对于第 个前沿点 ,其探索价值计算公式为:
def sort_waypoints(
self, obstacle_map, value_map, frontiers: np.ndarray, env: int = 0,
) -> Tuple[np.ndarray, List[float]]:
# 获取初始排序后的前沿点和值
raw_sorted_pts, raw_sorted_values = value_map[env].sort_waypoints(frontiers, 0.5)
# 过滤掉禁用的前沿点
filtered_pairs = []
for pt, val in zip(raw_sorted_pts, raw_sorted_values):
if tuple(pt) not in obstacle_map[env]._disabled_frontiers:
filtered_pairs.append((pt, val))
return np.array([pair[0] for pair in filtered_pairs]), [pair[1] for pair in filtered_pairs]
这个设计的直觉是:当存在多个语义相关的前沿点时,机器人应该优先探索距离较近的区域,充分利用局部信息后再进行远距离探索。这种策略在实验中被证明能够显著提高探索效率。
3.1.2 楼梯感知障碍地图(Stair-Aware Obstacle Map)
楼梯感知障碍地图 是一个二值占用栅格,记录环境中的可通行和不可通行区域。与传统方法的关键区别在于,ASCENT不将楼梯视为障碍物,而是通过语义分割和深度分析将其标记为可通行的特殊区域。
该地图维护两个重要的持久化记录:
-
- •
黑名单(Blacklist)
-
- :记录已尝试但失败的楼梯位置,避免重复尝试•
缓存(Cache)
- :记录成功通过的楼梯的起点和终点坐标,用于后续快速通行
这种设计为跨楼层导航提供了拓扑基础,使得机器人能够在多个楼层之间灵活切换。
3.2 楼梯检测:双模态识别机制
楼梯检测是实现多楼层导航的关键技术。ASCENT采用双模态方法,能够同时检测向上和向下的楼梯。
3.2.1 向上楼梯检测
向上楼梯的检测结合了物体检测和语义分割两种技术。系统首先使用物体检测器识别候选楼梯区域,然后通过语义分割验证楼梯像素的占比。只有同时满足检测置信度和像素占比两个条件的候选区域才被认定为有效楼梯:
实际实现:楼梯检测逻辑集成在 ascent/mapping/obstacle_map.py 中的 ObstacleMap 类。核心代码片段:
# ascent/mapping/obstacle_map.py:520-541 (向上楼梯检测)
if np.any(stair_mask) > 0 and np.sum(seg_mask == STAIR_CLASS_ID) > 20:
stair_map = (seg_mask == STAIR_CLASS_ID)
fusion_stair_mask = stair_mask & stair_map
if np.any(fusion_stair_mask) > 0:
stair_depth = np.full_like(depth, max_depth)
scaled_depth_stair = scaled_depth.copy()
stair_depth[fusion_stair_mask] = scaled_depth_stair[fusion_stair_mask]
# 生成楼梯点云
stair_cloud_camera_frame = get_point_cloud(stair_depth, fusion_stair_mask, fx, fy)
stair_cloud_episodic_frame = transform_points(tf_camera_to_episodic,
stair_cloud_camera_frame)
stair_xy_points = stair_cloud_episodic_frame[:, :2]
stair_pixel_points = self._xy_to_px(stair_xy_points)
if agent_pitch_angle >= 0 and climb_stair_flag != 2:
for x, y in stair_pixel_points:
if 0 <= x < self._up_stair_map.shape[1] and 0 <= y < self._up_stair_map.shape[0]:
self._up_stair_map[y, x] = 1
3.2.2 向下楼梯检测:主动探索策略
向下楼梯的检测面临更大的挑战,因为从当前视角往往无法直接看到下方的楼梯结构。ASCENT采用了一种创新的主动探索策略来解决这个问题。
系统通过深度图识别深度值小于-0.2米的区域,这些区域可能是地面的下沉部分,暗示着向下楼梯的存在。当检测到这样的潜在区域时,机器人会执行以下步骤:
1. 执行LOOK_DOWN动作:调整相机角度向下观察
2. 主动接近:向潜在楼梯区域移动,获得更好的观察视角
3. 验证确认:使用物体检测和语义分割验证是否为真实的向下楼梯
# ascent/mapping/obstacle_map.py:551-562 (向下楼梯检测)
if agent_pitch_angle <= 0 and reach_stair == False:
filled_depth_for_stair = fill_small_holes(depth, self._hole_area_thresh)
inverted_depth_for_stair = max_depth - filled_depth_for_stair * (max_depth - min_depth)
inverted_mask = inverted_depth_for_stair < 2 # 检测深度下沉区域
inverted_point_cloud_camera_frame = get_point_cloud(inverted_depth_for_stair,
inverted_mask, fx, fy)
inverted_point_cloud_episodic_frame = transform_points(tf_camera_to_episodic,
inverted_point_cloud_camera_frame)
below_ground_obstacle_cloud_0 = filter_points_by_height_below_ground_0(
inverted_point_cloud_episodic_frame)
below_ground_xy_points = below_ground_obstacle_cloud_0[:, :2]
below_ground_pixel_points = self._xy_to_px(below_ground_xy_points)
self._down_stair_map[below_ground_pixel_points[:, 1], below_ground_pixel_points[:, 0]] = 1
这种主动探索策略使得ASCENT能够实现真正的双向楼层探索,而不是像之前的方法那样只能单向通行。这是实现灵活多楼层导航的关键能力。
3.3 跨楼层转换:动态导航机制
当系统决定进行楼层切换时,跨楼层转换模块负责执行实际的上下楼操作。这个过程涉及多个精心设计的步骤。
3.3.1 楼梯前沿点生成
当检测到有效楼梯后,系统在楼梯区域的中点位置创建一个特殊的前沿点 。这个前沿点与普通的探索前沿点不同,它代表了一个楼层转换的机会。
3.3.2 动态中间路点导航
在接近楼梯后,机器人的导航目标切换为动态中间路点(dynamic intermediate waypoint)。这个路点始终位于机器人当前位置前方 米处,鼓励机器人持续向前移动,避免在楼梯中途停止或发生定位漂移。
实际实现:跨楼层导航逻辑集成在主导航流程中。关键代码片段:
# ascent/mapping/obstacle_map.py:710-735 (楼梯前沿点生成)
if np.sum(self._up_stair_map == 1) > 20:
self._up_stair_map = cv2.morphologyEx(self._up_stair_map.astype(np.uint8),
cv2.MORPH_CLOSE, self._navigable_kernel)
# 连通域分析,找到最大楼梯区域
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(
self._up_stair_map, connectivity=8)
max_area = 0
max_label = 1
for i in range(1, num_labels):
area = stats[i, cv2.CC_STAT_AREA]
if area >= min_area_threshold:
if area > max_area:
max_area = area
max_label = i
# 生成楼梯前沿点(质心位置)
self._up_stair_frontiers_px = np.array([[centroids[max_label][0],
centroids[max_label][1]]])
self._up_stair_frontiers = self._px_to_xy(self._up_stair_frontiers_px)
self._has_up_stair = True
关键参数:动态路点距离 米,最大爬楼步数 步。系统采用两阶段策略:导航到楼梯区域后,使用动态路点持续向前移动直到完成楼层切换。失败时标记到黑名单 _disabled_stair_map。
3.3.3 楼层转换验证与记录
对于未探索的楼梯,机器人会持续爬行直到到达对面出口。对于已经通过的楼梯,系统会利用记录的起点和终点坐标进行直接导航,提高效率。
如果爬楼过程超过 步(约为总任务步数的10%),系统判定该楼梯不可通行,机器人返回原位置并将该楼梯标记到黑名单中。这种失败处理机制确保了系统的鲁棒性。
3.3.4 多楼层地图管理
完成楼层转换后,系统更新其多楼层地图列表。每个楼层维护独立的BEV地图,形成地图列表如 和 。
当多个楼梯连接相同的楼层时,机器人在初次探索时会尝试新楼梯,但在后续访问中会优先选择已成功通过的楼梯或面积最大的楼梯,确保高效的楼层重访。
这种设计避免了MFNP等方法中存在的地图重叠问题,为每个楼层提供了清晰独立的空间表示,同时通过楼梯连接关系建立了楼层间的拓扑结构。
4. 粗到精推理模块:高效的上下文感知决策
粗到精推理模块是ASCENT实现高效导航的关键。该模块巧妙地结合了视觉-语言模型(VLM)的快速评估能力和大语言模型(LLM)的深度推理能力,在保证决策质量的同时大幅降低了计算成本。
4.1 设计动机:平衡效率与推理能力
现有的零样本导航方法在决策策略上存在两个极端:
一方面,像VLFM这样的方法采用贪心策略,每次选择语义相似度最高的前沿点。这种方法虽然快速,但缺乏全局规划能力,容易陷入局部最优,导致在相似区域之间反复振荡。
另一方面,像L3MVN和InstructNav这样的方法在每个决策步都调用LLM进行推理。虽然推理能力强,但频繁的API调用导致高延迟(每次调用数秒)和高成本(每个任务可能需要数十到上百次调用)。在实验中,这类方法平均每个任务需要35到149次LLM调用,严重影响了实时性。
ASCENT的粗到精推理策略在这两个极端之间找到了最佳平衡点:默认使用快速的VLM进行粗粒度评估,仅在关键决策点才调用LLM进行细粒度推理。
4.2 粗粒度评估:VLM驱动的快速筛选
粗粒度评估阶段的目标是快速识别出最有价值的前沿点候选集。这个过程完全基于VLM,不涉及LLM调用。
4.2.1 场景描述生成
对于每个检测到的前沿点,系统在其对应的观测时刻t',使用场景分类模型和图像标注模型生成结构化的场景描述。这个描述包含两个关键信息:
- • 房间类型(如客厅、卧室、厨房等)• 场景中的物体列表(如沙发、桌子、电视等)
area_descriptions = []
for i, step in enumerate(self.frontier_step_list[env]):
try:
room = object_map[env].each_step_rooms[step] or "unknown room"
objects = object_map[env].each_step_objects[step] or "no visible objects"
if isinstance(objects, list):
objects = ", ".join(objects)
area_description = {
"area_id": i + 1,
"room": room,
"objects": objects
}
area_descriptions.append(area_description)
except (IndexError, KeyError) as e:
logging.warning(f"Error accessing room or objects for step {step}: {e}")
continue
系统通过 ObjectPointCloudMap 类的 each_step_rooms 和 each_step_objects 属性维护历史观测记录,在构建LLM提示时动态组装场景描述。
4.2.2 前沿点排序与候选集生成
系统根据探索价值地图 对所有可用前沿点进行排序,选择得分最高的 个前沿点作为候选集。这些候选点的场景描述被缓存起来,供后续的细粒度决策使用。
在大多数情况下,系统直接选择得分最高的前沿点进行探索,无需调用LLM。这种策略在局部探索阶段非常高效。
4.3 细粒度决策:LLM驱动的上下文推理
细粒度决策阶段只在特定条件满足时才被触发,这是ASCENT实现高效率的关键设计。
4.3.1 触发条件
LLM推理仅在同时满足以下两个条件时才被激活:
1. 所有前沿点都较远:(所有前沿点距离都超过阈值,通常设为3米)
2. 有足够的选项:(可用前沿点数量不少于k个,通常设为3)
这个设计的直觉是:当机器人周围有近距离的前沿点时,应该优先进行局部探索,无需复杂推理;只有当局部区域已充分探索,需要进行远距离决策时,才值得调用LLM进行深度分析。
def _try_nearby_frontier(self, sorted_pts, sorted_values, robot_xy, env):
# 提取近邻前沿的逻辑
distances = [np.linalg.norm(frontier - robot_xy) for frontier in sorted_pts]
close_frontiers_info = [
(idx, frontier, distance)
for idx, (frontier, distance) in enumerate(zip(sorted_pts, distances))
if distance <= self.nearby_distance # nearby_distance = 3.0
]
if close_frontiers_info:
closest_frontier_info = min(close_frontiers_info, key=lambda x: x[2])
best_frontier_idx = closest_frontier_info[0]
return sorted_pts[best_frontier_idx], sorted_values[best_frontier_idx], True
return None, None, False
核心参数:nearby_distance = 3.0 米(第30行),topk = 3(第31行)。如果存在距离小于等于 米的前沿点,直接选择最近的前沿点,跳过LLM推理;否则进入LLM决策流程。
4.3.2 楼层间推理:是否切换楼层
当存在楼梯相关的前沿点 时,LLM首先进行楼层间推理,决定是否应该切换楼层。这个决策基于以下信息:
• 缓存的楼层描述:每个楼层的房间类型和物体分布
• 学习的物体先验:从训练集统计得到的物体-楼层关联概率
• 当前楼层的探索程度:已探索区域的比例
系统会向LLM提供结构化的提示,例如:
任务:找到"电视机"
当前楼层(1楼)观察到的场景:
- 客厅:沙发、茶几、书架
- 厨房:冰箱、炉灶、餐桌
- 已探索比例:85%
其他楼层(2楼)的楼梯可达,但尚未探索。
根据常识,电视机通常出现在:
- 客厅(概率:70%)
- 卧室(概率:20%)
- 其他(概率:10%)
问题:是否应该切换到2楼继续搜索?
LLM基于这些上下文信息进行推理,输出是否切换楼层的决策。为了避免频繁的楼层切换,系统还设置了最小时间间隔( 步)和楼层完全覆盖的策略约束。
4.3.3 楼层内推理:选择最相关的区域
如果决定留在当前楼层,LLM会分析可用前沿点的语义描述,选择与任务目标最相关的位置。这个过程考虑:
• 房间类型与目标物体的关联性:例如,寻找"床"时优先选择卧室方向的前沿点
• 已观察到的物体线索:例如,在寻找"电视"时,如果某个前沿点附近观察到了"沙发",则该方向更有可能
• 空间布局的合理性:例如,厨房通常与餐厅相邻
def llm_analyze_single_floor(self, env, target_object_category, frontier_index_list,
obstacle_map, object_map):
# 构建提示
prompt = self._prepare_single_floor_prompt(target_object_category, env,
obstacle_map, object_map)
# 调用LLM
response = self._llm.chat(prompt)
# 解析响应
if response == "-1":
temp_frontier_index = 0
else:
try:
response_dict = json.loads(response.replace("n", "").replace("r", ""))
index = response_dict.get("Index", "N/A")
reason = response_dict.get("Reason", "N/A")
if 1 <= int(index) <= len(frontier_index_list):
temp_frontier_index = int(index) - 1
else:
temp_frontier_index = 0
except (json.JSONDecodeError, ValueError):
temp_frontier_index = 0
return frontier_index_list[temp_frontier_index]
系统使用知识图谱提供物体-房间关联先验概率(get_room_probabilities 方法,第339-368行),结合当前观测到的场景信息,让LLM选择最相关的探索方向。
4.4 效率优化分析
粗到精推理策略的效率优势体现在多个方面:
LLM调用次数的大幅减少:实验数据显示,ASCENT平均每个任务只需要2.0-2.7次LLM调用,而之前的LLM规划方法需要35.0-149.4次。这意味着LLM调用次数减少了90%以上。
决策质量的保持:尽管大幅减少了LLM调用,ASCENT的导航成功率反而更高。这是因为系统在关键决策点(远距离选择、楼层切换)才使用LLM,而在局部探索时使用更快的VLM评估,避免了过度规划导致的延迟。
实时性的提升:减少LLM调用直接降低了任务执行时间。在实验中,ASCENT的平均任务时间比频繁调用LLM的方法快30-50%。
这种设计体现了"在正确的时机使用正确的工具"的原则:VLM擅长快速的语义匹配,LLM擅长复杂的上下文推理,将两者结合起来实现了效率和效果的双重优化。
5. 总结与展望
ASCENT的提出标志着机器人导航技术向真实世界应用迈出了重要一步。通过解决多楼层导航这一长期被忽视但至关重要的问题,ASCENT为服务机器人在复杂建筑环境中的部署扫清了技术障碍。其创新的多楼层抽象机制和高效的粗到精推理策略,不仅提升了导航性能,也为未来的研究提供了新的方向。
随着视觉-语言模型和大语言模型技术的不断进步,我们有理由相信,结合这些强大的基础模型,机器人将能够在更复杂、更动态的环境中实现真正的自主导航。ASCENT的工作为这一愿景的实现提供了坚实的技术基础。
458