MultimodalFlow
← 返回博客

Jetson AGX Thor + Orbbec 3D 相机:本地多模态机器人巡检系统开发实战

JetsonJetson Thor机器人3D 视觉OrbbecVLMRAG边缘AI

项目开发周期:2026 年 6 月 1 日至 2026 年 7 月 2 日。
项目设备:NVIDIA Jetson AGX Thor Developer Kit,外接 Orbbec Gemini 345Lg / RealSense D435i 3D 相机,预留 Airy LiDAR 数据通道。
项目代码位置:NVIDIA_Thor_Demos/thor_orbbec_3d_robot_demo

这篇文章复盘一个运行在 Jetson AGX Thor 上的边缘 3D 机器人感知应用项目:一台 Thor 加一台 3D 相机,在本地完成 RGB 识别、深度/点云处理、占据栅格构建、风险判断、VLM 场景理解、RAG 规则检索、LLM 决策、TTS 播报和巡检报告生成。

我做这个项目的出发点很朴素:很多机器人方案在演示视频里看起来很炫,但一旦离开云端 API、离开台式机 GPU、离开提前录好的视频,就很难在现场稳定跑起来。真实展厅、工厂、仓库和实验室需要的是另一种能力:设备本地就能看见、理解、判断和记录,而且网络不稳定时也能继续工作。

一、项目整体介绍与落地场景

这个项目第一版的目标可以概括为一句话:

让机器人在 Jetson AGX Thor 上本地完成“看见环境、理解风险、查规则、做决策、说结果、留报告”的完整闭环。

下图是项目在 Jetson AGX Thor 真机服务上采集的 RGB-D 与点云数据。RGB 画面包含办公环境,因此发布前做了模糊脱敏;深度图和点云俯视图保留了空间结构,用来说明系统确实接入了 3D 传感器数据,而不是只做前端模拟。

Jetson Thor 上采集的脱敏 RGB-D 与点云俯视图

项目面向的场景是移动机器人、巡检机器人和工厂通道安全检测。典型任务是:机器人前方出现人员、箱子、工具车或杂物时,系统需要判断是否可以继续通行。如果只依赖 RGB 图像,机器人可能知道“画面里有一个人”,但不知道距离;如果只依赖深度或点云,机器人知道“前方 1.05 米有障碍”,但不知道障碍物是什么;如果只依赖规则脚本,又很难解释现场语义。

所以我把系统拆成三条线:

  1. 几何感知线:RGB-D 相机输出 RGB、Depth、IR 和点云,点云模块计算最近障碍物距离、地面/非地面点数量和通道占用情况。
  2. 语义理解线:YOLO 负责目标检测,VLM 负责理解画面语义,比如“人员位于前方约 2.4 米”“箱子占用通道右侧”。
  3. 决策解释线:RAG 从本地 SOP / 巡检规则中取回约束条件,LLM 根据检测结果、点云距离、VLM 描述和规则生成机器人动作建议。

最终输出不是一句空泛的“有风险”,而是一份结构化巡检报告:检测到什么目标、最近障碍物多远、风险等级是什么、为什么要停车、下一步动作是什么。

项目第一版支持传感器与模型的兜底模式,是为了保证没有相机、没有真实大模型、没有完整传感器链路时也能在离线环境跑通完整业务流程。但代码里已经预留了 RealSense、Orbbec SDK、YOLO/TensorRT、Qwen2.5-VL、NVlabs Eagle LocateAnything、Ollama/vLLM 和 TTS 后端的切换点。换句话说,它不是一个纯展示页面,而是一个可以逐步替换真实模块的边缘机器人感知系统骨架。

二、硬件、SDK、模型和工具选型

1. 硬件平台:为什么选 Jetson AGX Thor

我选择 Jetson AGX Thor,主要因为这个项目同时吃三类资源:

  • 3D 传感器数据:RGB、Depth、IR、点云会持续刷新,对 I/O、CPU 和内存都有压力。
  • 多模型推理:YOLO、VLM、LLM、TTS 可以串行跑,也可以逐步做并行优化。
  • 本地服务化:FastAPI、WebSocket、前端可视化、报告生成和监控都在同一台设备上完成。

Thor 的优势不是单点跑一个模型,而是能把多模态机器人链路放在一台边缘设备里。相比把图像传到云端,Thor 本地处理可以减少网络依赖,也避免把工厂、实验室或仓库现场画面传出内网。对于机器人来说,低延迟和数据闭环比单纯的模型参数规模更重要。

项目中还保留了对 Jetson Orin 的经验复用。例如监控模块同时兼容 nvidia-smipynvml 和 Jetson 常见的 tegrastats 思路,方便后续把链路下放到 AGX Orin 或 Orin NX 上做裁剪版本。

2. 传感器和系统软件

传感器侧设计了三层兼容:

模块作用当前状态
RealSense D435iRGB-D 相机输入已实现服务封装,优先尝试启动
Orbbec Gemini 345Lg目标 3D 相机预留 OrbbecCameraService / SDK 适配接口
MockOrbbecCameraService离线调试与流程验证默认 fallback,保证无硬件可运行
Airy LiDAR激光点云扩展已预留点云和扇区分析接口

软件栈以 Python + FastAPI 为核心:

  • FastAPI:提供 Web UI、REST API、上传图片、巡检任务、健康检查和 WebSocket 事件流。
  • Pydantic:定义检测结果、点云统计、风险分析、VLM 输出、LLM 决策等结构化 schema。
  • NumPy / OpenCV:处理深度图、IR、点云可视化和安全区域热力图。
  • psutil / pynvml / nvidia-smi:采集 CPU、内存、GPU、功耗和温度指标。
  • Markdown 报告:每次巡检完成后自动生成可归档的 .md 报告。

3. AI 模型选型

当前版本默认使用兜底 AI 服务,原因是比赛文章强调的是完整开发流程和边缘系统架构,第一阶段我更看重链路可运行、数据结构稳定和模块边界清晰。真实模型接入点如下:

模块默认实现真实接入建议
目标检测可替换检测服务Ultralytics YOLO、TensorRT Engine、DeepStream
VLM可切换视觉语言服务Qwen2.5-VL、InternVL、NVlabs Eagle LocateAnything
RAGMarkdownRAGServiceFAISS、Chroma、本地 SOP 文档库
LLM 决策可替换决策服务Ollama、vLLM、OpenAI-compatible API
TTS可替换语音服务Piper、edge-tts、CosyVoice

我没有一开始就把所有模型都接成真实推理,是因为机器人系统最怕“模型能跑,但工程链路不稳”。先固定输入输出 schema,再逐步替换真实后端,可以避免前端、状态机、报告和决策层被模型输出格式反复牵着走。

三、完整开发流程与核心实现

1. 任务状态机

项目的主流程由 InspectionTaskRunner 驱动,每次巡检任务会经历以下阶段:

CAPTURE_SENSOR_FRAME
RGB_DETECTION
DEPTH_PROCESSING
POINTCLOUD_PROCESSING
OCCUPANCY_GRID_BUILDING
RISK_ANALYSIS
VLM_ANALYSIS
RAG_RETRIEVAL
LLM_DECISION
TTS_SPEAKING
REPORTING
DONE

这样做的好处是,每个阶段都有明确输入、输出和耗时记录。前端通过 WebSocket 订阅任务事件,可以看到任务从相机采集、YOLO 检测、点云处理一路推进到报告生成。开发调试时,哪个阶段慢、哪个阶段报错、哪个模块输出异常,都能马上定位。

2. 相机与输入源切换

机器人感知项目有个常见问题:开发时手边不一定有真实传感器。如果系统强依赖相机在线,很多功能就没法调。这个项目的输入源支持两种模式:

  • 摄像头模式:使用 RealSense / Orbbec / 兜底相机服务的当前帧,保留 RGB、Depth、IR、PointCloud 流程。
  • 图片模式:上传本地图片作为 RGB / VLM 输入,Depth、IR、PointCloud 继续由当前传感器或兜底数据补齐。

这让开发、测试和现场验证都更轻松。现场有相机时跑实时链路;没有相机时上传一张通道图片,也能完整验证检测、风险分析、RAG、LLM 和报告。

3. 点云统计与占据栅格

点云处理不追求复杂 SLAM,而是先解决机器人避障里最直接的问题:前方有没有障碍,最近障碍物多远,通道是否被占用。

系统会对点云做范围过滤和下采样,默认把点云压到 8000 个点以内,既能保留空间结构,又避免浏览器端渲染压力过大。随后计算:

  • 点云总数和下采样数量
  • 最近障碍物距离
  • 地面点数量
  • 非地面点数量
  • 可通行区域和占用区域统计

一次测试报告中的结果如下:

指标数值
点云数量8500
下采样数量8000
最近障碍物距离1.05 m
障碍物点数量2948
地面点数量5552
Occupancy Grid occupied35
Occupancy Grid free803

这组数据已经足够支撑一个实际机器人判断:前方 2 米内存在障碍物,通道不宜直接通行。

为了便于公开分享,我把接口返回的点云数据单独渲染成俯视距离图。图中机器人位于底部,红色点表示近距离高关注区域,青绿色点表示更远处的空间结构。相比只展示 RGB 画面,点云俯视图更能说明 3D 感知模块在机器人避障里的作用。

RealSense 点云俯视距离图

4. 风险分析、RAG 和 LLM 决策

风险分析模块先根据硬规则给出初步判断。例如:

  • 前方 2 米内有障碍物,应减速或停车。
  • 人员进入前方 3 米安全范围,应停车等待。
  • 箱子、工具或杂物占用通道,应标记为通道堵塞。
  • RGB 与点云冲突时,优先相信点云距离。

这些规则来自本地 Markdown SOP,通过 RAG 模块检索后交给 LLM。LLM 不直接“凭感觉”决策,而是收到结构化上下文:

  • 用户指令:请定位 person 和 box 并判断能否通行。
  • YOLO 检测:person 置信度 0.91,距离约 2.4 m;box 置信度 0.88,距离约 1.3 m。
  • 点云统计:最近障碍物约 1.05 m。
  • VLM 描述:前方通道内有人和箱子,箱子偏右,可能影响通行。
  • RAG 规则:人员进入 3 米范围应停车,2 米内障碍应减速或停车。

最终输出的决策是:

{
  "decision": "STOP_AND_WAIT",
  "speed_advice": "停车或低速等待",
  "path_advice": "当前不建议直接通行,可等待人员离开后从左侧绕行",
  "reasoning_summary": "点云显示最近障碍物约1.1米,RGB检测到人员约2.4米。根据规则,人员进入前方3米范围时应停车等待。",
  "final_message": "前方存在人员和障碍物,建议停车等待并重新规划路径。"
}

这个结果对机器人系统很重要。它既有动作建议,也有解释依据,方便工程师复盘,也方便后续接入 ROS2、Isaac Sim 或真实底盘控制。

四、开发难点、问题排查与解决方案

难点一:真实硬件不稳定时如何保证项目可运行

3D 相机、深度流、IR 流、点云和模型服务任何一个模块出问题,整条链路都可能断。我的解决办法是“真实服务优先,兜底服务保障流程”。启动时系统先尝试 RealSense,再尝试 Orbbec,失败后自动切到本地兜底相机服务。

这样做不是为了偷懒,而是为了把工程调试拆开:前端、状态机、报告、RAG 和决策可以独立验证;等相机 SDK 装好以后,只替换相机服务,不改上层逻辑。

难点二:多模态输出格式容易失控

YOLO、VLM、LLM 输出天然不稳定。如果直接把模型原始文本丢给前端,页面和报告很快会变成各种特殊情况的集合。项目里所有核心输出都用 Pydantic schema 约束,例如 Detection、PointCloudStats、RiskAnalysis、VLMSceneResult、RobotDecision。

后续接入真实 Qwen2.5-VL 或 vLLM 时,只需要把模型输出校验成统一 schema。校验失败就重试或降级,而不是让错误一路传到前端。

难点三:点云既要可用又要轻量

点云数据很容易变大。直接把完整点云通过接口返回给浏览器,会拖慢页面,也会增加 Jetson 的 CPU 压力。我采用了三步:

  1. 按距离过滤,只保留业务相关范围。
  2. 下采样到 8000 点以内。
  3. 前端只做轻量级渲染,真正判断在后端完成。

这样既能展示 3D 空间感,又不会让点云可视化压垮主流程。

难点四:机器人决策必须可解释

很多 AI 应用最后只输出一句话:“建议停车”。但机器人场景里,这不够。工程师和客户会追问:为什么停车?是因为人,还是箱子?距离多少?规则从哪里来?

所以项目把 RAG 规则、风险分析、VLM 场景描述、LLM reasoning summary 和最终动作全部写进报告。一次巡检结束后,报告里能看到完整证据链,而不是只看最终答案。

五、从 NVIDIA Vesta 看这个项目验证了什么

在项目开发过程中,我也重点关注了 NVIDIA Vesta 这类 embodied reasoning / generalist planner 的方向。Vesta 的核心思路不是让一个模型直接替代底层控制器,而是把定位、导航、具身推理、长程规划和记忆能力统一到一个高层机器人 planner 中。它观察当前环境,结合历史记忆和任务目标,输出下一步自然语言子任务,再交给底层 actor 或控制系统执行。

这篇文章并不声称复现了 Vesta 的论文结果。原因很直接:当前项目没有接入 Vesta 权重,也没有复现 R2R-CE、AgiBot 或真实双臂机器人任务评测。更准确地说,这个 Jetson Thor + RGB-D 机器人巡检项目验证的是 Vesta 所代表的一个工程方向:把空间感知、规则记忆、场景理解和动作规划收敛到一个本地高层 planner 接口。

从这个角度看,项目已经验证了三件事。

第一,系统验证了统一 planner 接口的工程可行性。YOLO 检测、点云距离、占据栅格、VLM 描述、RAG 规则和 LLM 决策并不是各自孤立展示,而是被整理成统一结构化上下文,最终输出 STOP_AND_WAITSLOW_DOWNREROUTE 这类机器人动作建议。这个接口和 Vesta 的高层 planner 思路是接近的:planner 不直接控制电机,而是给出下一步可执行子任务或动作意图。

第二,项目验证了 3D spatial grounding 对机器人巡检的价值。纯 RGB VLM 只能说“画面里有人和箱子”,但 RGB-D / 点云可以进一步给出最近障碍物约 1.05 米、人员约 2.4 米、箱子约 1.3 米这类空间依据。对于机器人来说,能不能通行不是一个纯语义问题,而是语义和几何共同决定的问题。

第三,项目验证了本地规则记忆和可解释决策的重要性。Vesta 强调历史观察和已执行子任务对长程规划的作用;本项目当前先用 RAG 和结构化报告保存规则、风险依据和决策结果。下一步如果要更贴近 Vesta,可以增加连续巡检记忆:例如第一次看到箱子占用右侧通道,第二次画面里箱子被遮挡但点云仍显示右侧障碍,planner 仍能结合历史动作和当前 3D 观测建议停车或绕行。

因此,这个项目更像是一次边缘侧的 Vesta-style 架构验证,而不是 Vesta 模型复现。它证明了在 Jetson Thor 这样的边缘设备上,可以把 3D 感知、视觉语言理解、规则检索和动作决策先串成一个稳定闭环;等未来 Vesta 或同类 embodied planner 开放可部署权重后,可以把当前 LLM 决策层替换成更强的统一 planner。

六、项目效果、数据与后续优化

在兜底传感器 + 默认服务配置下,一次完整巡检可以在本地生成如下结果:

模块输出
RGB 检测person、box 两类目标
点云最近障碍物1.05 m
风险等级HIGH
是否需要停车true
VLM 场景结论通道内有人和箱子,可能影响通行
RAG 命中规则2 米障碍减速/停车、3 米人员停车等待
LLM 决策STOP_AND_WAIT
报告输出自动生成 Markdown 巡检报告

部分阶段耗时也被记录到报告中。例如一次测试里,传感器帧采集约 4.26 ms,RGB 检测阶段约 201.24 ms。由于当前 YOLO 使用兜底检测服务,这个耗时主要体现链路调度和端到端流程;接入 TensorRT YOLO 后,下一步会重点测试真实检测 FPS、端到端延迟和功耗。

项目当前还有几个明确的优化方向:

  1. 接入真实 Orbbec SDK:完成 Gemini 345Lg 的 RGB、Depth、IR、PointCloud 实时流适配。
  2. 接入 TensorRT YOLO:把兜底检测替换为真实模型,并记录 FP16 / INT8 推理速度。
  3. 接入真实 VLM:优先测试 Qwen2.5-VL、InternVL 和 LocateAnything-3B 在 Thor 上的视觉定位能力。
  4. 接入本地 LLM:使用 Ollama 或 vLLM 运行 Qwen 系列模型,验证结构化 JSON 输出稳定性。
  5. 接入 ROS2 / Isaac:把 STOP_AND_WAITSLOW_DOWNREROUTE 等动作映射到机器人控制接口。
  6. 做功耗与温度曲线:记录长时间运行下的 GPU 利用率、内存占用、功耗和温度。

总结

这次 Jetson AGX Thor + Orbbec 3D 机器人巡检系统开发给我最大的感受是:边缘 AI 项目的关键不只是“能不能跑一个模型”,而是能不能把传感器、模型、规则、决策、交互和报告稳定地串起来。

Thor 的价值也在这里。它让机器人系统不必把所有数据送上云端,不必依赖远程大模型服务,不必在网络波动时停摆。对于工厂、仓库、实验室和展厅,真正有用的是本地闭环:现场数据现场处理,风险现场判断,结果现场解释。

这个项目还在继续迭代。第一版先把工程骨架和闭环跑通,后面会逐步替换真实相机、真实检测模型、真实 VLM 和真实 LLM。等这些模块全部接上后,它会进一步沉淀为一套可以迁移到移动机器人、巡检机器人和工业安全检测终端上的边缘多模态机器人开发模板。