JetAuto VLN语义目标探索

JetAuto 语义目标探索 ------ 总体方案与框架(v2,含开源参考映射)

硬件:HIWONDER JetAuto(Jetson Nano,麦轮底盘,LiDAR + 深度相机)。六麦阵列是否存在待确认 。无语音盒,语音链路需自建(ESP32-C6 + 官方/自写 ASR/TTS)。

目标:未知环境下,用户给出目标物体名称,小车自主探索建图,用 VLM 识别场景,写入全局拓扑 JSON 记忆,直到找到目标。

0. 开源调研结论与复用策略

项目 仓库 与我们的关系 复用方式
AgentVLN (ECCV 2026) Allenxinn/AgentVLN 最接近:VLM-as-Brain + 技能调用,3B 模型,支持 Jetson 边缘实时 主线参考:技能库抽象、VLM 与技能调用接口、Jetson 部署配置
OpenFrontier 论文 OpenReview ER9ebVLq29;前序 FrontierNet 高度相关:把导航建模为"离散子目标识别",set-of-mark prompting 让 VLM 给 frontier 打分 frontier-VLM 接口参考:VLM 对 frontier 重排序的 prompt 结构
VLFM (ICRA 2024) rai-opensource/vlfm frontier + VLM value map,真机 Spot 验证;但计算图重(GroundingDINO+MobileSAM+YOLOv7) 只借鉴 frontier 价值评估逻辑,不跑全套
vlm-exploration aarush3002/vlm-exploration ROS + Habitat 的 VLM 引导 frontier 探索,代码结构清晰 参考 ROS 节点组织;环境接口需替换为 JetAuto 真机
InternNav InternRobotics/InternNav Habitat/Isaac 上的离散动作空间 VLN-CE 工具箱,有真机部署代码 实验设计参考:离散动作空间定义、VLN-CE 评测协议
Odin-Nav-Stack Robotic-Developer-Road/Odin-Nav-Stack ROS1 + Jetson Orin 的语义导航栈,模块化高;但 SLAM 部分不开源 参考 ROS1 节点组织与语义导航接口,不复用定位/建图
LERR-NAV kim-os/LERR-Nav 显式协调探索/恢复/回忆 恢复状态机参考
SCOPE mrwangyou/SCOPE 语义认知驱动的 frontier 潜力探索 frontier 选择策略参考
Hypothesis Graph Refinement chenpppx/Hypothesis_Graph_Refinement frontier 预测组织成可修正的假设图 拓扑记忆数据结构参考

三条硬约束(决定复用边界):

  1. Jetson Nano 4GB 跑不动 VLFM 全套(GroundingDINO + MobileSAM + YOLOv7 + PointNav 权重),只读逻辑不跑代码。

  2. AgentVLN 的 3B 模型能否在 Jetson Nano 上跑需实测;跑不动就保留 GLM-4V 云端调用,但借用其技能接口设计。

  3. 我们有官方 LiDAR SLAM 提供几何地图 ,可以跳过 AgentVLN/OpenFrontier 里"从 RGB 预测 frontier"或"3D 路径投影到 2D"的最耗算力部分,只复用高层决策接口和记忆组织方式。

1. 总体架构(标注每块的参考来源)

text

复制代码
┌──────────────────── JetAuto 官方底层(已就绪)────────────────────┐
│ LiDAR + 深度相机 → SLAM(Gmapping/Cartographer)→ 栅格地图        │
│ move_base / TEB → 速度指令 → 麦轮底盘                             │
│ [不参考开源项目,直接用官方 launch]                                │
└──────────────────────────────┬──────────────────────────────────┘
                               │ /map、/amcl_pose、导航 action
┌──────────────────────────────▼──────────────────────────────────┐
│ ★ 探索决策节点(核心工作)                                        │
│  1. frontier 提取:栅格扫描(不用 OpenFrontier 的 RGB 预测)      │
│  2. frontier 选择:可参考 SCOPE 的语义潜力评分                    │
│  3. 导航到观察位:调官方 move_base                               │
│  4. 到达触发抓帧 → 调 VLM                                        │
│  5. 写入拓扑 JSON:[数据结构参考 Hypothesis Graph Refinement]     │
│  6. 目标匹配 → 停止或继续                                         │
│  [整体状态机结构参考 AgentVLN 的 Skill Calling 抽象]              │
└──────────────────────────────┬──────────────────────────────────┘
                               │ 观察点触发
┌──────────────────────────────▼──────────────────────────────────┐
│ ★ VLM 调用层                                                     │
│ 模式A(默认):GLM-4V 云端,prompt 要求 JSON 场景描述             │
│ 模式B(备选):本地 Qwen2.5-VL-3B [参考 AgentVLN 部署配置]        │
│ Prompt 结构参考 OpenFrontier 的 set-of-mark prompting            │
│ [若采用 frontier 重排序:把 frontier 作为视觉标记喂给 VLM]         │
└─────────────────────────────────────────────────────────────────┘

┌──────────────────── ★ 语音链路(无六麦时自建)────────────────────┐
│ ESP32-C6:唤醒 + 采集 [参考小智框架/ESP-SR]                       │
│ Jetson:ASR(Vosk/云端)→ 文本指令                                │
│ TTS(Piper/官方)→ 扬声器                                         │
└─────────────────────────────────────────────────────────────────┘

┌──────────────────── ★ 恢复状态机 ────────────────────────────────┐
│ 卡住检测 → 后退+环视 → 重新调 VLM                                │
│ [状态机设计参考 LERR-NAV 的探索/恢复/回忆协调]                    │
└─────────────────────────────────────────────────────────────────┘

2. 模块划分与参考映射

模块 职责 参考项目与具体复用点 优先级
环境确认 套件版本、ROS 版本、large_models 路径、六麦有无、Jetson 显存 无 P0
SLAM/导航对接 跑通官方建图与多点导航 官方 launch;不参考开源 P0
frontier 提取 从 OccupancyGrid 找未知区域边界 自己写 numpy 扫描;不采用 OpenFrontier/VLFM 的 RGB 预测 frontier(算力不够且我们有地图) P0
frontier 选择策略 最近优先 / 信息增益优先 / 混合 参考 SCOPE 的语义潜力评分思路;参考 OpenFrontier 的 VLM 重排序接口(可选) P0
探索调度器 状态机:选点→导航→观察→记录 参考 AgentVLN 的 Skill Calling 抽象:把"导航""抓帧""调VLM""写记忆"定义为可调用技能 P0
VLM 调用 抓帧 → 调模型 → 解析 JSON 模式A:官方 agent_process 或自写;模式B:参考 AgentVLN 的 Qwen2.5-VL-3B Jetson 部署 ;prompt 结构参考 OpenFrontier 的 set-of-mark prompting P0
拓扑记忆 全局 JSON 节点/边读写,目标匹配 schema 参考 Hypothesis Graph Refinement 的可修正假设图结构;节点字段参考 TopoNav(Node ID/Position/Objects/Room/Frontier count) P0
恢复状态机 卡住检测 → 后退+环视 → 重试 参考 LERR-NAV 的探索/恢复/回忆协调;参考 vlm-exploration 的 ROS 节点组织方式 P1
语音输入 唤醒 + ASR → 文本指令 ESP32 侧参考小智框架/ESP-SR;无开源 VLN 项目可参考 P1(可降级为文本输入)
语音输出 TTS 播报"找到/未找到" Piper/官方 TTS P1
实验设计 有/无记忆对比、frontier 策略对比、失败案例 参考 InternNav 的离散动作空间定义与 VLN-CE 评测协议,作为报告中的学术参照 P0(贯穿)

3. 核心数据流(一次探索循环,标注参考点)

text

复制代码
1. 接收指令(语音或文本):“找沙发”
2. 循环:
   a. 读官方地图 → 提取 frontier 候选点
      [numpy 栅格扫描;不用 OpenFrontier 的 RGB 预测]
   b. 按策略选一个 frontier
      [可选:参考 OpenFrontier,把 frontier 作为视觉标记喂 VLM 重排序]
      → 调 move_base 到其附近观察位
   c. 到达后停住 → 抓一帧 RGB
   d. 调 VLM:prompt 注入“正在找沙发”+ 最近 2~3 条记忆摘要
      [prompt 结构参考 OpenFrontier set-of-mark;技能调用方式参考 AgentVLN]
      → 返回 {objects: [...], brief: "...", target_visible: bool}
   e. 写入全局拓扑 JSON:新节点
      [schema 参考 Hypothesis Graph Refinement + TopoNav]
   f. 若 objects 含目标同义词 → 停止,TTS 播报“找到沙发”
   g. 若 frontier 耗尽 → 停止,播报“未找到”
   h. 若检测到卡住 → 触发恢复状态机 [参考 LERR-NAV] → 回到 a

4. 关键算法(含参考来源)

4.1 frontier 提取(自写,不参考开源)

text

复制代码
grid = OccupancyGrid.data  # -1未知, 0空闲, 100占用
for each free cell (0):
    if 8邻域中存在未知 cell (-1):
        标记为 frontier 候选
聚类相邻候选 → frontier 簇中心作为候选点
过滤:距离 < 0.3m、位于障碍物内、已访问过的簇

为什么不采用 OpenFrontier/VLFM 的 RGB frontier 预测 :它们从单帧 RGB 预测 frontier 像素和信息增益,需要训练过的 FrontierNet 或重型检测器;我们有 LiDAR SLAM 的几何地图,直接扫描栅格更准、更省算力。只借用它们"用 VLM 对 frontier 重排序"的高层接口。

4.2 frontier 选择策略(可配置,用于对比实验)

  • 最近优先:欧氏距离最小

  • 信息增益优先:frontier 簇的未知邻域面积 / 路径长度

  • 语义潜力优先 (参考 SCOPE ):frontier 方向与目标类别的语义相关性;若采用 VLM 重排序,参考 OpenFrontier 的 set-of-mark prompting------把 frontier 在图像上标记出来,让 VLM 判断"哪个 frontier 最可能通向目标"

  • 混合 :score = w1·(-距离) + w2·信息增益 + w3·语义分,权重进 config

4.3 VLM Prompt(场景描述 + 可选 frontier 重排序)

模式A:纯场景描述(默认,最稳)

text

复制代码
你是机器人的视觉感知模块。机器人正在寻找【目标物体】。
根据当前图像,用严格 JSON 输出:
{"objects": ["..."], "brief": "一句话描述当前视角", "target_visible": true/false}
不要输出 JSON 以外的内容。
上下文(最近观察):{最近2~3条JSON记忆摘要}

模式B:frontier 重排序(参考 OpenFrontier set-of-mark prompting,可选)

text

复制代码
图像中已用彩色标记标出若干可探索方向(frontier)。
机器人正在寻找【目标物体】。根据当前图像和标记,判断哪个标记最可能通向目标。
用严格 JSON 输出:{"best_frontier_id": <id>, "reason": "一句话"}

AgentVLN 的 Cross-space Representation Mapping 思路可参考:先把可行路径投影到图像空间,再让 VLM 在图像空间做离散选择,而不是回归连续坐标。

4.4 拓扑记忆 schema(参考 Hypothesis Graph Refinement + TopoNav)

json

复制代码
{
  "target": "沙发",
  "nodes": [
    {
      "id": 1,
      "position": {"x": 1.2, "y": 0.5},
      "objects_seen": ["茶几", "电视"],
      "brief": "客厅左侧,有茶几和电视",
      "room_type": "客厅",
      "frontier_count": 3,
      "visited": true,
      "confidence": 0.8,
      "timestamp": "..."
    }
  ],
  "edges": [[1, 2], [1, 3]],
  "status": "exploring"
}
  • confidence 字段参考 Hypothesis Graph Refinement 的"可修正假设"思想:VLM 低置信观察可被后续观察修正。

  • room_type 参考 TopoNav 的房间类型字段。

5. 技术选型表(含开源参考)

层 选择 开源参考与取舍
ROS 版本 ROS2(优先) InternNav 偏 ROS2/Habitat;Odin-Nav-Stack 是 ROS1,可参考节点组织
SLAM 官方 Gmapping/Cartographer 不参考开源
导航 官方 move_base + TEB 不参考开源
frontier 提取 自写 numpy 栅格扫描 不采用 OpenFrontier/VLFM 的 RGB 预测
frontier 重排序 可选,VLM + set-of-mark 参考 OpenFrontier 的 prompt 结构
技能抽象 自写状态机 参考 AgentVLN 的 Skill Calling:导航/抓帧/调VLM/写记忆作为独立技能
VLM 模式A GLM-4V 云端 官方 agent_process 或自写 requests
VLM 模式B Qwen2.5-VL-3B 本地 参考 AgentVLN 的 Jetson 部署配置;需实测 Jetson Nano 4GB 显存
恢复状态机 规则状态机 参考 LERR-NAV 的探索/恢复/回忆协调
拓扑记忆 JSON + 原子写 参考 Hypothesis Graph Refinement 的可修正假设图;节点字段参考 TopoNav
语音唤醒 ESP-SR / 小智框架 无 VLN 项目参考
ASR Vosk(本地)或云端 无 VLN 项目参考
TTS Piper / 官方 TTS 无 VLN 项目参考
实验评测 自定指标 + VLN-CE 参照 参考 InternNav 的离散动作空间与评测协议

6. 目录结构(标注参考来源)

text

复制代码
jetauto_semantic_explore/
├── explore_node/              # ROS2 包
│   ├── frontier_extractor.py  # 地图 → frontier 候选(自写,numpy 扫描)
│   ├── frontier_selector.py   # 选点策略 [参考 SCOPE 语义评分;可选 OpenFrontier 重排序]
│   ├── skill_manager.py       # 技能抽象:导航/抓帧/调VLM/写记忆 [参考 AgentVLN Skill Calling]
│   ├── explorer.py            # 主状态机 [参考 AgentVLN 技能调度]
│   ├── vlm_client.py          # 抓帧 + 调 VLM + 解析 JSON [模式B 参考 AgentVLN 部署]
│   ├── vlm_prompts.py         # prompt 模板 [参考 OpenFrontier set-of-mark]
│   ├── memory.py              # 拓扑 JSON 读写 + 目标匹配 [参考 Hypothesis Graph Refinement + TopoNav]
│   ├── recovery.py            # 卡住检测 + 恢复 [参考 LERR-NAV]
│   └── config.py              # 策略权重、prompt、模型名、阈值
├── voice/                     # 语音链路(P1)
│   ├── esp32_firmware/        # ESP32-C6 唤醒+采集 [参考小智框架/ESP-SR]
│   ├── asr.py                 # Vosk/云端 ASR
│   └── tts.py                 # Piper/官方 TTS
├── experiments/               # 对比实验脚本与数据 [评测协议参考 InternNav]
├── memory/                    # 运行时 JSON 记忆
└── README.md                  # 环境搭建 + 各模块参考来源索引

7. 里程碑计划(按任务,含参考项目验收点)

里程碑 内容 参考项目 验收标准
M0 环境确认 套件版本、ROS 版本、large_models 路径、六麦有无、Jetson 显存 无 一份环境清单;明确 VLM 走云端还是本地 3B
M1 官方底层跑通 SLAM 建图 + move_base 多点导航 官方 launch RViz 点目标点,小车能到达
M2 frontier + 调度器 提取 frontier、选点、导航、到达停住抓帧 frontier 提取自写;技能抽象参考 AgentVLN ;选择策略参考 SCOPE 小房间内自动探索 2~3 个 frontier,抓帧保存(暂不调 VLM)
M3 VLM + 记忆闭环 VLM 调用、JSON 解析、写入拓扑、目标匹配 prompt 参考 OpenFrontier ;记忆 schema 参考 Hypothesis Graph Refinement ;模式B 部署参考 AgentVLN 指令"找沙发",经过 3~5 观察点,看到则停并播报,未看到则继续到 frontier 耗尽
M4 恢复状态机 卡住检测、后退环视、重试 参考 LERR-NAV 人为制造卡住场景,系统能在 2 次内恢复
M5 语音链路 ESP32 唤醒 + ASR + TTS,接入指令入口 小智框架/ESP-SR 语音说"找沙发"触发探索;找到后语音播报。未跑通则降级为文本输入
M6 实验与报告 有/无记忆对比、frontier 策略对比、失败案例 评测协议参考 InternNav 定量数据 + 已知局限章节 + 演示视频

依赖关系:M1 → M2 → M3 是主线;M4 可在 M3 后并行;M5 优先级低于 M3/M4;M6 在 M3 完成后即可开始积累数据。

8. 风险与对策(含开源复用风险)

风险 对策
六麦是否存在不确定 M0 确认;无则 ESP32 方案,语音降级为 P1
JetAuto 无 large_models 包 M0 确认;无则自写 VLM 客户端,预留 1 周
Qwen2.5-VL-3B 在 Jetson Nano 4GB 跑不动 M0 实测显存;跑不动则保留 GLM-4V 云端,只借用 AgentVLN 的技能接口设计,不强行本地部署
VLFM 全套计算图太重 只读其 frontier 价值评估逻辑,不跑 GroundingDINO+MobileSAM+YOLOv7
frontier 在狭窄区域误判 过滤最小簇面积、与障碍物距离;失败案例写入报告
VLM 光线不足误识别 prompt 要求 target_visible 置信表达;失败案例写入报告
开源项目环境接口与 JetAuto 不兼容 vlm-exploration 跑 Habitat,Odin-Nav-Stack 依赖 Odin1 不开源------只参考代码结构,不试图直接跑通
语音链路拖慢主线 M5 严格排在 M3/M4 之后;答辩前未通就用文本输入
ROS1/ROS2 迁移成本 M0 确认官方课程重心,优先用官方能跑通的版本

9. Agent 复现指引(最重要的部分)

Agent 拿到这份文档后,按以下顺序操作:

  1. 先读第 0 节的"三条硬约束",不要试图 clone VLFM/OpenFrontier 全套跑起来------算力不够,环境不兼容。

  2. M0 必须实测两件事 :large_models 包是否存在;Jetson Nano 4GB 能否加载 Qwen2.5-VL-3B(nvidia-smi 看显存,python -c "import torch; print(torch.cuda.is_available())" 看 CUDA)。这两个结果决定 VLM 走模式A还是模式B。

  3. M2 的 frontier 提取自己写 ,不要 import OpenFrontier 的模型。参考 SCOPE 的选择策略公式即可,不需要它的训练代码。

  4. M3 的 prompt 从 vlm_prompts.py 开始改,默认用模式A(纯场景描述),模式B(frontier 重排序)作为对比实验的可选项,不要作为主线。

  5. 拓扑记忆 schema 直接抄第 4.4 节的 JSON 结构,字段名不要改,方便和 Hypothesis Graph Refinement/TopoNav 的论文表述对齐。

  6. 恢复状态机参考 LERR-NAV 的伪代码逻辑,但用规则实现,不要引入它的训练部分。

  7. 每个模块完成后,在 README 里记录"参考了哪个仓库的哪个文件/函数",答辩时这是"调研深度"的证据。

不要做的事:

  • 不要 clone AgentVLN 后试图把它整个接进 JetAuto------它的技能库是它自己定义的,你们要做的是把技能替换成 JetAuto 官方接口,只借用它的抽象方式。

  • 不要把 VLFM 的 GroundingDINO+MobileSAM 塞进 Jetson Nano------显存和算力都不够。

  • 不要让 VLM 输出连续速度或像素坐标------坚持离散选择(frontier ID 或方向词),这是你们方案在算力受限下的核心优势。

相关推荐
tianxuanjg1 小时前
采购指南|工业无人机高强度结构件怎么选?
人工智能·经验分享·机器人·无人机·制造
好焊孙辉1 小时前
从六代螺柱焊机到AI质检:鸿栢科技的螺柱焊国产化路径
人工智能·python·科技·fpga开发
美狐美颜sdk1 小时前
直播APP开发中的视频帧处理:美颜SDK接入需要注意哪些细节?
大数据·前端·人工智能·音视频·美颜sdk
紧跟先前的步伐1 小时前
Go AI Agent 实战 12|HTTP 状态码、API 错误处理与日志
开发语言·人工智能·http·ai·golang
miofly1 小时前
Kimi K3.1 Pro 跻身智能榜第四,开源权重模型逼近头部闭源水平
人工智能
行走的小派1 小时前
Harmony输入法框架解析:IME架构、多模式输入引擎与语音识别链路
人工智能·架构·语音识别
UMI赋能企业1 小时前
AI实战交流的提问模板:从业务描述到可分析的问题
人工智能·工作流·ai应用
2601_962071001 小时前
Claude 值不值得用?价格、缓存与 API 接入成本怎么算
人工智能·缓存
自养Agent1 小时前
Agent Harness 从用到会造:prompt 不是问句,是控制面板
人工智能·大模型·llm·prompt