# LIBERO **Repository Path**: mitsunobukaze/LIBERO ## Basic Information - **Project Name**: LIBERO - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-28 - **Last Updated**: 2026-05-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Switchable Libero Playground 本项目为北京大学 OSLab Embodied AI System 项目的一部分。Switchable Libero Playground 提供支持任务切换实验与评估的 Libero 数据集 + RoboSuite 仿真环境,提供便捷的场景定义、任务定义、任务切换、任务评估。 Switchable Libero Playground 通过 Websocket 进行模型通信,便于环境隔离与多机部署。 ## 环境安装 按照 [Libero 仓库](https://github.com/Lifelong-Robot-Learning/LIBERO?tab=readme-ov-file#installtion)的方式进行 Libero 的安装,推荐使用 Python>=3.10: ```bash conda create -n LiberoPlayground python=3.10 conda activate LiberoPlayground git clone https://github.com/Lifelong-Robot-Learning/LIBERO.git libero cd libero pip install -r requirements.txt pip install torch==1.11.0+cu113 torchvision==0.12.0+cu113 torchaudio==0.11.0 --extra-index-url https://download.pytorch.org/whl/cu113 ``` 安装本仓库所需要的依赖: ```bash cd .. # Change to the root directory of this repo pip install -r requirements.txt ``` ### OpenPi 模型支持 按照 [OpenPi 仓库](https://github.com/Physical-Intelligence/openpi?tab=readme-ov-file#installation)的方式进行环境配置,推荐新建 Python 环境,以避免依赖版本冲突。幸运的是,OpenPi 使用 `uv` 进行包管理,可参考: ```bash git clone --recurse-submodules git@github.com:Physical-Intelligence/openpi.git cd openpi uv sync uv pip install -e . ``` 启动 OpenPi 模型的服务端后,在本仓库中启动评估: ```bash conda activate LiberoPlayground python playground/main_pi05.py ``` ### UniAct 模型支持 按照 [UniAct 仓库](https://github.com/2toinf/UniAct?tab=readme-ov-file#install-package-and-requirements)的方式进行环境配置,推荐新建 Python 环境,以避免依赖版本冲突。 ```bash conda create -n UniAct python=3.10 conda activate UniAct git clone https://github.com/2toinf/UniAct.git cd UniAct pip install -r requirements.txt ``` 此外,需要对服务端支持进行补丁应用与环境安装: ```bash git am Path/To/Playground/patches/UniAct.patch pip install websockets msgpack ``` 在 UniAct 仓库中开启模型服务: ```bash conda activate UniAct python eval/libero/libero_server.py --base-path Path/To/basemodel.pt --head-path Path/To/libero_mlp.pt ``` 在本仓库中启动评估: ```bash conda activate LiberoPlayground cat assets/builtin_task_seq.txt | tr '\n' '\0' | xargs -0 python playground/main_uniact.py --rounds 20 --sequence ``` ## 场景定义封装 `playground/scene_define.py` 将基于类继承的场景定义,进行 API 化的封装,提供多个接口对场景信息进行描述,并能够生成 BDDL 描述文件共仿真环境使用。 `SceneBuilder` 类为场景构建器,其初始化参数 `scene_type` 与 `workspace_name` 需均为 Libero 中的预设值,`class_name` 为向 Libero 场景控制传递的类名。 `add_fixture` 与 `add_object` 用于向场景中添加固定物体与普通物体;`add_region` 用于注册区域信息,区域用于初始化物体的位置,位置具备一定的区域内的随机性。 `add_init_state` 用于添加初始状态,由一个谓词加上若干物体组成的参数组成,与任务目标的描述形式一致,为 Libero 支持的内容格式。任务目标状态的描述不在场景中定义,因此 BDDL 文件中会存在一些域的缺失。 `add_object_of_insterst` 用于添加感兴趣的物体,为 BDDL 文件中存在的描述项。 上述接口均返回 `SceneBuilder` 自身,可在恰当的时候进行链式调用。 `build` 方法只可在最后调用一次,用户向系统正式注册已经完成的场景定义。调用全局方法 `generate_bddl_files` 可以生成这些场景对应的 BDDL 文件,方法会将这些文件保存在随机生成的临时文件夹中,需要调用者主动进行清理。 ## 任务定义封装 `playground/task_wrapper.py` 定义了任务的多维度描述方式,并提供对序列化任务的支持。 `TaskSwitchPoint` 枚举定义了任务结束的时机,一个任务可能在完成时结束,也可能在预设的时间后结束,用于对任务切换进行测试;`TaskCheck` 枚举定义了任务成功的判断条件,一个任务可能需要在完成后才算成功,也可能完成了反而算作失败。 `TaskUnit` 类描述了一个任务单元,其不再拆分,包含提示词、完成目标状态、用于录制视频的标志色、结束时机、判断条件等内容;`TaskSequence` 则将多个任务单元进行组合,形成一个完整的任务。`TaskSequence` 类提供了 `add_normal_task`, `add_early_switch_task` 与 `add_late_switch_task` 这三个添加任务的方法,分别代表:普通任务,在完成后切换;早期切换任务,此时的步数限制应当使得任务不可能完成,如果完成,则说明模型任务切换失败;晚期切换任务,此时对与模型是否完成任务不做要求。后两者都将在指定的时间点后进行切换(或者任务被提前完成也进行切换)。 `playground/task_wrapper.py` 中还预设了很多单元任务与任务序列,可通过 `BuiltinMetaTask` 与 `BuiltinSeqTask` 找到,任务序列也可通过 `get_builtin_task_seq` 全局方法利用名称获得。 ## 仿真环境封装 `playground/env_wrapper.py` 将 Libero 对 RoboSuite 的仿真封装进行了进一步的封装,隐藏了环境启动与配置的过程,并将模型的推理与仿真环境的步进分离,避免了多类项目的混杂。 该封装能够对多 Chunk 模型与单步推理模型都提供良好的、自适应的支持,并简化了对模型输入(场景观察)与模型输出(动作序列)的处理,同时提供了对任务切换在 Prompt 层面的支持。 ## 任务运行时封装 `playground/task_runtime.py` 提供了对任务运行时的封装,可以对任务切换进行控制,并对任务执行结果进行收集。 `TaskResult` 类描述了一轮执行中,任务序列中每个单元任务的执行情况,包括成功与否,以及执行步数。 `TaskRuntimeLaunchParams` 类为对外的重要接口,其中提供了模型推理的接口,以及对运行过程进行“录像”的接口。每当缓存的动作序列执行完后,运行时会调用 `infer` 方法获取新的动作序列;而对于仿真环境进行的每一步,运行时都会调用 `record` 方法。 `TaskRuntime` 运行时支持对于同一个任务序列的多次重复运行,每次开始前都需要执行 `invoke` 方法进行重置。运行时通过调用 `step` 方法进行仿真,需要调用者为其提供一个循环环境。一个最简单的调用方式为: ```python for _ in range(try_count): runtime.invoke() result = None while result is None: result = runtime.step() save_result(result) ```