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 生成视频,确认抓取动作有效

相关推荐
不熬夜的熬润之2 小时前
YOLOv5-OBB 训练避坑笔记
人工智能·yolo·计算机视觉
实证小助手2 小时前
世界各国经济政策不确定指数(1997-2024年)月度数据
大数据·人工智能
Wcowin2 小时前
Hermes Agent:自进化的 AI Agent
人工智能
yong99902 小时前
IHAOAVOA:天鹰优化算法与非洲秃鹫优化算法的混合算法(Matlab实现)
开发语言·算法·matlab
U盘失踪了3 小时前
go 环境配置
学习
努力学习_小白3 小时前
ResNet-50——pytorch版
人工智能·pytorch·python
Stella Blog3 小时前
狂神Java基础学习笔记Day03
java·笔记·学习
安思派Anspire3 小时前
内容创作的核心变量:从选题判断到系统化生产的再思考 AI 选题及预测工具 百万加 MPlus
人工智能·aigc
探物 AI3 小时前
虾破苍穹(二)·《openclaw功法全书》 [特殊字符]
人工智能·ai编程