首先最大的坑就是安装啦,这也是PyBullet的优点之一,不同于装到自闭,demo还跑不通的openai_ros或者其余的平台,PyBullet的安装很简单:
python3 -m pip install pybullet
我使用的平台是Ubuntu18,请根据自己平台安装pybullet。
然后PyBullet内部的一些demo需要额外下载,也就是pybullet的baselines模块,通过以下命令来下载:
git clone https://github.com/openai/baselines.git
cd baselines
pip3 install -e .
由于pybullet内部的一些开箱即用的RL算法是由tensorflow实现的,所以在运行pybullet内部现成的算法前,需要确保安装了tensorflow。
我们来构建第一个pybullet程序,召唤一个星球大战中的r2d2机器人:
#!/usr/bin/python3
import pybullet as p
import pybullet_data
from time import sleep
# 链接物理引擎
p.connect(p.GUI)
# 设置模型加载路径
datapath = pybullet_data.getDataPath()
p.setAdditionalSearchPath(datapath)
# 加载模型
robot_id = p.loadURDF("r2d2.urdf", [0, 0, 0.5])
# 在这停顿
sleep(1000)
鼠标滚轮可以调整观察的远近,Ctrl+拖动鼠标可以调整观察位置
查看机器人的信息主要有getNumJoints()
和getJointInfo()
两个函数。
getNumJoints()
接受两个参数,其中第一个参数为机器人ID,第二个参数可选,一般不需要选,因为只有多平台开发时才用得到。该函数返回该ID机器人的关节数量。
getJointInfo()
接受三个参数,其中第三个参数和上面那个函数的第二个参数一样,有关平台,可以不填,前两个参数为需要查看的机器人的ID和需要查看的该机器人的关节序号。该函数返回一个tuple,该tuple的长度为17。具体含义可看下面的代码:
可以试着打印关于机器人的信息:
#!/usr/bin/python3
import pybullet as p
import pybullet_data
from time import sleep
# 链接物理引擎
p.connect(p.GUI)
# 设置模型加载路径
datapath = pybullet_data.getDataPath()
p.setAdditionalSearchPath(datapath)
# 加载模型
robot_id = p.loadURDF("r2d2.urdf", [0, 0, 0.5])
# 输出基本信息
joint_num = p.getNumJoints(robot_id)
print("r2d2的节点数量为:", joint_num)
print("r2d2的信息:")
for joint_index in range(joint_num):
info_tuple = p.getJointInfo(robot_id, joint_index)
print(f"关节序号:{
info_tuple[0]}\n\
关节名称:{
info_tuple[1]}\n\
关节类型:{
info_tuple[2]}\n\
机器人第一个位置的变量索引:{
info_tuple[3]}\n\
机器人第一个速度的变量索引:{
info_tuple[4]}\n\
保留参数:{
info_tuple[5]}\n\
关节的阻尼大小:{
info_tuple[6]}\n\
关节的摩擦系数:{
info_tuple[7]}\n\
slider和revolute(hinge)类型的位移最小值:{
info_tuple[8]}\n\
slider和revolute(hinge)类型的位移最大值:{
info_tuple[9]}\n\
关节驱动的最大值:{
info_tuple[10]}\n\
关节的最大速度:{
info_tuple[11]}\n\
节点名称:{
info_tuple[12]}\n\
局部框架中的关节轴系:{
info_tuple[13]}\n\
父节点frame的关节位置:{
info_tuple[14]}\n\
父节点frame的关节方向:{
info_tuple[15]}\n\
父节点的索引,若是基座返回-1:{
info_tuple[16]}\n\n")
# 在这停顿
sleep(1000)
除去基本的环境连接与结束的信息外,打印信息如下:
r2d2的节点数量为: 15
r2d2的信息:
关节序号:0
关节名称:b'base_to_right_leg'
关节类型:4
机器人第一个位置的变量索引:-1
机器人第一个速度的变量索引:-1
保留参数:0
关节的阻尼大小:0.0
关节的摩擦系数:0.0
slider和revolute(hinge)类型的位移最小值:0.0
slider和revolute(hinge)类型的位移最大值:-1.0
关节驱动的最大值:0.0
关节的最大速度:0.0
节点名称:b'right_leg'
局部框架中的关节轴系:(0.0, 0.0, 0.0)
父节点frame的关节位置:(0.22, 0.0, 0.25)
父节点frame的关节方向:(0.0, -0.7070904020014416, 0.0, 0.7071231599922604)
父节点的索引,若是基座返回-1:-1
关节序号:1
关节名称:b'right_base_joint'
关节类型:4
机器人第一个位置的变量索引:-1
机器人第一个速度的变量索引:-1
保留参数:0
关节的阻尼大小:0.0
关节的摩擦系数:0.0
slider和revolute(hinge)类型的位移最小值:0.0
slider和revolute(hinge)类型的位移最大值:-1.0
关节驱动的最大值:0.0
关节的最大速度:0.0
节点名称:b'right_base'
局部框架中的关节轴系:(0.0, 0.0, 0.0)
父节点frame的关节位置:(0.2999999996780742, 0.0, -1.3898038463944216e-05)
父节点frame的关节方向:(0.0, 0.7070904020014416, 0.0, 0.7071231599922604)
父节点的索引,若是基座返回-1:0
关节序号:2
关节名称:b'right_front_wheel_joint'
关节类型:0
机器人第一个位置的变量索引:7
机器人第一个速度的变量索引:6
保留参数:1
关节的阻尼大小:0.0
关节的摩擦系数:0.0
slider和revolute(hinge)类型的位移最小值:0.0
slider和revolute(hinge)类型的位移最大值:-1.0
关节驱动的最大值:100.0
关节的最大速度:100.0
节点名称:b'right_front_wheel'
局部框架中的关节轴系:(0.0, 0.0, 1.0)
父节点frame的关节位置:(0.0, 0.133333333333, -0.085)
父节点frame的关节方向:(0.0, -0.7070904020014416, 0.0, 0.7071231599922604)
父节点的索引,若是基座返回-1:1
关节序号:3
关节名称:b'right_back_wheel_joint'
关节类型:0
机器人第一个位置的变量索引:8
机器人第一个速度的变量索引:7
保留参数:1
关节的阻尼大小:0.0
关节的摩擦系数:0.0
slider和revolute(hinge)类型的位移最小值:0.0
slider和revolute(hinge)类型的位移最大值:-1.0
关节驱动的最大值:100.0
关节的最大速度:100.0
节点名称:b'right_back_wheel'
局部框架中的关节轴系:(0.0, 0.0, 1.0)
父节点frame的关节位置:(0.0, -0.133333333333, -0.085)
父节点frame的关节方向:(0.0, -0.7070904020014416, 0.0, 0.7071231599922604)
父节点的索引,若是基座返回-1:1
......
呼~,我在知乎上写了不少了,贴在这儿吧:
PyBullet笔记(一)pybullet及其依赖项的安装、pybullet初探
PyBullet笔记(二)从hello world开始的杂谈(引擎连接,URDF模型加载,查看信息)
PyBullet笔记(三)createMultiBody创建带有碰撞箱性质的模型对象
PyBullet笔记(四)机器人控制,相机追踪与状态记录
PyBullet笔记(五)碰撞检测与模拟激光探测
PyBullet笔记(六)Debug模块与GUI的正确食用姿势
PyBullet笔记(七)获取键盘事件和鼠标事件
PyBullet笔记(八)强化学习环境的引入与训练