MuJoCo学习(一)——环境搭建和文件转换

开发环境

在WIN11系统下开发
在conda中新建了python3.10.18虚拟环境

安装命令
pip install mujoco urdf2mjcf openGL numpy

文件准备

实验采用睿尔曼rml63机械臂,下载文件,复制其中meshes、urdf文件夹到代码文件夹
6eda08ea7eb87932c6ebbff0d499734c
meshes移动到urdf文件夹下

urdf文件修改

打开urdf文件,将geometry部分与mesh中的stl文件绑定相关语句修改为绝对路径

<geometry>
        <mesh
          filename="所在绝对路径base_link.STL" />

urdf转换到mjcf文件

由于pycharm等ide有概率无法取得管理员权限,运行convert_urdf.py时建议使用管理员身份打开anaconda prompt,跳转到代码所在文件夹运行

import os
from urdf2mjcf.convert import convert_urdf_to_mjcf

os.makedirs("mjcf", exist_ok=True)

convert_urdf_to_mjcf(
    urdf_path="urdf/RML63II-6F.urdf",
    mjcf_path="mjcf/rml63ii.xml",
    copy_meshes=True  # ✅ 关键:直接复制mesh文件,避免创建符号链接
)

print("转换完成: mjcf/rml63ii.xml")

转换完成后会自动创建mjcf文件夹并复制meshes文件

xml可能需要的转换

db4049b3-7718-4224-bb1d-fbebaf780fe5

<body name="base_link" pos="0 0 0.0164595954617898">
      <!-- imu site 移到 base_link 内部或根据需要保留 -->
      <site name="imu" size="0.01" pos="0 0 0" />
      

由于选用的机械臂stl资产存在base_link与link_1干涉,在z方向抬高0.005,从而使得joint_1能够顺利转动

<body name="link_1" pos="0 0 0.177"> <!-- 原值假设为0.172,现改为 0.172 + 0.005 = 0.177 -->
    <inertial pos="-0.068442 -0.023913 -0.006938" quat="-0.301712 0.808775 -0.161786 0.478204" 
              mass="1.837" diaginertia="0.00431382 0.00419084 0.00169105" />
    
    <joint name="joint_1" pos="0 0 0" axis="0 0 1" range="-3.106 3.106" actuatorfrcrange="-60 60" />
    
    <geom type="mesh" mesh="link_1" rgba="1 1 1 1" 
          contype="0" conaffinity="0" density="0" group="1" class="visualgeom" />
    <geom type="mesh" mesh="link_1" rgba="1 1 1 1" 
          contype="2" conaffinity="1" />
</body>

基础效果

静态重力测试

import mujoco
import mujoco.viewer
import numpy as np

model = mujoco.MjModel.from_xml_path("mjcf/rml63ii-g.xml")
data = mujoco.MjData(model)

# 设置一个非零姿态,避免奇异点掩盖问题
data.qpos[:] = [0.5, -0.8, 1.2, -0.5, 0.3, 0.0]

print(f"✅ nq={model.nq}, nv={model.nv}, nu={model.nu}")
print(f"总质量: {np.sum(model.body_mass):.3f} kg")

with mujoco.viewer.launch_passive(model, data) as viewer:
    while viewer.is_running():
        # 不调用 mj_control,只让重力作用
        mujoco.mj_step(model, data)
        viewer.sync()

e2db1f6baa8c8de2aad923eb15335be6

PD控制测试

mport mujoco
import mujoco.viewer
import numpy as np

model = mujoco.MjModel.from_xml_path("mjcf/rml63ii-g.xml")
data = mujoco.MjData(model)

# PD 增益(根据 RML63II-6F 实际参数调整)
KP = np.array([200, 200, 150, 150, 80, 80])
KD = np.array([20, 20, 15, 15, 8, 8])

# 目标关节角度
target_qpos = np.array([0, 0, 0, 0, 0, 0])
# target_qpos = np.array([0.5, -0.8, 1.2, -0.5, 0.3, 0.0])

with mujoco.viewer.launch_passive(model, data) as viewer:
    while viewer.is_running():
        # 简单 PD 控制律
        error = target_qpos - data.qpos
        d_error = -data.qvel  # 目标速度为0
        torque = KP * error + KD * d_error

        # 限幅(与 actuator ctrlrange 一致)
        torque = np.clip(torque,
                         model.actuator_ctrlrange[:, 0],
                         model.actuator_ctrlrange[:, 1])

        data.ctrl[:] = torque
        mujoco.mj_step(model, data)
        viewer.sync()

posted on 2026-06-04 14:55  fmix  阅读(99)  评论(0)    收藏  举报

导航