MuJoCo学习(一)——环境搭建和文件转换
开发环境
在WIN11系统下开发
在conda中新建了python3.10.18虚拟环境
安装命令
pip install mujoco urdf2mjcf openGL numpy
文件准备
实验采用睿尔曼rml63机械臂,下载文件,复制其中meshes、urdf文件夹到代码文件夹

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可能需要的转换

<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()

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()
浙公网安备 33010602011771号