• 正文
  • 相关推荐
申请入驻 产业图谱

具身智能 | LDA-1B: 通过通用具身数据摄入实现规模化的机器人基础模型

14小时前
134
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

转载自公众号: 敢敢AUTOHUB

1. 引言:机器人智能的新范式

在人工智能领域,大语言模型(LLM)和视觉语言模型(VLM)通过大规模预训练展现了惊人的泛化能力。机器人领域也在探索类似路径,但面临独特挑战:现有机器人基础模型多采用行为克隆(Behavior Cloning, BC)范式,只能从高质量专家演示中学习。这导致一个严重问题——大量包含丰富物理交互动力学的异构具身数据(低质量轨迹、失败尝试、人类视频)被浪费。如何让机器人像人类一样从各种经验中学习,包括失败和次优行为?这正是LDA-1B要解决的核心问题。

想象一下,如果我们能让机器人不仅学习"做什么",还能理解"为什么这样做会产生这样的结果",那么机器人的智能水平将会有质的飞跃。这正是LDA-1B(Latent Dynamics Action Model)所要解决的核心问题。LDA-1B是一款参数量达10亿的机器人基础模型,它通过创新的 "通用具身数据摄入"机制,能够从超过3万小时的混合质量人机交互数据中学习,不仅掌握操作策略,还深刻理解物理世界的动力学规律。

统一世界模型(Unified World Model, UWM)框架为解决这些问题提供了新思路。UWM在单一模型内联合优化动力学、策略和视频生成,理论上可以利用各种质量的数据。但现有的UWM实现仍然存在明显不足:数据使用方式粗糙、缺乏大规模标准化数据集、在像素空间中表征导致训练效率低下

Github主页:https://github.com/jiangranlv/LDA-1B
文章地址:https://arxiv.org/html/2602.12215

2. 核心技术原理:潜态动力学动作模型

LDA-1B通过四大核心创新,突破了现有方法的瓶颈:

1. 通用具身数据摄入机制
LDA-1B为不同质量的数据分配差异化角色:无动作标注的人类视频用于视觉预测,低质量轨迹主要用于动力学学习,高质量轨迹同时支撑策略和动力学学习。这种设计使得模型能够充分挖掘每一份数据的价值。

2. EI-30k大规模数据集
研究团队构建了包含超3万小时人机轨迹的EI-30k数据集,涵盖8030小时真实世界机器人数据、8600小时仿真数据、7200小时带动作标注的人类演示和10000小时无动作人类视频。所有数据采用统一格式,实现了末端执行器坐标系的对齐。

3. 结构化DINO潜空间
不同于传统方法在像素空间中进行预测,LDA-1B在预训练的DINO编码器提取的潜特征空间中进行动力学学习。这种表征对高层语义和空间结构进行编码,同时抑制背景噪声和低层视觉变化,大幅提升了训练效率和泛化能力。

4. 多模态扩散Transformer(MM-DiT)
LDA-1B采用创新的MM-DiT架构,能够处理异步的视觉和动作流。视觉观测以3Hz采样,动作以10Hz采样,这种设计在保留细粒度动作动力学的同时,减少了冗余计算。

2.1 统一世界模型(UWM)基础

LDA-1B的核心思想建立在 统一世界模型(Unified World Model, UWM) 框架之上。传统的机器人学习方法往往将策略学习和动力学建模分离,而UWM则提出了一个革命性的想法:在单一模型内联合学习四个关键能力

给定当前观测  (通常为RGB图像),UWM联合建模未来观测和动作分块的多个条件分布:

1. 策略学习:  - 根据当前观测预测未来动作序列

2. 前向动力学:  - 预测执行动作后的未来状态

3. 逆向动力学:  - 从状态变化推断所需动作

4. 视觉规划:  - 预测未来可能的状态演化

这种统一框架的优势在于,不同的学习目标可以相互促进。例如,学习前向动力学可以帮助模型更好地理解动作的物理后果,从而改进策略学习;而逆向动力学则能帮助模型理解如何通过动作达到期望状态。

技术实现:UWM采用联合扩散模型来实例化这一框架。扩散模型是一类强大的生成模型,通过逐步去噪的过程生成数据。在UWM中,模型同时为动作和未来观测预测噪声:

def unified_world_model(current_obs, language_instruction, t_action, t_obs):
    """
    current_obs: 当前观测(RGB图像)
    language_instruction: 语言指令
    t_action: 动作的扩散时间步
    t_obs: 观测的扩散时间步
    """
    # 编码当前观测和语言指令
    obs_embedding = vlm_encoder(current_obs, language_instruction)

    # 为动作和观测独立采样噪声
    noisy_action = add_noise(action, t_action)
    noisy_future_obs = add_noise(future_obs, t_obs)

    # 联合预测去噪后的动作和观测
    denoised_action, denoised_obs = diffusion_model(
        obs_embedding,
        noisy_action,
        noisy_future_obs,
        t_action,
        t_obs
    )

    return denoised_action, denoised_obs

这里的关键创新在于,动作和观测使用独立采样的扩散时间步(t_a和t_o),这使得模型能够灵活地处理不同模态的噪声水平,提高了训练的稳定性和效率。

2.2 通用数据摄入:让每一份数据发挥价值

LDA-1B最重要的创新之一是"通用数据摄入"机制。这一机制的核心思想是:不同质量的数据应该在训练中扮演不同但互补的角色,而不是简单地被接受或拒绝。

数据分类与角色分配

高质量机器人和人类演示数据作为最可靠的监督信号,用于所有四个训练目标的联合训练,同时支撑动作策略学习和动力学建模。这些数据代表了专家级的操作水平,为模型提供了最优行为的范例。

低质量轨迹数据虽然动作可能不完美,但仍然包含有价值的物理交互过程。这些数据仅用于动力学和视觉预测任务,因为这些任务对动作最优性的要求较低。即使是失败的尝试,也能帮助模型理解"什么样的动作会导致什么样的结果"。

无动作标注的人类操作视频专门用于视觉预测目标,提供大规模的视觉动力学监督。这些视频帮助模型学习物体运动和场景变化规律,即使没有精确的动作标签,也能从中提取丰富的视觉先验知识。

这种设计避免了模型过拟合到仅含专家的行为,同时实现了可扩展的可迁移动力学和动作表征学习。

技术实现:任务嵌入和寄存器标记

为了在单一扩散模型中实现差异化目标,LDA-1B引入了创新的设计:

# 多任务数据加载器实现
class MultiTaskDiffusionModel:
    def __init__(self):
        # 4个可学习的任务嵌入(对应4种训练目标)
        self.task_embeddings = nn.ModuleDict({
            'policy': nn.Embedding(1, dim),              # 策略学习
            'forward_dynamics': nn.Embedding(1, dim),    # 前向动力学
            'inverse_dynamics': nn.Embedding(1, dim),    # 逆向动力学
            'visual_forecasting': nn.Embedding(1, dim)   # 视觉预测
        })

        # 2个可学习的寄存器标记(处理缺失模态)
        self.action_register = nn.Parameter(torch.randn(1, 1, dim))
        self.visual_register = nn.Parameter(torch.randn(1, 1, dim))

    def forward(self, obs, task_type, noisy_action=None, noisy_visual=None):
        # 获取任务嵌入
        task_emb = self.task_embeddings[task_type](torch.zeros(1, dtype=torch.long))

        # 根据任务类型使用实际数据或寄存器
        if task_type == 'policy':
            # 策略学习: 有动作,无未来视觉
            action_tokens = noisy_action
            visual_tokens = self.visual_register.expand(batch_size, -1, -1)
        elif task_type == 'visual_forecasting':
            # 视觉预测: 无动作,有未来视觉
            action_tokens = self.action_register.expand(batch_size, -1, -1)
            visual_tokens = noisy_visual
        else:
            # 动力学学习: 两者都有
            action_tokens = noisy_action
            visual_tokens = noisy_visual

        # 联合处理
        return self.mm_dit(obs, task_emb, action_tokens, visual_tokens)

这种设计的巧妙之处在于,它使统一架构能够灵活支持不同的输入输出结构,无需修改网络拓扑。模型通过任务嵌入知道当前要执行什么任务,通过寄存器标记处理缺失的模态信息。

流匹配目标:

模型采用流匹配(Flow Matching)目标进行训练,这是一种比传统DDPM更高效的训练方法:

在训练过程中,动作和视觉损失会根据任务要求选择性激活。例如,对于无动作标注的人类视频,只计算;对于低质量轨迹,计算和动力学相关的损失,但不计算策略损失。

这种灵活的训练机制使得LDA-1B能够从3万小时的混合质量数据中学习,而不是像传统方法那样只能使用其中的一小部分高质量数据。

2.3 预测目标的表征:从像素到语义

LDA-1B的另一个关键创新是预测目标的表征方式。传统的世界模型通常在像素空间中进行预测,这带来了严重的问题:光照变化、纹理细节、背景杂乱等与任务无关的因素会主导训练目标,导致模型难以学习真正重要的物理交互动力学。

DINO潜空间:语义结构化的表征

LDA-1B采用预训练的DINO(Self-Distillation with No Labels)编码器提取的潜特征,而非基于VAE的像素空间表征。DINO是一种自监督学习方法,能够学习到高质量的视觉表征。

DINO潜特征具有三大核心优势:语义编码能力使其对高层语义和空间结构进行编码,关注物体的功能属性而非表面外观;噪声抑制特性可以自动抑制背景噪声和低层视觉变化,如光照、阴影等干扰因素;强大的泛化能力使其在不同环境和物体配置下保持一致性,有助于跨场景泛化。

# DINO潜特征提取
class LatentRepresentation:
    def __init__(self):
        # 使用预训练的DINOv2-ViT-small(冻结参数)
        self.dino_encoder = torch.hub.load('facebookresearch/dinov2', 'dinov2_vits14')
        self.dino_encoder.eval()
        for param in self.dino_encoder.parameters():
            param.requires_grad = False

    def encode_observation(self, rgb_image):
        """
        将RGB图像编码为DINO潜特征
        输入: (B, 3, 224, 224) RGB图像
        输出: (B, 196, 384) 潜特征序列 (14x14 patches)
        """
        with torch.no_grad():
            # 提取patch级别的特征(不包含CLS token)
            features = self.dino_encoder.forward_features(rgb_image)
            patch_features = features['x_norm_patchtokens']  # (B, 196, 384)
        return patch_features

    def predict_future_latent(self, current_latent, action):
        """
        在潜空间中预测未来状态(核心优势)
        - 不需要重建像素级纹理和光照
        - 专注于物体运动、接触和状态变化
        """
        future_latent = self.mm_dit(current_latent, action)
        return future_latent

这种设计的关键优势在于,模型不需要学习如何重建像素级的纹理和光照,而是专注于学习物体的运动、接触和状态变化等与任务相关的动力学知识。

统一的动作空间:以手部为中心

为了实现不同具身形式(机器人、人类、不同类型的机械手)之间的知识共享,LDA-1B定义了统一的以手部为中心的动作空间。该空间包含两个核心组件:腕部位姿增量表示6自由度的位置和姿态变化,手指构型则根据具身形式不同而有所区别——对于平行爪夹持器使用单自由度的夹持器宽度,对于多指灵巧手则使用腕部坐标系中的关键点位置。

# 统一动作表征(跨具身形式)
class UnifiedActionSpace:
    def __init__(self, embodiment_type):
        self.embodiment_type = embodiment_type

    def encode_action(self, raw_action):
        """将不同具身形式的动作编码为统一格式"""
        if self.embodiment_type == 'parallel_gripper':
            # 机器人平行爪: 6D位姿增量 + 夹持器宽度
            wrist_delta = raw_action[:6]  # (x,y,z, roll,pitch,yaw)
            gripper = raw_action[6:7]
            return torch.cat([wrist_delta, gripper])

        elif self.embodiment_type == 'dexterous_hand':
            # 灵巧手(Sharpa 22-DoF): 6D位姿 + 手指关节
            wrist_delta = raw_action[:6]
            finger_joints = raw_action[6:]  # 22个关节角度
            return torch.cat([wrist_delta, finger_joints])

        elif self.embodiment_type == 'human_hand':
            # 人类手部: 6D位姿 + MANO关键点
            wrist_pose = raw_action[:6]
            mano_keypoints = raw_action[6:]  # 21个3D关键点
            return torch.cat([wrist_pose, mano_keypoints])

这种统一表征使得模型能够从人类演示中学习灵巧操作的先验知识,然后迁移到机器人上,大大提高了数据利用效率。

混合频率的时间建模

LDA-1B采用创新的混合频率设计来建模时间动力学:视觉观测以3Hz采样,动作以10Hz采样。这种设计基于一个重要观察——视觉场景的变化通常比动作控制信号慢。高频采样视觉会产生大量高度相关的连续帧造成计算浪费,而动作需要更高的采样频率来捕捉细粒度的控制动力学。这种设计在保留细粒度动作动力学的同时减少了冗余计算,使模型能够在快速变化的控制信号和慢速演化的视觉状态之间维持连贯的时间对齐。

# 混合频率时间建模(3Hz视觉 + 10Hz动作)
class MixedFrequencyStream:
    def __init__(self):
        self.visual_freq = 3   # Hz (每333ms一帧)
        self.action_freq = 10  # Hz (每100ms一个动作)

    def organize_temporal_data(self, trajectory):
        """将轨迹组织为异步的视觉和动作流"""
        # 视觉流: 降采样到3Hz
        visual_indices = torch.arange(0, len(trajectory), step=10//3)
        visual_stream = trajectory.observations[visual_indices]

        # 动作流: 保持10Hz
        action_stream = trajectory.actions

        # 时间对齐: 为每个动作关联最近的视觉观测
        aligned_data = self.temporal_alignment(visual_stream, action_stream)
        return aligned_data

这种设计在保留细粒度动作动力学的同时,减少了冗余计算,使模型能够在快速变化的控制信号和慢速演化的视觉状态之间维持连贯的时间对齐。

2.4 多模态扩散Transformer(MM-DiT):统一架构的核心

LDA-1B的模型架构采用多模态扩散Transformer(MM-DiT),这是一个能够在统一扩散框架中联合处理动作和视觉两种模态的创新架构。

架构设计原理

MM-DiT的核心思想是:虽然动作和视觉是两种截然不同的模态,但它们在物理交互中是紧密耦合的。因此,模型需要能够同时处理这两种模态,并让它们相互交互。

class MMDiTBlock(nn.Module):
    """多模态扩散Transformer块 - 核心创新"""
    def __init__(self, dim, num_attention_heads, attention_head_dim):
        super().__init__()

        # 双时间步编码器(动作+视觉)
        self.dual_timestep_encoder = DualTimestepEncoder(dim)

        # 条件注入层(AdaLN-Zero初始化)
        self.to_cond = nn.Sequential(
            nn.SiLU(),
            nn.Linear(dim * 3, dim * 12)  # gamma和beta参数
        )
        nn.init.zeros_(self.to_cond[-1].weight)
        nn.init.constant_(self.to_cond[-1].bias[:dim*8], 1.0)  # gamma初始化为1

        # 模态特定的归一化
        self.image_norm1 = RMSNorm(dim)
        self.action_norm1 = RMSNorm(dim)

        # 联合自注意力(关键创新:动作和视觉共享注意力)
        self.joint_attn = JointAttention(
            dim=dim,
            num_heads=num_attention_heads,
            qk_rmsnorm=True,  # 稳定训练
            flash_attn=True   # 加速计算
        )

        # 语言交叉注意力
        self.cross_attn_image = Attention(dim, cross_attention_dim=dim)
        self.cross_attn_action = Attention(dim, cross_attention_dim=dim)

        # 模态特定的前馈网络
        self.image_ff = FeedForward(dim, activation_fn="geglu")
        self.action_ff = FeedForward(dim, activation_fn="geglu")

    def forward(self, image_tokens, action_tokens, language_context,
                t_action, t_visual, task_emb):
        """
        image_tokens: (B, N_img, D) 视觉标记
        action_tokens: (B, N_act, D) 动作标记
        language_context: (B, L, D) 语言上下文
        t_action, t_visual: 扩散时间步
        """
        # 1. 双时间步编码
        timestep_emb = self.dual_timestep_encoder(t_action, t_visual)
        cond = torch.cat([timestep_emb, task_emb, language_context.mean(1)], -1)

        # 2. 提取AdaLN参数(gamma和beta)
        gammas_betas = self.to_cond(cond).chunk(12, dim=-1)
        (img_gamma1, img_gamma2, img_gamma3, img_gamma4,
         act_gamma1, act_gamma2, act_gamma3, act_gamma4,
         img_beta1, img_beta2, act_beta1, act_beta2) = gammas_betas

        # 3. 自注意力(联合处理两个模态)
        img_norm = self.image_norm1(image_tokens) * img_gamma1 + img_beta1
        act_norm = self.action_norm1(action_tokens) * act_gamma1 + act_beta1

        img_attn, act_attn = self.joint_attn(img_norm, act_norm)
        image_tokens = image_tokens + img_attn * img_gamma2
        action_tokens = action_tokens + act_attn * act_gamma2

        # 4. 交叉注意力(语言条件)
        image_tokens = image_tokens + self.cross_attn_image(
            image_tokens, language_context
        ) * img_gamma3
        action_tokens = action_tokens + self.cross_attn_action(
            action_tokens, language_context
        ) * act_gamma3

        # 5. 前馈网络
        image_tokens = image_tokens + self.image_ff(image_tokens) * img_gamma4
        action_tokens = action_tokens + self.action_ff(action_tokens) * act_gamma4

        return image_tokens, action_tokens

MM-DiT Block的设计

每个MM-DiT块包含三个关键组件:

class MMDiTBlock(nn.Module):
    def __init__(self, hidden_size, num_heads):
        super().__init__()
        # 自适应层归一化(AdaLN)
        self.adaln = AdaptiveLayerNorm(hidden_size)

        # 模态特定的QKV投影
        self.action_qkv = nn.Linear(hidden_size, 3 * hidden_size)
        self.visual_qkv = nn.Linear(hidden_size, 3 * hidden_size)

        # 共享的多头注意力
        self.attention = MultiHeadAttention(num_heads, hidden_size)

        # 语言交叉注意力
        self.cross_attention = CrossAttention(hidden_size)

        # 模态特定的FFN
        self.action_ffn = FeedForward(hidden_size)
        self.visual_ffn = FeedForward(hidden_size)

    def forward(self, tokens, condition):
        # 1. AdaLN调节
        tokens_norm = self.adaln(tokens, condition)

        # 2. 分离动作和视觉标记
        action_tokens = tokens_norm[:, :action_len]
        visual_tokens = tokens_norm[:, action_len:]

        # 3. 模态特定的QKV投影
        action_qkv = self.action_qkv(action_tokens)
        visual_qkv = self.visual_qkv(visual_tokens)

        # 4. 拼接后进行共享注意力(关键创新!)
        all_qkv = torch.cat([action_qkv, visual_qkv], dim=1)
        attended = self.attention(all_qkv)

        # 5. 语言交叉注意力
        attended = self.cross_attention(attended, language_tokens)

        # 6. 分离并通过模态特定的FFN
        action_out = self.action_ffn(attended[:, :action_len])
        visual_out = self.visual_ffn(attended[:, action_len:])

        # 7. 残差连接
        return tokens + torch.cat([action_out, visual_out], dim=1)

关键设计特点

MM-DiT的设计体现了四个核心创新。模态特定的QKV投影保留每个模态的归纳偏置,使模型能够学习模态特定的特征。共享的注意力机制允许动作和视觉标记相互交互,学习跨模态的依赖关系。AdaLN条件注入通过自适应层归一化将时间步和任务信息注入每一层。语言交叉注意力提供高层语义指导,使模型理解任务目标。

这种设计使得MM-DiT能够同时处理异步的视觉(3Hz)和动作(10Hz)流,在10亿参数规模下实现稳定训练,并灵活支持不同的训练目标(策略、动力学、视觉预测)。

# 基于实际实现的训练循环
def train_step(batch, model, optimizer):
    """LDA-1B训练步骤 - 流匹配目标"""

    # 1. 随机采样扩散时间步 [0, 1]
    t_action = torch.rand(batch_size, device=device)
    t_visual = torch.rand(batch_size, device=device)

    # 2. 添加噪声(线性插值)
    eps_action = torch.randn_like(batch.action)
    eps_visual = torch.randn_like(batch.future_visual)

    action_noisy = t_action * batch.action + (1 - t_action) * eps_action
    visual_noisy = t_visual * batch.future_visual + (1 - t_visual) * eps_visual

    # 3. 模型预测速度场(flow matching)
    v_action, v_visual = model(
        obs=batch.obs,
        language=batch.language,
        action_noisy=action_noisy,
        visual_noisy=visual_noisy,
        t_action=t_action,
        t_visual=t_visual,
        task_emb=batch.task_embedding
    )

    # 4. 流匹配损失(预测目标 - 噪声)
    target_action = batch.action - eps_action
    target_visual = batch.future_visual - eps_visual

    loss_action = F.mse_loss(v_action, target_action)
    loss_visual = F.mse_loss(v_visual, target_visual)

    # 5. 根据任务类型选择性激活损失
    if batch.task == 'policy':
        loss = loss_action  # 仅策略学习
    elif batch.task == 'visual_forecasting':
        loss = loss_visual  # 仅视觉预测
    elif batch.task == 'forward_dynamics':
        loss = loss_action + loss_visual  # 前向动力学
    elif batch.task == 'inverse_dynamics':
        loss = loss_action + 0.5 * loss_visual  # 逆向动力学

    # 6. 反向传播(带梯度裁剪)
    optimizer.zero_grad()
    loss.backward()
    torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
    optimizer.step()

    return loss.item()

通过这些精心设计的架构和训练技术,LDA-1B实现了在10亿参数规模下的稳定训练,同时保持了对异构数据的高效利用能力。

3. EI-30k数据集:规模化的基石

3.1 数据集概览

EI-30k(Embodied Interaction 30k)是LDA-1B能够实现规模化学习的关键基础设施。这是一个包含超过3万小时具身交互轨迹的大规模数据集,是目前机器人领域最大的统一格式数据集之一。

EI-30k整合了四大类数据源,总计33,830小时真实世界机器人数据(8,030小时)涵盖Open X-Embodiment的大规模物理机器人执行日志、Agibot World的通用操作任务、Humanoid Everyday的双足运动动力学、Galaxea的高保真灵巧任务,以及RoboCOIN的多样化环境探索数据。仿真机器人数据(8,600小时)包括InternData-A1的高质量仿真轨迹和Behavior-1k的长时程任务演示。带动作标注的人类演示数据(7,200小时)整合了Ego4D、Epic-Kitchens、Ego-Exo4D、Something-Something V2、EgoDex和HOT3D等数据集。无动作标注的人类视频(10,000小时)通过Egocentric-10k、RH20T-human和TASTE-Rob提供大规模视觉先验。这种多样化组合使LDA-1B能够学习从简单拾取到复杂双手协调的丰富物理交互知识。

3.2 数据统一:从碎片到整体

机器人领域的一个长期痛点是数据集的高度碎片化。不同的研究团队使用不同的数据格式、传感器配置、动作表征和标注质量,这使得大规模数据聚合变得极其困难。EI-30k通过系统化的数据处理流程解决了这一问题。

LeRobot格式标准化

所有原始数据集首先被转换为统一的LeRobot 2.1格式,这是一个专为机器人学习设计的标准化数据格式:

# LeRobot标准化数据格式
{
    "observation": {
        "image": {
            "head_camera": np.array([224, 224, 3]),  # RGB
            "wrist_camera": np.array([224, 224, 3])  # 可选
        },
        "state": {
            "joint_positions": np.array([7]),
            "joint_velocities": np.array([7])
        }
    },
    "action": {
        "end_effector_pose": np.array([6]),  # 6D位姿增量
        "gripper_command": np.array([1])
    },
    "language_instruction": "pick up the red cube",
    "episode_metadata": {
        "episode_id": "ep_001",
        "task_name": "pick_and_place",
        "quality_label": "high",  # 质量标签: high/medium/low
        "success": True
    },
    "camera_extrinsics": np.array([4, 4]),
    "camera_intrinsics": np.array([3, 3])
}

这种标准化带来了多重好处:即插即用训练使所有数据集可以无缝组合使用,灵活的数据组合允许根据需要选择不同质量或类型的数据,额外标注的无缝整合可以方便地添加新的标注信息,大幅降低工程开销不需要为每个数据集编写专门的加载代码。

3.3 对齐的动作表征:跨具身形式的知识共享

EI-30k的另一个关键创新是实现了跨不同具身形式的动作表征对齐。这使得模型能够从人类演示中学习,然后迁移到机器人上,大大提高了数据利用效率。

统一的以手部为中心的坐标系

所有可用的动作标注都被转换到一个共享的以手部为中心的坐标系中:

# 统一的具身数据集类
class EmbodiedDataset:
    def __init__(self, dataset_name, eef_in_world, has_mano):
        self.dataset_name = dataset_name
        self.eef_in_world = eef_in_world  # 腕部位姿是否在世界坐标系
        self.has_mano = has_mano          # 是否有MANO手部参数
        self.eef_offset = {}              # 末端执行器偏移矩阵

    def get_wrist_pose(self, raw_data):
        """获取统一的腕部位姿"""
        if self.dataset_name == 'robot_gripper':
            wrist_pose = raw_data['ee_pose']
        elif self.dataset_name == 'robot_dexterous':
            wrist_pose = raw_data['wrist_pose']
        elif self.dataset_name == 'human_egocentric':
            wrist_pose = self.extract_wrist_from_mano(raw_data['mano'])
        else:
            raise ValueError(f"Unknown dataset: {self.dataset_name}")

        # 应用坐标系对齐变换
        return self.apply_alignment(wrist_pose)

    def get_finger_configuration(self, raw_data):
        """获取统一的手指构型"""
        if self.dataset_name == 'robot_gripper':
            return {'gripper_width': raw_data['gripper_width']}
        elif self.dataset_name == 'robot_dexterous':
            return {'finger_joints': raw_data['finger_joints']}
        elif self.dataset_name == 'human_egocentric':
            return {'mano_keypoints': raw_data['mano_keypoints']}

坐标系对齐的重要性

不同数据集的坐标系定义往往不一致——有些数据集的腕部位姿在世界坐标系中定义,有些在相机坐标系中定义,还有些在机器人基座坐标系中定义。EI-30k通过人工对齐确保所有坐标系的几何一致性,使得模型能够从人类灵巧操作中学习手指协调模式,将学到的知识迁移到机器人灵巧手上,实现跨具身形式的零样本泛化。

3.4 质量标注与数据清洗

EI-30k的一个重要特点是采用了系统化的质量标注和清洗流程,而不是简单地丢弃低质量数据。这种做法基于一个重要洞察:低质量数据虽然不适合直接用于策略学习,但仍然包含有价值的动力学信息。

EI-30k根据动作准确性、标注完整性和任务成功率将每个轨迹分配到四个质量等级。高质量轨迹展现接近专家水平的动作准确性,包含完整的标注信息且任务成功完成,这类数据同时用于策略学习、动力学学习和视觉预测三个训练目标。中等质量轨迹的动作基本正确但可能存在小的失误,标注基本完整且任务最终完成但过程不够流畅,主要用于动力学学习和视觉预测。低质量轨迹可能包含错误或次优的动作选择,标注可能不完整且任务可能失败或需要多次尝试,但由于物理交互过程仍然有效,这类数据专门用于动力学学习以帮助模型理解"什么样的动作会导致什么样的结果"。无动作标注数据仅包含视觉信息而无动作标签,专门用于视觉预测任务以提供大规模的视觉动力学监督。

# 数据质量标注系统
class QualityAnnotation:
    def __init__(self):
        self.vlm = VisionLanguageModel()

    def annotate_trajectory(self, trajectory):
        """为轨迹分配质量标签"""
        score = 0

        # 任务成功率(40分)
        if trajectory.task_success:
            score += 40

        # 动作流畅度(30分)
        smoothness = self.compute_smoothness(trajectory.actions)
        score += smoothness * 30

        # 标注完整性(30分)
        completeness = self.check_annotations(trajectory)
        score += completeness * 30

        # 分配标签
        if score >= 80:
            return 'high'
        elif score >= 50:
            return 'medium'
        else:
            return 'low'

    def clean_trajectory(self, trajectory):
        """清洗轨迹数据"""
        # 1. 语言标注归一化
        trajectory.language = self.vlm.normalize_instruction(trajectory.language)

        # 2. 移除无手-物交互的片段
        meaningful_segments = [
            seg for seg in trajectory.segments
            if self.has_hand_object_interaction(seg)
        ]
        trajectory.segments = meaningful_segments

        # 3. 验证手部可见性
        for frame in trajectory.frames:
            if not self.verify_hand_visibility(frame):
                frame.mark_as_invalid()

        return trajectory

EI-30k采用系统化的四步清洗流程确保数据质量。首先通过语言标注归一化使用VLM统一不同数据集的语言描述风格并确保语义一致性,例如将"拿起红色方块"标准化为"Pick up the red cube"。其次进行无效片段移除,清除无手-物交互的运动片段、手部被遮挡或截断的帧以及运动学无效的姿态。第三步是坐标系验证,检查坐标变换的正确性并验证手部运动与相机运动的解耦。最后也是最关键的一步是保留低质量数据,与激进过滤策略不同,EI-30k通过质量标签让模型自适应使用这些数据,充分挖掘其中包含的物理交互动力学信息。

这种系统化的处理使得EI-30k不仅规模大,而且质量可控,为LDA-1B的规模化学习提供了坚实基础。

EI-30k的规模和多样性在机器人领域是前所未有的。数据集总时长达到33,830小时,包含超过200万条轨迹,覆盖1000+种不同任务和100+个不同场景,涉及20+种不同的机器人和人类配置。在质量分布上,高质量数据占40%,中等质量占30%,低质量占20%,无动作标注占10%。这种规模和多样性使得LDA-1B能够学习到真正通用的物理交互知识,而不是过拟合到特定的任务或环境。

4. 结论与展望

LDA-1B代表了机器人基础模型发展的一个重要里程碑。通过创新的通用具身数据摄入机制和统一潜态动力学学习, LDA-1B展示了通过通用具身数据摄入和统一潜态动力学学习实现机器人基础模型规模化的可行性。这不仅是一个技术突破,更是一种范式转变:从"只用最好的数据"到"充分利用所有数据",从"模仿动作"到"理解动力学",从"像素空间"到"语义空间"。

随着数据规模的持续增长、模型架构的不断优化、以及对物理世界理解的深入,我们有理由相信,真正通用的机器人智能正在逐步成为现实。LDA-1B只是这一征程中的一个重要里程碑,未来还有更广阔的探索空间等待着我们。

相关推荐