
标题:MuJoCo深度解析:qfrc三力详解及鼠标交互物理效果测试
内容:
大家好,今天我将带大家详细了解MuJoCo中的三种力:qfrc_actuator、qfrc_passive和qfrc_applied,并在其可视化窗进行鼠标拖拽交互测试。
在MuJoCo的官方文档mjData中,我们可以看到以下三种力的定义:
1. qfrc_actuator:对于关节电机表现为力矩,如电机驱动关节转动;对于线性执行器,表现为线,如推动连杆。
2. qfrc_passive:由被动力学元件产生,包括关节的弹簧力、阻尼力、摩擦力、接触力等。例如,在xml中定义的关节接触、摩擦等。
3. qfrc_applied:外部施加的力或力矩,例如我们可以通过代码手动给模型中的某个点施加力或力矩。
接下来,让我们看看如何在MuJoCo中使用鼠标拖拽进行物理交互。在可视化窗,我们可以通过鼠标拖拽模型来测试qfrc的实时变化。
当我们双击接触点或物体,并按住Ctrl键进行鼠标右键点击并拖动时,MuJoCo会在接触点(或选中的物体)上施加一个位置约束,使物体跟随鼠标移动。这个过程等效于在接触点上施加一个弹簧阻尼力,即实现了位置拖拽(Position Drag)。
同样地,当我们双击接触点或物体,并按住Ctrl键进行鼠标左键按住旋转时,MuJoCo会在物体上施加力矩,使其绕指定轴旋转。这就是旋转拖拽(Rotation Drag)。
为了更好地记录拖拽过程中的qfrc_actuator变化,我们可以编写一段代码来存储关节力矩的列表,并绘制关节力矩随时间变化的曲线。这样,我们就可以直观地看到鼠标拖拽对模型力的影响。
示例代码片段如下:
python
import mujoco_viewer
import numpy as np
import matplotlib.pyplot as plt
class TestViewer(mujoco_viewer.CustomViewer):
def __init__(self, model_path):
super().__init__(model_path, 3, azimuth=180, elevation=-30)
self.model_path = model_path
self.torque_history = [] 存储关节力矩的列表
self.time_history = [] 存储时间戳
def mouse_drag(self, event):
在鼠标拖拽时记录力矩
if event.button == 1: 左键拖拽,实现旋转拖拽
记录力矩变化…
elif event.button == 3: 右键拖拽,实现位置拖拽
记录位置约束下的力变化…
def runFunc(self):
绘制关节力矩曲线…(与示例代码类似)
pass
if __name__ == “__main__”:
test_viewer = TestViewer(“model/trs_so_arm100/scene.xml”) 加载模型路径
test_viewer.run_loop() 运行视图循环
