MuJoCo 学习笔记


MuJoCo 安装与入门

MuJoCo(Multi-Joint dynamics with Contact)是一个用于物理仿真的高性能引擎,广泛应用于机器人学和强化学习领域。以下是安装和入门的基本步骤:

  • 访问 MuJoCo 官方网站 下载最新版本的 MuJoCo。
  • 解压下载的文件,并将其放置在合适的目录中(例如 ~/.mujoco/mujoco210)。
  • 设置环境变量 MUJOCO_PY_MUJOCO_PATH 指向 MuJoCo 的安装路径。
  • 安装 Python 绑定 mujoco-py,可以使用 pip:
    pip install mujoco

gemini给出的示例代码解析

import mujoco
import mujoco.viewer
import time
import numpy as np

## 1. 加载模型 (请将 path_to_your_arm.xml 替换为你实际的路径)
model = mujoco.MjModel.from_xml_path("franka_emika_panda/scene.xml")
data = mujoco.MjData(model)

# 2. 启动可视化交互窗口
with mujoco.viewer.launch_passive(model, data) as viewer:
    # 保持仿真运行
    while viewer.is_running():
        step_start = time.time()

        # --- 这里是你的控制逻辑区 ---
        
        # 核心功能:重力补偿 (Gravity Compensation)
        # qfrc_bias 存储了为了抵消重力、科氏力等所需的力矩
        # 我们把这个力直接赋值给执行器 (ctrl),机器人就能"浮"在空中
        data.ctrl[:] = data.qfrc_bias[:len(data.ctrl)]
        
        # -----------------------

        # 3. 物理步进
        mujoco.mj_step(model, data)

        # 4. 同步渲染频率
        viewer.sync()
        
        # 尽量维持实时仿真速度
        time_until_next_step = model.opt.timestep - (time.time() - step_start)
        if time_until_next_step > 0:
            time.sleep(time_until_next_step)

现象:机械表疯狂转动不停止

手臂“疯狂转动”通常是因为控制信号(ctrl)与执行器(actuator)的类型不匹配导致的。 在 MuJoCo 中,不同类型的执行器(如位置控制、速度控制、力控制)需要不同的控制信号。如果你将一个执行器设置为位置控制,但提供了力控制信号,机械臂可能会表现出异常行为。

常见的执行器类型包括但不限于:

  • 位控制(Position Control):控制信号表示期望的位置。
  • 力控制(Force Control):控制信号表示施加的力或力矩。
  • 速度控制(Velocity Control):控制信号表示期望的速度。

其他一些执行器类型还包括:

  • 力矩控制(Torque Control):控制信号表示施加的力矩。
  • 混合控制(Hybrid Control):结合多种控制方式。
  • 弹簧阻尼控制(Spring-Damper Control):模拟弹簧和阻尼器的行为。
  • 肌肉模型控制(Muscle Model Control):模拟生物肌肉的行为。
  • 自定义控制(Custom Control):用户定义的控制方式。
  • 环境反馈控制(Environment Feedback Control):基于环境状态的控制。
  • 学习型控制(Learning-based Control):通过机器学习方法实现的控制。
  • 自适应控制(Adaptive Control):根据系统变化自动调整控制参数。
  • 鲁棒控制(Robust Control):在不确定性条件下保持性能的控制。
  • 分布式控制(Distributed Control):多个控制器协同工作。
  • 非线性控制(Nonlinear Control):处理非线性系统的控制方法。
  • 最优控制(Optimal Control):通过优化方法实现的控制策略。
  • 预测控制(Predictive Control):基于未来状态预测的控制方法。
  • 多变量控制(Multivariable Control):同时控制多个变量的系统。
  • 分层控制(Hierarchical Control):多层次的控制结构。
  • 事件驱动控制(Event-driven Control):基于事件触发的控制机制。
  • 混沌控制(Chaotic Control):利用混沌理论实现的控制方法。
  • 量子控制(Quantum Control):基于量子力学原理的控制方法。
  • 生物启发控制(Bio-inspired Control):模仿生物系统的控制策略。
  • 智能控制(Intelligent Control):结合人工智能技术的控制方法。
  • 模糊控制(Fuzzy Control):基于模糊逻辑的控制方法。
  • 神经网络控制(Neural Network Control):利用神经网络实现的控制策略。
  • 遗传算法控制(Genetic Algorithm Control):通过遗传算法优化的控制方法。
  • 粒子群优化控制(Particle Swarm Optimization Control):利用粒子群优化算法实现的控制策略。
  • 强化学习控制(Reinforcement Learning Control):通过强化学习方法实现的控制。
  • 模仿学习控制(Imitation Learning Control):通过模仿专家行为实现的控制策略。
  • 分布式智能控制(Distributed Intelligent Control):结合分布式系统和智能控制方法。
  • 协同控制(Cooperative Control):多个系统协同工作的控制策略。

确保你的控制信号类型与执行器类型匹配。例如,如果你的执行器是位置控制类型,你应该提供期望的位置值,而不是力矩值。

ur5e.xml 中的执行器类型是位置控制(position),而代码中提供的是力矩值(data.qfrc_bias),这就导致了机械臂的异常行为。要解决这个问题,你需要根据执行器的类型调整控制信号的赋值方式。

# 在循环开始前,记录初始姿势
initial_qpos = np.array(data.qpos[:model.nu])

# 在 while 循环中
while viewer.is_running():
    # 发送位置指令,而不是力矩指令
    data.ctrl[:] = initial_qpos  
    
    mujoco.mj_step(model, data)
    viewer.sync()

改为位控后保持静止。

怎么用鼠标拽动机械臂

按住ctrl键,然后用鼠标左键点击并拖动机械臂的某个部分,就可以直接操纵机械臂的位置和姿态。释放鼠标按钮后,机械臂会根据新的位置继续进行仿真。