https://github.com/huggingface/lerobot-dataset-visualizer
lerobot record是关键核心流程,其包括了数据的采集和模型推理两部分。
如果是数据采集模式,命令启动如下
如果是模型推理模式,则命令如下
主要的区别是如果是采集模式需要使用–teleop参数启动遥控机器,如果是模型推理模式则不需要启动遥控机器,但是需要指定模型路径–policy.path,本质上就是机器人的动作指令来源于哪里,要么来之遥控器的,要么来自模型推理出来的。
可以看出整个录制流程主要围绕机器设备、遥控设备、模型、数据集四个要素进行展开。
机器:有SO101Follower、LeKiwi等机器,都继承Robot类。通过命令行参数robot.type调用make_robot_from_config函数选择创建具体的实例设备,函数返回的还是Robot但是指向的是具体的机器实例如SO101Follower,利用了多态的特性做到了解耦,如果要新添机器时,只需要参考SO101Follower添加一个新的设备即可。在创建机器实例时传递RobotConfig参数,这个参数依旧是抽象基类,其继承了draccus.ChoiceRregistry,通过命令行参数robot.type选择注册具体的配置如SO101FollowerConfig。
遥控:用于控制机器,常用于数据的采集。这里同样通过命令行参数teleop.type调用make_teleoperator_from_config函数选择创建具体的设备实例,创建实例时需要传递TeleoperatorConfig参数,其也是一个抽象基类,基于命令选择注册实例化的配置类参数,如SO101LeaderConfig。
模型:模型用于决策推理动作,其和遥控二选一,如果指定了遥控了,模型就不需要指定了。通用使用了机器、遥控的解耦机制,具体的实例化为ACT或DiffusionPolicy等。
数据:通过参数dataset.xxx将参数构建为DataRecordConfig类,然后将其中的信息传递给LeRobotDataset
RecordConfig中有几个关键的成员,分别是RobotConfig,DatasetRrcordConfig、TeleoperatorConfig、PreTrainedConfig。其中除了DatasetRrcordConfig外的其他几个都是继承draccus.ChoiceRegistry 和 abc.ABC,是一个抽象基类,需通过注册的子类(如特定机器人型号的配置类)实例化,种设计既保证了配置的结构化(继承 abc.ABC),又支持灵活的子类选择(通过 draccus.ChoiceRegistry 实现配置注册与解析)。
RobotConfig 是抽象基类(ABC),仅定义所有机器共有的通用配置字段,如id、calibration_dir。其继承了draccus.ChoiceRegistry实现了不同机器人型号的动态注册与选择
DatasetRecordConfig 是数据集录制任务的参数容器,被嵌套在 RecordConfig 中(作为 RecordConfig.dataset 字段),最终通过 parser.wrap() 装饰器从命令行参数解析生成实例
TeleoperatorConfig 是远程遥控操作器(如手柄、键盘、 leader 机器人)的抽象配置基类,用于定义所有遥操作器共有的通用配置字段和动态选择机制。它与RobotConfig类似,同样继承了draccus.ChoiceRegistry 实现了注册机制,其具体的子类又继承TeleoperatorConfig
用户通过-teleop.type指定来实例化具体的操作设备,如–teleop.type=so101_leader时,具体的流程如下。
PreTrainedConfig是所有策略模型如ACT,TDMPC的抽象配置类,定义了策略训练/推理所需的通用参数,特征规范、设备配置及Hugging Face Hub交互机制。它通过 dataclass、draccus.ChoiceRegistry 和 abc.ABC 实现“配置标准化”“多策略兼容”和“Hub 集成”,是策略初始化的核心参数载体。
学习率调度器(Learning Rate Scheduler)是深度学习训练中动态调整优化器学习率的工具(注意是在优化器的基础上动态调整学习率),通过优化收敛过程提升模型性能。
学习率(η)控制梯度更新步长,参数更新量 = -η × 梯度。过大步长导致震荡,过小则陷入局部最优或训练缓慢,固定学习率易导致训练初期震荡或后期收敛缓慢,调度器在训练期间自适应调整初期较高学习率加速收敛,中期稳定探索最优解,后期精细调优避免震荡。
以下是常见的学习率调度器
LRSchedulerConfig是学习率调度器配置的核心抽象,通过抽象接口定义+配置注册机制,实现了学习率调度策略的统一管理与灵活扩展。
其同样继承了abc.ABC标记为抽象基类,强制子类事项build抽象方法,同时继承draccus.ChoiceRegistry提供子类注册机制,通过 @LRSchedulerConfig.register_subclass(“名称”) 将子类与调度器类型绑定(如 “diffuser” → DiffuserSchedulerConfig),支持配置驱动的动态实例化。同时使用了@dataclass 装饰器自动生成构造函数、repr 等方法,简化调度器超参数的定义与管理。
其核心属性只有一个num_warmup_steps表示学习率预热步数。预热是深度学习训练的常见技巧(尤其在 Transformer 等模型中),将其作为基类字段可避免子类重复定义。也是几乎所有学习率调度器的基础参数,用于控制“预热阶段”(学习率从低到高线性增长的步数),避免训练初期因高学习率导致的不稳定。
其只有两个方法type和build,type是用于获取子类注册调度器类型名称进而匹配到对应子类,而build的方法是强制子类实现。
lerobot的学习率调度实现了3个DiffuserSchedulerConfig、VQBeTSchedulerConfig、CosineDecayWithWarmupSchedulerConfig子类
在lerobot中,启动训练是可以通过参数来实例化使用哪些调度器,如下。
优化器的就是更新计算参数的,根据损失函数的梯度方向调整模型权重和偏置值,公式为:新参数 = 旧参数 – 学习率 × 梯度。通过迭代逐步逼近最优解。在文章https://www.laumy.tech/2050.html我们已经探讨过常用的优化算法。
接下来我们再来从PyTorch使用的角度复习一下。torch.optim 是 PyTorch 官方优化器模块,提供了 SGD、Adam、AdamW 等主流优化算法的实现,所有的优化器都继承自基类 torch.optim.Optimizer。其核心作用是如下:
在Pytorch中优化器统一封装成torch.optim接口调用,可以有以下优势。
避免重复实现复杂算法:无需手动编写 Adam 的动量、二阶矩估计等逻辑,直接调用成熟接口。
灵活支持训练需求:支持单/多参数组优化(如不同模块用不同学习率)、学习率调度、梯度清零等核心训练逻辑。
工程化与可维护性:通过统一接口管理超参数(lr、weight_decay),便于实验对比与代码复用。
loss是损失,通过调用loss.backward()进行反向传播Pytorch就自动把梯度计算好保存了,然后调用关键的一部optimizer.step()就可以执行参数更新了(即新参数=旧参数-学习率*梯度),需要注意的是,在调用loss.backward()进行反向传播计算梯度时,要先调用optimizer.zero_grad()把之前的梯度值情况,因此每计算一次梯度都是被保存,不情况会导致梯度累积
https://zhuanlan.zhihu.com/p/1921873980442280840
传统的机器算法过程是观测关节位置J1经过模型预测动作A2然后执行,观测到J2预测数A3,观测到J3遇到A4依次类推,这样就有一个问题,假设预测出的A2跟实际相比偏差就比较大那么对应的观测到的J2就偏离比较大。如果要连续预测K步,就要连续采集K步,缺点就是误差会累积同时预测效率也比较低。那么对于ACT算法是怎么进行优化的了
ACT算法是一下观测连续的K个动作,然后预测出K个动作,这样相对于传统算法效率就提升了K倍。同时也可以解决累积误差,计时K个连续的动作中,有某个动作偏差比较大,但是整体经过模型就会弱化不至于累积。假设K是10 ,简单举个例子理解过程,T0时刻观测到J1数据(开始时只有一个数据),模型直接预测数10个动作序列,等机器按顺序依次执行完这10个动作后,模型下一次就直接把这10个动作当做输入然后预测下一批的10个动作,依次类推
基于transformer的动作分块(ACT)架构。分为训练模式和测试模式。
当为训练模式是,ACT为左图的编码器+右图的解码器。左图可以理解为一个CVAE的编码器,将关节序列、动作序列、CLS经过transformer编码压缩为风格变量Z。然后将Z再加上采集的摄像头数据、关节序列作为输入给到右边的解码器最终输出动作序列。
当为测试模式时,左图丢弃不再,只需要使用右图的部分,输入为摄像头数据、关节序列、Z(被简单设置为0,表示先验的平均值)。可以这么理解Z为CVAE模型中的风格,经过训练后,Z已经让模型的参数定型,在后续的测试过程中就不需要了,因为参数已经固定了就不用了。
动作分块Action Chunking机制,传统机器人每执行一步都要重新观测环境(如拍摄一张照片),走一步采集一步预测一步,而ACT采用的是”分块执行”策略。
具体就是累积到每K步观测一次(如K=100),然后一次性输出K个动作序列,执行这就可以按顺序执行这组K个动作序列。
动作分块也可以理解为决策频率进行了压缩,传统的单步策略需每一步观测环境并生成动作(如T次决策),而ACT是每K步观测一次,一次性生成后续K个动作序列(决策点将至T/K个),例如若K=10,1000步的任务仅需100次决策,效率提升了10倍
将各个动作组合在一起并作为一个单元的执行,从而使起存储和执行更有效率,直观地讲一组动作可以对应抓住糖果包装纸的一角或将电池插入插槽,在实现中将块大小固定为K,每K步agent会收到一次观测然后预测生成K个动作然后机器按顺序执行。如上图所示假设K为4,t=0时刻策略观测到4个动作,然后就会生成4个动作序列,让机器按顺序执行;紧接着到t=4这个时刻,策略又观测到4个动作,生成4个预测动作机器按这个4个动作顺序执行。
浙大博士生
https://github.com/Tavish9/any4lerobot
https://xlerobot.readthedocs.io/en/latest/
https://github.com/Physical-Intelligence/openpi
首先,通过TrainConfig定义主要的参数设置,包含模型,数据,权重加载,训练超参数等
其中,数据通过lerobot的格式进行创建,然后类似pytorch去创建dataset和dataloader,见src/openpi/training/data_loader.py
对应到模型的Pi0Config输入的设置,即包含:
images:包含主身体/左右手腕视角的RGB图像,维度为[bs, h, w, 3];image_masks:每个视角图像的mask,猜测可能有些存在图像缺失,维度为[bs,];state:本体状态,维度为[bs, action_dim];tokenized_prompt:文本指令,维度为[bs, max_token_len];tokenized_prompt_mask:指令的mask,因为存在padding等,维度为[bs, max_token_len];action_spec:最终需要预测的动作时序,维度为[bs, action_horizon, action_dim]。在pi0_fast中,则输入会额外多出:token_ar_mask和token_loss_mask,此外在pi0_fast中tokenized_prompt和tokenized_prompt_mask的含义应有变化
数据处理主要分两部分,对于image embedding和token embedding(广义,可能包含text, state, action等)
首先,针对图像数据,主要涉及image transform和image mask,即在训练时会对image图像进行augmax数据增强,归一化和mask等处理,见src/openpi/models/model.py
其次,对于tokenizer,则考虑pi0和pi0_fast两个版本,通过src/openpi/models/tokenizer.py中,看出paligemma和fast的tokenizer的处理逻辑的区别:
paligemma tokenizer:仅针对prompt,将text以\n结尾进行decode,如果长度超长则截断,如果长度过短则padding,最终返回token和loss_mask。
fast tokenizer:
state进行离散化和归一化,然后跟prompt组合送入paligemma tokenizer,获得prefix token;action(若有)则通过fast tokenizer编码并映射到paligemma被替换的vocab中,获得postfix token;token由这两部分组成,token_mask则表示是否被padding,ar_mask则表示是否可见(prefix互相可见,postfix则为causual),loss_mask则仅计算postfix部分模型:src/openpi/models/pi0.py
pi0可以参考论文中的架构图,大致流程即使用paligemma作为vlm,action expert则使用gemma 300m,此外,通过MLP将state和action转换为特征,并通过MLP block进行特征融合,最后经过action expert后通过MLP将特征转换为action
根据input_mask和ar_mask获得真正的attn_mask
然后获取sincos位置编码:
模型输入分为两部分,其中image + instruction作为embed_prefix,state + noisy action + timestep作为embed_suffix:
embed_prefix:
即将image + instruction转换为embedding,即分别通过siglip和gemma llm,输出对应的tokens(即按顺序所有的images embedding + 对应的text embedding), input_mask(即loss_mask,其中img从一维mask扩展到与img token一样的维度,text则为tokenized_prompt_mask), ar_mask(用于后续转换为attn_mask,这里为互相全可见)在训练时则根据model config中的variant名称决定不同的训练方式,类似于获得一个需要更新的param_group
pi0的推理过程,即通过observation + instruction,通过降噪过程最终生成期望的动作序列
paligemma部分的代码,并且为了过一下jax的代码风格,其中siglip的代码无区别,gemma部分则因为pi0和pi0_fast的使用有一定的区别,其中src/openpi/models/gemma_fast.py更像是原始的gemma,而src/openpi/models/gemma.py因为pi0代码中llm和action_expert共用gemma架构,所以在构建layer的过程中会增加多个configs的使用,并最终在函数的forward中会增加for循环等操作
Pi0fast 基本代码都在src/openpi/models/pi0_fast.py
主要新增的是对tensor的移位操作,以及类似按索引赋值的操作,分别用于后续的动作生成及logits取值
pi0_fast不同于pi0的vlm + diffusion,而是采用AR的方式,故模型架构更简单,完全继承paligemma
pi0_fast为AR,则按照LLM一样计算action部分的CE loss
推理阶段同理,pi0_fast为AR,则按照LLM一样进行next token prediction去预测动作序列
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
https://github.com/ARISE-Initiative/robosuite
https://zhuanlan.zhihu.com/p/658683732
https://github.com/Lifelong-Robot-Learning/LIBERO
Libero搭建了一个全新的机器人持续模仿学习环境LIBERO,针对机器人持续学习问题中持续学习算法、网络架构、任务顺序、任务空间/目标/物体变化、语言嵌入、预训练等众多因素耦合导致的难以分析的问题,我们提出使用程序化生成的环境(Procedurally Generated Environments)来解耦地分析各个因素在机器人持续学习训练时带来的影响,为之后的领域内工作提供一个较为全面的实验环境
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
https://github.com/ARISE-Initiative/robomimic
https://robotics-transformer-x.github.io/
https://zhuanlan.zhihu.com/p/1005149740
https://gr2-manipulation.github.io/
https://byte-dexter.github.io/gr-dexter/
https://www.physicalintelligence.company/blog/pi0
利用在互联网数据训练的VLM+action expert 组成一个VLA模型,这里结合开源+内部的机器人数据训练得到异构本体foundation model,然后可以在不同的本体/特定的任务上post-training,以完成多任务的泛化或某种复杂任务的灵巧操作
Pre-training:这里有面向于具身智能的专用数据集,如open x-embodiment dataset和 pi cross-embodiment robot datasets,使用这些数据进行训练,已经包含了大量场景的机器人操作数据(论文把这一步也叫pre-training,其实也没问题),这个阶段后会得到一个foundation model,也就是一个可以统一所有任务/本体的基础模型,这样的模型具备初步的泛化性,但不一定专门用于在任何一项操作任务上实现高性能。
Post-training(fine-tuning):根据上一个阶段的foundation model,进行ft, 这里分为两类任务的post-traing数据,以提高模型在某种任务表现的专门数据,包含unseen tasks(未见任务)、high dexterity task (高灵巧任务),包括20 多项任务
VLM:视觉语言大模型,这里用的PaliGemma,这里主要是指代在使用大量互联网文本图像数据上去预训练VLM
PaliGemma: 2024 年 Google I/O 活动上发布(今年2025I/O刚举办大家感兴趣也可以去看看),它是一种基于两个模型的组合多模态模型:视觉模型 SigLIP 和大型语言模型 Gemma,这意味着该模型是 Transformer 解码器和 Vision Transformer 图像编码器的组合。它将图像和文本作为输入,并生成文本作为输出,支持多种语言。
Action Expert:接受VLM输出,专门输出action的网络,这里使用的flow matching,是VLA中 action的重要组成部分。
Open X-Embodiment dataset :是一个由 DeepMind 创建并开源的超大规模机器人数据集,汇集了来自 22 种不同机器人类型的数据. RT-2也这个数据集上训练的,简称OXE dataset
Pi cross-embodiment robot datasets:pi0公司自己采集的本体数据集,一共7 种不同机器人配置,和 68 个任务的不同数据,长度为1w个小时。cross-embodiment robot 也可以理解为异构本体,不同的机器人类型具有不同的配置空间和动作表示,包括固定基座的单臂和双臂系统,以及移动机械手。自动驾驶中也有类似的事情,不同相机安装角度、型号、个数都算是某种程度的异构。(在具身智能领域有一个专门的词汇即“通用数据”)
https://zhuanlan.zhihu.com/p/1907535034941965833
https://zhuanlan.zhihu.com/p/1910755399646287695
https://zhuanlan.zhihu.com/c_1907131586568251035
https://io-ai.tech/platform/guides/Pipeline/LeRobot/Pi0/
https://modelers.csdn.net/680e0968a5baf817cf496e7f.html
https://zhuanlan.zhihu.com/p/1919100548071788918
Pi 0.6
https://github.com/MINT-SJTU/Evo-RL
https://www.pi.website/research/memory
在机器人领域,“通用化”和“稳健性”一直是两座难攀的高峰。过去,大多数视觉-语言-动作(VLA)模型都像“温室里的花朵”——只能在预设的演示数据里“照猫画虎”,一旦遇到真实世界的变数,比如褶皱的衬衫、变形的纸箱,就容易手忙脚乱,更别说像人类一样“从错误里学经验”,越练越熟练。
但最近,Physical Intelligence团队发布的一项研究,彻底打破了这一困境。他们提出了名为RECAP(RL with Experience and Corrections via Advantage-conditioned Policies)的强化学习框架,成功训练出π₀.₆*模型。这款模型不仅能在家庭、工厂、咖啡馆等真实场景里精准完成任务,还能通过自主执行和人类修正持续优化——折叠多样衣物时失败率减半,制作浓缩咖啡时吞吐量翻倍,甚至能连续13小时无间断工作
RECAP的本质,是让VLA模型在真实世界部署中“边干活边升级”。整个框架围绕三个核心步骤展开,形成一个不断循环的“学习闭环”,既保证了数据的多样性,又能精准优化策略
RECAP的第一步,是让机器人“走出实验室”,到真实场景里收集数据。但这不是简单的“让机器人瞎忙活”,而是融合了“自主执行”和“人类修正”的双向赋能。
机器人会先自主执行目标任务——比如折叠衣物,系统会给每个任务片段打上“成功/失败”的标签,这是最基础的奖励信号。但如果机器人出现明显错误,比如把衬衫揉成一团、打翻咖啡杯,旁边的人类专家就会通过遥操作“出手相救”,提供修正示例。这些修正数据会被特殊标记为“高质量动作”,告诉模型“遇到这种情况该这么做”。
有趣的是,RECAP并不需要大量人类修正:人类的作用更像“教练兜底”,解决机器人自主探索难以突破的瓶颈;而大部分数据还是机器人的自主经验,用来优化细节,比如怎么折得更快、怎么适配不同面料的衣物。这种“少量修正+大量自主经验”的组合,既降低了人力成本,又保证了学习效率
有了价值函数的“判断标准”,下一步就是让模型学会“优先选好动作”——这是RECAP最核心的创新,也是它能适配大规模VLA模型的关键。
传统强化学习方法(比如PPO)在处理大模型时,常常会遇到“训练不稳定”的问题:要么因为数据太杂难以收敛,要么因为约束太多限制性能。而RECAP的解法很巧妙:它把价值函数算出的“优势值”,转化成简单的文本指令——“Advantage: positive”(优势为正,动作好)或“Advantage: negative”(优势为负,动作差),然后把这个指令当作额外输入,融入VLA模型的训练
π₀.₆*在π₀.₆的基础上,只做了一个关键改动,却让性能实现了质变——加入对“优势标签”的处理能力。
具体来说,π₀.₆*的输入里多了“Advantage: positive/negative”的文本指令,而且这个指令被放在“子任务预测”之后、“动作生成”之前。这样设计的目的很明确:让动作生成过程完全受优势值引导。比如模型预测出“拿起滤杯”的子任务后,看到“Advantage: positive”的信号,就会选择之前被验证过的“稳定拿取动作”,避免打翻滤杯。
π₀.₆*的训练还分为“预训练”和“微调”两个阶段:预训练时,用数万个小时的多任务、多机器人数据做离线强化学习,让模型掌握通用的“动作价值判断”;微调时,针对具体任务(比如折叠衣物),加入自主收集的经验和人类修正,让模型快速适配场景。这种“先通用、再专用”的模式,既保证了模型能处理多种任务,又能在特定场景里做到极致
https://github.com/RealManRobot/ros2_rm_robot
https://develop.realman-robotics.com/robot4th/ros2/gazebo/
https://huggingface.co/datasets/RealSourceData/RealSource-World
https://github.com/wandb/wandb
https://github.com/rerun-io/rerun
https://github.com/lance-format/lance
https://huggingface.co/blog/smolvla
https://huggingface.co/lerobot/smolvla_base
https://www.laumy.tech/2743.html/lerobot-smolvla%e7%ad%96%e7%95%a5/
https://www.nature.com/articles/s42256-025-00983-2
涂鸦数据集:https://github.com/googlecreativelab/quickdraw-dataset