logo Mr.Robota 具身智能学习手册 EN
第十三章:其他前沿项目复现

具身导航综合入门实践

是否学完了基础教程了解了具身导航还是迷迷糊糊不知道怎么实践?是否复现了前沿代码但是代码很复杂不清楚具体的算法实践流程?是否因为环境太复杂,数据集太大,下载流程过于复杂,不知道怎么应用大模型和其他算法?

本课程用最基础的测试环境,将各个算法独立成每一个文件,由主函数组合调用,可以自由替换各个模块(理解各个模块的输入输出即可),方便后续继续使用,同时各个模块与环境基本分离,可以自由替换到其他仿真环境甚至部署到真实导航环境中,并且采用零样本导航思路,不需要任何的微调即可完成具身导航。

本课程从基础的环境安装到各个模型权重的获取和下载,以及各个算法的讲解和整合都进行了详细的讲解,仅需“半天”即可走通从感知决策再到规划控制的所有的算法,从入门具身导航到继续深入研究都可以参考课程中的算法,希望能够为你的科研生活提供一点点小小的帮助。下面就让我们开始吧~

一、从搭建环境开始

如果不想配置环境,本课程也提供了镜像支持,可以去Autodl以下地址:https://www.autodl.art/i/datawhalechina/every-embodied/datawhale-navigation

Autodl镜像README中有详细的镜像运行说明,gpu-free中也提供了镜像支持,可以在镜像中搜索datawhale,选择加载具身导航综合入门实践镜像。

1. 配置conda环境

创建navigation环境并激活

pythonconda create -n navigation python=3.9 cmake=3.14.0
conda activate navigation

安装habitat-sim=0.2.5

pythonconda install habitat-sim=0.2.5 withbullet headless -c conda-forge -c aihabitat

安装habitat-lab=0.2.5(这里在云端中已经部署,如果想要在自己电脑上运行,请参考以下流程,注意:一定要安装和habitat-sim相同版本的habitat-lab)

1)进入habitat-lab的github网站:https://github.com/facebookresearch/habitat-lab.git

2)找到他的Releases

3)选择v0.2.5版本,并在下方的Assets中下载Source code(zip)解压

4)下载下来之后应该是habitat-lab-0.2.5这个文件名,进入这个文件夹即可开始habitat-lab的安装

pythoncd habitat-lab-0.2.5
pip install -e habitat-lab

如果安装出现no model named "torch"的问题和其他问题可以试试

pythonpip install -e habitat-lab --no-build-isolation

2. 配置算法环境

1)安装视觉感知算法模块

pythonpip install ultralytics

2)安装大模型所需要的相关组件

pythonpip install openai
pip install transformers

3)下载算法运行的仿真环境

pythonpython -m habitat_sim.utils.datasets_download --uids habitat_test_scenes --data-path /data

至此,如果只是想要通过API调用,所有的算法环境配置已经结束

有的同学要问了,同学!同学!有没有本地部署的版本,有的同学有的,如果想要本地部署的同学可以继续以下的环境配置,想直接用API的可以跳过下面的内容,直接查看第二部分,当然~本地部署也不是很复杂哦~

1)依赖安装

pythonpip install accelerate
pip install modelscope

2)下载模型权重

pythonmodelscope download --model Qwen/Qwen3-VL-4B-Instruct --local_dir /root/every_embodied_navigation/Qwen3-VL-4B-Instruct/

这里的路径可以自行修改,比如我的主函数是在every_embodied_navigation文件夹下,也需要在every_embodied_navigation下再加一个Qwen3-VL-4B-Instruct这个文件夹,用来存放模型权重,如果不加Qwen3-VL-4B-Instruct这个文件夹,则会出现模型权重文件全下载到主函数的文件夹下的情况。这里由于云端内存的原因,下载了Qwen3-VL-4B的模型,大家自行可以去modelscope下载Qwen3-VL-8B或者其他的模型进行测试,仅需修改vlm文件夹下的文件,navigator.py文件以及config.py文件即可。

下载完成后,此时的完整目录结构是:

every_embodied_navigation/
├── main.py                    # 主函数入口(支持 --mode local/api)
├── navigator.py               # EmbodiedNavigator 主导航器
│
├── config/
│   └── config.py              # 统一配置
│
├── utils/
│   ├── simulator.py           # habitat-sim 初始化 & 相机内参
│   └── geometry.py            # 四元数旋转、深度反投影
│
├── perception/
│   └── detector.py            # YOLODetector(YOLOv8 检测 & 可视化)
│
├── mapping/
│   └── map_utils.py           # 战争迷雾、前沿点检测、坐标转换
│
├── planning/
│   └── planner.py             # PathPlanner(路径规划 & 导航执行)
│
├── vlm/
│   ├── base_engine.py         # BaseVLMDecisionEngine(prompt/解析/降级/日志)
│   ├── local_engine.py        # LocalVLMDecisionEngine(本地 Qwen3-VL)
│   ├── api_engine.py          # APIVLMDecisionEngine(OpenAI兼容 API)
│   └── __init__.py            # create_vlm_engine()
│
└── output/
│   └── visualizer.py          # VisualOutput(HUD / 地图面板 / 视频保存)
│
└── Qwen3-VL-4B-Instruct/      # 权重文件

至此,所有需要安装的部分就都结束了,是不是很快呢~

看到这里有的同学又要问了,同学同学,你的这个代码框架确实很方便,每个模块都能独立自由更换,但是这么多文件夹,对于新手小白的我来说还是有点超纲,有没有更简单易上手的代码,有的同学!有的!对于暂时不需要具身导航框架的同学,本课程还提供了navigation_api.py和navigation_local.py这两个文件,分别为API调用大模型和本地调用大模型,不需要额外安装任何依赖即可运行。

二、文件路径及相关说明

  1. 修改大模型调用形式
  • 在主函数中通过修改mode参数,可以选择大模型是采用本地部署还是API调用模式
  1. config参数路径修改
  • 场景文件用的是相对路径,一般不需要修改

  • 本地VLM文件是存放本地部署模型的路径,建议使用绝对路径,否则有可能会判定到.cache文件中,如果出现huggingface联网问题,大部分是这个路径没有设置好,导致系统认为模型权重文件没有下载,从而去huggingface官网下载模型权重

  • API_BASE_URL是代理模型平台的地址,这里是用的阿里云百炼平台,如果还是使用Qwen的模型,可以不用修改这个地址,其他的模型请自行修改。其中API_KEY就是在平台中获得的密钥,API_MODEL_NAME是你选择的模型名称,可以在阿里云百炼平台或者其他平台获取。

对于API的获取,以阿里云百炼平台为例:https://bailian.console.aliyun.com/

进入网页登录后,点击左上角的模型,并点击左下角的密钥管理

然后点击右上角的创建API Key即可创建API密钥

点击文档,选择模型列表,即可查看到可以用API选用的模型,本课程选用的是Qwen-VL,点击下方的更多模型,还可以选用qwen2.5-vl的各种参数版本的模型

至此就完成了所有参数和路径的适配,下面就可以直接运行啦~

三、代码运行

在完成所有的配置之后,使用python main.py即可运行代码,如果出现BUG可以优先参考第六部分“远离BUG”,如果出现其他BUG,欢迎指出~

我们可以看到整个大模型完整的思考过程,且会保存到vlm_reasoning_log.json

python============================================================
  📝 大模型完整思考过程
============================================================

--- 决策 #1 ---
  位置: [0.9390037655830383, -1.5215539932250977, -2.021697998046875]
  检测: 13 物体,  前沿: 1 个
  动作: go_to_object
  置信: 0.85
  思考: 当前图像显示的是百叶窗,未发现目标物体。YOLO检测结果显示有多个沙发(couch)目标,但距离较远(3.94m至4.00m),且未访问过。根据规则,应优先选择最近的未访问目标。最近的沙发在索引9,距离2.36m,符合优先导航条件。因此,应导航至该沙发。

--- 决策 #2 ---
  位置: [2.7892143726348877, -1.600250005722046, -0.646697998046875]
  检测: 17 物体,  前沿: 3 个
  动作: explore_frontier
  置信: 0.85
  思考: 当前检测到的目标物体中,'couch'已访问,待寻找的'chair'未被检测到。YOLO结果中未出现'chair'的检测结果,因此无法直接导航到目标。根据规则3,应选择最优前沿点进行探索。可选前沿点中,[1]位置[2.44, -1.60, 2.33]距离3.00m,朝向未探索区域,且距离适中,符合探索优先级。因此选择该前沿点进行探索。

--- 决策 #3 ---
  位置: [2.423809766769409, -1.600250005722046, 2.2950756549835205]
  检测: 8 物体,  前沿: 5 个
  动作: go_to_object
  置信: 0.81
  思考: 我看到了多个椅子目标,其中最近的椅子在[4.55, -2.64, 3.86],距离2.84米,置信度0.81,符合优先导航到最近目标的规则。虽然有多个椅子,但最近的未访问目标是当前最优选择。因此,我决定导航到最近的椅子。

程序还会保存一个navigation_output.avi的视频文件,视频中的左边为机器人的实时图像,左上角是当前的位置,寻找到的物体和待寻找的物体,左边是2d地图,包含黄色的前沿和绿色的前沿点,深蓝色的圆圈是机器人本体,浅蓝色的是机器人的运行路径,紫色的是当前机器人规划的路径:

同时,为了方便大家学习,我们还为大家准备了单独运行调试的文件,不需要额外下载任何依赖,单独运行文件即可。介绍如下:

1)local_test.py:具身导航框架代码中使用的是transformers库调用的本地部署文件,单独测试文件local_test.py给大家提供了另一种本地部署的方法:用modelscope来本地部署。文件中仅需修改已经下载的模型权重文件路径以及图片路径即可,图片已经为大家准备好了。

代码的运行输出如下:

python['This is a close-up, eye-level photograph of a small, fluffy white dog, likely a Samoyed or a similar breed like a Pomeranian, sitting indoors on a light-colored wooden floor.\n\nThe dog has a thick, luxurious coat of pure white fur that looks soft and voluminous, especially around its neck and chest. Its ears are pointed and erect, with a slightly pinkish inner lining visible. The dog’s face is round and expressive, featuring large, dark, round eyes that look directly at the camera with an innocent and curious gaze. It has a small, black nose and a gentle, slightly open mouth that gives']

2)api_test.py:这个是使用api运行的大模型文件,仅需填入按照上文获取的大模型api,修改图片路径即可,注意,原来官网代码的api调用不支持图片的直接输入,需要进行转换,这里已经提供,为了方便大家理解,提供了两种格式的图片文件,一个是png图片,另一个是webp文件,可以看出,除了路径以外,还需要修改base64_url中的格式,这个也与具身导航框架中的图片转换内容一致。

代码的运行输出如下:

python图中描绘的是一只可爱的白色小狗,它正坐在室内木地板上,面向镜头。小狗毛发蓬松洁白,眼睛乌黑明亮,鼻子是黑色的,表情显得非常温顺和呆萌。背景较为模糊,可以看到部分家具或装饰物,整体氛围温馨舒适。这只小狗看起来像一只萨摩耶犬或类似品种的小型犬。

3)yolo_test.py:除了具身导航框架中的yolov8以外,还提供了yolo-world的测试,仅需几行代码即可完成视觉检测,需要注意的是,yolo-world开放视觉检测需要提前定义分类的类型。(yolov8l-world.pt)由于模型过大,因此请前往链接下载。

两种yolo模型的检测结果如下,可以看出,yolo-world提前定义之后,可以很清楚的识别出萨摩耶小狗~

Image 1 Image 2

四、代码讲解

具身导航中大部分算法应该大家都有所了解,例如yolo视觉算法,大语言模型,以及规划算法,如何将这些算法应用到具身导航,是我们需要探索和学习的,本课程主要就是为了让大家了解和熟悉具身导航整个流程,给大家讲解分享学习时踩到的坑,为大家后续的研究起到一点点的帮助,就心满意足啦~

下面开始具体的算法讲解,主要围绕具身导航各个算法的结合与具身导航需要额外添加学习的代码部分来进行讲解,各个算法的原理可以参考datawhale的其他教程,例如yolo和大语言模型算法,都有很好的讲解。

首先给大家看一下代码整体的VLM一次决策过程:

1)旋转观察:12步左转,YOLO检测+3D反投影+迷雾更新

2)去重合并:12帧结果合并,同位置同类别取最高置信度

3)获取前沿点:检测前沿,过滤已访问的前沿点,按距离排序取前8个

4)构造VLM输入:整理检测摘要、前沿摘要、历史记录、采样4帧关键图

5)VLM决策:调用大模型,解析JSON输出决策

6)执行决策:根据action走向目标物体、前沿点、随机点

7)到达判断:距离小于距离目标检测距离则记录已找到目标

8)终止检查:全部目标已找到或者步数耗尽则退出循环

这就是具身导航一次决策的完整流程,相信大家对整个代码有了一个初步的认知,下面对代码文件各个模块进行详细的讲解。

1. config

python# ── YOLO ──────────────────────────────────────────────────
YOLO_MODEL = "yolov8n.pt"
YOLO_CONF_THRESHOLD = 0.35

# ── 本地 VLM (local 模式) ─────────────────────────────────
LOCAL_MODEL_NAME = "/home/robot/navigation/Qwen3-VL-4B-Instruct"
MODEL_DTYPE = "auto"
MODEL_DEVICE_MAP = "auto"
MODEL_MAX_NEW_TOKENS = 1024
MODEL_TEMPERATURE = 0.3
MODEL_TOP_P = 0.9
MODEL_TOP_K = 50

# ── 导航 ──────────────────────────────────────────────────
MAX_STEPS = 500
SPIN_STEPS = 12
VISIBLE_RADIUS = 3.0
MAP_RESOLUTION = 512
AREA_THRESHOLD_M2 = 9
TARGET_REACH_DIST = 1.5

除了先前配置文件中的一些参数,这里再讲解一下这里各个参数的调试依据。

1)YOLO_CONF_THRESHOLD 设 0.35 是经验值。太低(0.1)会把墙上的阴影也检测成椅子;太高(0.6)在光线暗的场景里会漏掉目标。

2)TARGET_REACH_DIST 设 1.5 米。太小(0.5m)机器人会撞墙;太大(3m)VLM会误判机器人已经到达。

3)MODEL_TEMPERATURE 对决策质量影响很大。0.3 是比较保守的选择,输出更稳定。调高到 0.8 以上时,模型可能会出现幻觉,出现一些不存在的物体。

2. utils

1)simulator.py

这个文件中主要用来创建habitat环境,如果有不懂的可以参考every-embodied项目中的第八章内容,有基础的讲解。

2)geometry.py

pythondef depth_to_3d_world(depth_map: np.ndarray, bbox, agent_state, K: np.ndarray):
    x1, y1, x2, y2 = [int(v) for v in bbox]
    mx = max(1, (x2 - x1) // 4)
    my = max(1, (y2 - y1) // 4)
    region = depth_map[y1 + my:y2 - my, x1 + mx:x2 - mx]
    if region.size == 0:
        return None
    valid = region[region > 0]
    if valid.size == 0:
        return None
    d = float(np.median(valid))
    if d <= 0 or d > 10.0:
        return None

    cx_px = (x1 + x2) / 2.0
    cy_px = (y1 + y2) / 2.0
    fx, fy = K[0, 0], K[1, 1]
    cx_c, cy_c = K[0, 2], K[1, 2]

    point_cam = np.array([
        (cx_px - cx_c) * d / fx,
        -(cy_px - cy_c) * d / fy,
        -d,
        1.0,
    ])

    rot = agent_state.rotation
    q = np.array([rot.w, rot.x, rot.y, rot.z])
    R = quaternion_to_rotation_matrix(q)
    T = np.eye(4)
    T[:3, :3] = R
    T[:3, 3] = np.array(agent_state.position)
    return (T @ point_cam)[:3]

depth_to_3d_world函数主要是将检测的像素转换到世界坐标,具体来说,YOLO给出的只是图像坐标(像素位置),我们需要的是3D世界坐标(机器人在哪、物体在哪)。深度图告诉我们每个像素对应的距离,结合相机内参,就能把2D检测框反投影到3D空间。这个过程叫做深度反投影,是连接视觉感知和空间导航的关键桥梁。

3. perception

感知模块不做过多的介绍,代码很简单,就是利用yolo做了一个视觉检测。

4. mapping

pythondef detect_frontiers(full_map: np.ndarray, explored_mask: np.ndarray,
                     min_area: int = 8):
    navigable = (full_map > 0).astype(np.uint8)
    explored = (explored_mask > 0).astype(np.uint8)
    unexplored_nav = (navigable & (1 - explored)).astype(np.uint8)

    border = cv2.morphologyEx(explored, cv2.MORPH_GRADIENT, np.ones((3, 3), np.uint8))
    frontier_mask = (border & unexplored_nav).astype(np.uint8)

    n, labels, stats, centroids = cv2.connectedComponentsWithStats(frontier_mask, 8)
    pts = []
    for i in range(1, n):
        if stats[i, cv2.CC_STAT_AREA] >= min_area:
            c = centroids[i]
            pts.append(np.array([int(c[1]), int(c[0])]))  # row, col
    return pts, frontier_mask

mapping建图中最重要的就是前沿点检测,这个也是大部分未知环境导航论文中都使用到的模块,但是其实原理并不复杂,

python    border = cv2.morphologyEx(explored, cv2.MORPH_GRADIENT, np.ones((3, 3), np.uint8))
    frontier_mask = (border & unexplored_nav).astype(np.uint8)

这两行代码就是找出已探索区域的边缘线,边缘线 & 未探索可通行区域 = 前沿线。

python    n, labels, stats, centroids = cv2.connectedComponentsWithStats(frontier_mask, 8)

然后每个独立的前沿区域取质心,也就是一个前沿点。是不是很简单~

5. vlm

传统导航用规则来决策(离目标近就走过去,否则探索最近前沿),而我们用多模态大模型来理解场景并做出更智能的决策。

1)base_engine.py

base_engine.py主要作用是prompt构建、用户文本格式化、JSON解析、规则降级、日志记录。api和本地部署共用这一套逻辑,这是多模态大模型共用的输入。

python    def _build_system_prompt(self) -> str:
        return f"""你是一个具身智能导航机器人的决策大脑。你的任务是在室内环境中找到以下全部目标物体: {self.targets}

你需要根据当前观察到的图像、YOLO检测结果(含物体3D坐标和距离)、可探索的前沿点,做出导航决策。

决策规则:
1. 如果检测到了目标物体且距离合理(< 8米), 优先导航到目标物体
2. 如果检测到多个目标物体, 选择最近的未访问目标
3. 如果没有检测到目标物体, 选择最优的前沿点进行探索
4. 选择前沿点时, 优先选择距离适中、朝向较大未探索区域的方向
5. 如果所有目标都已访问, 返回 "task_complete"

严格以以下JSON格式回复, 不要输出其他内容:
{{
    "thinking": "你的详细思考过程: 1)看到了什么 2)分析各选项 3)做出决策的理由",
    "action": "go_to_object" 或 "explore_frontier" 或 "task_complete",
    "target_index": 选择的目标在对应列表中的索引(从0开始),
    "confidence": 0到1之间的置信度
}}"""

system_prompt主要是告诉大模型他是谁,需要严格遵守的规则有哪些,具体而言:

  • 明确角色:你是具身智能导航机器人的决策大脑

  • 给出5条清晰的决策规则,优先级从高到低

  • 强制输出格式:严格JSON,防止模型自由发挥

python    def _build_user_text(self, agent_pos, visited_targets,
                         detection_summary, frontier_info, nav_history) -> str:
        text = f"""## 第 {self.count} 次决策

### 当前状态
- Agent位置: [{agent_pos[0]:.2f}, {agent_pos[1]:.2f}, {agent_pos[2]:.2f}]
- 已访问目标: {visited_targets if visited_targets else '无'}
- 待寻找目标: {[t for t in self.targets if t not in visited_targets]}

### YOLO 检测结果 (原地旋转360°汇总)
"""
        if detection_summary:
            for i, d in enumerate(detection_summary):
                p = (f"[{d['world_pos'][0]:.2f}, {d['world_pos'][1]:.2f}, {d['world_pos'][2]:.2f}]"
                     if d.get("world_pos") else "未知")
                dist = f"{d['distance']:.2f}m" if d.get("distance") is not None else "未知"
                tag = "目标" if d["is_target"] else "非目标"
                text += f"  [{i}] {d['class']} (置信度:{d['confidence']:.2f}) 3D位置:{p} 距离:{dist} {tag}\n"
        else:
            text += "  当前旋转一圈未检测到任何物体\n"

        text += "\n### 可用前沿点\n"
        if frontier_info:
            for i, f in enumerate(frontier_info):
                text += (f"  [{i}] 位置:[{f['position'][0]:.2f}, {f['position'][1]:.2f}, "
                         f"{f['position'][2]:.2f}] 距离:{f['distance']:.2f}m\n")
        else:
            text += "  无可用前沿点\n"

        text += f"\n### 导航历史\n{nav_history}\n"
        return text

user_prompt中主要包含喂给大模型的信息,主要包含:

1)视觉图像:旋转一圈中均匀采样4帧关键帧,压缩为JPEG base64

2)检测结果文字摘要:类别、置信度、3D坐标、距离、是否是目标

3)前沿点信息:最多8个候选前沿点的位置和距离

4)导航历史:最近5次决策记录,让模型知道自己走了哪里

pythondef _fallback(self, dets, fronts, visited) -> dict:
    """VLM 调用失败时的规则降级策略。"""
    if dets:
        tgts = [d for d in dets if d["is_target"] and d["class"] not in visited
                and d.get("distance") is not None and d["distance"] < 8]
        if tgts:
            tgts.sort(key=lambda x: x["distance"])
            idx = dets.index(tgts[0])
            return {"action": "go_to_object", "target_index": idx,
                    "reasoning": f"[降级] 检测到 {tgts[0]['class']}", "confidence": 0.6}
    if fronts:
        return {"action": "explore_frontier", "target_index": 0,
                "reasoning": "[降级] 无目标, 探索前沿", "confidence": 0.3}
    return {"action": "explore_frontier", "target_index": 0,
            "reasoning": "[降级] 随机探索", "confidence": 0.1}

最后一个是为了保证在实机部署中,网络断了或者模型崩了之后,能有个兜底的代码,使得系统能够正常运行。

6. planning

这一部分主要是采用habitat-sim中自己的habitat_sim.GreedyGeodesicFollower,并输出动作执行,这一部分可以在得到目标点后,自行根据仿真环境修改,可以自己添加和替换规划器,并添加控制器,以达到更好的效果。

7. output

这一部分就是可视化的内容,也可以自行修改。

恭喜大家完成了代码讲解的阅读,相信大家已经对代码有了更深的了解,对各个模块已经非常的熟悉,最后navigator.py将各个模块结合,并再main.py中运行。之前也提到本课程写了api调用和local本地部署两个单的具身导航文件,如果对各个模块之间的调用不理解的,也可以直接使用单个文件进行运行和学习,本课程主要就是想竭尽全力让大家简单清晰的学习到具身导航的基础流程,并能够为大家今后的科研或者学习提供一点点小小的帮助,希望没有让大家失望~

后续是当前代码存在的一些问题的改进建议和一些前沿的方案,由于本教程希望能够用最小的代码和安装流程,为大家讲清楚整个最基础的具身导航框架流程,同时上传云端的内存也有限制,因此,并没有添加一些比较复杂的例如图像分割,3D高斯建图,vllm部署等内容,大家可以自行学习添加。

五、问题与追求

这个具身导航框架中存在的问题还是要向大家说明,它并不是完美无缺的,也希望这些问题能够给各位在今后的科研中提供一点小小的思路,能够帮助到大家是我的荣幸,也是做这个课程的初衷~

代码存在最主要的两个问题:

1)感知模块的误检问题:

Image 1 Image 2

在前面yolo单个文件运行的结果中,可以看出,yolov8在检测的时候,会存在误检的问题,有人说,用yolo-world开放检测自己定义不就没有问题了吗,在我的科研过程中,实际测试表明,用yolo-world开放检测,也不能够完全的解决误检的问题,对于不太常规的物体,依旧不能够检测成功,因此,需要对感知模块进行改进。

2)2D转3D的问题:

在仅执行找到chair椅子和couch沙发这两个物体的时候,我发现没什么特别大的问题,甚至运行的很完美,当时还很开心,这个问题是我想要多测试几遍,在让系统找到TV电视时偶然发现的,有没有会觉得当时的我会很苦恼?不!发现这个问题的时候我依然很开心~毕竟~科研嘛,能发现问题,就代表需要解决这个问题,这样不就能在这个领域留下哪怕很微弱的贡献了吗~

python============================================================
  📝 大模型完整思考过程
============================================================

--- 决策 #1 ---
  位置: [0.9390037655830383, -1.5215539932250977, -2.021697998046875]
  检测: 13 物体,  前沿: 1 个
  动作: go_to_object
  置信: 0.63
  思考: 当前检测到多个目标物体,包括tv(距离4.56m)、couch(距离3.94m)和bed(非目标)。根据规则2,应选择最近的未访问目标。couch在3.94m处,tv在4.56m处,因此优先选择couch。前沿点距离2.86m,但目标优先级更高,故不选择探索。置信度基于检测结果,选择couch的置信度0.63较高。

--- 决策 #2 ---
  位置: [3.9896955490112305, -1.600250005722046, -0.521697998046875]
  检测: 14 物体,  前沿: 4 个
  动作: go_to_object
  置信: 0.61
  思考: 当前检测到两个目标物体:tv(距离2.64m)和未访问的chair。但检测结果中未出现chair,因此无法直接导航到chair。根据规则,应优先选择最近的未访问目标。tv距离最近(2.64m),且在待寻找目标中,因此选择tv作为目标。置信度为0.61,表明识别可靠。

--- 决策 #3 ---
  位置: [3.0499484539031982, -1.600250005722046, 2.3973488807678223]
  检测: 14 物体,  前沿: 3 个
  动作: go_to_object
  置信: 0.85
  思考: 当前检测到多个椅子目标,且距离均在8米内,符合优先导航到目标物体的规则。已访问'couch'和'tv',剩余目标为'chair'。检测到的椅子中,距离最近的是[12],位置[4.61, -2.42, 3.64],距离2.16米,置信度0.79,是当前最优选择。因此应导航到最近的未访问椅子。
为什么这个全是前往物体的思考过程,我看大模型也有前往前沿点的过程啊

大家请看,有没有发现,大模型一直都是go_to_object,没有探索前沿点的过程,我的chair明明在另一个房间,他是怎么不探索前沿点去的呢?他真的成长成超级人工智能了?不是的!大家看

在这个图片中,这个是机器人到达couch沙发附近后,又发现了挂在墙上的tv,并导航到他的附近,问题就出在这里,在2d转3d坐标的过程中,因为tv很薄,又贴着墙,算法将坐标转到了墙后,这个是算法转换误差导致的,因此,机器人直接运行到了墙后,也就是chair椅子所在的房间,大家可以看下图。

可以看出,导航到有椅子这个房间后,由于贴着墙,系统判断机器人到达了tv电视的附近,所以视频的左上角显示找到了tv,并重新开始检测,又在这个房间中发现了chair椅子,因此才出现了大模型决策过程中,只有三个go_to_object这个问题。

那怎么解决呢?

给大家推荐几个有代码的文章,方便大家学习

1)GaussNav: Gaussian Splatting for Visual Navigation

单位:中国科学技术大学

项目主页:https://xiaohanlei.github.io/projects/GaussNav/

代码链接:https://github.com/XiaohanLei/GaussNav

解决路径:主要通过3DGS来实现物体实例级3D定位与导航。

2)Towards Physically Executable 3D Gaussian for Embodied Navigation

单位:浙江大学

项目主页:https://sage-3d.github.io

代码链接:https://github.com/Galery23/SAGE-3D_Official?tab=readme-ov-file

解决路径:为VLN构建语义和物理对齐的3DGS环境,提供可执行的物体3D定位与交互。

3)EmbodiedSAM: Online Segment Any 3D Thing in Real Time

单位:清华大学

项目主页:https://xuxw98.github.io/ESAM/

代码链接:https://github.com/xuxw98/ESAM?tab=readme-ov-file

解决路径:实时在线3D实例分割,用SAM的2D Mask转3D点云Mask,为具身导航提供物体3D坐标。

如果存在其他问题,欢迎提出哦~

六、远离BUG

愿我们大家都远离BUG,愿大家调BUG一调就通~

  • BUG-1
pythonImportError: libEGL.so.1: cannot open shared object file: No such file or directory

遇到libEGL.so.1这个BUG时,只需要更新和安装以下库即可

pythonapt update
apt install -y libegl1-mesa libegl1-mesa-dev libgl1-mesa-glx
  • BUG-2
pythonGL::Context: cannot retrieve OpenGL version: GL::Renderer::Error::InvalidValue

遇到GL这个BUG时,可以通过运行以下代码来避免

pythonexport LD_PRELOAD=/lib/x86_64-linux-gnu/libGLX_nvidia.so.0:/lib/x86_64-linux-gnu/libGLdispatch.so.0

如果大家遇到了其他的BUG,欢迎指出~

七、致谢

本课程在habitat-sim,habitat-lab,3D-Mem,vlfm,阿里云百炼平台,yolo算法,魔搭社区的基础上构建。十分感谢这些优秀工作的作者们的开源和付出。同时也感谢豆包,Claude opus4.6,Gemini 3.1pro老师们对本课程的优化和贡献。