新聞中心

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

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

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

        一、PyBullet 簡介

        1.1 PyBullet是什么?

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

        本文引用地址:http://www.104case.com/article/202502/467342.htm

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

        1.2 PyBullet的發展歷程

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

        PyBullet 作為 Bullet 的 Python 接口,隨著 Python 在科學計算和機器學習領域的流行。

        1.3PyBullet有哪些功能及特點

        • 多體動力學仿真: PyBullet 能夠精確模擬多體系統的動態行為,包括剛體和軟體動力學。

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

        • 逆向動力學和運動規劃: PyBullet 提供了逆向動力學求解器和運動規劃算法,這對于機器人的路徑規劃至關重要。

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

        • 強化學習環境: PyBullet 與 OpenAI Gym 兼容,為強化學習提供了標準化的環境和接口。

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

        1.4PyBullet有哪些優缺點

        優點:

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

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

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

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

        缺點:

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

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

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

        • 為什么使用它進行機器人仿真

        1.5 為什么使用PyBullet進行機器人仿真

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

        最重要的是:PyBullet 兼容 OpenAI Gym 接口,提供了一個標準化的環境用于開發和測試強化學習算法。

        二、PyBullet 物理仿真初體驗

        安裝 PyBullet

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

        pip install pybullet

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

        第一次仿真

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

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

        image.png

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

        import pybullet as p
        import pybullet_data
        import time

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

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

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

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

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

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

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

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

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

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

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

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

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

        二、PyBullet 函數功能及用法

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

        p.commect:

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

        p.connect(p.GUI)

        p.setGravity:

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

        p.setGravity(0, 0, -9.81)

        p.setAdditionalSearchPath:

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

        p.setAdditionalSearchPath(pybullet_data.getDataPath())

        p.loadURDF:

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

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

        p.changeDynamics:

        用于更改仿真中特定剛體的動力學屬性。可以設置多種屬性,如質量、摩擦系數和彈性系數等。在這個例子中,我們用它來設置球體的彈性系數。

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

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

        p.resetBaseVelocity:

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

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

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

        p.setTimeStep:

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

        p.setTimeStep(timeStep)

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

        p.stepSimulation:

        進行一步物理仿真迭代。在循環中調用,以連續模擬物理環境的變化。

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

        在循環中調用 `p.stepSimulation()` 使得仿真逐步前進,每次調用對應一個時間步長。

        time.sleep:

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

        time.sleep(timeStep)

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

        p.disconnect:

        斷開當前的 PyBullet 會話,關閉 GUI 窗口。這是在仿真結束時進行清理所必須的。

        p.disconnect()

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



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 类乌齐县| 宝山区| 台安县| 曲松县| 中方县| 永康市| 永胜县| 郓城县| 黔江区| 广灵县| 金乡县| 防城港市| 辽阳市| 凤山县| 赞皇县| 铁岭市| 乐东| 香港| 泽州县| 抚顺县| 汉阴县| 富源县| 漳州市| 吉林省| 琼结县| 北安市| 荃湾区| 江陵县| 漳州市| 雅江县| 辽中县| 阳江市| 鲜城| 阳新县| 芦溪县| 那曲县| 中阳县| 广昌县| 息烽县| 金秀| 黑山县|