Pybullet

最近一直在想如何进行RL的学习,在学习RL的过程中,好的模拟仿真平台是非常重要的。除了Gym,还了解到Pybullet模块可以简便快捷地创建仿真环境,所以学习一下。

1.简介

PyBullet 是一个用于机器人学、游戏开发和图形研究的开源物理仿真库。它是基于 Bullet Physics SDK,这是一个成熟的、广泛使用的开源物理引擎。
PyBullet 提供了 Python 接口,使得开发者能够利用 Bullet 强大的物理仿真能力,同时享受 Python 的易用性。

官方文档介绍:
PyBullet 是一个快速、易用的 Python 模块,用于机器人仿真和机器学习,重点是仿真到真实的传输。 使用 PyBullet,您可以从 URDF、SDF、MJCF 和其他文件格式加载铰接体。 PyBullet 提供正向动力学仿真、逆向动力学计算、正向和逆向运动学、碰撞检测和射线交汇查询。 Bullet 物理 SDK 包含 PyBullet 机器人示例,如模拟 Minitaur 四足动物、使用 TensorFlow 推理运行的人形机器人和抓取物体的 KUKA 机械臂。 还原坐标多体、刚体和变形体由统一的 LCP 约束求解器处理,类似于本论文中的Articulated Islands Algorithm,它使用Articulated Body Algorithm进行线性时间前向动力学和求解器 A 矩阵的创建。
除物理模拟外,PyBullet 还绑定了渲染功能,包括 CPU 渲染器(TinyRenderer)、OpenGL 3.x 渲染和可视化,以及对 HTC Vive 和 Oculus Rift 等虚拟现实头显的支持。 PyBullet 还具有执行碰撞检测查询(最近点、重叠对、光线交叉测试等)和添加调试渲染(调试线和文本)的功能。 PyBullet 内置跨平台客户端-服务器,支持共享内存、UDP 和 TCP 网络。 因此,您可以在连接 Windows VR 服务器的 Linux 上运行 PyBullet。

官方网站:https://pybullet.org/wordpress/
官方文档:https://docs.google.com/document/d/10sXEhzFRSnvFcl3XxNGhnD4N2SedqwdAvK3dsihxVUA/edit?pli=1
GitHub:https://github.com/bulletphysics/bullet3

2.特点

多体动力学仿真: PyBullet 能够精确模拟多体系统的动态行为,包括刚体和软体动力学。
机器人学支持: 它支持加载 URDF(统一机器人描述格式)文件,这是一种在机器人学中广泛使用的标准格式。
逆向动力学和运动规划: PyBullet 提供了逆向动力学求解器和运动规划算法,这对于机器人的路径规划至关重要。
渲染和可视化: 它包括一个简单的直接渲染器,也可以通过 VR 接口进行更高级的渲染。
强化学习环境: PyBullet 与 OpenAI Gym 兼容,为强化学习提供了标准化的环境和接口。
跨平台: 它可以在 Windows、Linux 和 macOS 上运行。

优点:
开源: 作为一个开源工具,PyBullet 有一个庞大的社区,不断有新的改进和功能添加。
性能: 对于复杂的仿真任务,PyBullet 提供了良好的性能和实时仿真能力。
易于学习: Python 接口简化了与物理引擎的交互,使得非专家也能轻松上手。
多功能性: 可以用于研究、教育和商业项目,覆盖了从基本物理仿真到高级机器人学习的各种需求。

缺点:
文档: 尽管社区支持广泛,但某些特定功能的文档可能不够详尽,新用户可能需要一段时间来熟悉。
资源消耗: 对于非常大型或复杂的仿真,PyBullet 可能需要较多的计算资源。
渲染限制: 内置的直接渲染器功能有限,对于需要高级图形的应用,可能需要额外的渲染工具。

3.安装

pip3 install pybullet

4.Pybullet初体验

import pybullet as p
import time
import pybullet_data
physicsClient = p.connect(p.GUI)#or p.DIRECT for non-graphical version
p.setAdditionalSearchPath(pybullet_data.getDataPath()) #optionally
p.setGravity(0,0,-10)
planeId = p.loadURDF("plane.urdf")
startPos = [0,0,1]
startOrientation = p.getQuaternionFromEuler([0,0,0])
boxId = p.loadURDF("r2d2.urdf",startPos, startOrientation)
#set the center of mass frame (loadURDF sets base link frame) startPos/Ornp.resetBasePositionAndOrientation(boxId, startPos, startOrientation)
for i in range (10000):
    p.stepSimulation()
    time.sleep(1./240.)
cubePos, cubeOrn = p.getBasePositionAndOrientation(boxId)
print(cubePos,cubeOrn)
p.disconnect()

在这里插入图片描述

接下来我们将仿真一个物理世界,并在世界中放置两个球体,模拟两个球体碰撞。

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./100.
p.setTimeStep(timeStep)

# 模拟循环,持续一定时间
for i in range(500):
    p.stepSimulation()
    time.sleep(timeStep)

# 断开与仿真引擎的连接
p.disconnect()

在这里插入图片描述

此段程序引用自:

PyBullet 四足机器人仿真入门(1)

如果你出现以下报错则按图片下方的方法解决:
在这里插入图片描述

要解决这个问题,可以降低numpy版本

pip install numpy==1.26.4

当然,Pybullet也有一些自带的示例:

python3 -m pybullet_envs.examples.enjoy_TF_AntBulletEnv_v0_2017may

python3 -m pybullet_envs.examples.enjoy_TF_HumanoidFlagrunHarderBulletEnv_v1_2017jul

python3 -m pybullet_envs.deep_mimic.testrl --arg_file run_humanoid3d_backflip_args.txt

python -m pybullet_robots.panda.loadpanda

5.Pybullet关键函数

import pybullet as p

5.1 connect()建立连接

这个函数用于连接到 PyBullet 仿真引擎。可以将一个GUI参数传入此函数,p.GUI 参数告诉 PyBullet 使用带有图形用户界面的模式,返回一个数字代表服务器的ID。还有其他模式比如 p.DIRECT,它运行仿真但不会打开GUI窗口,常用于后台运行或测试。

导入 PyBullet 模块后,要做的第一件事就是 "connect "到物理仿真。 PyBullet 是围绕客户端-服务器端驱动的 API 设计的,客户端发送命令,物理服务器返回状态。 PyBullet 内置了一些物理服务器: DIRECTGUI。 GUI 和 DIRECT 连接将在与 PyBullet 相同的进程中执行物理模拟和渲染。
请注意,在 DIRECT 模式下,您无法访问 OpenGL 和 VR 硬件功能,如 "虚拟现实 "和 "调试图形用户界面、线条、文本、参数 "章节所述。 直接模式允许通过 "getCameraImage "API 使用内置软件渲染器渲染图像。 这对于在没有 GPU 的服务器上运行云模拟非常有用。
你可以提供自己的数据文件,也可以使用 PyBullet 附带的 PyBullet_data 包。 为此,请导入 pybullet_data,并使用 p.setAdditionalSearchPath(pybullet_data.getDataPath()) 注册目录。

5.2 disconnect()断开连接

此函数的目的是断开当前的 PyBullet 会话,关闭 GUI 窗口。这是在仿真结束时进行清理所必须的。可以通过传入参数关闭指定的物理服务器,默认参数为0,也就是创建的第一个物理服务器的ID.

5.3 setGravity()设置重力

默认情况下,没有启用重力。 setGravity 可以设置所有对象的默认重力。
setGravity 的输入参数为: (无返回值)

required graX float gravity force along the X world axis
required gravY float gravity force along the Y world axis
required gravZ float gravity force along the Z world axis
optional physicsClientId int if you connect to multiple physics servers, you can pick which one.

5.4 loadURDF, loadSDF, loadMJCF加载各种格式的模型文件

如函数loadURDF(),用于加载URDF文件。loadURDF 会向物理服务器发送命令,从通用机器人描述文件(URDF)中加载物理模型。 ROS 项目(机器人操作系统)使用 URDF 文件来描述机器人和其他对象,该文件由 WillowGarage 和开源机器人基金会(OSRF)创建。 许多机器人都有公开的 URDF 文件,您可以在这里找到相关说明和教程: http://wiki.ros.org/urdf/Tutorials
重要提示:大多数关节(滑块、外旋式、连续式)都默认启用了电机,以防止自由运动。 这类似于带有高摩擦谐波驱动的机器人关节。 您应使用 p.setJointMotorControl2 设置关节电机控制模式和目标设置。 更多信息请参见 setJointMotorControl2 API。
警告:默认情况下,PyBullet 会缓存一些文件以加快加载速度。 您可以使用 setPhysicsEngineParameter(enableFileCaching=0) 来禁用文件缓存。

5.5 stepSimulation()一步仿真

进行一步物理仿真迭代。在循环中调用,以连续模拟物理环境的变化。

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

在循环中调用 p.stepSimulation() 使得仿真逐步前进,每次调用对应一个时间步长。

stepSimulation 将在一个正演动力学仿真步骤中执行所有操作,如碰撞检测、约束求解和积分。 默认的时间步长为 1/240 秒,可以使用 setTimeStepsetPhysicsEngineParameter API 进行更改。

更多推荐