<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 機(jī)器人 > 設(shè)計應(yīng)用 > 四足機(jī)器人步態(tài)仿真(一)PyBullet 物理仿真初體驗

          四足機(jī)器人步態(tài)仿真(一)PyBullet 物理仿真初體驗

          作者:景皓 時間:2025-02-26 來源:古月居 收藏

          一、PyBullet 簡介

          1.1 PyBullet是什么?

          PyBullet 是一個用于機(jī)器人學(xué)、游戲開發(fā)和圖形研究的開源物理仿真庫。它是基于 Bullet Physics SDK,這是一個成熟的、廣泛使用的開源物理引擎。

          本文引用地址:http://www.ex-cimer.com/article/202502/467342.htm

          PyBullet 提供了 Python 接口,使得開發(fā)者能夠利用 Bullet 強(qiáng)大的物理仿真能力,同時享受 Python 的易用性。

          1.2 PyBullet的發(fā)展歷程

          Bullet Physics SDK 最初由 Erwin Coumans 在 2003 年開發(fā),它從一個小型的開源項目發(fā)展為一個強(qiáng)大的、被廣泛認(rèn)可的物理引擎,被用于電影特效、游戲和機(jī)器人仿真。

          PyBullet 作為 Bullet 的 Python 接口,隨著 Python 在科學(xué)計算和機(jī)器學(xué)習(xí)領(lǐng)域的流行。

          1.3PyBullet有哪些功能及特點

          • 多體動力學(xué)仿真: PyBullet 能夠精確模擬多體系統(tǒng)的動態(tài)行為,包括剛體和軟體動力學(xué)。

          • 機(jī)器人學(xué)支持: 它支持加載 URDF(統(tǒng)一機(jī)器人描述格式)文件,這是一種在機(jī)器人學(xué)中廣泛使用的標(biāo)準(zhǔn)格式。

          • 逆向動力學(xué)和運(yùn)動規(guī)劃: PyBullet 提供了逆向動力學(xué)求解器和運(yùn)動規(guī)劃算法,這對于機(jī)器人的路徑規(guī)劃至關(guān)重要。

          • 渲染和可視化: 它包括一個簡單的直接渲染器,也可以通過 VR 接口進(jìn)行更高級的渲染。

          • 強(qiáng)化學(xué)習(xí)環(huán)境: PyBullet 與 OpenAI Gym 兼容,為強(qiáng)化學(xué)習(xí)提供了標(biāo)準(zhǔn)化的環(huán)境和接口。

          • 跨平臺: 它可以在 Windows、Linux 和 macOS 上運(yùn)行。

          1.4PyBullet有哪些優(yōu)缺點

          優(yōu)點:

          • 開源: 作為一個開源工具,PyBullet 有一個龐大的社區(qū),不斷有新的改進(jìn)和功能添加。

          • 性能: 對于復(fù)雜的仿真任務(wù),PyBullet 提供了良好的性能和實時仿真能力。

          • 易于學(xué)習(xí): Python 接口簡化了與物理引擎的交互,使得非專家也能輕松上手。

          • 多功能性: 可以用于研究、教育和商業(yè)項目,覆蓋了從基本物理仿真到高級機(jī)器人學(xué)習(xí)的各種需求。

          缺點:

          • 文檔: 盡管社區(qū)支持廣泛,但某些特定功能的文檔可能不夠詳盡,新用戶可能需要一段時間來熟悉。

          • 資源消耗: 對于非常大型或復(fù)雜的仿真,PyBullet 可能需要較多的計算資源。

          • 渲染限制: 內(nèi)置的直接渲染器功能有限,對于需要高級圖形的應(yīng)用,可能需要額外的渲染工具。

          • 為什么使用它進(jìn)行機(jī)器人仿真

          1.5 為什么使用PyBullet進(jìn)行機(jī)器人仿真

          PyBullet 提供了高質(zhì)量的物理仿真,包括對剛體動力學(xué)、軟體、碰撞檢測和摩擦等物理現(xiàn)象的精確模擬。并且內(nèi)置有逆向動力學(xué)求解器和運(yùn)動規(guī)劃算法。

          最重要的是:PyBullet 兼容 OpenAI Gym 接口,提供了一個標(biāo)準(zhǔn)化的環(huán)境用于開發(fā)和測試強(qiáng)化學(xué)習(xí)算法。

          二、PyBullet 物理仿真初體驗

          安裝 PyBullet

          開始使用pybullet非常簡單。如果你的Python環(huán)境已經(jīng)配置好了,只需打開終端或命令提示符,輸入以下命令:

          pip install pybullet

          如果你安裝失敗,很大概率上pip沒有換源

          第一次仿真

          接下來我們將仿真一個物理世界,并在世界中放置兩個球體,模擬兩個球體碰撞

          import pybullet as p
          import pybullet_data
          import time
          # 啟動仿真引擎的GUI
          p.connect(p.GUI)
          # 設(shè)置重力加速度
          p.setGravity(0, 0, -9.81)
          # 加載URDF模型路徑
          p.setAdditionalSearchPath(pybullet_data.getDataPath())
          # 加載平面模型作為地面
          planeId = p.loadURDF("plane.urdf")
          # 加載第一個球體模型,并設(shè)置初始位置
          ball1StartPos = [0, 0, 1]
          ball1StartOrientation = p.getQuaternionFromEuler([0, 0, 0])
          ball1Id = p.loadURDF("sphere2.urdf", ball1StartPos, ball1StartOrientation)
          # 加載第二個球體模型,并設(shè)置初始位置稍微偏離第一個球體
          ball2StartPos = [0.1, 0, 1]  # 稍微偏離第一個球體的位置
          ball2StartOrientation = p.getQuaternionFromEuler([0, 0, 0])
          ball2Id = p.loadURDF("sphere2.urdf", ball2StartPos, ball2StartOrientation)
          # 設(shè)置模擬循環(huán)和時間步長
          timeStep = 1./240.
          p.setTimeStep(timeStep)
          # 模擬循環(huán),持續(xù)一定時間
          for i in range(1000):
             p.stepSimulation()
             time.sleep(timeStep)
          # 斷開與仿真引擎的連接
          p.disconnect()

          image.png

          運(yùn)行程序,我們可以看到兩個球碰撞的過程,但好像還不夠直觀,下面我們修改diam,給兩個球體設(shè)置初始速度,使它們向?qū)Ψ揭苿又笈鲎病?/span>

          import pybullet as p
          import pybullet_data
          import time

          # 啟動仿真引擎的GUI
          p.connect(p.GUI)

          # 設(shè)置重力加速度
          p.setGravity(0, 0, -9.81)

          # 加載URDF模型路徑
          p.setAdditionalSearchPath(pybullet_data.getDataPath())

          # 加載平面模型作為地面
          planeId = p.loadURDF("plane.urdf")

          # 設(shè)置兩個球體的初始位置
          ball1StartPos = [-1, 0, 0.5]
          ball2StartPos = [1, 0, 0.5]

          # 加載第一個球體模型
          ball1Id = p.loadURDF("sphere2.urdf", ball1StartPos)

          # 加載第二個球體模型
          ball2Id = p.loadURDF("sphere2.urdf", ball2StartPos)

          # 設(shè)置初始速度,使兩個球體朝對方運(yùn)動
          p.resetBaseVelocity(ball1Id, linearVelocity=[5, 0, 0])
          p.resetBaseVelocity(ball2Id, linearVelocity=[-5, 0, 0])

          # 設(shè)置模擬循環(huán)和時間步長
          timeStep = 1./240.
          p.setTimeStep(timeStep)

          # 模擬循環(huán),持續(xù)一定時間
          for i in range(500):
             p.stepSimulation()
             time.sleep(timeStep)

          # 斷開與仿真引擎的連接
          p.disconnect()

          運(yùn)行程序,我們成功仿真了兩個球體相向運(yùn)動并碰撞的過程。

          image.png屏幕截圖 2023-12-12 131005.png

          二、PyBullet 函數(shù)功能及用法

          在上述示例中,我們使用了 PyBullet 來創(chuàng)建一個簡單的物理仿真,其中兩個球體相向而行并發(fā)生碰撞。這里將一一介紹代碼中使用到的 PyBullet 函數(shù)及其功能:

          p.commect:

          這個函數(shù)用于連接到 PyBullet 仿真引擎。p.GUI 參數(shù)告訴 PyBullet 使用帶有圖形用戶界面的模式。還有其他模式比如 p.DIRECT,它運(yùn)行仿真但不會打開GUI窗口,常用于后臺運(yùn)行或測試。

          p.connect(p.GUI)

          p.setGravity:

          設(shè)置整個仿真環(huán)境的重力。參數(shù)是三個浮點數(shù),分別表示 x、y 和 z 軸方向的重力加速度。在這個例子中,我們只在 z 軸(向下)設(shè)置了重力加速度為 -9.81 m/s2,模擬地球表面的重力條件。

          p.setGravity(0, 0, -9.81)

          p.setAdditionalSearchPath:

          PyBullet 可以加載多種格式的模型文件,包括 URDF(統(tǒng)一機(jī)器人描述格式)。p.setAdditionalSearchPath 函數(shù)用于設(shè)置額外的搜索路徑,這樣 PyBullet 在加載模型文件時會在這個路徑下查找。pybullet_data.getDataPath() 返回 PyBullet 默認(rèn)數(shù)據(jù)文件夾的路徑。

          p.setAdditionalSearchPath(pybullet_data.getDataPath())

          p.loadURDF:

          加載URDF模型到仿真環(huán)境中。URDF是一種常用于描述復(fù)雜機(jī)器人模型的XML格式。參數(shù)包括 URDF 文件的路徑、起始位置和起始朝向。起始位置是一個三元組,表示模型在世界坐標(biāo)系中的 x、y、z 坐標(biāo)。起始朝向通常是一個四元數(shù),表示模型的初始方向。

          ball1Id = p.loadURDF("sphere2.urdf", ball1StartPos)

          p.changeDynamics:

          用于更改仿真中特定剛體的動力學(xué)屬性??梢栽O(shè)置多種屬性,如質(zhì)量、摩擦系數(shù)和彈性系數(shù)等。在這個例子中,我們用它來設(shè)置球體的彈性系數(shù)。

          p.changeDynamics(ball1Id, -1, restitution=restitution)

          `ball1Id` 是通過 `p.loadURDF` 加載模型時返回的唯一ID,`-1` 表示改變整個剛體(而不是特定的鏈接),`restitution` 是彈性系數(shù)參數(shù)。

          p.resetBaseVelocity:

          用于設(shè)置剛體的線速度和角速度。在本例中,我們使用這個函數(shù)來給球體設(shè)置初始速度,使其相向而行。

          p.resetBaseVelocity(ball1Id, linearVelocity=[5, 0, 0])

          這里 `ball1Id` 是球體的唯一ID,`linearVelocity` 是線速度的三元組,分別對應(yīng) x、y、z 軸方向的速度分量。

          p.setTimeStep:

          設(shè)置仿真的時間步長,即每次仿真迭代過程中模擬的真實時間長度。時間步長越小,仿真越精確,但計算量越大。

          p.setTimeStep(timeStep)

          ``timeStep` 為每個仿真步長的時間,這里設(shè)置為 1/240 秒,意味著每秒仿真240幀。

          p.stepSimulation:

          進(jìn)行一步物理仿真迭代。在循環(huán)中調(diào)用,以連續(xù)模擬物理環(huán)境的變化。

          for i in range(500):
             p.stepSimulation()

          在循環(huán)中調(diào)用 `p.stepSimulation()` 使得仿真逐步前進(jìn),每次調(diào)用對應(yīng)一個時間步長。

          time.sleep:

          這不是 PyBullet 的函數(shù),而是 Python 標(biāo)準(zhǔn)庫中的函數(shù),用于暫停程序執(zhí)行指定的時間(以秒為單位)。在這個例子中,它用于將仿真速度放慢到接近實時速度,使得我們可以觀察到仿真過程。

          time.sleep(timeStep)

          這里的 `timeStep` 設(shè)置為與仿真時間步長相同,以便每次迭代暫停時間與物理時間步長一致。

          p.disconnect:

          斷開當(dāng)前的 PyBullet 會話,關(guān)閉 GUI 窗口。這是在仿真結(jié)束時進(jìn)行清理所必須的。

          p.disconnect()

          所以在一個基礎(chǔ)的仿真過程中,我們先設(shè)置環(huán)境(重力、搜索路徑等),然后加載模型(球體和平面),接著設(shè)置球體的動力學(xué)屬性和初始速度,然后在循環(huán)中逐步執(zhí)行仿真,最后斷開連接以結(jié)束仿真。



          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();