用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/MIUAV/vibe-coding-ros2 --skill mujoco命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | mujoco |
| description | MuJoCo 物理仿真开发技能 - 高性能物理引擎、强化学习环境、MJCF 模型、GPU 加速 |
| argument-hint | mujoco仿真 OR 强化学习 OR MJCF模型 OR 机器人控制 |
| user-invocable | true |
用于 MuJoCo 物理仿真环境的配置和开发
当需要以下帮助时使用此技能:
# 安装 mujoco-py
pip install mujoco-py
# 或安装 mujoco (新版本)
pip install mujoco
# 下载 MuJoCo 引擎
# https://github.com/deepmind/mujoco/releases
# 解压到 ~/.mujoco/mujoco200
import mujoco
import mujoco.viewer as viewer
# 加载模型
model = mujoco.MjModel.from_xml_path("robot.xml")
data = model.data
# 创建查看器
v = viewer.launch_passive(model, data)
# 仿真循环
for _ in range(1000):
mujoco.mj_step(model, data)
v.sync()
<mujoco model="my_robot">
<!-- 编译器设置 -->
<compiler angle="radian" meshdir="meshes" autolimits="true"/>
<!-- 选项设置 -->
<option timestep="0.002" integrator="Euler" iterations="50" tolerance="1e-10"/>
<!-- 全局设置 -->
<global>
<gravity gravity="0 0 -9.81"/>
<wind wind="0 0 0"/>
<density density="1.0"/>
<viscosity viscosity="0.0"/>
</global>
<!-- 世界资源 -->
<worldbody>
<!-- 地面 -->
<geom type="plane" size="10 10 0.1" rgba="0.5 0.5 0.5 1" friction="0.4 0.005 0.0001"/>
<!-- 光照 -->
<mujoco model="biped_robot">
<compiler angle="radian" meshdir="meshes" autolimits="true"/>
<option timestep="0.002" iterations="100" solver="Newton" gravity="0 0 -9.81"/>
<worldbody>
<!-- 躯干 -->
<body name="torso" pos="0 0 1.0">
<freejoint/>
<inertial pos="0 0 0" mass="8" diaginertia="0.1 0.08 0.08"/>
<geom type="capsule" size="0.07 0.2" rgba="0.4 0.4 0.4 1" friction="0.5"/>
<!-- 头部 -->
<body name="head" pos="0 0 0.25">
<inertial pos= = =/>
import gymnasium as gym
from gym import spaces
import numpy as np
class MuJoCoEnv(gym.Env):
def __init__(self, model_path="robot.xml"):
super().__init__()
# 加载模型
self.model = mujoco.MjModel.from_xml_path(model_path)
self.data = self.model.data
# 定义空间
self.action_space = spaces.Box(
low=-1, high=1,
shape=(self.model.nu,),
dtype=np.float32
)
self.observation_space = spaces.Box(
low=-np.inf, high=np.inf,
shape=(self.model.nq + self.model.nv + self.model.nu,),
dtype=np.float32
)
def reset(self, seed=None, options=None):
# 重置状态
mujoco.mj_resetData(self.model, self.data)
# 获取观察
obs = self._get_obs()
return obs, {}
def step(self, action):
# 应用控制
self.data.ctrl[:] = action
# 仿真一步
mujoco.mj_step(.model, .data)
obs = ._get_obs()
reward = ._compute_reward()
done = ._is_done()
obs, reward, done, , {}
():
np.concatenate([
.data.qpos,
.data.qvel,
.data.ctrl
])
():
():
():
from dm_control import suite
import numpy as np
# 加载环境
env = suite.load(domain_name="walker", task_name="run")
# 获取观察和动作规格
action_spec = env.action_spec()
observation_spec = env.observation_spec()
# 运行 episodes
time_step = env.reset()
while not time_step.last():
action = np.random.uniform(action_spec.minimum, action_spec.maximum)
time_step = env.step(action)
print(f"Reward: {time_step.reward}")
def pd_control(model, data, kp=1.0, kd=0.5):
"""PD 控制器"""
# 目标位置 (可以从外部输入)
q_des = np.zeros(model.nq)
qdot_des = np.zeros(model.nv)
# PD 控制
q_error = q_des - data.qpos
qdot_error = qdot_des - data.qvel
# 计算控制力
ctrl = kp * q_error + kd * qdot_error
return ctrl
def impedance_control(model, data, target_pos, k_p=100, k_d=10):
"""阻抗控制器"""
# 当前末端位置 (假设为最后一个 body)
current_pos = data.body_xpos[-1]
# 位置误差
error = target_pos - current_pos
# 阻抗控制力
f = k_p * error - k_d * data.cvel
# 转换为关节力 (简化版)
ctrl = np.zeros(model.nu)
# 实际需要使用 Jacobian
return ctrl
# 检查 GPU 可用性
print(mujoco.get_platform())
# 启用 GPU
model = mujoco.MjModel.from_xml_path("robot.xml",
nthread=4,
nsubsteps=2)
# 使用 dm_control 并行环境
from dm_control import composer
from dm_control import suite
# 创建并行环境
env = suite.load(domain_name="cartpole",
task_name="balance",
visualize_reward=False)
# 并行步骤
for _ in range(1000):
action = env.action_spec().sample()
time_step = env.step(action)
# 关节位置
qpos = data.qpos
# 关节速度
qvel = data.qvel
# 力
qfrc = data.qfrc
# 末端位置
end_effector_pos = data.body_xpos[-1]
# 接触力
contact_force = data.eforce
# 触地检测
for i in range(model.ncon):
contact = data.contact[i]
# contact 包含接触信息
import rclpy
from rclpy.node import Node
import mujoco
class MuJoCoROS2(Node):
def __init__(self):
super().__init__('mujoco_ros2')
# 加载模型
self.model = mujoco.MjModel.from_xml_path('/path/to/robot.xml')
self.data = self.model.data
# 订阅
self.create_subscription(
Float64MultiArray,
'/joint_commands',
self.cmd_callback,
10)
# 定时器
self.timer = self.create_timer(0.002, self.step_callback)
def cmd_callback(self, msg):
self.data.ctrl[:] = msg.data
def step_callback(self):
mujoco.mj_step(self.model, self.data)
# 发布状态
# ...
解决方案:
解决方案:
解决方案: