RPV-SemNav 深度解析:让机器人先理解房间,再决定去哪里找目标

0. 简介

RPV-SemNav 面向的是一个很具体、也很难落地的机器人任务:在没有先验地图的室内环境中,只给机器人一个自然语言目标,例如 microwave,它就要通过 RGB-D 观察、开放词汇视觉模型和地图探索,最终走到目标附近。论文的关键设计是把"当前看见的物体"和"目标物体"先映射到一个由九类房间组成的 Room Probability Vector,再用两个向量的重叠程度估计空间共现关系。冰箱、餐桌和水槽未必长得像微波炉,却更可能与微波炉同处厨房,因此它们可以成为引导搜索的语义锚点。这个思路把视觉语义、房间功能和可通行几何连接起来,形成一条无需针对当前任务重新训练的 ObjectNav 流程。

这篇文章不把 RPV-SemNav 只当作一张结果表来介绍,而是沿着一次完整的导航 episode 拆开系统:目标如何进入策略,Mask2Former、YOLOE 和 SAM3 如何形成物体地图,CLIP 如何产生 RPV,FMM 如何把语义分数投影到自由空间,frontier 如何在未知边界上被排序,最后又怎样由 PointNav 控制器执行动作。阅读时可以把它当成一个"从论文公式走到 Python 调用链"的工程导读。论文报告的最终版本 RPV-V2 在 HM3D 验证集上达到 SR 0.539、SPL 0.307,相比 VLFM 的相对提升约为 3% 和 1.3%;这个增益不大,却能说明一个重要问题:在零样本导航里,中间语义表示是否贴近空间结构,往往比单纯增加模型规模更直接地影响搜索方向。

1. ObjectNav 到底难在哪里

1.1 从找微波炉开始

假设机器人从客厅中央出发,目标是微波炉。第一帧 RGB 图像里可能只有沙发、电视、茶几和一面墙,目标完全不在视野内。一个只做图像相似度匹配的策略很容易把电视当成重要线索,因为电视和"微波炉"都属于家电,或者把沙发附近的开阔区域当作值得优先探索的地方。人类会使用更强的功能常识:微波炉通常在厨房,厨房常见冰箱、烤箱、水槽和餐桌;看到其中任何一个物体,都意味着搜索范围可以向厨房方向收缩。ObjectNav 的难点不在于机器人能否识别一个物体,而在于目标不可见时,能否把局部观察转化成下一段空间的合理假设。

这里的关键是把"目标识别"和"目标搜索"分开。目标识别是一个感知问题,要求模型在图像中找到微波炉的像素和深度;目标搜索则是一个决策问题,要求机器人在目标尚未出现时选择一片值得进入的未知区域。前者可以由开放词汇检测器和分割器完成,后者需要语义先验、几何地图和探索策略共同作用。RPV-SemNav 的设计重点落在第二个问题上:它不声称已经知道目标的确切位置,而是用看到的物体估计"哪些房间更可能包含目标",再把这个估计转换成 frontier 的优先级。

直觉理解:机器人不是在每一步猜"目标就在这一个像素后面",而是在维护一组可更新的假设:"厨房方向的未知边界,比卧室方向的未知边界更值得先走过去看看"。

1.2 几何地图和语义地图的分工

机器人探索未知环境时,几何地图负责回答"哪里能走"。RGB-D 相机提供颜色和深度,里程计把连续观测变换到 episode 坐标系,ObstacleMap 记录自由空间、障碍物和已经观察过的区域,frontier 则是自由空间与未知空间的边界。语义地图回答的是另一件事:"哪里更可能找到目标"。RPV-SemNav 没有把两者混成一个黑盒策略,而是先在语义空间计算物体关联,再在几何地图上进行受障碍物约束的传播,最后只对当前真实可达的 frontier 做排序。

换句话说,几何信息负责给语义信息划边界,语义信息负责给几何探索排序。一个厨房线索即使分数很高,也不能让信号穿过实体墙直接影响墙另一侧的候选点;一个几何上很近的走廊 frontier,如果附近没有任何支持目标的语义证据,也不应该因为欧氏距离短而自动成为首选。这样的分工让系统每一层都能解释:检测器产生了什么,RPV 认为哪些物体相关,FMM 让信号沿哪条通路传播,frontier 最终为什么排在第一位。

进一步看,这种分工也让系统适合做失败分析:如果高分区域跨越了墙体,应当检查自由空间掩码和传播模式;如果相关物体没有贡献,应当检查分割掩码、深度投影和标签过滤;如果机器人在合理区域反复徘徊,则应当检查 frontier 历史和循环抑制,而不是笼统地归因于"模型不够聪明"。

2. RPV-SemNav 的整体流程

2.1 输入、输出与三种运行状态

系统每一步接收 RGB-D 观测、相机到 episode 的变换、深度范围、相机内参和当前目标名称。输出不是一个连续速度,而是离散动作集合中的 forward(0.25m)、left(30°)、right(30°) 或 stop。在 initialize 状态,策略原地旋转 12 次,获得近似 360 度的初始视野;在 explore 状态,机器人不断更新地图并选择 frontier;一旦目标在物体点云地图中被确认,系统转入 navigate,由预训练 PointNav 控制器把机器人带到目标附近。论文设置了最多 500 步、距离目标 1 米以内成功的评测条件。

代码中的状态机并没有把视觉推理和底层控制纠缠在一起。BaseObjectNavPolicy.act 先缓存观测,再根据当前模式决定是否运行完整检测;目标未找到时调用 _explore,目标已知时调用 _pointnav。探索阶段完整感知流程默认每三步运行一次,以减少重复检测;导航阶段复用已经建立的目标地图,只每三步用 SAM3 对目标做一次轻量确认。这种节流策略不会改变论文的语义模型,却直接影响真实部署时的吞吐量和显存占用。

2.2 四阶段系统结构

把方法压缩成一条数据流,可以得到四个相互衔接的阶段。第一阶段是感知:Mask2Former 将墙、地板、天花板、门窗和窗帘等低区分度区域模糊掉,YOLOE 在 LVIS 的 1203 个类别上提出开放词汇候选,SAM3 根据候选标签生成精细实例掩码。第二阶段是语义关联:CLIP 分别把目标和检测到的物体映射到九类房间名称,温度 Softmax 产生 RPV,点积得到物体与目标的共现分数。第三阶段是空间投影:实例掩码的深度中值被反投影到世界坐标,分数以带衰减的信号写入 ValueMap。第四阶段是决策:FMM 在自由空间内传播信号,frontier 取局部中值作为候选价值,最高价值点被交给 PointNav。

这里的关键是每个阶段都保留了可替换接口。YOLOE 可以被换成其他开放词汇检测器,CLIP 可以换成兼容文本嵌入的视觉语言模型,PointNav 也可以换成另一种局部控制器;只要输出的物体标签、世界坐标和 frontier 价值保持一致,RPV 的中间逻辑仍然成立。仓库还保留了 DIRECT_OBJECT_OBJECT 环境变量,用于切换到直接物体到物体相似度,这为比较"房间中介"究竟带来多少作用提供了工程上的对照开关。

从感知流水线继续往下看,还需要一幅把"物体标签如何变成探索方向"连起来的解释图。上面的官方图主要呈现视觉处理阶段,下面的 Gemini 提示词用于制作一张贯穿全文的总览插图:固定以"寻找微波炉"为任务,依次展示物体观测、房间向量、自由空间价值图和下一处 frontier。后两幅解释图沿用同一配色与小蝾螈形象,分别放大语义计算和空间决策,让读者能够在总览与细节之间来回对照。三个引用块均为可直接复制的绘图说明,生成后的插图可放在各自引用块所在位置。

读这幅总览图时,可以先只追踪两条线:一条从 RGB-D 和里程计进入地图,提供物体位置与可通行区域;另一条从目标词、检测标签和房间词表进入 RPV,提供搜索方向的语义依据。两条线在 ValueMap 汇合,frontier 再把连续的价值场转成有限个可执行候选。图角落的小蝾螈只承担系列插图的视觉引导作用,不代表算法模块,也不能作为真实尺寸的测量参照。接下来要展开的,就是第二条线为什么需要经过房间,而不是直接比较两个物体名称。

3. 为什么直接比较物体相似度不够

3.1 CLIP 相似度与空间共现的错位

CLIP 的文本嵌入擅长表达语言和视觉概念之间的接近程度,但这种接近不等价于物体在真实房间里的共现概率。微波炉和烤箱在语义空间中可能非常相近,因为它们都是厨房电器;床和沙发也可能因为家具属性而接近,但床主要指向卧室,沙发主要指向客厅。若直接计算目标词与检测标签的余弦相似度,系统得到的是"概念像不像",而不是"是否值得沿着当前空间线索继续搜索"。在墙体、门洞和房间功能都存在的环境中,这种差异会被放大:一个语言上相近的物体可能位于完全不同的房间。

核心问题在于直接相似度缺少一个能承载空间语境的中间变量。论文选择房间类型作为这个变量,是因为房间是物体共现的低维原因之一:冰箱和微波炉共享厨房语境,床和床头柜共享卧室语境,马桶和浴缸共享浴室语境。这个表示不是在数据集上学习一个固定的物体关系表,而是用 CLIP 对一个小型房间词表的响应,给任意自然语言物体生成一组可比较的房间关联。这样,开放词汇能力保留下来,空间解释也比直接标签相似度更清楚。

3.2 房间词表作为中间语义空间

论文采用九类室内房间:bathroom、bedroom、dining room、garage、kitchen、hallway、laundry、living room 和 home office。对每个物体,系统并不声称它真的有一个可校准的房间概率,而是把 CLIP 对九个房间名称的相似度归一化成一个分布。一个微波炉可能得到厨房高权重、餐厅次高权重;椅子的权重则可能分散在餐厅、客厅、书房和卧室。分布的尖锐程度还提供了一个有用信号:低熵物体通常更像明确的房间锚点,高熵物体则更像到处都可能出现的通用物件。

直观理解是,RPV 把一个难以解释的高维向量压缩成一张"房间倾向表"。表中每一列不是物体类别本身,而是一个可以被人读懂的空间语境。房间词表也不是不可修改的硬编码规则,在医院可以替换为诊室、病房和护士站,在仓库可以替换为收货区、货架区和包装区;只要文本编码器能处理这些名称,就不需要为每个新词表重新训练导航策略。它的代价是词表质量会直接影响结果,房间定义过粗会丢失区别,定义过细又可能让分布变得不稳定。

4. Room Probability Vector 的数学结构

4.1 CLIP 相似度与温度 Softmax

设房间词表为 R = { r 1 , ... , r K } \mathcal{R}=\{r_1,\ldots,r_K\} R={r1,...,rK}, e ( ⋅ ) e(\cdot) e(⋅) 表示 CLIP 文本编码器输出的向量。对于一个物体标签 o o o,系统先计算它与每个房间名称的余弦相似度。这里使用原始类别名,而不是人为添加 "a photo of" 一类 prompt 模板,目的是让比较集中在房间词表和物体词之间的相对关系上。相似度经过温度为 τ = 0.03 \tau=0.03 τ=0.03 的 Softmax 后得到长度为 K K K 的概率向量。

s o ( r i ) = cos ⁡ ( e ( o ) , e ( r i ) ) = e ( o ) ⋅ e ( r i ) ∥ e ( o ) ∥   ∥ e ( r i ) ∥ , p o ( r i ) = exp ⁡ ( s o ( r i ) / τ ) ∑ j = 1 K exp ⁡ ( s o ( r j ) / τ ) . s_o(r_i)=\cos(e(o),e(r_i))=\frac{e(o)\cdot e(r_i)}{\|e(o)\|\,\|e(r_i)\|},\qquad p_o(r_i)=\frac{\exp(s_o(r_i)/\tau)}{\sum_{j=1}^{K}\exp(s_o(r_j)/\tau)}. so(ri)=cos(e(o),e(ri))=∥e(o)∥∥e(ri)∥e(o)⋅e(ri),po(ri)=∑j=1Kexp(so(rj)/τ)exp(so(ri)/τ).

温度参数决定分布有多尖锐。温度过低会把轻微的相似度差距放大成几乎 one-hot 的房间判断,温度过高则会把所有物体都摊成接近均匀的分布,失去区分能力。论文选择 0.03,是在 CLIP 相似度范围和室内房间词表上做出的折中。必须把这个量理解成 CLIP 语义空间中的归一化关联,而不是从 HM3D 房间标注统计出的现实概率;它的可解释性来自词表和归一化形式,校准误差仍然会被视觉语言模型带入后续导航。

下面是仓库 vlfm/vlm/clip.py 中对应的核心实现。compute_text_embeddings 负责批量编码文本,cosine_vector 计算目标与候选房间的相似度,apply_softmax 完成温度缩放,最后 calculate_dot_product 把目标 RPV 与多个检测物体的 RPV 逐一配对。代码对应的不是抽象伪代码,而是仓库当前实现中真正承担 RPV 计算的四个步骤,读者可以据此把公式中的符号和张量形状一一对上。

python 复制代码
def cosine_vector(self, query: str or List[str], candidates: List[str]) -> torch.Tensor:
    q = self.compute_text_embeddings(query)
    c = self.compute_text_embeddings(candidates)
    return torch.nn.functional.cosine_similarity(
        q.unsqueeze(1), c.unsqueeze(0), dim=-1
    )

def apply_softmax(self, similarities: torch.Tensor,
                  temperature: float = 0.03) -> torch.Tensor:
    return torch.nn.functional.softmax(similarities / temperature, dim=-1)

4.2 RPV 点积如何表达共现

目标物体 o t o_t ot 和检测物体 o d o_d od 各自得到一个 RPV。论文用两个分布的点积作为房间中介的共现分数,它等价于在潜在房间变量上求和:只有两个物体在同一个房间维度上同时给出较大权重,最终分数才会升高。微波炉与冰箱在厨房维度上都高,微波炉与床则分别偏向厨房和卧室,因此前者的重叠显著更大。

A o d = cooc ⁡ ( o d , o t ) = p o d ⊤ p o t = ∑ i = 1 K p o d ( r i ) p o t ( r i ) . A_{o_d}=\operatorname{cooc}(o_d,o_t)=\mathbf{p}{o_d}^{\top}\mathbf{p}{o_t}=\sum_{i=1}^{K}p_{o_d}(r_i)p_{o_t}(r_i). Aod=cooc(od,ot)=pod⊤pot=i=1∑Kpod(ri)pot(ri).

点积的优势在于实现简单、对称且容易投影到地图,缺点是它不能表达所有方向性的条件关系。真实数据中的 P ( t ∣ o ) P(t\mid o) P(t∣o) 往往是不对称的,例如看到"水槽"对寻找"微波炉"可能很有帮助,但看到微波炉对寻找水槽的意义未必相同。论文用 HM3D 标注计算的条件共现矩阵做离线验证,RPV 点积在 Top-5 上的 Spearman 相关为 0.319、Recall@5 为 0.524、NDCG@5 为 0.715,说明它更适合做候选排序,而不应被解读为精确的现实概率估计。

python 复制代码
def calculate_dot_product(self, rpv1: torch.Tensor,
                          rpv_matrix: torch.Tensor) -> torch.Tensor:
    # rpv1: [1, K], rpv_matrix: [N, K], output: one score per detection
    return torch.matmul(rpv_matrix, rpv1.T).squeeze(-1)

仓库的策略代码先为目标调用一次 CLIP 服务,得到目标在房间词表上的分布;再把所有检测标签作为 query,重复计算它们的房间分布,并把目标分布通过 target_prob_dist 传给服务端。每个分数随后和实例的像素中心、掩码及标签一起保存,只有正分数且能成功反投影到世界坐标的实例才会写入 ValueMap。这样做把"语义相关"与"是否有可靠空间位置"分开处理,避免一个没有有效深度的检测把错误信号写进地图。

4.3 高熵物体为什么容易变成弱线索

房间分布的熵揭示了 RPV 的另一面。床、浴缸和马桶等功能单一的物体通常把质量集中在少数房间维度上,适合做强锚点;椅子、桌子、衣物和壁炉等物体可以出现在多个房间,分布更均匀,和任何目标的点积都容易落在狭窄的低分区间。论文给出的椅子归一化熵约为 0.773,这正好解释了为什么"看到一把椅子"比"看到一个马桶"更难决定下一间房。

这里要区分两个工程动作。点积本身负责判断分布是否重叠,随后使用 w = A o w=\sqrt{A_o} w=Ao 调整传播范围,是为了扩大中低分之间的可见差异,而不是把一个高熵物体凭空变成强证据。平方根会压缩高分、抬高中低分的相对可见度,配合后续的 sigma 插值,让弱关联只产生局部提示,强关联才拥有房间尺度的影响范围。传播范围是证据强弱的空间表达,不是对物体真实尺寸的估计,这一点关系到后面解释热力图时是否会把参数误读成物理测量。

w = A o , σ o = σ min ⁡ + ( s i g m a max ⁡ − σ min ⁡ ) w , σ min ⁡ = 1 m , σ max ⁡ = 5 m . w=\sqrt{A_o},\qquad \sigma_o=\sigma_{\min}+(sigma_{\max}-\sigma_{\min})w, \quad \sigma_{\min}=1\text{ m},\ \sigma_{\max}=5\text{ m}. w=Ao ,σo=σmin+(sigmamax−σmin)w,σmin=1 m, σmax=5 m.

官方热力图给出了不同物体分布的整体形态,但入门读者还需要看清一对向量究竟怎样相乘。因此第二幅解释图继续使用微波炉任务,把冰箱、床和椅子放在同一组房间坐标下比较:冰箱与目标主要在厨房维度重叠,床与目标的峰值错开,椅子的质量则散布在多个房间。下面提示词使用明确标注的人工示意分布,让读者能手工核算点积;这些数字只用于讲解公式,不是 CLIP 实测输出,也不替代上面的论文热力图。

这幅图可以直接对照前面的代码来读:四行矩阵对应批量生成的 rpv_matrix,目标微波炉这一行对应 rpv1,矩阵乘法输出右侧三个关联分数。冰箱的高分主要来自厨房列,床即使在卧室列非常集中,也无法与微波炉的峰值重叠;椅子则因分布较散提供有限提示。熵描述房间指向性,点积描述与指定目标的关联性,两者需要结合判断。分数计算完成后,下一步仍须依赖分割、深度和位姿把它落到地图,向量本身不包含物体在哪里的坐标信息。

5. 从 RGB-D 到物体地图

5.1 Mask2Former 过滤背景

开放词汇检测器面对一张室内图像时,会把墙面纹理、地板边界、窗帘和门框都当成潜在的词汇匹配区域。它们在像素上很显眼,却很少能帮助机器人区分"厨房还是卧室"。RPV-SemNav 先用 ADE20K 训练的 Mask2Former 做语义分割,把 floor、wall、ceiling 等 stuff 类别以及门、窗、窗帘区域模糊掉,再把结果交给 YOLOE。这个步骤没有增加导航策略的表达能力,却减少了开放词汇候选中的结构性噪声。

过滤背景还有一个地图层面的好处。若墙面纹理不断触发相似标签,很多错误实例会被投影到自由空间边缘,经过传播后把一大片 frontier 抬高。由于 ValueMap 会对不同标签的信号做归一化平均,错误检测越多,真正相关物体的相对优势反而越弱。先过滤,再检测,是在感知入口处控制错误信号密度的一种直接办法。

5.2 YOLOE 与 SAM3 的开放词汇感知

YOLOE 使用 LVIS 的 1203 个类别作为候选标签,并保留置信度大于 0.5 的检测框。它的职责是快速提出"画面中可能有哪些物体",而不是立即给出像素精确的实例边界。之后 SAM3 接收这些标签作为 prompt,重新生成高质量掩码并过滤掉无法稳定分割的候选。目标类别也会被强制加入 prompt 列表,使得目标出现时能够尽快进入 ObjectPointCloudMap,而不是等开放词汇检测器偶然提出它。

代码层面,检测和分割是独立的客户端服务,端口分别来自 YOLOE_PORT=12184 和 SAM3_PORT=12183。这使感知模型可以放在单独 GPU 或边缘服务器上,但也引入网络请求、模型权重和版本匹配的复现成本。论文的"零样本"描述只针对 ObjectNav 任务本身没有额外轨迹训练,并不意味着 YOLOE、SAM3、Mask2Former 和 CLIP 不需要预训练权重。

5.3 深度投影与物体位置

分割掩码真正有用的地方,是能够从像素空间进入地图坐标。仓库中的 _project_centroid_to_world 不只取中心像素的深度,而是优先使用实例掩码内部的深度中值,减少中心点落在反光、孔洞或边界上的风险。像素坐标先通过相机焦距和深度范围恢复相机坐标,再乘以 camera-to-episodic 的 4×4 变换,最后取平面上的世界坐标。只有齐次坐标有效、深度位于合法范围且投影点落在地图窗口内,实例才会被写入信号列表。

python 复制代码
world_xy = self._project_centroid_to_world(
    centroid_px, depth_obs, tf_cam, min_d, max_d,
    fx, fy, mask=mask
)
if world_xy is None or seg.get("dot_product", 0.0) <= 0:
    continue

self._value_map.add_object_signal(
    world_xy,
    float(seg["dot_product"]),
    seg.get("label", "unknown"),
)

这一步连接了视觉和导航的坐标系,也暴露出实际部署中的误差来源。深度空洞会让物体无法投影,位姿漂移会让同一物体在地图中重复出现,目标被遮挡则会推迟 ObjectPointCloudMap 的确认。RPV 分数即使完全正确,只要世界坐标偏了几米,后面的 FMM 仍会在错误位置传播;因此 RPV-SemNav 的可解释性并不等于误差消失,而是让错误可以沿着"检测、投影、传播、排序"的链条逐层定位。

6. FMM 如何让语义信号服从地图

6.1 Gaussian 与 geodesic propagation

最简单的做法是在物体中心周围盖一个欧氏高斯。它计算方便,却没有墙体概念:物体在客厅,厨房与它只隔一面薄墙时,厨房里的 frontier 可能因为平面距离很短而得到高分,即使机器人必须绕很远才能真正走过去。RPV-V1 使用的就是这种各向同性高斯传播;RPV-V2 则改用 Fast Marching Method,在自由空间速度为 1、障碍物和未知区域近似不可通行的网格上计算 travel time。

FMM 计算的不是直线距离,而是沿着当前已知自由空间的测地距离。信号遇到墙会停下,遇到门洞可以绕过去;因此价值图的高分区域与机器人实际可达的拓扑更一致。论文中的传播公式仍然使用高斯衰减,但距离项换成了 FMM 的 travel time,仓库实现还加了最大传播半径和自由空间掩码,避免信号影响无限扩张。

V ( x ) = 1 ∣ O x ∣ ∑ o ∈ O x A o exp ⁡ ( − d g e o ( x , x o ) 2 2 σ o 2 ) . V(\mathbf{x})=\frac{1}{|\mathcal{O}{\mathbf{x}}|}\sum{o\in\mathcal{O}{\mathbf{x}}} A_o\exp\left(-\frac{d{geo}(\mathbf{x},\mathbf{x}_o)^2}{2\sigma_o^2}\right). V(x)=∣Ox∣1o∈Ox∑Aoexp(−2σo2dgeo(x,xo)2).

难点提示:FMM 不是"让信号绕路画一条线",而是在自由空间上计算从种子到每个网格单元的到达时间。墙内速度被设成近似零,所以它们不会成为合法的传播通道。

6.2 自适应 sigma 与多实例聚合

仓库 ValueMap.recompute_value_map 会根据每个对象的分数先计算传播宽度。默认 decay_sigma_m=2.0 时,代码把下限设为 1 米、上限设为 5 米,再用 RPV 分数的平方根做线性插值。高关联的水槽或冰箱可以影响更大的房间范围,低关联的椅子只在邻近区域留下提示。最大传播半径默认是 6 米,因此传播范围由"衰减速度"和"硬截断"共同决定,不能把 sigma 单独理解成可到达距离。

当多个实例影响同一网格时,代码先按 label 合并实例,在同一标签内取最大信号;再把不同标签的非零信号相加并除以有效标签数,最后限制到 0 到 1。这个归一化避免"检测到很多个弱物体"的房间仅凭数量压过"检测到一个强锚点"的房间。目标相关性进入峰值和 sigma,物体数量只提供重复证据,二者在聚合阶段被刻意分离。

python 复制代码
weight = np.sqrt(np.clip(obj["score"], 0.0, 1.0))
sigma_min_m = max(0.5, self._decay_sigma_m * 0.5)
sigma_max_m = max(sigma_min_m + 0.1, self._decay_sigma_m * 2.5)
sigma_m = sigma_min_m + (sigma_max_m - sigma_min_m) * weight

if self._signal_mode == "fmm":
    crop = self._compute_fmm_crop(
        row, col, obj["score"], sigma_m * self.pixels_per_meter,
        radius_px, free_mask
    )

6.3 障碍物种子与失败回退

检测到的物体中心经常落在家具本体上,而家具在占据栅格中不是自由单元。若直接把这个点当作 FMM 种子,算法会找不到合法起点。仓库实现会在中心附近搜索占据区域的自由边界,把边界像素作为多个种子,让信号从物体表面向外扩散;如果附近没有可用边界,或者 skfmm.travel_time 计算失败,就退回各向同性 Gaussian,而不是把整块 crop 填成相同的零距离。

这里的回退逻辑很有工程价值。严格使用 FMM 会让孤立的检测、地图边缘和稀疏未知区域直接丢失语义线索;无条件使用 Gaussian 又会重新引入穿墙问题。系统在大多数情况下选择拓扑一致的 FMM,在异常输入上保留可解释但较弱的 Gaussian 结果,保证单个感知故障不会让整个策略停止。论文的消融结果也说明,这个选择带来的提升是稳健但有限的:RPV-V1 到 RPV-V2 只有 SR +0.005、SPL +0.003 的绝对变化。回退分支保住的是系统连续运行能力,不应被包装成与 FMM 等价的几何推理。

7. Frontier Scoring 与机器人动作

7.1 frontier 的定义

frontier 是已经确认的自由空间和未知空间之间的边界。它不是目标点,也不是机器人必须停下来的位置,而是一组能够继续揭示环境的候选入口。系统把相邻、距离小于 0.5 米的自由单元聚成 frontier 区域,对区域内的 ValueMap 分数取中值,再按照中值从高到低排序。使用中值而不是最大值,可以减少一个偶然的高分像素把整片区域抬成首选,也让候选评价更接近"走到这个边界附近后,整体会看到什么"。

V j = median ⁡ c ∈ C j V ( c ) , F ∗ = arg max ⁡ F j ∈ F V j . V_j=\operatorname{median}_{c\in\mathcal{C}j}V(c),\qquad F^*=\operatorname*{arg\,max}{F_j\in\mathcal{F}}V_j. Vj=medianc∈CjV(c),F∗=Fj∈FargmaxVj.

把第 6 节的传播机制与这里的 frontier 评分放在一起,才能解释"地图上看起来有价值"如何转成"机器人下一步去哪"。第三幅图沿用同一张带门洞的住宅地图,左侧展示欧氏高斯可能产生的穿墙影响,右侧展示 FMM 在已知自由空间中的传播,再放大两个候选 frontier 的中值评分。这一对照只隔离几何传播与评分逻辑,不预先宣称整次任务必然成功;真实系统还可能受未知区域、感知错误和回退分支影响。

...详情请参照古月居

相关推荐
好悬给我拽开线5 小时前
RoboJEPA:扩展机器人潜在世界模型
机器人
硅谷秋水21 小时前
AgenticRoboRL:将“编程智能体”后训练引入智能体化机器人领域
人工智能·机器学习·语言模型·机器人
敢敢のwings21 小时前
SimpleMemVLA 深度解读:把原生视频上下文变成机器人的记忆
数码相机·机器人·音视频
杜子不疼.1 天前
没有真机,我给启元 Q1 造了一台“假机器人“:官方 SDK 示例跑通实录
人工智能·机器人
todoitbo1 天前
启元机器人 Q1 SDK 接口实操:构建 aimdk_msgs 并用 ROS 2 本地 Mock 验证 Service 与 Topic
ai·机器人·二次开发·sdk·启元
lisw051 天前
智能化机器人系统的模块化设计自动化!
机器学习·机器人·自动化
敢敢のwings1 天前
TACDYN-WAM 深度解读:机器人如何预测接触变化,并据此生成动作
人工智能·机器学习·机器人
敢敢のwings1 天前
Super Odometry 2.0:相机与激光雷达退化后,机器人如何继续估计运动
人工智能·数码相机·机器人
QY_Research_1 天前
2026房地产NFT平台创业机遇与落地指南分析报告
大数据·人工智能·物联网·机器人·制造