<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

作者:景皓 時(shí)間:2025-02-26 來(lái)源:古月居 收藏

一、PyBullet 簡(jiǎn)介

1.1 PyBullet是什么?

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

本文引用地址:http://dyxdggzs.com/article/202502/467342.htm

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

1.2 PyBullet的發(fā)展歷程

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

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

1.3PyBullet有哪些功能及特點(diǎn)

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

  • 機器人學(xué)支持: 它支持加載 URDF(統一機器人描述格式)文件,這是一種在機器人學(xué)中廣泛使用的標準格式。

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

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

  • 強化學(xué)習環(huán)境: PyBullet 與 OpenAI Gym 兼容,為強化學(xué)習提供了標準化的環(huán)境和接口。

  • 跨平臺: 它可以在 Windows、Linux 和 macOS 上運行。

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

優(yōu)點(diǎn):

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

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

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

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

缺點(diǎn):

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

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

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

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

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

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

最重要的是:PyBullet 兼容 OpenAI Gym 接口,提供了一個(gè)標準化的環(huán)境用于開(kāi)發(fā)和測試強化學(xué)習算法。

二、PyBullet 物理仿真初體驗

安裝 PyBullet

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

pip install pybullet

如果你安裝失敗,很大概率上pip沒(méi)有換源

第一次仿真

接下來(lái)我們將仿真一個(gè)物理世界,并在世界中放置兩個(gè)球體,模擬兩個(gè)球體碰撞

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

image.png

運行程序,我們可以看到兩個(gè)球碰撞的過(guò)程,但好像還不夠直觀(guān),下面我們修改diam,給兩個(gè)球體設置初始速度,使它們向對方移動(dòng)之后碰撞。

import pybullet as p
import pybullet_data
import time

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

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

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

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

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

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

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

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

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

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

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

運行程序,我們成功仿真了兩個(gè)球體相向運動(dòng)并碰撞的過(guò)程。

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

二、PyBullet 函數功能及用法

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

p.commect:

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

p.connect(p.GUI)

p.setGravity:

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

p.setGravity(0, 0, -9.81)

p.setAdditionalSearchPath:

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

p.setAdditionalSearchPath(pybullet_data.getDataPath())

p.loadURDF:

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

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

p.changeDynamics:

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

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

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

p.resetBaseVelocity:

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

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

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

p.setTimeStep:

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

p.setTimeStep(timeStep)

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

p.stepSimulation:

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

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

在循環(huán)中調用 `p.stepSimulation()` 使得仿真逐步前進(jìn),每次調用對應一個(gè)時(shí)間步長(cháng)。

time.sleep:

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

time.sleep(timeStep)

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

p.disconnect:

斷開(kāi)當前的 PyBullet 會(huì )話(huà),關(guān)閉 GUI 窗口。這是在仿真結束時(shí)進(jìn)行清理所必須的。

p.disconnect()

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



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>