Trossen Arm MuJoCo自定义1:改变目标物体

改变目标物体

(换成蓝色方块、圆柱或其他形状)

1. 修改场景 XML 文件

关键文件 :Trossen Arm MuJoCo 包的核心配置文件都在 assets/ 文件夹里。场景XML文件:

  • 单臂操作:assets/wxai/scene_wxai_pick_place.xml

  • 双臂固定:assets/stationary_ai/scene_stationary_ai_pick_place.xml


  • 找到 <body name="red_box"> 或类似物体定义

  • 修改 nameblue_box,同时修改 rgba 颜色为蓝色(例如 0 0 1 1

  • 如果物体是自定义几何体(如 STL 网格),确保 mesh 路径指向正确的文件,或直接使用内置几何体。如果使用自定义网格(mesh),需在 <asset> 中定义 mesh,并在 <geom> 中引用。

XML 复制代码
<!-- 原物体 -->
<body name="red_box" pos="0.3 0 0.05">
    <geom type="box" size="0.03 0.03 0.03" rgba="1 0 0 1" name="red_box" group="1"/>
    <joint name="red_box_joint" type="free"/>
</body>

<!-- 改为蓝色方块 -->
<body name="blue_box" pos="0.3 0 0.05">
    <geom type="box" size="0.03 0.03 0.03" rgba="0 0 1 1" name="blue_box" group="1"/>
    <joint name="blue_box_joint" type="free"/>
</body>

2. 更新任务代码中的物体名称

ee_sim_env.pysim_env.py 中,找到对应任务类(如 TransferCubeTask),将物体名称从 red_box 改为 blue_box

  • 获取关节索引physics.model.name2id("blue_box_joint", "joint")

  • 接触检测 :在 get_reward 中,将 ("red_box", "left/gripper_follower_left") 替换为 ("blue_box", "left/gripper_follower_left")

  • 环境状态提取 :如果 get_env_state 返回方块位姿,无需修改名称,但确保索引正确(通常物体自由关节位于 qpos 末尾)。

XML 复制代码
def initialize_episode(self, physics):
    # ...
    box_start_idx = physics.model.name2id("blue_box_joint", "joint")  # 修改此处
    np.copyto(physics.data.qpos[box_start_idx:box_start_idx+7], cube_pose)

def get_reward(self, physics):
    # ...
    touch_left_gripper = ("blue_box", "left/gripper_follower_left") in all_contact_pairs
    touch_right_gripper = ("blue_box", "right/gripper_follower_left") in all_contact_pairs
    touch_table = ("blue_box", "table") in all_contact_pairs

3. 调整策略中的抓取点计算(如果需要)

如果你的策略(scripted_policy.py)中硬编码了物体的抓取点(例如 box_xyz),确保从环境状态中正确读取的是新物体的位置。通常 env_state 就是物体位姿,只要任务类的 get_env_state 返回的是该物体的位姿,策略无需改动。

如果策略中使用了固定的抓取高度或偏移,可能需要微调(例如不同物体的尺寸)。

4. 更新任务配置(可选)

如果你在 constants.py 中定义了新任务,确保 scene_xml 指向修改后的 XML 文件,并且 task_class 使用更新后的任务类

5. 验证

运行 record_sim_episodes.py 指定你的任务,观察仿真中物体颜色是否为蓝色,机械臂是否成功抓取蓝色方块。如果出现接触检测不生效,检查接触对中的几何体名称是否与 XML 中的 name 完全一致(包括大小写)

如果想将方块换成葡萄串

1. 准备葡萄串的3D模型

  • 需要一个 .stl.obj 格式的葡萄串模型文件。如果没有现成的,可以:

    • 从免费3D模型网站下载(如 Sketchfab),确保许可允许使用。

    • 使用建模软件(如 Blender)简单制作一个组合体(多个球体簇)。

  • 将模型文件放置在仓库的 trossen_arm_mujoco/assets/meshes/ 目录下,例如命名为 grape_bunch.stl

2. 在场景XML中定义葡萄串物体

打开你使用的场景XML文件(例如 assets/wxai/scene_wxai_pick_place.xml)。找到原方块的 <body> 定义,将其替换为葡萄串的定义。

2.1 添加网格资源

<asset> 标签内添加对葡萄串模型的引用:

XML 复制代码
<asset>
    <mesh file="meshes/grape_bunch.stl" name="grape_bunch_mesh" scale="0.01 0.01 0.01"/>
    <!-- 其他资产... -->
</asset>
2.2 定义葡萄串的body
XML 复制代码
<body name="grape_bunch" pos="0.3 0 0.05">
    <!-- 视觉几何体:使用精细网格 -->
    <geom type="mesh" mesh="grape_bunch_mesh" rgba="0.6 0.2 0.6 1" group="1" name="grape_bunch_vis"/>
    <!-- 碰撞几何体:可以使用简化形状(例如球体簇或胶囊)来提高仿真效率,避免复杂网格碰撞 -->
    <geom type="sphere" size="0.04" pos="0 0 0" rgba="0.6 0.2 0.6 1" group="3" name="grape_bunch_collision"/>
    <!-- 或者使用多个球体模拟葡萄粒 -->
    <!-- <geom type="sphere" size="0.02" pos="0.02 0.01 0.02" .../> -->
    <joint name="grape_bunch_joint" type="free"/>
</body>
2.3 调整初始位置和方向

葡萄串可能重心较高或不规则,初始位置 pos 要确保放置在桌面上方且不与其他物体穿插。

3. 更新任务代码中的物体名称

ee_sim_env.pysim_env.py 中,找到对应的任务类(如 TransferCubeTask),将所有出现 red_boxblue_box 的地方替换为 grape_bunch,包括:

  • 关节名称physics.model.name2id("grape_bunch_joint", "joint")

  • 接触检测 :将接触对中的物体名改为 ("grape_bunch", "left/gripper_follower_left") 等。

  • 环境状态get_env_state 返回的位姿现在对应葡萄串的位姿。

XML 复制代码
def initialize_episode(self, physics):
    # ...
    grape_start_idx = physics.model.name2id("grape_bunch_joint", "joint")
    np.copyto(physics.data.qpos[grape_start_idx:grape_start_idx+7], grape_pose)

def get_reward(self, physics):
    # ...
    touch_left_gripper = ("grape_bunch", "left/gripper_follower_left") in all_contact_pairs
    touch_right_gripper = ("grape_bunch", "right/gripper_follower_left") in all_contact_pairs
    touch_table = ("grape_bunch", "table") in all_contact_pairs

同样修改 sim_env.py 中的对应任务类

4. 调整抓取策略(可选)

由于葡萄串是不规则物体,原方块的正上方抓取点可能不适用。可以修改 **scripted_policy.py**中的轨迹生成逻辑,例如:

  • 调整抓取点位置 :从环境状态中获取葡萄串位姿后,设定一个偏移量(例如 grasp_xyz = grape_xyz + [0, 0, 0.05])。

  • 改变夹爪开合时机:可能需要在闭合夹爪后稍微上提再移动,避免葡萄串滚动。

  • 使用更柔和的夹持力 :如果夹爪闭合太紧可能导致葡萄模型穿透,可以调整夹爪位置控制参数(在控制器中设置 gripper_force 等,但需要修改底层)。

也可以在 scripted_policy.py 中新增一个专门针对葡萄串的策略类,重写 generate_trajectory

5. 验证

  • 运行单次仿真 :先用 python3 trossen_arm_mujoco/scripts/wxai_pick_place.py(如果修改的是单臂场景)测试,观察葡萄串是否显示正确、机械臂是否能够接近。

  • 检查接触检测 :在 get_reward 中打印接触对,确保抓取时能正确识别与葡萄串的接触。

  • 数据收集 :使用 record_sim_episodes.py 采集几个episode,并用 visualize_eps.py 生成视频,确认抓取动作有效

相关推荐
aqi0014 小时前
15天学会AI应用开发(十)把文本嵌入模型换成国产模型
人工智能·python·ai编程
MobotStone14 小时前
为什么在AI时代,“好奇心”成了最值钱的能力?
人工智能
武子康15 小时前
调查研究-200 llama.cpp b9754:一次很小但很关键的 Agent 工具调用修复
人工智能·agent·llama
Ralph_Salar15 小时前
从0到1搭建AI智能支付风控助手Stage1-RAG知识库升级 — 元数据让检索更精准
人工智能
武子康15 小时前
调查研究-199 MCP Zero-Touch OAuth:为什么它是 MCP 进入企业生产的关键门槛?
人工智能·agent·mcp
冬奇Lab15 小时前
每日一个开源项目(第144篇):ai-website-cloner-template - 一条命令、多 Agent 并行,把任意网站逆向成 Next.js 代码
前端·人工智能·开源
冬奇Lab15 小时前
AI 原生组织不是买工具,而是让等待消失
人工智能·工作流引擎
半个落月15 小时前
从数据集划分理解大模型的数据工程
人工智能