视频讲解:
仓库地址:GitHub - LitchiCheng/mujoco-learning
本期介绍下,mujoco_py这个库很老了,最新的版本可以通过mujoco的python库,可视化模型及获取模型body的实时位置,下面开始,首先安装如下依赖库
关于模型有哪些body,可以通过代码的形式,或者查看xml描述文件
新建get_body_pos.py的文件夹
- import mujoco
- import numpy as np
- import glfw
-
-
- def scroll_callback(window, xoffset, yoffset):
-
- global cam
-
-
- cam.distance *= 1 - 0.1 * yoffset
-
- def main():
-
- global cam
-
- model = mujoco.MjModel.from_xml_path('/home/dar/MuJoCoBin/mujoco_menagerie/franka_emika_panda/scene.xml')
-
- data = mujoco.MjData(model)
-
-
- if not glfw.init():
-
- return
-
-
- window = glfw.create_window(1200, 900, 'Panda Arm Control', None, None)
- if not window:
-
- glfw.terminate()
- return
-
-
- glfw.make_context_current(window)
-
-
- glfw.set_scroll_callback(window, scroll_callback)
-
-
- cam = mujoco.MjvCamera()
-
- opt = mujoco.MjvOption()
-
- mujoco.mjv_defaultCamera(cam)
-
- mujoco.mjv_defaultOption(opt)
-
- pert = mujoco.MjvPerturb()
-
- con = mujoco.MjrContext(model, mujoco.mjtFontScale.mjFONTSCALE_150.value)
-
-
- scene = mujoco.MjvScene(model, maxgeom=10000)
-
-
- end_effector_id = mujoco.mj_name2id(model, mujoco.mjtObj.mjOBJ_BODY, 'hand')
- print(f"End effector ID: {end_effector_id}")
- if end_effector_id == -1:
-
- print("Warning: Could not find the end effector with the given name.")
- glfw.terminate()
- return
-
-
- while not glfw.window_should_close(window):
-
- end_effector_pos = data.body(end_effector_id).xpos
-
- print(f"End effector position: {end_effector_pos}")
-
-
- mujoco.mj_step(model, data)
-
- viewport = mujoco.MjrRect(0, 0, 1200, 900)
-
- mujoco.mjv_updateScene(model, data, opt, pert, cam, mujoco.mjtCatBit.mjCAT_ALL.value, scene)
-
- mujoco.mjr_render(viewport, scene, con)
-
-
- glfw.swap_buffers(window)
-
- glfw.poll_events()
-
-
- glfw.terminate()
-
- if __name__ == "__main__":
-
- main()
运行代码,python3 get_body_pos.py,可以看到出现panda机械臂场景,同时控制台不停的输出hand body的位置