跳转至

utils.py — LIBERO 环境专用的工具函数

文件路径: verl/experimental/vla/envs/libero_env/utils.py 模块路径: verl.experimental.vla.envs.libero_env.utils

文件概述

LIBERO 环境专用的工具函数,包括图像提取、四元数转换和 gripper 动作处理。

核心函数

图像提取

def get_libero_image(obs, camera_name="agentview"):
    """从 LIBERO 观测中提取主相机图像"""
    image = obs[f"{camera_name}_image"]
    # LIBERO 图像是上下翻转的,需要修正
    image = image[::-1]
    return image

def get_libero_wrist_image(obs):
    """提取腕部相机图像"""
    return get_libero_image(obs, camera_name="robot0_eye_in_hand")

四元数转换

def quat2axisangle(quat):
    """将四元数转换为轴角表示

    机器人控制中,旋转可以用四元数或轴角表示。
    LIBERO 使用轴角作为动作空间的旋转部分。
    """
    # 标准化四元数
    quat = quat / np.linalg.norm(quat)
    # 计算旋转角度
    angle = 2 * np.arccos(np.clip(quat[0], -1, 1))
    # 计算旋转轴
    if angle < 1e-6:
        axis = np.array([0, 0, 1])
    else:
        axis = quat[1:] / np.sin(angle / 2)
    return axis * angle

Gripper 动作处理

def normalize_gripper_action(action):
    """将 gripper 动作归一化到 [-1, 1]

    LIBERO 中 gripper 动作范围可能不在标准范围内。
    """
    return np.clip(action, -1, 1)

def invert_gripper_action(action):
    """反转 gripper 动作方向

    某些仿真器的 gripper 开合方向与模型输出相反。
    """
    return -action

核心函数列表

名称 说明
get_libero_image 提取主相机图像
get_libero_wrist_image 提取腕部相机图像
quat2axisangle 四元数 -> 轴角转换
normalize_gripper_action gripper 动作归一化
invert_gripper_action gripper 方向反转

与其他模块的关系

  • 被 LiberoEnv(libero_env.py)的观测提取和动作处理使用

小结

LIBERO 环境的底层数据处理工具,处理仿真器特有的数据格式问题。