MuJoCo 解析 qfrc 三种力!带你测试鼠标拖拽物理交互效果

yumo6665个月前 (05-15)技术文章33

视频讲解:MuJoCo 解析 qfrc 三种力!带你测试鼠标拖拽物理交互效果_哔哩哔哩_bilibili

代码仓库:GitHub -
LitchiCheng/mujoco-learning

今天分享下,在MuJoCo中有三种力,可以在官方文档中的mjData中看到如下定义

1. mjData.qfrc_actuator 对于关节电机,表现为力矩,如电机驱动关节转动;对于线性执行器,表现为线性力,如活塞推动连杆

2. mjData.qfrc_passive:由被动力学元件产生,像关节的弹簧力、阻尼力、摩擦力、接触力,比如 xml 中定义的关节的 ,接触,摩擦

3. mjData.qfrc_applied:外部施加的,比如手动给模型中的某个点施加力或力矩

力类型

来源

可控方式

qfrc_actuator

执行器(如电机)

通过data.ctrl数组控制

qfrc_passive

弹簧、阻尼、接触、摩擦等

修改模型参数(如stiffness)

qfrc_applied

手动施加或鼠标拖拽

直接修改data.qfrc_applied或鼠标交互

当在 MuJoCo 的可视化窗口中用鼠标拖拽模型时,MuJoCo 会自动计算并施加以下两种力:

位置拖拽(Position Drag):双击接触点或物体,按住Ctrl键,然后鼠标右键点击并拖动模型时,MuJoCo 会在接触点(或选中的物体)上施加一个位置约束,使物体跟随鼠标移动,等效于在接触点上施加一个弹簧阻尼力

旋转拖拽(Rotation Drag):双击接触点或物体,按住Ctrl键,然后鼠标左键按住旋转模型时,MuJoCo 会在物体上施加力矩,使其绕指定轴旋转。

记录拖拽过程中的 qfrc_actuator,完整代码如下

import mujoco_viewer
import numpy as np
# matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
import time,math

class Test(mujoco_viewer.CustomViewer):
    def __init__(self, path):
        super().__init__(path, 3, azimuth=180, elevation=-30)
        self.path = path
    
    def runBefore(self):
        # 存储关节力矩的列表
        self.torque_history = []
        self.time_history = []
       
    def runFunc(self):
        if True:
            self.time_history.append(self.data.time)
            self.torque_history.append(self.data.qfrc_actuator.copy())  # 存储关节力矩
            if len(self.torque_history) > 20000:
                torque_history = np.array(self.torque_history)
                # 绘制关节力矩曲线
                plt.figure(figsize=(10, 6))
                for i in range(torque_history.shape[1]):
                    plt.subplot(torque_history.shape[1], 1, i + 1)
                    plt.plot(self.time_history, torque_history[:, i], label=f'Joint {i + 1} Torque')
                    plt.xlabel('Time (s)')
                    plt.ylabel('Torque (N·m)')
                    plt.title(f'Joint {i + 1} Torque Over Time')
                    plt.legend()
                    plt.grid(True)
                # plt.tight_layout()
                plt.show()

if __name__ == "__main__":
    test = Test("model/trs_so_arm100/scene.xml")
    test.run_loop()

    

相关文章

让交互更加生动!有意思的鼠标跟随 3D 旋转动效

今天,群友问了这样一个问题,如下所示的鼠标跟随交互效果,如何实现:简单分析一下,这个交互效果主要有两个核心:借助了 CSS 3D 的能力元素的旋转需要和鼠标的移动相结合本文,就将讲述如何使用纯 CSS...

全屏的十字准星跟随鼠标箭头移动奇怪的问题原因分析及处理方法

今天遇见一个奇怪的问题,有一个全屏的十字准星,然后跟随鼠标的移动而移动。大家可以看一下,现在有一个全屏的十字,我们的鼠标左右移动的时候也会跟着移动,我们点东西的时候也是可以点到的,遇见这种情况就特别奇...

图表随鼠标点击改变位置

所谓表不如图,图在展示信息的时候会更加直观,更加有视觉效果。有时候我的表格行数会很多,比如我在看经销商销售,或者每款销售的时候就会有很多行,但是我想看每款产品的各周销售走势,以便更好的了解产品,预估未...

EXCEL表设置十字光标,精准定位单元格,巧用宏表函数和条件格式

在EXCEL表格里查看或对比数据时候,如果数据量特别多,总要紧盯屏幕,生怕数据对错行列,那如果在表格里有这样一个十字光标显示在当前选定单元格里,是不是数据看起来就方便很多呢?在WPS表格里,自带了这个...

html5精选特效代码分享(收藏)

在网页设计过程中,我们会经常用到一些HTML5特效代码,下面就是为大家整理分享的一些好看炫酷且实用的HTML5特效代码,可以放心在您的应用程序中使用。一、Canvas跟随鼠标光标动画特效演示、下载地址...

有意思的鼠标指针交互探究

今天,来实现这样一个有意思的交互效果:将原本的鼠标指针样式,修改成自己想要的效果,并且添加上一些特殊的交互效果。修改鼠标样式首先,第一个问题,我们可以看到,上图中,鼠标指针的样式被修改成了一个圆点:正...