摘要:具身智能(Embodied AI)正在从实验室走向产线——NVIDIA Isaac GR00T N1.6 开源、腾讯 HY-Embodied 以 MoT 架构打通视觉-语言-动作链路、OpenVLA 等开源 VLA 模型让开发者可以在 Jetson 上跑通端到端控制。但将大模型塞进机器人的边缘芯片,远不是"下个模型跑起来"那么简单:延迟不能超控制周期约束、功耗不能吃光电池、模型要能看懂 3D 空间还要直接输出关节角度。本文从三层架构设计(云端大脑 + 边缘中脑 + 端侧小脑)出发,拆解 LLM/VLM/VLA 三类模型的选型逻辑,给出 Jetson Orin/Thor 部署的量化-推理全链路代码,附 ROS2 集成方案与避坑清单。读完你能回答一个核心问题:我的机器人,到底该把模型跑在哪里?


目录


一、具身智能为什么需要 LLM+VLM?

纯传统方法做机器人,是"感知 → 规划 → 控制"三段式:视觉检测物体 → 预编程状态机决策 → PID 控制关节。这条路在固定产线上够用,但一遇到开放式指令(“把桌上的红色杯子拿给沙发上的人”)就崩——不可能为所有物体-位置-任务的排列组合写 if-else。

LLM+VLM 带来的核心变化:

能力 传统方法 LLM+VLM 方法
指令理解 预定义指令集,超出即失败 自然语言零样本泛化
场景理解 检测固定类别物体 推理物体间关系(空间位置、功能属性、语义关联)
任务规划 手写状态机,改需求 = 改代码 自然语言描述目标,模型自动分解为动作序列
错误恢复 抛异常,等人重启 感知到失败后可尝试调整策略重试(研究阶段)

一个直观对比:

传统方法做"收拾桌面":
  1. 硬编码所有桌面物品坐标
  2. if 物品==水杯 → 放到杯架;elif 物品==书本 → 放到书架...
  3. 每新增一种物品类型 → 改代码 + 重新部署
  4. 杯子换了颜色 → 检测失败 → 任务中止

LLM+VLM 方法做"收拾桌面":
  1. VLM 看图 → "桌上有水杯、书本、钥匙、充电线"
  2. LLM 推理 → "杯子归位杯架,书归位书架,钥匙挂门口,充电线收抽屉"
  3. VLA 输出动作序列 → 逐个执行
  4. 来了个从没见过的物件 → VLM 推理其功能和归位逻辑 → 照做

核心认知:LLM 负责"想清楚做什么",VLM 负责"看懂面前有什么",VLA(Vision-Language-Action)负责"把想法变成关节动作"。三者协同才能让机器人从"执行程序"升级为"理解任务"。


二、核心架构:三层分级计算设计

将 LLM/VLM 塞进机器人的最大挑战不是模型不够强,而是延迟预算(Latency Budget)。机器人控制是分级定时的——不同控制层的延迟约束不同,能放的硬件也不同:

控制层级              典型频率      延迟预算        对模型推理的要求
────────────────────────────────────────────────────────────
实时控制(关节环)      500–1000Hz    < 1–2ms        不跑大模型,由 MCU 固件闭环
反射感知(避障)        30–200Hz     5–30ms         极轻量模型或传统CV
主动规划(语义理解)    5–20Hz       50–200ms       VLM/VLA 推理可接受范围
策略推理(多步规划)    0.1–1Hz      1s–数秒         LLM 复杂推理,延迟不敏感

关键区分:把延迟预算和控制频率搞混是最常见的架构错误。 VLA 推理本身需要 100–300ms,所以它只能放在主动规划层(5–10Hz),不能替代实时控制环。实时控制环(1KHz)始终由 MCU 独立运行——无论大模型推理多快都不能动这层。

工业界主流方案是三层分级计算(大小脑架构):

┌─────────────────────────────────────────────────────────┐
│                    云端大脑(策略推理,0.1–1Hz)          │
│  硬件:A100/H100 集群  模型:70B+ LLM/VLM               │
│  职责:复杂语义理解、长程任务规划、多机协同、知识检索    │
│  典型延迟:500ms–数秒                                  │
├─────────────────────────────────────────────────────────┤
│                    边缘中脑(主动规划,5–20Hz)           │
│  硬件:Jetson AGX Thor / Orin  模型:3B–32B VLM/VLA    │
│  职责:场景理解、物体识别、动作生成                      │
│  典型延迟:50–200ms(取决于模型大小与量化)              │
├─────────────────────────────────────────────────────────┤
│                    端侧小脑(实时控制,500–1000Hz)       │
│  硬件:MCU/FPGA                                        │
│  职责:电流环、速度环、平衡控制、紧急避障、碰撞检测      │
│  典型延迟:< 1–2ms(不与大模型共享硬件)                 │
└─────────────────────────────────────────────────────────┘

核心原则:高频实时留本地 MCU,中频语义推理放边缘 Jetson,低频长程规划上云端。断网时边缘 + 端侧兜底,保证机器人安全待机不失控。

这套架构的已知落地实践(基于公开论文与厂商博客):

案例 云端 边缘 端侧 说明 来源
利兹大学 + Unitree G1 LLaMA-3.2-11B-Vision (对照组) ORAN MEC 边缘节点 + Qwen2-VL-2B G1 板载 MCU WebRTC 实时流 + 边缘 VLM 推理,端到端延迟优于纯云;2B 模型在边缘可实现亚秒级响应 arXiv:2601.14921
NVIDIA IntBot 接待机器人 无(全边缘) Jetson Thor + Cosmos-Reason2-2B (TensorRT FP8) MCU 底盘控制 GTC 2026 展出,全链路本地推理,隐私数据不出酒店 NVIDIA GTC 2026 / IntBot.ai
腾讯 HY-Embodied MoE-A32B(云端教师) MoT-2B(边缘蒸馏学生) 大→小蒸馏:2B 版在同等小模型级别中取得领先(论文自报 22 基准 16 项第一) arXiv 2026.04

注意:上表中具体硬件配置来自公开论文和厂商博客的推断,实际部署可能因定制化而不同。智元机器人、傅利叶等国内人形厂商的具体模型架构未完整公开,此处不列入。


三、模型选型:LLM、VLM、VLA 怎么选?

三类模型各管一摊,千万别搞混:

模型类型 输入 输出 在机器人中的角色 代表模型
LLM 纯文本 纯文本 任务规划、对话、知识推理 Qwen-72B, Llama-3.1-70B, DeepSeek-V3
VLM 图像 + 文本 文本(描述/分析) 场景理解、物体识别、空间关系推理 GPT-4V, Qwen2.5-VL-72B, Cosmos-Reason2
VLA 图像 + 文本 关节角度/末端位姿 端到端动作生成(唯一能直接控制运动的) OpenVLA-7B, GR00T N1.6, π0.5

关键区别:VLM 输出"红杯子在桌子左边",VLA 输出"肩关节 +0.15rad,肘关节 +0.08rad,夹爪闭合"。前者是感知,后者是控制——只有 VLA 把语义直接映射为电机指令。

3.1 2026 年主流 VLA 模型横向对比

以下数据来自各项目公开文档与学术论文,部分数字为厂商自报值,建议在实际任务上自行验证。

维度 OpenVLA-7B NVIDIA GR00T N1.6 π0.5 (Physical Intelligence) HY-Embodied MoT-2B
参数量 7B 3B (HuggingFace) 3.3B 总(VLM骨干+动作专家) 2B (MoT)
VLM 骨干 Prismatic-7B:DINOv2+SigLIP双视觉编码器+Llama 2 Cosmos-Reason-2B VLM PaliGemma 3B 自研 MoT
动作头 离散动作 token(256桶/维)→ 自回归预测 DiT (32层) + Flow Matching,120Hz Flow Matching 连续生成 统一架构输出
训练数据 970k 条 Open X-Embodiment 轨迹(64×A100,15天) ~32K 小时真实+人类数据 + 8K 小时仿真 6 类异构数据联合训练(含网页图文) 600B+ tokens(含具身/空间数据)
开源 Apache 2.0 Apache 2.0 Apache 2.0 论文公开
已验证部署 Jetson Orin (INT4, 3–6Hz) Jetson Thor Jetson Orin (论文测试) 昇腾 310B (厂商宣称)
典型场景 机械臂抓取(支持WidowX/Google Robot/Franka) 人形全身移动操作(loco-manipulation) 跨形态家务操作(厨房/卧室) 腾讯机器人

注意: HY-Embodied MoT-2B 在昇腾 310B(20 TOPS)上的实时推理为厂商宣称,独立验证数据待补充。GR00T N1.6 在 Jetson Thor 上的具体帧率取决于量化等级和任务复杂度。

3.2 模型选型决策树

你的机器人要干什么?
│
├─ 只需自然语言对话 + 知识问答
│   → LLM(Qwen-7B/Llama-3.1-8B),跑在边缘或云端
│
├─ 需要"看懂"场景,但不直接控制运动
│   → VLM(Qwen2.5-VL-7B/32B),跑在边缘 Jetson Orin/Thor
│   场景:质检、安防巡检、物品盘点
│
├─ 需要端到端控制(语言指令 → 关节动作)
│   → VLA(OpenVLA-7B / GR00T N1.6 / π0.5)
│   场景:机械臂操作、人形机器人、移动抓取
│   │
│   ├─ 预算有限 + 通用任务 → OpenVLA-7B (INT4 → Jetson Orin)
│   ├─ NVIDIA 生态 + 高性能 → GR00T N1.6 (Jetson Thor)
│   ├─ 多形态机器人 → π0.5 (Jetson Orin / RTX 4090)
│   └─ 自研芯片 + 国产合规 → 关注 HY-Embodied MoT-2B (需验证)
│
└─ 既要复杂推理又要实时控制
    → 分层:云端 LLM(70B) 负责策略 + 边缘 VLA(7B) 负责动作 + 端侧 MCU 负责安全闭环

四、边缘端部署实战:从量化到推理全链路

OpenVLA-7B 部署到 Jetson AGX Orin 64GB 为例,展示端侧 VLA 部署的完整流程。

4.1 硬件环境

组件 型号 关键指标
边缘计算 Jetson AGX Orin 64GB 275 TOPS (sparse INT8), 64GB 统一内存, 15–60W
系统 JetPack 6.0 CUDA 12.2
相机 RealSense D435 30 FPS, 深度 + RGB
本体 UR5e 机械臂 (6 DOF) 关节控制周期 500Hz

4.2 环境搭建

# 1. 确认 JetPack 版本
cat /etc/nv_tegra_release

# 2. 安装 PyTorch for Jetson(使用 NVIDIA 官方优化版,版本号以实际 JetPack 对应为准)
# 参考: https://developer.nvidia.com/embedded/downloads
pip3 install torch torchvision --index-url https://developer.download.nvidia.com/compute/redist/jp/v60/pytorch/

# 3. 安装依赖
pip3 install transformers accelerate pillow numpy opencv-python

# 4. 克隆并安装 OpenVLA
git clone https://github.com/openvla/openvla.git
cd openvla && pip install -e .

# 5. 下载模型权重 (~15GB)
huggingface-cli download openvla/openvla-7b --local-dir ./models/openvla-7b

4.3 模型量化方案

Jetson Orin 64GB 统一内存中,操作系统 + ROS2 约占 8GB。OpenVLA-7B 的 FP16 权重约 14GB,加上 KV Cache 和激活值后很容易 OOM。必须量化。

量化有两种路径,各有适用场景:

方案 原理 优点 缺点
bitsandbytes INT4 运行时动态量化,不修改权重文件 即插即用,无需预处理 每次加载都需量化配置;反量化有开销
GPTQ/AWQ INT4 离线量化并固化权重 加载即用,推理更快 需 GPU 提前跑量化脚本(耗时数小时)

下面以 bitsandbytes 方案为例(适合快速验证),生产环境建议走 GPTQ → TensorRT 路径。

# load_vla_int4.py — 使用 bitsandbytes 动态 INT4 量化加载 VLA
import torch
from transformers import AutoModelForVision2Seq, AutoProcessor, BitsAndBytesConfig

# INT4 量化配置
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_compute_dtype=torch.float16,
    bnb_4bit_use_double_quant=True,
    bnb_4bit_quant_type="nf4",
)

# 加载(每次启动都需要重新量化,不修改磁盘上的权重文件)
model = AutoModelForVision2Seq.from_pretrained(
    "openvla/openvla-7b",          # 或本地路径 ./models/openvla-7b
    quantization_config=bnb_config,
    device_map="auto",
    low_cpu_mem_usage=True,
)
processor = AutoProcessor.from_pretrained("openvla/openvla-7b")
print("✓ 模型以 INT4 动态量化加载完成")

重要提示: model.save_pretrained() 在 bitsandbytes 量化模式下保存的是原始 FP16 权重而非 INT4 权重——量化配置被记录但实际权重未被修改。如需离线固化 INT4 权重,请使用 GPTQ 或 AWQ 工具链。

推理性能实测参考(Jetson AGX Orin 64GB, 30W 模式, bitsandbytes INT4):

精度 显存占用(估算) 单帧推理延迟(估算) 对应推理频率
FP16(原始) ~16GB+ 无法加载(OOM)
INT8 ~9GB ~250–350ms ~3–4 Hz
INT4(NF4 双重量化) ~6GB ~160–220ms ~4.5–6 Hz

以上数据为 Jetson Orin 上的典型数量级参考,实际值受输入图像分辨率、上下文长度、并发负载等因素影响。建议在自己的硬件上实际测量。

4.4 TensorRT 加速(可选进阶方案)

如需更高推理频率,可将 VLA 模型的 LLM 部分通过 TensorRT-LLM 编译为优化后的推理引擎。注意:这仅针对 VLA 中的语言模型骨干——视觉编码器和动作头的 TensorRT 编译需要额外适配,不在 trtllm-build 的开箱即用范围内。

# TensorRT-LLM 编译 VLA 的 LLM 骨干(在 x86 主机上交叉编译后部署到 Jetson)
# Step 1: 导出 LLM 部分的 ONNX(需自行编写导出脚本,模型结构因 VLA 而异)
python3 scripts/export_llm_onnx.py \
    --model ./models/openvla-7b \
    --output ./trt_workspace/onnx

# Step 2: 构建 TensorRT Engine(在 Jetson 上执行)
trtllm-build \
    --checkpoint_dir ./trt_workspace/onnx \
    --output_dir ./trt_workspace/engines \
    --gemm_plugin fp16 \
    --max_batch_size 1 \
    --max_input_len 4096 \
    --max_output_len 256

# Step 3: 在推理代码中替换 HuggingFace 生成部分为 TensorRT Engine

加速参考(纯 LLM 场景,非 VLA):NVIDIA 官方数据显示,Jetson AGX Thor 上 Llama-3.3-70B 通过 TensorRT-LLM 优化 + Eagle 3 推测解码后达到 88.62 tok/s(约 7x 于发布日基准)。VLA 模型因包含视觉编码和多模态融合,加速比会低于纯 LLM。

4.5 推理节点核心代码

# vla_inference_node.py — 端侧 VLA 推理引擎
import time
import torch
import numpy as np
from PIL import Image
from transformers import AutoModelForVision2Seq, AutoProcessor, BitsAndBytesConfig


class EdgeVLAInference:
    """边缘端 VLA 推理引擎

    使用 bitsandbytes INT4 量化加载,包含预热和频率统计。
    """

    def __init__(
        self,
        model_name: str = "openvla/openvla-7b",
        use_int4: bool = True,
    ):
        self.device = "cuda" if torch.cuda.is_available() else "cpu"

        load_kwargs = {
            "device_map": "auto",
            "low_cpu_mem_usage": True,
        }

        if use_int4 and self.device == "cuda":
            load_kwargs["quantization_config"] = BitsAndBytesConfig(
                load_in_4bit=True,
                bnb_4bit_compute_dtype=torch.float16,
                bnb_4bit_use_double_quant=True,
                bnb_4bit_quant_type="nf4",
            )

        self.model = AutoModelForVision2Seq.from_pretrained(
            model_name, **load_kwargs
        )
        self.model.eval()
        self.processor = AutoProcessor.from_pretrained(model_name)

        self.inference_count = 0
        self.total_time = 0.0

        # 预热:触发 CUDA kernel 编译,避免首次推理卡顿
        self._warmup()

    def _warmup(self):
        """预跑一次 dummy 推理,编译 CUDA kernels"""
        dummy_img = Image.new("RGB", (224, 224), color=(128, 128, 128))
        with torch.no_grad():
            inputs = self.processor(
                text="warmup",
                images=dummy_img,
                return_tensors="pt",
            ).to(self.device)
            _ = self.model.generate(**inputs, max_new_tokens=5)
        print("✓ VLA 模型预热完成")

    def predict_action(
        self, rgb_image: np.ndarray, instruction: str
    ) -> np.ndarray:
        """
        单帧 VLA 推理。

        Args:
            rgb_image: RGB 格式图像 (H, W, 3)
            instruction: 自然语言指令

        Returns:
            np.ndarray: 关节角增量 (DOF,),根据模型设定安全限幅
        """
        t_start = time.time()
        image = Image.fromarray(rgb_image).convert("RGB")

        with torch.no_grad():
            inputs = self.processor(
                text=instruction,
                images=image,
                return_tensors="pt",
            ).to(self.device)

            outputs = self.model.generate(
                **inputs,
                max_new_tokens=20,
                do_sample=False,
            )

        # 解码模型输出文本 → 动作数值
        raw_text = self.processor.decode(
            outputs[0], skip_special_tokens=True
        )
        action = self._parse_action(raw_text)

        # 统计推理耗时
        elapsed = time.time() - t_start
        self.inference_count += 1
        self.total_time += elapsed

        return action

    def _parse_action(self, raw: str) -> np.ndarray:
        """将模型输出解析为动作向量。

        VLA 模型通常输出空格分隔的数值序列,
        实际格式取决于具体模型的训练约定。
        此处以 7 维关节空间动作为例进行安全截取与限幅。
        """
        try:
            parts = raw.strip().split()
            # 提取所有可解析为浮点数的 token
            values = []
            for p in parts:
                try:
                    values.append(float(p))
                except ValueError:
                    continue

            if len(values) == 0:
                return np.zeros(7, dtype=np.float32)

            # 取前 dof 个值(这里以 7 为例,实际应按机器人 DOF 调整)
            dof = 7
            raw_action = np.array(values[:dof], dtype=np.float32)

            # 安全限幅:单步角增量不超过 ±0.1 rad(约 ±5.7°)
            return np.clip(raw_action, -0.1, 0.1)
        except Exception:
            # 解析失败时返回零动作,不动比乱动安全
            return np.zeros(7, dtype=np.float32)

    @property
    def avg_inference_hz(self) -> float:
        """返回平均推理频率(Hz)"""
        if self.total_time == 0:
            return 0.0
        return self.inference_count / self.total_time


# ── 使用示例 ─────────────────────────────────
if __name__ == "__main__":
    import cv2

    vla = EdgeVLAInference(use_int4=True)

    cap = cv2.VideoCapture(0)
    ret, frame = cap.read()

    if ret:
        action = vla.predict_action(
            rgb_image=cv2.cvtColor(frame, cv2.COLOR_BGR2RGB),
            instruction="pick up the red cube and place it on the table",
        )
        print(f"关节增量 (rad): {np.round(action, 4)}")
        print(f"平均推理频率: {vla.avg_inference_hz:.1f} Hz")

    cap.release()

五、ROS2 集成方案

VLA 推理节点需要嵌入 ROS2 控制回路。标准做法是:ROS2 订阅相机话题 → VLA 推理生成动作 → ROS2 发布关节指令。

关键注意事项:

  1. VLA 输出的是关节角度增量(Δq),需要累加到当前关节位置后再发送给控制器。
  2. 相机帧率(30FPS)远高于 VLA 推理频率(~5Hz),必须做跳帧处理,避免推理队列堆积。
  3. 需在回调中加互斥锁或标志位,防止推理未完成时新帧触发新的推理。
# ros2_vla_node.py — ROS2 + VLA 集成节点
import threading
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image, JointState
from trajectory_msgs.msg import JointTrajectory, JointTrajectoryPoint
from cv_bridge import CvBridge
import numpy as np

from vla_inference_node import EdgeVLAInference


class VLAInferenceNode(Node):
    """ROS2 节点:接收图像 → VLA 推理 → 发布关节轨迹

    注意:VLA 输出的是增量,需要结合当前关节位置计算目标位置。
    """

    def __init__(self):
        super().__init__("vla_inference_node")

        # 声明参数
        self.declare_parameter("model_name", "openvla/openvla-7b")
        self.declare_parameter("instruction", "pick up the red cube")
        self.declare_parameter(
            "joint_names",
            ["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint",
             "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"],
        )
        # 推理节流:至少间隔 N 秒才触发下一次推理
        self.declare_parameter("min_inference_interval_sec", 0.2)

        # 初始化 VLA 模型
        model_name = self.get_parameter("model_name").value
        self.get_logger().info(f"加载 VLA 模型: {model_name}")
        self.vla = EdgeVLAInference(model_name=model_name, use_int4=True)

        # 当前关节位置缓存(由 /joint_states 话题更新)
        self.current_positions = {}
        self._pos_lock = threading.Lock()

        # 推理状态控制
        self._inferring = False
        self._last_inference_time = 0.0
        self._infer_lock = threading.Lock()

        # ROS2 通信
        self.bridge = CvBridge()

        # 订阅关节状态(获取当前位置)
        self.create_subscription(
            JointState, "/joint_states", self.joint_state_callback, 10
        )
        # 订阅相机图像
        self.create_subscription(
            Image, "/camera/color/image_raw", self.image_callback, 5
        )
        # 发布关节轨迹
        self.pub = self.create_publisher(
            JointTrajectory, "/joint_trajectory_controller/joint_trajectory", 10
        )
        self.get_logger().info("✓ ROS2 VLA 推理节点已就绪")

    def joint_state_callback(self, msg: JointState):
        """维护当前关节位置缓存"""
        with self._pos_lock:
            for name, pos in zip(msg.name, msg.position):
                self.current_positions[name] = pos

    def image_callback(self, msg: Image):
        """图像回调:节流 + VLA 推理 + 发布关节目标"""
        now = self.get_clock().now().nanoseconds / 1e9
        interval = self.get_parameter("min_inference_interval_sec").value

        # 节流:如果距离上次推理不足 interval,丢弃本帧
        if now - self._last_inference_time < interval:
            return

        # 如果上一次推理还没结束,丢弃本帧
        with self._infer_lock:
            if self._inferring:
                return
            self._inferring = True

        try:
            cv_image = self.bridge.imgmsg_to_cv2(msg, desired_encoding="rgb8")
            instruction = self.get_parameter("instruction").value

            # VLA 推理:得到关节角度增量
            action_delta = self.vla.predict_action(cv_image, instruction)

            # 获取当前关节位置,计算目标位置 = 当前位置 + 增量
            joint_names = self.get_parameter("joint_names").value
            with self._pos_lock:
                target_positions = []
                for name in joint_names:
                    current = self.current_positions.get(name, 0.0)
                    idx = joint_names.index(name)
                    delta = action_delta[idx] if idx < len(action_delta) else 0.0
                    target_positions.append(current + delta)

            # 构建并发布 JointTrajectory 消息
            traj = JointTrajectory()
            traj.joint_names = joint_names
            point = JointTrajectoryPoint()
            point.positions = [float(p) for p in target_positions]

            # 根据增量大小动态设置执行时间(简单线性映射)
            max_delta = max(abs(d) for d in action_delta) if len(action_delta) > 0 else 0.01
            duration_sec = max(0.1, min(1.0, max_delta * 5.0))
            point.time_from_start.sec = int(duration_sec)
            point.time_from_start.nanosec = int((duration_sec % 1) * 1e9)
            traj.points = [point]

            self.pub.publish(traj)
            self._last_inference_time = now
            self.get_logger().debug(
                f"动作已发布 | 推理频率: {self.vla.avg_inference_hz:.1f} Hz"
            )

        except Exception as e:
            self.get_logger().error(f"VLA 推理失败: {e}")
        finally:
            with self._infer_lock:
                self._inferring = False


def main():
    rclpy.init()
    node = VLAInferenceNode()
    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        pass
    finally:
        node.destroy_node()
        rclpy.shutdown()


if __name__ == "__main__":
    main()

ROS2 Launch 文件示例:

# launch/vla_bringup.launch.py
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package="vla_inference",
            executable="ros2_vla_node",
            name="vla_inference_node",
            parameters=[{
                "instruction": "pick the red cube",
                "min_inference_interval_sec": 0.2,
            }],
            output="screen",
        ),
    ])

六、硬件选型速查

平台 AI 算力(sparse INT8) 内存 典型功耗 可跑模型(参考) 适合场景
Jetson Orin NX 16GB 100 TOPS 16GB 10–25W LLM 3B (INT4), 轻量 VLM 3B 轻量移动机器人
Jetson AGX Orin 64GB 275 TOPS 64GB 15–60W VLA 7B (INT4), VLM 7–32B (INT4) 机械臂/人形机器人
Jetson AGX Thor ~1000 TOPS (预估) 128GB 30–100W VLA/VLM 70B (FP8+量化) 旗舰人形机器人
RTX 4090(边缘工作站) 1321 TOPS (FP8) 24GB 200–450W VLA 7B (FP16), VLM 7–13B (FP16) 固定工位/实验室原型

注意: 不同厂商的 TOPS 指标测量条件不同(稀疏 vs 稠密,INT8 vs FP8),不可直接横向对比。选型时优先看实测推理延迟显存容量而非 TOPS。RTX 4090 显存仅 24GB,77B 级模型即使 INT4 也接近极限,所谓的"全尺寸模型"指 7–13B 范围。昇腾等国产 NPU 因 VLA 框架适配仍在早期阶段,未列入本表。

选型口诀: 移动端用 Orin,旗舰人形上 Thor,实验室固定工位可考虑 RTX 工作站。无论选哪个,先在目标硬件上实测一轮再采购。


七、避坑指南

现象 根因 解法
FP16 直接跑 OOM 模型加载到一半崩溃 Orin 统一内存被系统/ROS2 占用后,剩余空间不足以装下完整权重+KV Cache 必须 INT4 量化;bitsandbytes 快速验证,GPTQ 生产部署
首次推理卡 5 秒+ 第一帧延迟爆炸,后续正常 CUDA kernel JIT 编译 初始化时做 _warmup() dummy 推理
VLA 增量当绝对位置 机械臂跳变/撞限位 JointTrajectory.positions 是绝对位置,VLA 输出是增量 Δq /joint_states 获取当前位置 → 累加增量 → 发目标位置
相机帧率 >> 推理频率 推理队列堆积,延迟越来越大 30FPS 相机每 33ms 触发一次回调,推理要 150ms+ 加跳帧逻辑 + 互斥锁:推理未完成时丢弃新帧
动作输出抖动 机械臂一顿一顿的 VLA 推理 ~5Hz,两帧之间姿势不连续 动作间做线性插值,或降低轨迹点的执行时间间隔
VLA 输出关节越界 机械臂撞限位停 模型输出未约束 输出层加 np.clip(action, -max_delta, max_delta) 安全限幅
VLM 当 VLA 用 机械臂不动,只有文字输出 VLM 只输出文本,不输出关节指令 VLM 负责感知 → 输出给 VLA 或传统规划器;不能用 VLM 替代 VLA
WiFi 断连机器人宕机 纯云端架构离线即挂 所有推理依赖云 API 边缘推理兜底,云端只做非实时长程规划;断网时机器人安全待机
仿真跑通、真机翻车 Sim-to-Real Gap 仿真摩擦/光照/延迟与真实环境不同 真机遥操作采集数据 → LoRA 微调 VLA;训练时引入域随机化
深度量化精度崩塌 INT4 后任务成功率骤降 动作头对精度敏感,极端量化导致输出噪声 尝试混合精度:视觉编码器 INT8、语言模型 INT4、动作头保持 FP16
Jetson 供电不足降频 推理速度忽快忽慢 电池电压下降时自动切低功耗模式 锁定性能模式(nvpmodel -m 0),加电源管理监控

八、趋势预判与总结

8.1 2026 年具身智能五大趋势

  1. VLA 从 Demo 走向工程。 2025 年还在争论 VLA 能不能脱离桌面 GPU、在真机上跑通闭环。2026 年,OpenVLA(7B,970k 轨迹训练)已成为开源 VLA 的事实标准;GR00T N1.x 系列从 N1 迭代到 N1.7,在 Jetson Thor 上实现了实用帧率;π0.5 跨形态零样本泛化到陌生环境(厨房/卧室清洁)。工程化——量化、LoRA 微调、ROS2 集成——成为新的竞争焦点。

  2. 大-小模型蒸馏是端侧部署的关键路径。 腾讯 HY-Embodied 用 32B MoE 大模型教 2B MoT 小模型的方法已验证可行性:云端教师负责复杂推理,边缘学生负责低延迟执行。NVIDIA GR00T N1.7 同样采用 3B 规模的开源权重 + LoRA 微调范式。训练在云端、推理在端侧的模式正在成为标准。

  3. 开源 VLA 逼近闭源能力。 OpenVLA 以 7B 参数在 29 项跨本体任务上超越 55B 的闭源 RT-2-X(+16.5% 绝对成功率)。GR00T N1.7、π0.7 均以 Apache 2.0 开源。闭源方案(Gemini Robotics 等)仅靠垂直生态差异化——模型能力本身的差距已不再构成壁垒。

  4. 边缘推理加速进入快车道。 Jetson Thor 的 NVFP4 量化 + 推测解码 + TensorRT Edge-LLM 持续压缩推理延迟。GR00T N1.6 的 DiT 动作头已在 Thor 上跑到 120Hz——对于 VLA 的动作生成来说绰绰有余,瓶颈回到了 VLM 骨干的场景理解速度。

  5. 架构趋同 + 数据为王。 VLA 动作头从离散 token 预测(OpenVLA)向 Flow Matching/DiT(π 系列、GR00T)收敛;视觉编码器从单一路线向 DINOv2+SigLIP 双融合(OpenVLA)演进。差异化的主战场从"用什么架构"转向"用什么数据训练"——Open X-Embodiment 的 970k 跨本体轨迹、π 系列的 6 类异构数据联合训练,都在证明数据的多样性比模型的参数量更重要。

8.2 总览速查

┌──────────────────────────────────────────────────────────────────────┐
│           LLM + VLM + 机器人:具身智能选型 & 部署 最终速查表             │
├────────────┬────────────────┬────────────────┬──────────────────────┤
│            │ 云端大脑        │ 边缘中脑         │ 端侧小脑              │
├────────────┼────────────────┼────────────────┼──────────────────────┤
│ 硬件        │ A100/H100 集群  │ Jetson Orin/Thor │ MCU/FPGA               │
│ 模型        │ LLM 70B+       │ VLA 3–7B (量化)  │ 轻量NN/传统控制          │
│ 典型延迟    │ 500ms–数秒      │ 50–200ms        │ < 1–2ms                 │
│ 职责        │ 策略推理        │ 场景理解+动作生成 │ 实时闭环              │
│ 断网时       │ 降级不可用      │ 正常运行          │ 正常运行               │
├────────────┴────────────────┴────────────────┴──────────────────────┤
│ 核心法则:                                                            │
│ 1. 只有 VLA 能输出关节动作 — LLM/VLM 不直接控制机器人                 │
│ 2. Jetson Orin 裸跑 7B VLA 必须量化,不然 OOM                        │
│ 3. 首次推理必须 Warmup,否则第一帧延迟远超预期                        │
│ 4. VLA 输出增量 → 累加当前关节位置 → 得目标位置,不能把增量当绝对位置   │
│ 5. 相机帧率远高于推理频率,必须做节流/跳帧,否则队列堆积                │
│ 6. 真实硬件上实测一次 > 表上对比十次 — benchmark 评分不等同于现场效果  │
│ 7. 永远留端侧兜底 — 断网时机器人能安全待机,不能失控                   │
└──────────────────────────────────────────────────────────────────────┘

参考来源:


摘要总结

具身智能的核心命题不是"用哪个大模型最强",而是"在三层计算架构中把模型放到正确的物理位置"——每个模型都有它必须遵守的延迟预算。LLM 负责策略推理(延迟容忍度高,可上云),VLM 负责场景理解(边缘 Jetson),VLA 是唯一能端到端输出关节动作的模型,必须跑在边缘(推理周期 50–200ms,再慢控制回路断裂)。2026 年的工程进展:三大开源 VLA(OpenVLA/GR00T/π0.5)覆盖主流机器人形态,Jetson Orin 上 INT4 量化可跑到 ~5Hz,Thor 上更可达 10–20Hz;LoRA 微调用数百条真机数据即可适配新硬件。部署关键:VLA 输出是增量不是绝对位置、推理频率远低于相机帧率必须节流、首次推理前必须 Warmup、实时控制环永远留给 MCU。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐