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 预测组织成可修正的假设图 | 拓扑记忆数据结构参考 |
三条硬约束(决定复用边界):
-
Jetson Nano 4GB 跑不动 VLFM 全套(GroundingDINO + MobileSAM + YOLOv7 + PointNav 权重),只读逻辑不跑代码。
-
AgentVLN 的 3B 模型能否在 Jetson Nano 上跑需实测;跑不动就保留 GLM-4V 云端调用,但借用其技能接口设计。
-
我们有官方 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 拿到这份文档后,按以下顺序操作:
-
先读第 0 节的"三条硬约束",不要试图 clone VLFM/OpenFrontier 全套跑起来------算力不够,环境不兼容。
-
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。 -
M2 的 frontier 提取自己写 ,不要 import OpenFrontier 的模型。参考 SCOPE 的选择策略公式即可,不需要它的训练代码。
-
M3 的 prompt 从
vlm_prompts.py开始改,默认用模式A(纯场景描述),模式B(frontier 重排序)作为对比实验的可选项,不要作为主线。 -
拓扑记忆 schema 直接抄第 4.4 节的 JSON 结构,字段名不要改,方便和 Hypothesis Graph Refinement/TopoNav 的论文表述对齐。
-
恢复状态机参考 LERR-NAV 的伪代码逻辑,但用规则实现,不要引入它的训练部分。
-
每个模块完成后,在 README 里记录"参考了哪个仓库的哪个文件/函数",答辩时这是"调研深度"的证据。
不要做的事:
-
不要 clone AgentVLN 后试图把它整个接进 JetAuto------它的技能库是它自己定义的,你们要做的是把技能替换成 JetAuto 官方接口,只借用它的抽象方式。
-
不要把 VLFM 的 GroundingDINO+MobileSAM 塞进 Jetson Nano------显存和算力都不够。
-
不要让 VLM 输出连续速度或像素坐标------坚持离散选择(frontier ID 或方向词),这是你们方案在算力受限下的核心优势。