
视频讲解:Mujoco 基础:获取模型中所有 body 的 name, id 以及位姿_哔哩哔哩_bilibili
代码仓库:https://github.com/LitchiCheng/mujoco-learning
今天介绍下一个很常用的接口:获取模型中所有的 body 的 name,id,以及位姿。
经常做测试时会遇到获取某个 body 的位姿以及利用该位姿,我们可以通过指定 body,先获取 id,再通过 id 获取 ee 的世界坐标系下的位姿,然后将位置作为对运动学的一个目标,同时可以在模型当中添加一些可视化的元素,更直观的来看自己的代码或者说这个实验是否达到预期,如下为常用来的接口或字段:
- body的数量
model.nbody
- 通过id获取名称
mujoco.mj_id2name
- 获取父 id
model.body_parentid
- 获取指定 id 的位置
data.body(body_id).xpos
如下代码为获取所有body的id、以及位姿
import mujoco
import time
import mujoco_viewer
import numpy as np
class Test(mujoco_viewer.CustomViewer):
def __init__(self, path):
super().__init__(path, 3, azimuth=-45, elevation=-30)
self.path = path
def runBefore(self):
for body_id in range(self.model.nbody):
# 参数说明:model=模型,obj_type=对象类型(body),obj_id=body ID
body_name = mujoco.mj_id2name(self.model, mujoco.mjtObj.mjOBJ_BODY, body_id)
# 获取父 body ID
parent_body_id = self.model.body_parentid[body_id]
# print(f"{body_id:<10} {body_name:<20} {parent_body_id:<15}")
pos = self.data.body(body_id).xpos
quat = self.data.body(body_id).xquat
print(f"id:{body_id}, name: {body_name}, Position: {pos}, Quaternion: {quat}")
def runFunc(self):
placeholder = 0
test = Test("./model/franka_emika_panda/scene_pos.xml")
test.run_loop()

也可以通过在viewer中显示body看到实际的位置
