LeRobot documentation

OpenGalaxea G0.5

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.7.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

OpenGalaxea G0.5

G0.5 是一个 Qwen3.5-2B 视觉-语言-动作模型,能够在单一数据流中生成具身推理和动作。LeRobot 将动作阶段暴露为 System 1,并将可选的原生思维链阶段暴露为 System 2。它们并非独立的模型:运行时从一次推理调用中同时获取两者,并且动作始终受推理结果的约束。

模型概览

Transformers 包含原生的多模态 Qwen3.5 骨干网络、视觉塔和处理器。不过,G0.5 并非标准的 Qwen3_5ForConditionalGeneration 检查点:它增加了本体感觉/动作路径、动作专家、流匹配头、ActionCodec 以及统一的 CoT/动作解码。LeRobot 原生实现了这些 G0.5 组件,并加载转换后的检查点,无需 OpenGalaxea Python 包、Hydra 或 OmegaConf。

LeRobot 集成涵盖的内容

  • 标准 policy.type=g05 配置和 Hub 检查点加载。
  • 原生连续流和离散 ActionCodec 动作生成。
  • 可选的同轮次 System 2 推理与动作生成。
  • 可序列化的相机、状态、动作、归一化和提示处理器。
  • 通过 lerobot-train 进行微调,通过 lerobot-rollout 进行推理。
  • LIBERO、RoboTwin、SO-101,以及已发布的 R1 Lite/Pro 检查点合约。

G0.5 集成代码(src/lerobot/policies/g05)和检查点采用 G0.5 Community License, 包括非商业限制;Apache-2.0 不适用于这些材料。 转换后的检查点随附该许可证作为 LICENSE 及其 NOTICE, 且未获得 Galaxea 的认可。

检查点

输入和输出约定

检查点已发布的操作路径原始 → 策略布局相机预测已执行归一化
g05_base显式选择的 AR ActionCodec 或 flowR1 Lite/Pro 关节 → 27D 全身布局头部 + 双腕,6 步历史3216逐步 z 分数
g05_libero连续流右侧 EEF 6 + 夹爪 1 → 20D 分组布局外部,右手腕3210逐步 q01/q99
g05_robotwin20连续流两条机械臂 6+夹爪 → 20D 分组布局高,左手腕,右手腕328逐步 q01/q99
g05_so101Flow 或 AR ActionCodec + 原生 CoT右臂关节 6 → 20D 分组布局外部,可选的左手腕 + 右手腕3216逐步 q01/q99

每个转换后的检查点都存储了已解析的模型和处理器配置、ActionCodec 元数据、统计信息、精确的提示模板以及许可证。

转换后的检查点

仓库合约
lerobot/g05_base27D 基础,R1 Lite 处理器
lerobot/g05_libero20D LIBERO
lerobot/g05_robotwin2020D RoboTwin
lerobot/g05_so10120D SO-101(so100 配置文件)

这些检查点基于非商业的 G0.5 社区许可证 发布; 请参阅 许可证。

lerobot/g05_base 提供了这些 27D 模型权重、两个动作头、ActionCodec 分词器,以及发布的六步 R1 Lite 处理器/统计契约。

安装要求

使用 G0.5 Transformers 依赖项安装 LeRobot:

uv sync --extra g05 --extra test

Install flash-linear-attention for training and inference on GPU. Most Qwen3.5 decoder layers are Gated DeltaNet linear attention, and without it Transformers falls back to a much slower PyTorch kernel, logging “The fast path is not available”. It is pure Triton, so it installs without a build:

uv pip install flash-linear-attention

使用它进行训练的速度大约快 1.5 倍,并且内存占用更少,损失值完全相同。由于 Triton 需要编译其内核,第一步大约会多花费 20 秒。

SO-100 和 SO-101 共享已发布的 so100 本体 token 以及六关节右臂契约。缺失的左手腕相机会进行零填充。

用法

使用标准的 --policy.path 选项加载与目标本体匹配的 checkpoint。打包的配置会选择合适的动作头、相机顺序、维度、归一化以及执行时域。

交互式 System 1 和 System 2 运行时

G0.5 从同一个推理流中输出推理和行动:思维链与代码块在同一次生成中产生,而行动则以其为条件。

检查点中的 policy.runtime_system 用于选择路径。System 1 直接执行所选的 ActionCodec 或 flow chunk,且不生成 CoT:

lerobot-rollout \
  --policy.path=lerobot/g05_so101 \
  --policy.runtime_system=system1 \
  --task="pick up the cup" \
  --fps=30

System 2 仅在打包的检查点元数据包含 predict_cot=true 时可用。其思维链作为策略的预测返回:predict_action_chunk 返回一个 PolicyOutput 批次,其中 "action" 下包含该 chunk,"prediction" 下包含每个环境的 CoT 子任务(language["subtask"],每个环境一个字符串)以及以 policy.config.bbox_camera 为基准的 [0, 1] xyxy 分数形式的框(boxes[camera],每个环境一个答案),并且 select_action 会将其与每个 chunk 的第一个动作一起返回。模型不指定相机:其 BBox 目标在训练期间均绘制在该相机上。System 1 不生成 CoT,仅返回原始动作。

output = policy.predict_action_chunk(batch)
print(output["prediction"])
# {"language": {"subtask": ["grasp the cup"]},
#  "boxes": {"observation.images.top": [{"detections": [{"label": "cup", "bbox": [...]}]}]}}

使用 --display_data=true 时,lerobot-rollout 会显示子任务,并在 Rerun 或 Foxglove 中的 bbox 相机上绘制边界框。

从 stdin 驱动会话

--interactive=true 通过聊天式命令驱动 rollout,同时保持硬件和策略处于连接和热备状态。在您输入 /start 之前,机器人不会移动,这使得它成为启动物理 SO-101 的安全方式:请先确认相机索引和机械臂端口,然后再启动。

lerobot-rollout \
  --interactive=true \
  --policy.path=lerobot/g05_so101 \
  --policy.device=cuda \
  --robot.type=so101_follower \
  --robot.port=/dev/ttyACM0 \
  --robot.id=my_follower \
  --robot.cameras='{exterior: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist_right: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}' \
  --task="pick up the cube" \
  --fps=30
命令效果
/start启动(或重启)策略控制循环
/subtask <text>设置策略所遵循的指令
/vqa <text>在 G0.5 上不受支持(参见下文)
/autosteer <goal>\|off让策略自行选择子任务以实现高层目标
/reset停止移动,返回初始位置,恢复任务
/stop结束会话并关闭
/help显示命令列表

/autosteer 需要一个包含 predict_cot=true 且带有实时观测答案的检查点,因此在 /start 运行之前会被拒绝。它会将其选择的子任务打印为 Autosteer subtask:,而 --autosteer_interval_s 用于设置两次重新规划查询之间经过的运动秒数。

选择与任务呈现方式相匹配的运行时,因为 G0.5 的训练方式如下:

  • 高层任务,无需引导:保持 System 2。每个块根据任务预测当前子任务,然后对其执行操作。
  • /subtask 或 /autosteer:使用 --policy.runtime_system=system1。子任务将成为任务,策略直接对其执行操作;/autosteer 仍然通过 System 2 查询从目标规划每个子任务。如果将子任务作为任务使用 System 2,则会规划子任务的子任务,这是一个其未经过训练的提示。

选择思维链

--policy.runtime_cot_fields 用于选择 System 2 在生成每个 chunk 之前所采用的 G0.5 已训练的思维链格式。由于 action 会关注整个思维链,因此其中包含的任何内容都会对 action 产生条件约束。

runtime_cot_fields经过指令训练生成的思维链
["subtask"](默认值)predict subtask子任务
["bbox", "subtask"]predict bbox, subtask and actionboxes,然后是子任务

例如,["bbox", "subtask"] 会生成:

BBox: cube <loc0397><loc0717><loc0625><loc0895>|Subtask: pick up the blue cube
  • ["subtask"] 每个块生成的 token 数量最少,因此是更快的选择。
  • ["bbox", "subtask"] 首先定位相关对象,从而将子任务和动作锚定在场景中。每个框由一个标签和四个按 y1, x1, y2, x2 顺序排列的位置标记组成;标记 <locNNNN> 表示坐标值,即图像尺寸的比例乘以 1024。框引用的是 BBox 相机(--policy.cot_bbox_camera,默认为第一个非空相机槽位)。

lerobot/g05_base 和 lerobot/g05_so101 均在两种格式上进行了训练;LIBERO 和 RoboTwin 检查点具有 predict_cot=false 且没有 System 2。微调只有在数据集在 BBox 相机上具有基于 vqa 的标注时,才能生成有用的框(参见 数据要求)。

为什么不支持 /vqa

G0.5 的文本头并非通用的视觉语言助手。它经过训练,仅在上述固定指令之一之后输出上述思维链格式,且其提示词中没有用于自由形式问题的占位符。/vqa 问题只能占据任务的位置,因此模型会针对该“任务”回复一个子任务(以及边界框),而不是给出答案。/autosteer 之所以有效,是因为它的目标是一个任务,而这正是该占位符所期望的。

在交互模式下,--duration 限制的是每个 /start 片段,而不是整个会话。

数据要求

数据集必须暴露与所选检查点契约相匹配的状态、动作、相机和任务特征。相机名称可自由指定:--policy.camera_order 列出了为检查点的每个图像槽位提供数据的相机,null 表示该槽位为空(以零填充)。对于 SO-101,槽位分别为外部、左手腕和右手腕;其中左手腕为可选。

训练 System 2 语言目标还需要检查点中带有注释的 CoT 字段。普通的 LeRobot 录制提供动作监督,但不会合成 CoT 标签。按照注释流水线中的说明,使用lerobot-annotate生成subtask和基于场景的vqa语言列。

训练

G0.5 原生实现了 LeRobot 的训练接口:forward 计算 assistant-token 交叉熵和 flow-matching 损失,策略暴露 VLM/vision/action 优化器组,并且检查点可以通过常规的 LeRobot 脚本进行保存、恢复和加载。 该目标函数保留了打包的 ar.ce_weight、可选的 ar.ce_z_loss_scale 以及 fm.fm_weight;自回归损失同时覆盖 CoT 文本和 ActionCodec 目标。 例如,在 LeRobot 数据集上微调 SO-101 检查点:

训练命令示例

export HF_USER=your_hf_username

lerobot-train \
  --dataset.repo_id=${HF_USER}/my_so101_dataset_annotated \
  --policy.path=lerobot/g05_so101 \
  --policy.device=cuda \
  --policy.use_language_recipe=true \
  --policy.cot_bbox_camera=observation.images.exterior \
  --policy.repo_id=${HF_USER}/g05_so101_finetuned \
  --policy.private=true \
  --output_dir=outputs/train/g05_so101 \
  --job_name=g05_so101 \
  --batch_size=16 \
  --steps=10000 \
  --save_freq=1000

内置配方混合了三种类型的样本,与上游训练混合方式类似:

  • 4/6 思维链:任务,然后是 subtask 以及在该时间戳处于激活状态的基于 vqa 的标注的 BBox 和/或 Subtask 目标,最后是动作。
  • 1/6 子任务作为任务:当前激活的子任务即为指令,直接执行操作。 当 /subtask 或 /autosteer 设置了一个子任务后,策略看到的就是这个内容。
  • 1/6 plain:直接面向任务的操作,即 System 1 提示。

在时间戳处没有标注的思维链样本会训练纯提示。

按照标注流水线中的说明,使用lerobot-annotate生成所需的subtask和基于vqa的语言列。内置配方会读取在 BBox 相机上标注的框:--policy.cot_bbox_camera,其默认值为第一个非空的相机槽位。框坐标必须是图像宽度和高度的[0, 1]比例,这正是lerobot-annotate所存储的格式;像素框会被拒绝。通过--policy.recipe_path=/path/to/recipe.yaml传入显式的外部 YAML 以训练不同的配方:该配方在构建配置时会被一次性读取到policy.recipe中,因此即使文件后续发生变化,保存的检查点仍会保留其训练时所使用的配方。

在另一台机器人上微调基础检查点

lerobot/g05_base 可以在其未曾见过的机器人上进行微调。使用 --policy.embodiment 指定机器人名称,例如数据集的 robot_type;该名称即为提示词中的 Embodiment: 文本。此参数为必填项:若未提供,检查点将保留其自身的 embodiment 和槽位表。 关节会根据数据集中的关节名称放置在基础布局中:left_ 前缀的关节位于左臂,其余关节位于右臂;名称中包含 gripper 的关节将占据该臂的夹爪槽位,其余关节则按顺序填充该臂的九个控制槽位。因此,带有夹爪的 5 关节臂将填充右臂槽位 10-14 以及右夹爪,而 7 自由度臂则填充 10-16 以及夹爪。 设置 --policy.state_slots 和 --policy.action_slots 可显式指定关节的槽位。解析后的槽位将随微调后的检查点一起保存。

以下示例在单臂机器人上执行微调,该机器人配备了 front 相机和 wrist 相机。基础检查点的图像槽位分别为头部视角、左手腕和右手腕;由于单臂位于右侧,其手腕相机将占用右手腕槽位,而左手腕槽位保持为空。列表类型的标志需要传入带引号的 JSON。

lerobot-train \
  --dataset.repo_id=${HF_USER}/my_robot_dataset_annotated \
  --policy.path=lerobot/g05_base \
  --policy.embodiment=my_robot \
  --policy.camera_order='["observation.images.front", null, "observation.images.wrist"]' \
  --policy.n_obs_steps=1 \
  --policy.use_language_recipe=true \
  --policy.device=cuda \
  --policy.repo_id=${HF_USER}/g05_my_robot_finetuned \
  --output_dir=outputs/train/g05_my_robot \
  --job_name=g05_my_robot \
  --batch_size=16 \
  --steps=10000

--policy.n_obs_steps=1 每个摄像头仅输入一帧,与上游微调设置一致;而基础检查点的六步历史会将每个样本的图像数量乘以六。

归一化使用数据集自身的统计量(基础检查点使用 z-score;对于 q01/q99,请传入 --policy.normalization_mapping='{"VISUAL": "IDENTITY", "STATE": "QUANTILES", "ACTION": "QUANTILES"}')。夹爪保持绝对值(基础检查点中为 relative_exclude_joints=["gripper"]),而手臂关节则以增量方式训练。边界框目标来自标注在 observation.images.front(第一个非空相机槽位)上的基于 vqa 的答案。

SO-101 配方使用 AdamW,学习率为 8e-5,预热步数为 1,000。打包的 LIBERO 和 RoboTwin 配置使用其发布的 1e-5 配方,预热步数分别为 1,000 和 500。所有配置文件均保留 G0.5 的参数组和学习率乘数。如需使用不同的优化配方进行训练,请覆盖这些设置:

--policy.optimizer_lr=2e-5 \
--policy.optimizer_backbone_lr_multiplier=0.5 \
--policy.optimizer_vision_lr_multiplier=0.1

使用标准的 LeRobot 检查点恢复已保存的运行:

lerobot-train \
  --config_path=outputs/train/g05_so101/checkpoints/last/pretrained_model/train_config.json \
  --resume=true

关键配置参数

参数描述
policy.embodiment提示词中写入的机器人名称;选择一个已发布的槽位表
policy.state_slots, policy.action_slots每个原始状态/动作值的显式策略布局槽
policy.camera_order每个检查点图像槽位的 Dataset 相机;null 表示保持为空
policy.action_head使用检查点的 flow 或 actioncodec 动作路径
policy.runtime_system选择直接的 System 1 或统一的 System 2 推理与行动
policy.runtime_cot_fieldsSystem 2 思维链:["subtask"] 或 ["bbox", "subtask"]
policy.dtypebfloat16(在 CUDA 上发布混合精度)或 float32
policy.chunk_size每个块中预测的动作数量
policy.n_action_steps重新规划之前执行的操作次数
policy.use_language_recipe启用 G0.5 内置的语言监督配方
policy.recipe_path配方 YAML 仅读取一次并加载到 policy.recipe 中(不会保存)
policy.optimizer_backbone_lr_multiplier语言骨干的学习率乘数
policy.optimizer_vision_lr_multiplier视觉塔的学习率乘数

动作头、维度、时间范围、处理器模式以及归一化均从检查点中获取;在加载过程中,不兼容的覆盖设置将被拒绝。

评估

安装 LIBERO 模拟器后,使用其相机名称和相对控制来评估 LIBERO 检查点:

lerobot-eval \
  --policy.path=lerobot/g05_libero \
  --policy.device=cuda \
  --env.type=libero \
  --env.task=libero_10 \
  --env.control_mode=relative \
  --env.observation_height=512 \
  --env.observation_width=512 \
  '--env.camera_name_mapping={"agentview_image": "image", "robot0_eye_in_hand_image": "wrist_image"}' \
  --eval.batch_size=1 \
  --eval.n_episodes=5 \
  --seed=0 \
  --output_dir=outputs/g05-libero-lerobot-eval

参考

许可证

src/lerobot/policies/g05 下的 G0.5 集成代码改编自 Galaxea 的实现,与检查点权重一样,采用 G0.5 Community License 授权,而非 LeRobot 的 Apache-2.0。 在下载或使用检查点之前,请审阅并接受该许可证。

微调是 G0.5 的衍生作品。重新分发时,请包含其来源检查点的 LICENSE 和 NOTICE 文件:LeRobot 不会为您复制这些文件,但生成的模型卡片中会注明许可证。

Update on GitHub