視頻講解:
MuJoCo 仿真 Panda 機械臂!末端位置實時追蹤 + 可視化(含縮放交互)
倉庫地址:GitHub - LitchiCheng/mujoco-learning
本期介紹下,mujoco_py這個庫很老了,最新的版本可以通過mujoco的python庫,可視化模型及獲取模型body的實時位置,下面開始,首先安裝如下依賴庫
pip3 install mujoco glfw
關于模型有哪些body,可以通過代碼的形式,或者查看xml描述文件
新建get_body_pos.py的文件夾
import mujoco
import numpy as np
import glfw# 定義鼠標滾輪滾動的回調函數,用于處理界面縮放
def scroll_callback(window, xoffset, yoffset):# 使用 global 關鍵字聲明 cam 為全局變量,以便在函數內部修改它global cam# 根據鼠標滾輪的垂直滾動量 yoffset 調整相機的距離,實現縮放效果# 0.1 是縮放的比例因子,可以根據需要調整cam.distance *= 1 - 0.1 * yoffsetdef main():# 聲明 cam 為全局變量,方便在其他函數中使用global cam# 從指定的 XML 文件路徑加載 MuJoCo 模型model = mujoco.MjModel.from_xml_path('/home/dar/MuJoCoBin/mujoco_menagerie/franka_emika_panda/scene.xml')# 創建與模型對應的 MjData 實例,用于存儲模擬過程中的動態數據data = mujoco.MjData(model)# 初始化 GLFW 庫,用于創建窗口和處理輸入事件if not glfw.init():# 如果初始化失敗,直接返回return# 創建一個 1200x900 像素的窗口,標題為 'Panda Arm Control'window = glfw.create_window(1200, 900, 'Panda Arm Control', None, None)if not window:# 如果窗口創建失敗,終止 GLFW 并返回glfw.terminate()return# 將當前上下文設置為新創建的窗口,以便后續的 OpenGL 操作在該窗口上進行glfw.make_context_current(window)# 設置鼠標滾輪事件的回調函數為 scroll_callback,當鼠標滾輪滾動時會調用該函數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)# 根據名稱 'hand' 查找末端執行器的 body IDend_effector_id = mujoco.mj_name2id(model, mujoco.mjtObj.mjOBJ_BODY, 'hand')print(f"End effector ID: {end_effector_id}")if end_effector_id == -1:# 如果未找到指定名稱的末端執行器,打印警告信息并終止 GLFWprint("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 庫,釋放相關資源glfw.terminate()if __name__ == "__main__":# 當腳本作為主程序運行時,調用 main 函數main()
運行代碼,python3 get_body_pos.py,可以看到出現panda機械臂場景,同時控制臺不停的輸出hand body的位置