HY-World 2.0 轨迹规划WorldNav实现原理:VLM+NavMesh+SAM3如何规划避障相机路径
【免费下载链接】HY-World-2.0HY-World 2.0: A Multi-Modal World Model for Reconstructing, Generating, and Simulating 3D Worlds项目地址: https://gitcode.com/gh_mirrors/hy/HY-World-2.0
WorldNav 是 HY-World 2.0 多模态世界模型中负责轨迹规划的核心模块:它接收一张全景图,借助 VLM 识别导航地标、SAM3 做实例分割定位、NavMesh 构建可通行网格,最终自动规划出避障相机路径,让生成的 3D 世界真正"可走进、可探索"。本文带你看懂这三者如何分工协作,以及每一层背后关键的实现技巧 🧭
WorldNav 在 HY-World 2.0 管线中的位置
HY-World 2.0 的世界生成由四个阶段串联:全景生成(HY-Pano 2.0)→轨迹规划(WorldNav)→ 世界扩展(WorldStereo 2.0)→ 世界组合(WorldMirror 2.0 + 3DGS 训练)。WorldNav 的产物不是视频,而是一组带位姿的相机轨迹——后续所有渲染、建模都沿着这些轨迹进行。
WorldNav 的难点在于,它必须同时回答三个问题:
- 看什么:场景里哪些物体值得绕着拍?(语义)
- 哪里能走:哪些地面可以站人、不能穿墙?(几何)
- 怎么走:路径既避开障碍,又保持平滑和多样性?(优化)
它的做法是"三层分工":VLM 管语义,SAM3 管像素级定位,NavMesh 管几何避障。下面逐层拆解。
第一步:VLM 识别导航地标
主流程在 traj_generate.py 中启动。默认使用Qwen/Qwen3-VL-8B-Instruct(模型名定义),通过 vLLM 服务加载。
关键在一份精心设计的导航提示词 get_navigation_instruction():
- 只收"竖着的"导航线索:树、柱子、雕像、围栏、桌椅、门、车辆、垃圾桶……
- 明确排除干扰项:地面、天花板、天空、远景山脉等"不构成垂直障碍"的元素
- 输出格式强约束:短词 JSON 列表、不带形容词、不重复描述相似物体
拿到列表后,deduplicate_ordered() 再兜底过滤 floor / ceiling / sky / wall 等词,保证 VLM 即使"说多了"也不会把地板当成障碍物。
第二步:SAM3 实例分割 + 3D 定位
VLM 只给出"有哪些物体"的文本,SAM3 则负责把它们落到像素上。SAM3 加载 后按批次(SAM_BATCH_SIZE = 4)做文本引导分割,分割主循环 对每个词找出所有实例掩码。
掩码要过三道关卡(过滤逻辑):
- 垂直方向越出全景中部区域 → 丢弃
- 横向宽度超过全景 75% → 大概率误检,丢弃
- 与已选掩码重叠超过 50% → 去重丢弃
通过筛选的掩码会被定位到 3D:find_robust_center() 只取深度值落在 25~75 分位之间的像素求质心,再用深度中位数沿射线反投影出中心点,避免深度噪声把"树"的中心算到天空上。
最终每个障碍物都带上一份完整档案:标签、3D 中心点、尺度、深度距离、朝向(Front / Right / Left / Back),写入target_camera.json,供下一步规划使用。
第三步:NavMesh 构建可通行区域
NavMesh(导航网格)来自 Recast 库,代码位于 third_party/navmesh/。构建入口是 process_single_scene(),有四个值得注意的细节:
- 自适应机器人参数:先对原点向下打一组射线估计相机离地高度(裁剪到 0.2~0.78m),再按比例推导出机器人高度、半径与最大攀爬高度——不同场景自动适配(参数自适应)
- 调用 Recast 生成网格(build_navmesh_from_mesh()):cellSize、maxSlope 等参数决定哪些面"走得上、走不上"
- 后处理:过滤过高的"屋顶面"、把断裂的岛屿用桥面连接起来(connect_navmesh_components())、只保留最大连通块
- 防穿地:向下射线把导航顶点吸附到真实地面上方 5cm,再做三角面级抗裁剪(snap_navmesh_to_surface())
第四步:Dijkstra 规划四类避障轨迹
构建网格只是"地图",NavMeshGraph 才是"导航引擎":把网格表面按 5cm 间距密集采样成节点图,KDTree 找邻居、限制相邻点高度差,然后从原点做一遍全局 Dijkstra(compute_dijkstra()),拿到"到任何节点的最短距离"这张底牌。
在此基础上生成四类轨迹(规划主逻辑):
| 轨迹类型 | 作用 | 核心思路 |
|---|---|---|
| 探索 | 看全景 | 8 方向扇区各取最远可达点(explore_agents()) |
| 目标 | 走向地标 | 在障碍物周围选视线清晰的绕行点,评分以"视线无遮挡"为主 |
| 环绕 | 绕物拍一圈 | 目标周边生成弧形路径,两端分别接入最短路 |
| 重建 | 补拍远景 | 对远景"拉伸区"规划近→远两段路径 |
其中视线检查是避障的关键:在候选点与目标之间采样 50 个位置,逐一向下打射线判断地面是否被遮挡,遮挡比例直接计入评分——路径不仅"绕得开",还要"看得清"。
轨迹平滑与去重筛选
原始路径是折线,process_trajectories() 会做 B 样条拟合(起点权重放大保证贴合),对重建轨迹还会剔除反向运动超过 120° 的片段、过滤俯仰角过大的帧,最后均匀采样并构造 4×4 相机位姿矩阵。
多条候选轨迹之间还要去重保多样(filter_and_select_diverse_trajectories()):先按几何重叠度剔除冗余,再贪心保留方向差异大于 45° 的轨迹,保证最终生成的多条相机路径彼此多样而不重复。
输出与可视化
四类轨迹会分别导出:paths.json(坐标序列)、vis_mesh.ply(网格 + 彩色路径的三维可视化)、map.png(俯视导航图:灰色网格 + 彩色路径 + 目标点),另有metadata.json与重建目标对文件,方便你逐条检查规划结果(save_artifacts())。
快速上手
两步跑通 WorldNav 轨迹规划:
# 1. 编译 Recast 扩展 cd hyworld2/worldgen/third_party/navmesh && python setup.py build_ext --inplace # 2. 生成导航轨迹 python hyworld2/worldgen/traj_generate.py \ --target_path examples/worldgen/case000 \ --apply_nav_traj常用参数(参数定义):
--apply_nav_traj:启用 WorldNav 导航轨迹(必开)--obs_iteration_limit:障碍物避让的最大迭代次数,默认 3--llm_addr/--llm_port/--llm_name:VLM 服务器地址与模型
结果会写入render_results/下的 exploration / target / surround / reconstruct 四个子目录,打开map.png即可直观看到避障效果。
总结
WorldNav 的精髓在于把"相机别穿墙"拆成三层可解释的子问题:VLM 用自然语言语义找目标,SAM3 把目标钉到像素和 3D 空间,NavMesh 用图算法解决地面、坡度与视线。每层都有独立的 JSON 与可视化产物,出问题时能精确地知道"是语义找错了,还是路径算歪了"——这正是模块化架构在 3D 世界生成中的价值所在。
【免费下载链接】HY-World-2.0HY-World 2.0: A Multi-Modal World Model for Reconstructing, Generating, and Simulating 3D Worlds项目地址: https://gitcode.com/gh_mirrors/hy/HY-World-2.0
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考