mujoco构建无物理约束的几何体运动

mujoco构建无物理约束的几何体运动。

中心位置放置立方块,一个圆球围绕中心按照圆的轨迹进行运动。

具体模型定义、代码实现具体如下:

bash 复制代码
#-*-coding:utf-8-*-
# date:2025-12-07
# Author: Eric

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

# 1. 定义MuJoCo XML模型(修复range参数+优化关节)
xml = """
<mujoco model="sphere_circle_trajectory">
    <compiler angle="degree"/>
    <option timestep="0.005"/>  <!-- 仿真步长,越小越平滑 -->
    <worldbody>
        <light diffuse="0.5 0.5 0.5" pos="0 0 3" dir="0 0 -1"/>
        <geom name="ground" type="plane" size="2 2 0.1" rgba="0.5 0.5 0.5 1"/>

        <body name="cube" pos="0 0 0.1">
            <joint type="free"/>
            <geom type="box" size="0.1 0.1 0.1" rgba="0.0 0.0 0.5 1"/>
        </body>

        <!-- 球体 -->
        <body name="sphere" pos="0.0 0.0 0.09">  <!-- z=0.09:球体半径,刚好贴地面 -->
            <!-- 关节:仅允许x/y平移,z轴通过微小range+高阻尼固定 -->
            <joint name="sphere_x" type="slide" axis="1 0 0" damping="1"/>
            <joint name="sphere_y" type="slide" axis="0 1 0" damping="1"/>
            <joint name="sphere_z" type="slide" axis="0 0 1" limited="true"
                   range="0.089 0.091" damping="100"/>  <!-- 微小范围+高阻尼固定z轴 -->
            <geom type="sphere" size="0.09" rgba="0.0 0.9 0.0 1"/>
        </body>
    </worldbody>

    <!-- 控制器:为x/y关节添加位置控制 -->
    <actuator>
        <position name="act_x" joint="sphere_x" kp="1000"/>  <!-- kp:位置增益 -->
        <position name="act_y" joint="sphere_y" kp="1000"/>
    </actuator>
</mujoco>
"""
# from_xml_path
# 2. 初始化MuJoCo模型和数据
model = mujoco.MjModel.from_xml_string(xml)

data = mujoco.MjData(model)

# 3. 定义圆形轨迹参数
circle_radius = 1.0       # 圆半径
center_x, center_y = 0, 0 # 圆心坐标
angular_velocity = 0.3    # 角速度(rad/s),控制运动速度

# 4. 仿真循环(带可视化)
with mujoco.viewer.launch_passive(model, data) as viewer:
    # 固定仿真帧率
    viewer._paused = False
    start_time = time.time()

    while viewer.is_running():
        # 计算当前时间和角度
        current_time = time.time() - start_time
        theta = angular_velocity * current_time  # 随时间变化的角度

        # 计算圆形轨迹的目标位置(x,y)
        target_x = center_x + circle_radius * np.cos(theta)
        target_y = center_y + circle_radius * np.sin(theta)

        # 方式:直接修改物体状态(无物理约束,慎用)
        data.joint("sphere_x").qpos = target_x
        data.joint("sphere_y").qpos = target_y

        # 运行一步仿真
        mujoco.mj_step(model, data)

        # 同步可视化
        viewer.sync()

        # 控制仿真帧率(避免过快)
        time.sleep(model.opt.timestep)

代码执行效果如下:

相关推荐
zzzzzz3102 小时前
当产品经理说这个很简单:我用Python自动化处理奇葩需求的实战指南
python·pycharm·产品经理
雪隐2 小时前
个人电脑玩AI-06让5060 Ti给你打工——不光能画画,Qwen3-TTS还能学人说话,连我老板都信了!
人工智能·后端·python
兵慌码乱14 小时前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
hboot15 小时前
AI工程师第三课 - 机器学习基础
python·scikit-learn·kaggle
顾林海20 小时前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
呱呱复呱呱1 天前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
曲幽1 天前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码1 天前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱2 天前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵2 天前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学