robosuite-自建夹具bug

场景:

在 robosuite 中创建自己的夹具

问题描述

bash 复制代码
Traceback (most recent call last):
  File "collect_human_demonstrations_auto.py", line 436, in <module>
    dataset_states_to_obs(output_filename, save_name+"-obs.hdf5")
  File "/home/idm/Shares/imitation/haier_environments/my_envs/utils/dataset_states_to_obs.py", line 221, in dataset_states_to_obs
    traj = extract_trajectory(
  File "/home/idm/Shares/imitation/haier_environments/my_envs/utils/dataset_states_to_obs.py", line 85, in extract_trajectory
    obs = env.reset_to(initial_state)
  File "/home/idm/Shares/imitation/robomimic/robomimic/envs/env_robosuite.py", line 157, in reset_to
    xml = self.env.edit_model_xml(state["model"])
  File "/home/idm/Shares/imitation/robosuite/robosuite/environments/base.py", line 536, in edit_model_xml
    print("old_path:", old_path)
ValueError: max() arg is an empty sequence

原因分析:

下列代码中有相应的代码路径及代码解释,其中,源码中存在一个 val == robosuite 的操作,即所有的文件路径中都需要包含 robosuite 这个词(没有查明原因),考虑这个ind 参数是与 new_path 和 old_path 相关,所以就动态的print 了一下,发现这俩变量是恒等的,暂时没有领悟到作者这样作的意图是什么;

python 复制代码
 def edit_model_xml(self, xml_str):
        """
        This function edits the model xml with custom changes, including resolving relative paths,
        applying changes retroactively to existing demonstration files, and other custom scripts.
        Environment subclasses should modify this function to add environment-specific xml editing features.
        Args:
            xml_str (str): Mujoco sim demonstration XML file as string
        Returns:
            str: Edited xml file as string
        """

        path = os.path.split(robosuite.__file__)[0]
        path_split = path.split("/")

        # replace mesh and texture file paths
        tree = ET.fromstring(xml_str)
        root = tree
        asset = root.find("asset")
        meshes = asset.findall("mesh")
        textures = asset.findall("texture")
        all_elements = meshes + textures

        for elem in all_elements:
            old_path = elem.get("file")
            if old_path is None:
                continue
            old_path_split = old_path.split("/")
            import ipdb; ipdb.set_trace()
            print("old_path:", old_path)
            print("old_path_split:", old_path_split)
            ind = max(loc for loc, val in enumerate(old_path_split) if val == "robosuite")  # last occurrence index
            new_path_split = path_split + old_path_split[ind + 1 :]
            new_path = "/".join(new_path_split)
            # print("new_path:", new_path)
            # if new_path == old_path:
                # print("new_path == old_path")
            # else:
                # print("new_path != old_path")

            # elem.set("file", new_path)
            elem.set("file", old_path)

        return ET.tostring(root, encoding="utf8").decode("utf8")

解决方案:

既然是恒等的,那就直接删掉就好,修改后的代码如下:

python 复制代码
 def edit_model_xml(self, xml_str):
        """
        This function edits the model xml with custom changes, including resolving relative paths,
        applying changes retroactively to existing demonstration files, and other custom scripts.
        Environment subclasses should modify this function to add environment-specific xml editing features.
        Args:
            xml_str (str): Mujoco sim demonstration XML file as string
        Returns:
            str: Edited xml file as string
        """

        path = os.path.split(robosuite.__file__)[0]
        path_split = path.split("/")

        # replace mesh and texture file paths
        tree = ET.fromstring(xml_str)
        root = tree
        asset = root.find("asset")
        meshes = asset.findall("mesh")
        textures = asset.findall("texture")
        all_elements = meshes + textures
        for elem in all_elements:
            old_path = elem.get("file")
            if old_path is None:
                continue
            elem.set("file", old_path)

        return ET.tostring(root, encoding="utf8").decode("utf8")
相关推荐
数据治理自习室11 分钟前
2026最新:MCP开发与使用指南
人工智能
小小疯狐狸15 分钟前
我踩过的Agent harness几个坑:上下文越跑越慢
人工智能
kaixin_啊啊43 分钟前
【零基础学AI】第 30 章——对话记录与结构化输出
人工智能
aifannihao1 小时前
Rust 1.100 的 DropGuard:用 Python 实测失败回滚与吞异常
python·rust·异常处理·标准库·contextlib
泯泷1 小时前
让知识"长骨架"——RAPTOR、GraphRAG 与 OpenViking(四)
人工智能·llm
kaixin_啊啊2 小时前
【零基础学AI】第 30 章课后练习与答案
人工智能
电科_银尘2 小时前
【深度学习项目实战·33】自定义数据集:把自己的图片接入PyTorch
人工智能·pytorch·深度学习
Star(up up up)2 小时前
Redis Windows 安装教程:使用Windows 的 Redis 压缩包
redis·笔记·学习·程序人生·云原生·学习方法·改行学it
武子康2 小时前
单卡 A6000 跑 Qwen-Drive:怎样留下可比较的第一条基线?
linux·人工智能·深度学习
严肃小白兔2 小时前
第 06/24 期:神经网络的反向传播算法:从链式法则到梯度计算
人工智能·神经网络·算法