Mujoco 學習系列(一)安裝與部署

這個系列文章用來記錄 Google DeepMind 發布的 Mujoco 仿真平臺的使用過程,Mujoco 是具身智能領域中非常知名的仿真平臺,以簡單易用的API和精準的物理引擎而著稱(PS:原來Google能寫好API文檔啊),也是我平時使用最多的仿真平臺,相比較于Gazebo、Isaac Sim 等仿真器而言至少對我來說非常高效,能夠在初期快速驗證模型性能以及配置文件,下面是幾個我常用的仿真平臺對比:

仿真平臺開發公司渲染物理引擎主要優勢典型用途
MuJoCoDeepMind (原Roboti)MuJoCo精確的物理建模、速度快、適合優化強化學習、控制算法研究
GazeboOpen RoboticsODE, Bullet 等與 ROS 深度集成、功能豐富機器人系統集成、SLAM、導航
Isaac SimNVIDIAPhysX(GPU支持)高保真渲染、多傳感器仿真、數字孿生機器人感知、數字孿生建模
Isaac GymNVIDIAPhysX(GPU加速)多環境并行、用于大規模RL訓練強化學習

作為系列文章的第一篇是安裝與部署,整個系列將聚焦仿真這一方向,在部署到真機前實現模型驗證。


1. 前期準備工作

前期準備工作主要是檢查你的硬件條件,雖然官方文檔中提到了對OpenGL的需求,但如果你的OS內核沒有過于古老的情況下是不用理會的。

  • Github 倉庫:https://github.com/google-deepmind/mujoco
  • 官方文檔:https://mujoco.readthedocs.io/en/stable/overview.html

這里以我個人的平臺為例,具體配置如下:

  • OS:Ubuntu 20.04 Desktop
  • CPU:12th Gen Intel? Core? i7-12700K
  • Memory:Sumsung DDR4 32*2 GB
  • GPU:NVIDIA GeForce RTX 3060 Super 12 GB
  • CUDA Version:12.2
  • GPU Driver:535.183.01
  • Mujoco Version:3.3.2

后續會在GPU服務器上部署仿真平臺并訓練模型,如果沒有特殊說明的情況下都是以上述配置進行實驗。

雖然官方沒有說明有關仿真平臺的硬件要求,但我個人建議CPU使用12代及其以上型號、內存不低于32GB、顯卡在3060及其以上,因為后面會有博客教你如何在Mujoco上使用模型進行推理,如果你的顯卡顯存不夠的話幾個經典模型是跑不起來的。

在這里插入圖片描述


2. 編譯與部署

Mujoco 提供了Release和source兩種部署方式,支持 Windows、MacOS、Linux 三大平臺,自己編譯與直接拉取二進制文件效果一樣,兩種方式二選一。

2.1 源碼編譯

  • 官方提供的編譯文檔:Building from source

拉取源碼

$ git clone git@github.com:google-deepmind/mujoco.git

因為編譯過程中會使用到 cmake 的 FetchContent 從網上拉取需要的組件,所以需要你確保梯子可用。

編譯源碼

$ cd mujoco
$ mkdir build && cd build
$ cmake .....
-- Looking for IceConnectionNumber in ICE
-- Looking for IceConnectionNumber in ICE - found
-- mujoco::FindOrFetch: Using FetchContent to retrieve `glfw3` - Done
-- mujoco::FindOrFetch: checking for targets in package `mujoco`
-- mujoco::FindOrFetch: checking for targets in package `mujoco` - found
-- mujoco::FindOrFetch: checking for targets in package `glfw3`
-- mujoco::FindOrFetch: checking for targets in package `glfw3` - found
-- Configuring done
-- Generating done
-- Build files have been written to: /home/gaohao/Downloads/mujoco/build

上面的操作沒有報錯的可以繼續執行編譯命令:

$ cmake --build .		# 【不推薦】官方編譯命令
$ make -j$(nproc)		# 【推薦】多線程編譯
$ make install```

2.2 下載二進制文件

直接在官方 Github 倉庫的 Release 中下載即可:

在這里插入圖片描述

下載好后直接解壓:

$ tar -zxvf  mujoco-3.3.2-linux-x86_64.tar.gz 

然后在 ~/.bashrc 文件的末尾添加以下內容:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/Downloads/mujoco-3.3.2/bin

2.3 安裝 python 庫

這里建議使用conda管理python環境,根據官網介紹需要使用 3.8 及其以上版本,我這里使用 3.10:

$ conda create --name mujoco python=3.10
$ pip install mujoco

2.4 驗證安裝效果

新建一個python腳本并添加下面的內容用來加載mujoco自帶的一個xml模型文件 humanoid.xml,在安裝/編譯位置的 model 文件夾中

import mujoco# 你的實際安裝路徑
model_path = '~/Downloads/mujoco-3.3.2/model/humanoid/humanoid.xml'
model = mujoco.MjModel.from_xml_path(model_path)
data = mujoco.MjData(model)
print(data)
# 調用計時API確保其他組件正常安裝
for _ in range(1000): mujoco.mj_step(model, data)print("Test done.")

運行示例:

(mujoco) $ python test.py<mujoco._structs.MjData object at 0x7ff67c1471b0>
Test done.

能夠正確打印 data 的數據類型則說明安裝成功。

2.5 驗證仿真器 simulate

在確保上面的API驗證沒有報錯的前提下需要驗證仿真器是否能夠正常運行:

$ cd mujoco/bin
$ ./simulate ../model/humanoid/humaniod.xml

運行后會彈出仿真器,此時你需要確認以下幾點是可用的:

  1. 小人在沒有干預的情況下逐漸躺到在地面;
  2. 右側打開 Control 面板拖動控制條,小人對應的關節是可動的;

在這里插入圖片描述


3. 使用 URDF 文件

如果你有機器人的開發經驗,特別是在ROS平臺上,那么通常用得最多的是 urdfxacro,但 mujoco 原生并不支持 urdf 格式的文件,需要將其轉換為 xml 后使用。

3.1 獲取機器人 urdf 文件

這里推薦一個 Github 倉庫 Awesome Robot Descriptions 里面有很多開源的機器人模型文件。

  • Github 倉庫鏈接:Awesome Robot Descriptions

在這里插入圖片描述

這里以 Gen2 這個機械臂模型為例,直接點擊 URDF 進入對應的倉庫:

在這里插入圖片描述

你可以將整個倉庫下載下來也可以用瀏覽器插件下載一部分,這里為了方便我直接將 example-robot-data/robots/kinova_description 這個文件夾拷貝了一份到 mujoco-3.3.2 目錄下,當前文件結構如下:

$ cd ~/Downloads/mujoco-3.3.2
$ tree -L 1
.
├── bin
├── demo.py
├── include
├── kinova_description		# 從 example-robot-data/robots/ 拷貝過來的文件夾
├── lib
├── model
├── MUJOCO_LOG.TXT
├── sample
├── simulate
└── THIRD_PARTY_NOTICES

進入kinova_description/robots檢查一下 kinova.urdf 文件的link樹是否完整:

$ cd kinova_description/robots
$ check_urdf kinova.urdfrobot name is: kinova
---------- Successfully Parsed XML ---------------
root Link: base has 1 child(ren)child(1):  j2s6s200_link_basechild(1):  j2s6s200_link_1child(1):  j2s6s200_link_2child(1):  j2s6s200_link_3child(1):  j2s6s200_link_4child(1):  j2s6s200_link_5child(1):  j2s6s200_link_6child(1):  j2s6s200_end_effectorchild(2):  j2s6s200_link_finger_1child(1):  j2s6s200_link_finger_tip_1child(3):  j2s6s200_link_finger_2child(1):  j2s6s200_link_finger_tip_2

只要沒有報錯則說明文件 urdf 的link樹是正確的,那么就可以進行后續操作。

【Note】:這一步一定要去做,因為后面有些問題就是由于link樹沒有正確連接導致的,但urdf 文件本身排查起來很累,所以在使用前就檢查連接合法性是最合適的

3.2 [可選] 轉換 mesh 文件

如果你的機器人模型文件引用的 mesh 文件是 stl 格式,則可以直接跳過這一段,這里為了更全面的演示我特意找的是 dae 格式的文件。

dae 文件轉換為 stl 有很多種方法,我常用的方法有以下三種,前兩種是可能的偷懶方法,其中第三種是一定可行的,之所以說是可能的偷懶方法是因為這兩種轉化方式的成功與否完全取決于廠商是否規范和運氣。但無論如何都需要對原始文件進行備份:

$ cp -r meshes/ meshes_mujoco/

對于偷懶方法而言,使用后直接跳到 3.3 小節完成 urdf 文件修改后即可執行 3.4 小節驗證是否可用,如果不可用則跳回來在剩下兩個方法中再選一個嘗試。

3.2.1 可能的偷懶方法一

第一種可能的偷懶方法是直接修改文件后綴名,使用下面的命令可以直接將 dae 后綴修改為 stl 后綴:

$ cd meshes_mujoco
$ for file in *.dae; do mv "$file" "${file%.dae}.stl"; done

3.3.2 可能的偷懶方法二

第二種可能的偷懶方法是用python腳本批量修改,需要安裝依賴庫:

$ pip install trimesh pyglet

我這里提供了一個python腳本:

import os
import sys
import trimeshdef convert_dae_to_stl(folder_path):if not os.path.isdir(folder_path):print(f"路徑無效:{folder_path}")return# 獲取所有 .dae 文件dae_files = [f for f in os.listdir(folder_path) if f.lower().endswith('.dae')]if not dae_files:print("未找到 .dae 文件。")returnfor dae_file in dae_files:dae_path = os.path.join(folder_path, dae_file)stl_path = os.path.join(folder_path, os.path.splitext(dae_file)[0] + '.stl')try:mesh = trimesh.load(dae_path)if mesh.is_empty:print(f"跳過空模型:{dae_file}")continuemesh.export(stl_path)print(f"轉換成功:{dae_file} -> {os.path.basename(stl_path)}")except Exception as e:print(f"轉換失敗:{dae_file},錯誤信息:{e}")if __name__ == '__main__':if len(sys.argv) < 2:print("用法:python convert.py <文件夾路徑>")else:convert_dae_to_stl(sys.argv[1])

通過下面的命令使用,運行后會在 meshes_mujoco/ 文件夾下生成同名但格式不同的mesh文件:

$ cd meshes_mujoco/
$ python conv.py ./

3.2.3 絕對可行的方法

最保險和穩妥的方法是使用第三方工具將文件轉換成 stl 格式并保存,這里推薦使用開源工具 meshlab,這個方式比較麻煩的點在于需要一個一個手動轉換后保存:

  • Meshlab 官網鏈接:https://www.meshlab.net

進入后在 Download 頁面中選擇合適的版本下載。
在這里插入圖片描述

打開軟件后直接按照下面的步驟操作:

  1. File -> Import Mesh..
  2. File -> Export Mesh As..
  3. 在彈出的對話框中選擇 .stl 格式并保存;

在這里插入圖片描述

【Note】:因為 mujoco 在使用mesh文件時緊支持表面不超過 200000 個渲染面的文件,如果你在后面運行時出現了相關報錯還可以按照下面的步驟減少渲染面個數:

  1. Filters -> Remeshing, Simplication and Reconstruction -> Simplication: Quadric Edge Collaspe Decimation
  2. 在彈出的界面中將渲染面改到合適的范圍;

在這里插入圖片描述

在這里插入圖片描述

3.3 修改 urdf 文件

然后編輯 kinova.urdf 文件,總共需要做2步操作:

  1. mesh file 的搜索路徑改為相對路徑;
  2. 修改 .dae 文件后綴為 .stl
  3. 添加 mujoco 的 mesh 文件搜索路徑;

3.2.1 修改 mesh file 的搜索路徑

打開urdf文件后將里面的 package://example-robot-data/robots/kinova_description/meshes 批量替換成 ../meshes_mujoco

在這里插入圖片描述

3.2.2 修改 .dae 文件后綴為 .stl

如果你的urdf文件本身用的就是 stl 后綴就不用執行這一步;如果是跟著我的示例就需要執行,同樣是批量查找并替換:

在這里插入圖片描述

3.2.3 添加 mujoco mesh 重定向信息

在文件末尾處添加以下字段以讓mujoco能夠找到 mesh 文件:

【Note】:添加的部分一定要在 <robot>...</robot> 標簽內。

<robot>...<mujoco><compiler balanceinertia="true" discardvisual="false" meshdir="../meshes_mujoco"/></mujoco>
</robot>

3.4 運行 urdf 轉換命令

此時你的kinova_description文件結構如下:

$ cd mujoco-3.3.2/kinova_description/
$ tree -L 1.
├── meshes				# 原始的dae文件夾
├── meshes_mujoco		# 轉換成stl的文件夾
├── README.md
├── robots
└── srdf

運行轉換命令:

(mujoco) $ cd ../
(mujoco) $ ./bin/compile kinova_description/robots/kinova.urdf kinova_description/robots/kinova.xml...
WARNING: Geom with duplicate name '' encountered in URDF, creating an unnamed geom.
WARNING: Geom with duplicate name '' encountered in URDF, creating an unnamed geom.
WARNING: Geom with duplicate name '' encountered in URDF, creating an unnamed geom.
WARNING: Geom with duplicate name '' encountered in URDF, creating an unnamed geom.
Done.
First compile: 0.1349s
Second compile: 0.02025s

輸出上面的樣子則表明轉換成功。

3.4.1 可能的報錯一:

如果運行后發現有以下報錯:

Error: number of faces should be between 1 and 200000 in STL file 'kinova_description/robots/../meshes_mujoco/base.stl'; perhaps this is an ASCII file?

有兩種可能性:

  1. 不能直接通過修改文件后綴的方式,跳回到 3.2.3 老老實實用最穩妥的方式一個一個手動轉化吧;
  2. 文件的 mesh 渲染面體太多了,跳回到 3.2.3 中修改渲染面的個數;

3.4.2 可能的報錯二:

如果運行后發現有以下報錯:

Error: Error opening file 'kinova_description/robots/base.stl': No such file or directory

通常是應為沒有執行 3.2.3 步導致的,在urdf中添加字段讓 mujoco 完成重定向。

3.4.3 可能的報錯三:

如果運行后發現有以下報錯:

...
Plugins registered by library 'libelasticity.so':mujoco.elasticity.cablemujoco.elasticity.shell
ERROR: could not initialize GLFW

通常是因為沒有使用虛擬環境導致的,使用正確的conda環境,在我這里是mujoco

$ conda activate mujoco

如果仍然是這個報錯,檢測你的命令是否輸錯了:

$ ./bin/simulate	# 錯誤
$ ./bin/compile		# 正確

3.5 打開仿真器 simulate

在確保轉換成功后就可以打開仿真器查看機器人模型了,仿真器使用的是 xml 格式的文件,如果打開的是 urdf 則會報錯。

$ cd mujoco-3.3.2
$ ./bin/simulate kinova_description/robots/kinova.xml

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906334.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906334.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906334.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ai學習之openai api

一、什么是openai api 大家對特斯拉的馬斯克應該是不陌生的&#xff0c;openai 就是馬斯克投資的一家研究人工智能的公司&#xff0c;它就致力于推動人工智能技術的發展&#xff0c;目標是確保人工智能對人類有益&#xff0c;并實現安全且通用的人工智能。 此后&#xff0c;O…

leetcode 合并區間 java

用 ArrayList<int[]> merged new ArrayList<>();來定義數組的list將數組進行排序 Arrays.sort(intervals,(a,b) -> Integer.compare(a[0],b[0]));如果前面的末尾>后面的初始&#xff0c;那么新的currentInterval的末尾這兩個數組末尾的最大值&#xff0c;即…

std::vector<>.emplace_back

emplace_back() 詳解&#xff1a;C 就地構造的效率革命 emplace_back() 是 C11 引入的容器成員函數&#xff0c;用于在容器尾部就地構造&#xff08;而非拷貝或移動&#xff09;元素。這一特性顯著提升了復雜對象的插入效率&#xff0c;尤其適用于構造代價較高的類型。 一、核…

Dify實戰案例《AI面試官》更新,支持語音交互+智能知識庫+隨機題庫+敏感詞過濾等...

大模型應用課又更新了&#xff0c;除了之前已經完結的兩門課&#xff08;視頻圖文&#xff09;&#xff1a; 《Spring AI 從入門到精通》《LangChain4j 從入門到精通》 還有目前正在更新的 《Dify 從入門到實戰》 本周也迎來了一大波內容更新&#xff0c;其中就包括今天要介紹…

AGI大模型(29):LangChain Model模型

1 LangChain支持的模型有三大類 大語言模型(LLM) ,也叫Text Model,這些模型將文本字符串作為輸入,并返回文本字符串作為輸出。聊天模型(Chat Model),主要代表Open AI的ChatGPT系列模型。這些模型通常由語言模型支持,但它們的API更加結構化。具體來說,這些模型將聊天消…

動態IP技術在跨境電商中的創新應用與戰略價值解析

在全球化4.0時代&#xff0c;跨境電商正經歷從"流量紅利"向"技術紅利"的深度轉型。動態IP技術作為網絡基礎設施的關鍵組件&#xff0c;正在重塑跨境貿易的運營邏輯。本文將從技術架構、應用場景、創新實踐三個維度&#xff0c;揭示動態IP如何成為跨境電商突…

android雙屏之副屏待機顯示圖片

摘要&#xff1a;android原生有雙屏的機制&#xff0c;但需要芯片廠商適配框架后在底層實現。本文在基于芯發8766已實現底層適配的基礎上&#xff0c;僅針對上層Launcher部分對系統進行改造&#xff0c;從而實現在開機后副屏顯示一張待機圖片。 副屏布局 由于僅顯示一張圖片&…

STM32之中斷

一、提高程序實時性的架構方案 輪詢式 指的是在程序運行時&#xff0c;首先對所有的硬件進行初始化&#xff0c;然后在主程序中寫一個死循環&#xff0c;需要運行的功能按照順序進行執行&#xff0c;輪詢系統是一種簡單可靠的方式&#xff0c;一般適用于在只需要按照順序執行…

LLM應用開發平臺資料

課程和代碼資料 放下面了&#xff0c;自取&#xff1a; https://pan.quark.cn/s/57a9d22d61e9

硬盤健康檢測與性能測試的實踐指南

在日常使用 Windows 系統的過程中&#xff0c;我們常常需要借助各種工具來優化性能、排查問題或管理文件。針對windows工具箱進行實測解析&#xff0c;發現它整合了多種實用功能&#xff0c;能夠幫助用戶更高效地管理計算機。 以下為測試發現的功能特性&#xff1a; 硬件信息查…

正則表達式進階(三):遞歸模式與條件匹配的藝術

在正則表達式的高級應用中&#xff0c;遞歸模式和條件匹配是處理復雜嵌套結構和動態模式的利器。它們突破了傳統正則表達式的線性匹配局限&#xff0c;能夠應對嵌套括號、HTML標簽、上下文依賴等復雜場景。本文將詳細介紹遞歸模式&#xff08;(?>...)、 (?R) 等&#xff0…

從零開始創建React項目及制作頁面

一、React 介紹 React 是一個由 Meta&#xff08;原Facebook&#xff09; 開發和維護的 開源JavaScript庫&#xff0c;主要用于構建用戶界面&#xff08;User Interface, UI&#xff09;。它是前端開發中最流行的工具之一&#xff0c;廣泛應用于單頁應用程序&#xff08;SPA&a…

【前端部署】通過 Nginx 讓局域網用戶訪問你的純前端應用

在日常前端開發中&#xff0c;我們常常需要快速將本地的應用展示給局域網內的同事或測試人員&#xff0c;而傳統的共享方式往往效率不高。本文將指導你輕松地將你的純前端應用&#xff08;無論是 Vue, React, Angular 或原生項目&#xff09;部署到本地&#xff0c;并配置局域網…

【Python裝飾器深潛】從語法糖到元編程的藝術

目錄 ?? 前言??? 技術背景與價值?? 當前技術痛點??? 解決方案概述?? 目標讀者說明?? 一、技術原理剖析?? 核心概念圖解?? 核心作用講解?? 關鍵技術模塊說明?? 技術選型對比??? 二、實戰演示?? 環境配置要求?? 核心代碼實現案例1:基礎計時裝飾器案…

mbed驅動st7789屏幕-硬件選擇及連接(1)

目錄 1.整體介紹 2. 硬件選擇 2.1 mbed L432KC 2.2 ST7789 240*240 1.3寸 3. mbed與st7789的硬件連接 4. 總結 1.整體介紹 我們在使用單片機做一些項目的時候,交互性是最重要的因素。那么對于使用者而言,交互最直接的體現無非就是視覺感知,那么我們希望將項目通過視覺…

SpringBoot集成Jasypt對數據庫連接密碼進行加密、解密

引入依賴 <!--配置密碼加密--><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version></dependency><plugin><groupId>c…

分類器引導的條件生成模型

分類器引導的條件生成模型 分類器引導的條件生成模型1. **基本概念**2. **核心思想**3. **實現步驟&#xff08;以擴散模型為例&#xff09;**4. **優點**5. **挑戰與注意事項**6. **應用場景**7. **數學推導**總結 分類器引導的條件生成模型 分類器引導的條件生成模型是一種通…

WPF中的ObjectDataProvider:用于數據綁定的數據源之一

ObjectDataProvider是WPF(Windows Presentation Foundation)中一種強大而靈活的數據綁定源&#xff0c;它允許我們將對象實例、方法結果甚至是構造函數的返回值用作數據源。通過本文&#xff0c;我將深入探討ObjectDataProvider的工作原理、使用場景以及如何在實際應用中發揮其…

lasticsearch 報錯 Document contains at least one immense term 的解決方案

一、問題背景 在使用 Elasticsearch 存儲較大字段數據時&#xff0c;出現如下異常&#xff1a; ElasticsearchStatusException: Elasticsearch exception [typeillegal_argument_exception, reasonDocument contains at least one immense term in field"fieldZgbpka"…

[目標檢測] YOLO系列算法講解

前言 目標檢測就是做到給模型輸入一張圖片或者視頻&#xff0c;模型可以迅速判斷出視頻和圖片里面感興趣的目標所有的位置和它 的類別&#xff0c;而當前最熱門的目標檢測的模型也就是YOLO系列了。 YOLO系列的模型的提出&#xff0c;是為了解決當時目標檢測的模型幀率太低而提…