import pybullet as p
from time import sleep
import pybullet_data
physicsClient = p.connect(p.GUI) # 连接 PyBullet GUI
p.setAdditionalSearchPath(pybullet_data.getDataPath()) # 设置数据路径
p.setGravity(0, 0, -10) # 设置重力
planeId = p.loadURDF("plane.urdf") # 加载 URDF 文件中的平面
cubeStartPos = [0, 0, 1]
cubeStartOrientation = p.getQuaternionFromEuler([0, 0, 0]) # 初始方位
boxId = p.loadURDF("r2d2.urdf", cubeStartPos, cubeStartOrientation) # 加载 URDF 文件中的机器人
cubePos, cubeOrn = p.getBasePositionAndOrientation(boxId) # 获取机器人位置和方位
useRealTimeSimulation = 0 # 是否使用实时模拟
if (useRealTimeSimulation):
p.setRealTimeSimulation(1) # 开启实时模拟
while 1: # 主循环
if (useRealTimeSimulation):
p.setGravity(0, 0, -10)
sleep(0.01) # 等待一定的时间以保持实时模拟
else:
p.stepSimulation() # 单步模拟物理效果
代码解析:
1 pybullet_data.getDataPath()
返回 PyBullet 的数据路径,在这个路径下存储了很多 URDF 文件、纹理图片等资源文件。
p.setAdditionalSearchPath()函数是设置 PyBullet 搜索文件的额外路径,通过这个函数设置 PyBullet 数据的搜索路径,可以让 PyBullet 更容易地找到所需的数据文件。
在示例代码中,我们用到了 plane.urdf 和 r2d2.urdf这两个 URDF 文件,所以需要将 PyBullet 数据路径加入到搜索路径中,以便让 PyBullet 能够找到并加载这两个文件。
2 p.setGravity()
`p.setGravity()` 是 PyBullet 中的函数,用于设置仿真场景中的重力加速度。
该函数接受三个参数:x、y、z 方向上的重力加速度值,单位为 `m/s^2`。例如, `p.setGravity(0, 0, -10)` 会将仿真场景中的重力加速度设置为 `(0, 0, -10) m/s^2`,从而模拟一个沿着 z 轴向下的重力场。
需要注意的是, `p.setGravity()` 只能影响到该函数调用之后的物理仿真过程,而不能影响到此前已经执行的仿真过程。换句话说,如果要在仿真过程中改变重力,需要在每次执行 `p.stepSimulation()` 函数之前都调用一次 `p.setGravity()` 来设置重力加速度。
另外,需要在 PyBullet 的 `connect` 函数中设置 `physicsClientId` 参数以选择连接到的仿真引擎实例,例如 `p.connect(p.GUI, physicsClientId=0)`。
3 p.getQuaternionFromEuler()
p.getQuaternionFromEuler()
函数是将欧拉角转换为四元数的函数。在 PyBullet 中,物体的方位可以用四元数表示。
在示例代码中,[0, 0, 0]
表示机器人的初始方位,也就是欧拉角分别为 0 度,即机器人是沿着 X、Y、Z 三个轴方向上都面向正方向的。将这个欧拉角转换成四元数,就可以赋值给 cubeStartOrientation
,表示机器人的初始方位。
一般情况下,我们比较容易使用欧拉角来描述物体的方位,但是在许多算法和计算中,使用四元数会更方便。如果想了解更多关于欧拉角和四元数的知识,可以进一步阅读相关的资料。
4 cubePos, cubeOrn = p.getBasePositionAndOrientation(boxId)
`p.getBasePositionAndOrientation()` 是一个获取刚体基本信息的函数,它的作用是获取物体的位置和方向信息。函数的参数是想要获取信息的物体的 ID。
在示例代码中,`boxId` 是通过 `p.loadURDF()` 函数加载机器人模型后返回的 ID,通过这个 ID 调用 `p.getBasePositionAndOrientation(boxId)` 就可以获取机器人的位置信息和方位信息。返回值 `cubePos` 是一个长度为 3 的列表,包含机器人在 X、Y、Z 轴上的位置信息,`cubeOrn` 是一个四元数,包含机器人的方向信息。
这两个信息在控制机器人进行各种运动时非常重要,可以帮助我们计算机器人的移动轨迹、姿态控制、碰撞检测等等。
5 p.setRealTimeSimulation()
p.setRealTimeSimulation() 是一个函数,它决定了 PyBullet 是否使用实时模拟(Real-time Simulation)。
在 PyBullet 中,如果我们将 p.setRealTimeSimulation(1),那么 PyBullet 的仿真时间将会和真实时间同步,也就是说仿真过程中的每个时间步长将会根据实际时间经过相应的时间。这对于需要实时观察仿真过程的应用场景非常有用。
6 p.stepSimulation()
`p.stepSimulation()` 是 PyBullet 中的函数,用于单步模拟物理效果。
物理仿真是一种用于计算物体在现实中运动轨迹的方法,通过计算各种力和运动规律,来模拟物体在现实中的运动情况。在 PyBullet 中,使用 `p.stepSimulation()` 函数来对仿真场景进行固定时间步长的模拟,并更新物体的状态信息。
在每一次仿真计算中,PyBullet 会计算物体的受力情况,更新它们的运动状态,并进行碰撞检测和处理。通过多次执行 `p.stepSimulation()` 函数,可以模拟出各种物体在仿真场景中的运动情况并进行可视