aubo强化学习2:创建强化学习环境mujoco
摘要:本文介绍了MuJoCo物理引擎的安装与验证流程。
下载mujoco
直接在官方 Github 仓库的 Release 中下载
Github 仓库:https://github.com/google-deepmind/mujoco


解压
tar -zxvf mujoco-3.3.2-linux-x86_64.tar.gz
设置环境变量
export MUJOCO_PY_MUJOCO_PATH=~/.mujoco/mujoco-3.3.2
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/.mujoco/mujoco-3.3.2/bin
安装虚拟环境
python -m venv mujoco
conda activate mujoco
安装(python要用3.0版本以上)
pip3 install mujoco
验证安装
#simple_test.py
import mujoco
import numpy as np
print("=" * 60)
print("MuJoCo 基本功能测试")
print("=" * 60)
# 1. 验证导入
print("1. 导入测试... ✓")
print(f" MuJoCo 版本: {mujoco.__version__}")
# 2. 创建简单模型
print("\n2. 模型创建测试...")
xml = """
<mujoco>
<visual>
<headlight ambient="0.3 0.3 0.3"/>
</visual>
<worldbody>
<light name="top" pos="0 0 2"/>
<geom name="ground" type="plane" size="2 2 0.1" rgba="0.8 0.9 0.8 1"/>
<body name="ball" pos="0 0 0.5">
<joint type="free"/>
<geom type="sphere" size="0.1" rgba="0.8 0.3 0.3 1"/>
</body>
</worldbody>
</mujoco>
"""
try:
model = mujoco.MjModel.from_xml_string(xml)
data = mujoco.MjData(model)
print(f" ✓ 模型创建成功")
print(f" 自由度: {model.nv}")
print(f" 几何体: {model.ngeom}")
except Exception as e:
print(f" ✗ 模型创建失败: {e}")
exit(1)
# 3. 模拟测试
print("\n3. 模拟测试...")
for i in range(10):
mujoco.mj_step(model, data)
print(f" ✓ 模拟运行成功")
print(f" 球体位置: [{data.qpos[0]:.3f}, {data.qpos[1]:.3f}, {data.qpos[2]:.3f}]")
print("\n" + "=" * 60)
print("✅ MuJoCo 安装成功!所有测试通过")
print("=" * 60)
运行(记得在虚拟环境中运行)
# 确保在虚拟环境中
conda activate mujoco
# 运行测试
python simple_test.py
验证仿真器 simulate
cd mujoco-3.3.2/bin
./simulate ../model/humanoid/humanoid.xml

使用 URDF 文件
mujoco 原生并不支持 urdf 格式的文件,需要将其转换为 xml 后使用
1.获取机器人 urdf 文件
Github 仓库链接:Awesome Robot Descriptions 这里有很多机械臂模型

直接点击 URDF 进入对应的仓库,将整个仓库下载下来,这里为了方便我直接将 aubo_description 这个文件夹拷贝了一份到 mujoco-3.3.2 目录下,当前文件结构如下:
mujoco-3.3.2/
│ ├── aubo_description/
│ ├── bin/
│ ├── include/
│ ├── lib/
│ ├── LICENSE
│ └── model/
├── mujoco_env/
├── sample/
├── simulate/
├── test.py
└── THIRD_PARTY_NOTICES
检查一下 aubo_i5.urdf 文件的link树是否完整:
cd aubo_description/urdf
check_urdf aubo_i5.urdf

2.转换 mesh 文件
2.1使用下面的命令可以直接将 dae 后缀修改为 stl 后缀(机器人模型文件引用的 mesh 文件是 stl 格式,则可以直接跳过)
cd mujoco-3.3.2/aubo_description/meshes
for file in *.dae; do mv "$file" "${file%.DAE}.stl"; done
#如果是大写的DAE就把dae改成DAE
2.2安装依赖库,用python脚本批量修改
import os
import sys
import trimesh
def convert_dae_to_stl(folder_path):
if not os.path.isdir(folder_path):
print(f"路径无效:{folder_path}")
return
# 获取所有 .DAE 文件(不区分大小写)
dae_files = [f for f in os.listdir(folder_path) if f.lower().endswith('.dae')]
if not dae_files:
print("未找到 .DAE 文件。")
return
for dae_file in dae_files:
# 构建完整路径
dae_path = os.path.join(folder_path, dae_file)
# 输出文件名保持原样(仅更改扩展名为 .STL)
stl_filename = os.path.splitext(dae_file)[0] + '.STL'
stl_path = os.path.join(folder_path, stl_filename)
# 如果已存在同名 STL 文件,可选择跳过(避免重复转换)
if os.path.exists(stl_path):
print(f"文件已存在,跳过:{stl_filename}")
continue
try:
mesh = trimesh.load(dae_path)
if mesh.is_empty:
print(f"跳过空模型:{dae_file}")
continue
mesh.export(stl_path)
print(f"转换成功:{dae_file} -> {stl_filename}")
except Exception as e:
print(f"转换失败:{dae_file},错误信息:{e}")
if __name__ == '__main__':
if len(sys.argv) < 2:
print("用法:python convert.py <文件夹路径>")
else:
convert_dae_to_stl(sys.argv[1])
3.修改 urdf 文件
编辑 aubo_i5.urdf 文件
3.1 修改 mesh file 的搜索路径
打开urdf文件后将里面的package://aubo_description/meshes 批量替换成 ../meshes
3.2 修改 .dae 文件后缀为 .stl
urdf文件里的.dae换成.stl
3.3 添加 mujoco mesh重定向信息
在文件末尾处添加以下字段以让mujoco能够找到 mesh 文件(添加的部分一定要在 <robot>...</robot> 标签内):
<robot>
...
<mujoco>
<compiler balanceinertia="true" discardvisual="false" meshdir="../meshes"/>
</mujoco>
</robot>
4. 运行 urdf 转换命令
cd mujoco-3.3.2/aubo_description/
tree -L 1
├── conv.py
├── meshes
├── README.md
└── urdf
运行转换命令:
./bin/compile aubo_description/urdf/aubo_i5.urdf aubo_description/urdf/aubo_i5.xml
若出现Error: number of faces should be between 1 and 200000 in STL file 'aubo_description/urdf/../meshes_mujoco/base.stl'; perhaps this is an ASCII file?
不能直接通过修改文件后缀的方式,跳回到 2.转换 mesh 文件使用python转换
5.打开仿真器 simulate
cd mujoco-3.3.2
./bin/simulate aubo_description/urdf/aubo_i5.xml
更多推荐
所有评论(0)