MuJoCo键盘控制球体移动教程:实时记录位姿附代码

发布者:LitchiCheng最新更新时间:2026-03-27 来源: EEWorld 论坛作者: Lemontree关键字:键盘控制  实时记录  XML  重力  可视化  代码 手机看文章 扫描二维码
随时随地手机看文章

MuJoCo键盘控制球体移动教程:实时记录位姿附代码

本文将介绍如何在MuJoCo仿真环境中添加一个球体,并通过键盘方向键控制其x、y、z方向移动,同时实时记录球体的位置和姿态。教程包含完整的XML场景描述和Python代码实现,适合初学者学习MuJoCo基础操作和交互控制。

一、场景设置:XML描述

首先,创建一个MuJoCo XML文件,定义场景中的地面和球体。球体通过自由关节(freejoint)连接,允许在三维空间中自由移动。以下为XML代码:

<mujoco>
  <visual>
    <headlight diffuse="0.6 0.6 0.6" ambient="0.3 0.3 0.3" specular="0 0 0"/>
    <rgba haze="0.15 0.25 0.35 1"/>
    <global azimuth="140" elevation="-30"/>
  </visual>

  <asset>
    <texture type="skybox" builtin="gradient" rgb1="0.3 0.5 0.7" rgb2="0 0 0" width="512" height="3072"/>
    <texture type="2d" name="groundplane" builtin="checker" mark="edge" rgb1="0.2 0.3 0.4" rgb2="0.1 0.2 0.3"
      markrgb="0.8 0.8 0.8" width="300" height="300"/>
    <material name="groundplane" texture="groundplane" texuniform="true" texrepeat="5 5" reflectance="0.2"/>
  </asset>

  <worldbody>
    <geom name="floor" size="0 0 0.05" type="plane" material="groundplane"/>
    
    <body name="ball" pos="0 0 1">
      <freejoint name="free_joint"/>
      <geom type="sphere" size="0.2" rgba="1 0 0 1" mass="1"/>
    </body>
  </worldbody>
</mujoco>

该代码创建了一个带纹理的地面和一个红色球体,初始位置在(0,0,1)。

二、键盘控制:使用pynput库

通过Python的pynput库监听键盘事件,实现上下左右方向键控制球体x、y移动,Alt左键和Alt右键控制z移动。代码如下:

from pynput import keyboard

key_states = {
    keyboard.Key.up: False,
    keyboard.Key.down: False,
    keyboard.Key.left: False,
    keyboard.Key.right: False,
    keyboard.Key.alt_l: False,
    keyboard.Key.alt_r: False,
}

def on_press(key):
    if key in key_states:
        key_states[key] = True

def on_release(key):
    if key in key_states:
        key_states[key] = False

listener = keyboard.Listener(on_press=on_press, on_release=on_release)
listener.start()

三、完整代码:整合MuJoCo仿真与键盘控制

将XML场景和键盘控制结合,使用MuJoCo的Python接口进行仿真循环。在循环中,根据按键状态更新球体位置,并打印实时位姿。注意,需要关闭重力以防止球体下落。完整代码如下:

import mujoco
import mujoco.viewer
import numpy as np
from pynput import keyboard

key_states = {
    keyboard.Key.up: False,
    keyboard.Key.down: False,
    keyboard.Key.left: False,
    keyboard.Key.right: False,
    keyboard.Key.alt_l: False,
    keyboard.Key.alt_r: False,
}

def on_press(key):
    if key in key_states:
        key_states[key] = True

def on_release(key):
    if key in key_states:
        key_states[key] = False

listener = keyboard.Listener(on_press=on_press, on_release=on_release)
listener.start()

XML = """
<mujoco>
  <visual>
    <headlight diffuse="0.6 0.6 0.6" ambient="0.3 0.3 0.3" specular="0 0 0"/>
    <rgba haze="0.15 0.25 0.35 1"/>
    <global azimuth="140" elevation="-30"/>
  </visual>

  <asset>
    <texture type="skybox" builtin="gradient" rgb1="0.3 0.5 0.7" rgb2="0 0 0" width="512" height="3072"/>
    <texture type="2d" name="groundplane" builtin="checker" mark="edge" rgb1="0.2 0.3 0.4" rgb2="0.1 0.2 0.3"
      markrgb="0.8 0.8 0.8" width="300" height="300"/>
    <material name="groundplane" texture="groundplane" texuniform="true" texrepeat="5 5" reflectance="0.2"/>
  </asset>

  <worldbody>
    <geom name="floor" size="0 0 0.05" type="plane" material="groundplane"/>
    
    <body name="ball" pos="0 0 1">
      <freejoint name="free_joint"/>
      <geom type="sphere" size="0.2" rgba="1 0 0 1" mass="1"/>
    </body>
  </worldbody>
</mujoco>
"""

model = mujoco.MjModel.from_xml_string(XML)
model.opt.gravity = (0, 0, 0)
data = mujoco.MjData(model)

class CustomViewer:
    def __init__(self, model, data):
        self.handle = mujoco.viewer.launch_passive(model, data)
        self.pos = 0.0001

    def is_running(self):
        return self.handle.is_running()

    def sync(self):
        self.handle.sync()

    @property
    def cam(self):
        return self.handle.cam

    @property
    def viewport(self):
        return self.handle.viewport
    
    def run_loop(self):
        while self.is_running():
            ball_body_name = "ball"
            pos = data.body(ball_body_name).xpos
            quat = data.body(ball_body_name).xquat
            print(f"Position: {pos}, Orientation: {quat}")

            if key_states[keyboard.Key.up]:
                data.qpos[0] += self.pos
            if key_states[keyboard.Key.down]:
                data.qpos[0] -= self.pos
            if key_states[keyboard.Key.left]:
                data.qpos[1] += self.pos
            if key_states[keyboard.Key.right]:
                data.qpos[1] -= self.pos
            if key_states[keyboard.Key.alt_l]:
                data.qpos[2] += self.pos
            if key_states[keyboard.Key.alt_r]:
                data.qpos[2] -= self.pos

            mujoco.mj_step(model, data)
            self.sync()


viewer = CustomViewer(model, data)
viewer.cam.distance = 3
viewer.cam.azimuth = 0
viewer.cam.elevation = -30
viewer.run_loop()

四、常见问题:为什么Alt R无法控制z方向运动?

在默认情况下,MuJoCo开启重力(z轴方向),球体会自然下落。要解决此问题,需将重力设置为零,代码中添加:model.opt.gravity = (0, 0, 0)。这样,键盘控制即可在z轴生效。

五、总结

本教程演示了MuJoCo中球体的创建、键盘交互控制和位姿实时记录。通过此基础示例,可扩展用于机器人仿真、运动控制等场景。如需查看原帖详细内容(含视频和图片),请访问:MuJoCo 可视化键盘控制球体及位姿实时记录,附代码!

关键字:键盘控制  实时记录  XML  重力  可视化  代码 引用地址:MuJoCo键盘控制球体移动教程:实时记录位姿附代码 本文为EEWorld论坛网友原创,未经授权谢绝转载。如需转载或用于商业请联系作者并注明出处。如认为该文章侵权或违规请联系:bbs_service@eeworld.com.cn

上一篇:具身智能机器人进入家庭还需多久?
下一篇:基于Pinocchio和MuJoCo的机械臂逆运动学闭环控制仿真实现

推荐阅读最新更新时间:2026-03-27 16:59

实时监测神经“高速公路”是否“畅通”,非侵入性设备首次记录迷走神经活动
一名研究人员拿着一个光泵浦磁力计,他们使用这些非侵入性设备首次记录了人类迷走神经的活动。图片来源:高通研究所/加州大学圣迭哥分校 美国加州大学圣迭哥分校领导的一个研究团队首次表明,可穿戴的非侵入性设备能在临床环境中测量人类迷走神经活动。该设备成功记录了人类迷走神经、颈动脉窦神经以及在颈部皮肤和肌肉中发现的其他自主神经的活动。研究发表于最新一期《自然·通讯生物学》。 迷走神经如同神经系统的“高速公路”,它在人体由损伤或感染引起炎症反应中,起着关键作用,并且一直是败血症等致命疾病研究的重点。为了向医疗人员提供一种经过临床验证的、可用于监测神经系统活动水平的工具,研究人员设计了一种灵活的、黏合剂集成的电极阵列。 这种新设备利用“磁神
[医疗电子]
<font color='red'>实时</font>监测神经“高速公路”是否“畅通”,非侵入性设备首次<font color='red'>记录</font>迷走神经活动
以C8051F020单片机为系统控制器件的实时检测和记录车辆散热系统动态参数电路设计
1 引言 车辆的系统散热性是衡量其先进性的一个重要标志,因为车辆的各个部件和系统都存在一个最佳的工作温度区间,在此温度范围内零部件的各项性能指标才能得以保证。目前,我国车辆系统的研制已进入自行研制、自主创新的发展阶段,由于缺乏实车试验测试条件,加上车辆工作环境的复杂性,导致有效的实车试验数据严重缺乏,试验周期长,数据可复现性差,无法向工程设计部门提供准确有效的实车试验数据,严重影响车辆总体技术的进一步发展。因此,本文着重于在不改变车辆现有结构和性能的前提下,采用单片机控制系统、传感器技术、数据存储技术、实时时钟技术,研制一套能实时检测和记录车辆散热系统动态参数的电子电路。 2 系统总体构架设计 该散热系统参数测试电路由上位微型计算
[单片机]
以C8051F020单片机为系统<font color='red'>控制</font>器件的<font color='red'>实时</font>检测和<font color='red'>记录</font>车辆散热系统动态参数电路设计
基于铁电存储器的高速和高保真的汽车事故实时数据记录
1 引言 我国汽车行驶记录仪国家标准GB/T19056-2003已经于2003年9月1日开始实施,对耐高/低温和湿热性、抗振动、抗冲击、外壳防护、静电放电抗扰度、辐射抗扰度等25项技术指标都进行了严格的规定。汽车行驶记录仪是能够对车辆行驶速度、时间、里程及有关车辆行驶的其他状态信息进行记录、存储并通过接口实现数据输出的数字式电子记录装置。由于记录仪能够实时地记录车辆运行和驾驶员驾驶活动的有关信息,因而可在遏制疲劳驾驶、车辆超速等严重交换违章、约束驾驶人员的不良驾驶行为、预防道路交通事故、保障车辆行驶安全、提高营运管理水平等诸多方面发挥重要的作用,并将为事故分析鉴定提供原始数据。汽车行驶记录仪提供的原始数据按时间先后分为二种
[单片机]
基于铁电存储器的高速和高保真的汽车事故<font color='red'>实时</font>数据<font color='red'>记录</font>仪
记录实时多任务调度策略的研究
实时多任务系统应用极其广泛,几乎渗透到各行各业,系统分类也很复杂。虽然不同的应用在实现模式上不完全一样,但核心思想是一致的。在嵌入式系统中,实时多任务机制是依靠启动之后运行的一段后台任务管理程序实现的。应用程序运行在该管理器程序之上。后台根据各个任务的要求,进行资源管理、消息管理、任务调度、异常处理等工作。其首要目的是调度一切可利用的资源实现实时控制任务。 实时系统主要有两大类:软实时系统和硬实时系统。软实时系统的宗旨是使各个任务运行的越快越好,并不要求限定某一任务必须在多长时间内完成。在硬实时系统中,各任务不仅要执行无误而且要做到准时。大多数实时系统都是二者的结合。对于一个复杂任务系统,任务调度模式的选用是其系统架构的一个重点。无
[单片机]
<font color='red'>记录</font>仪<font color='red'>实时</font>多任务调度策略的研究
摩尔斯微电子推出MM8108:全球体积最小、速度最快、功耗最低、传输距离最远的Wi-Fi芯片
最新Wi-Fi HaLow片上系统(SoC)为物联网的性能、效率、安全性与多功能性设立新标准 配套USB网关,轻松实现Wi-Fi HaLow在新建及现有Wi-Fi基础设施中的快速稳健集成 2024年1月9日美国拉斯维加斯和中国北京—— 2025国际消费电子展(CES 2025)——基于IEEE 802.11ah标准的Wi-Fi HaLow芯片全球领军供应商摩尔斯微电子,宣布推出备受期待的第二代MM8108系统级芯片(SoC)。 继第一代MM6108 SoC大获成功,MM8108在覆盖范围、数据吞吐量和功率效率等核心指标实现全面突破,同时显著降低了将下一代Wi-Fi HaLow产品的上市成本、工作量、和周期。 摩尔斯微电
[网络通信]
摩尔斯微电子推出MM8108:全<font color='red'>球体</font>积最小、速度最快、功耗最低、传输距离最远的Wi-Fi芯片
球体积最小的薄膜带通滤波器由TDK研发
TDK 公司近日宣布,已开发出一款厚度仅 0.3 mm 的 1005 尺寸薄膜带通滤波器,这也是世界上同类产品中体积最小的滤波器。TDK 采用了其在 HDD 磁头(TDK 的主打产品)生产中研发的薄膜工艺,从而制造出真正低剖面 (low-profile) 且体积缩小至早期的 2012 尺寸产品 1/12 的滤波器。 在过去几年里,移动电话和其他移动通信设备随着功能增加而更为先进,在其核心功能之外还加入了大容量的数据传输能力,如图形和移动互联能力。此外,富有魅力的硬件设计变得与功能同样重要,对小巧、轻便及易于使用的需求不断增加,这也对电子元件提出了紧凑、低剖面的要求。同时,构成电子设备的大量模块中采用的电子元件也需要进一
[测试测量]
重力感应式智能便携闹钟的软硬件实现
一、项目概述 1.1引言 普通的闹钟只具有时间显示和语音提醒功能,若设想一种闹钟不仅可以进行时间显示,而且到达设定的闹钟时间时可以在表盘上显示相关的事务提醒,那么闹钟的功能可以得以极大的丰富。 1.2项目背景/选题动机 第一,参照PSoC Rocks例程所演示的效果,拓展到可以用一系列的LED灯来进行文字显示; 第二,曾看过有人用一个马达带动一系列LED灯,并施以一定的控制来完成表盘时钟的显示,觉得既有趣又具有观赏性,所以会想到将其功能复杂化,尝试完成文字显示; 第三,考虑到PSoC开发板集成有重力感应器,可以用来对闹钟的功能进行扩展,当器件处于不同的放置状态时进行不同的内容显示; 二、需求分析 2.1功能要求 1、时钟显示功能:
[嵌入式]
<font color='red'>重力</font>感应式智能便携闹钟的软硬件实现
压力,拉力,重力,称重传感器,差分应变电桥信号隔离变送器
应变电桥信号测量法的五个优点是灵敏度高、范围广、频率响应好、尺寸小、质量轻、电信号,可变为传感器。 一般地,被测量者的状态量是非常微弱的,必须用专门的电路来测量这种微弱的变化,最常用的电路就是各种电桥电路,主要有直流和交流电桥电路。 电桥电路的作用:把电阻片的电阻变化率ΔR/R转换成电压输出,然后提供给放大电路放大后进行测量。 电桥测量法的基本原理是用电阻应变片测定构件表面的线应变,再根据应变—应力关系确定构件表面应力状态的一种实验应力分析方法。 这种方法是将电阻应变片粘贴的被测构件表面,当构件变形时,电阻应变片的电阻值将发生相应的变化,然后通过电阻应变仪将此电阻变化转换成电压(或电流)的变化,再换算成应变值或者输出与
[测试测量]
压力,拉力,<font color='red'>重力</font>,称重传感器,差分应变电桥信号隔离变送器
小广播
最新机器人文章
厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关:

索引文件: 2 

词云: 1 2 3 4 5 6 7 8 9 10

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved