- 前言
- 安装
- 测试官方示例
- 基础环境搭建
- 导入pybullet
- 创建服务端
- (可选)配置图形GUI
- 添加资源路径
- 设置重力
- 加载模型
- 迭代运行
- 关闭服务端
- 基础环境代码
ROS + Gazebo应该是目前最常用的机器人仿真环境,但在gazebo中进行重复实验、记录数据是很麻烦(重置模型状态、渲染都很费时间),不适合快速验证DL、RL算法。
pybullet + gym应该是目前最常见的机器人强化学习仿真环境了,本篇开始学习搭建自己的pybullet仿真环境。
安装首先要确定本地主机性能够不够,系统支持windows,linux,硬件需要一个比较好的独显(官网建议GTX680以上)用来做渲染,软件需要有OpenGL2或3。
pybullet的安装非常简单:
pip install pybullet tensorflow
因为tensorflow是google的亲儿子,自然pybullet内置的模型也是tensorflow的版本。
pip安装的pybullet有上面五个文件夹,提供了测试用的数据、环境、示例、机器人模型和一些常用的工具。
官方提供了一些测试示例:
python -m pybullet_envs.examples.enjoy_TF_AntBulletEnv_v0_2017may
运行后看到一个行走的机器人,表示pybullet安装就没问题了。可以用鼠标滚轮接近/远离视角,可以用Ctrl+滚轮或者鼠标左键分别拖动和旋转视角。
基础环境搭建然后就是搭建自己需要的仿真环境。一口吃不成胖子,先从最基础的环境创建API开始。
pybullet和ros、carla一样,都采用的是client-server的通信方式,仿真器是一个server,本地client通过代码向server发送指令,server执行代码指令。
导入pybullet首先,导入pybullet包以及数据:
import time
import pybullet
import pybullet_data
创建服务端
然后创建一个服务端
client = pybullet.connect(pybullet.GUI)
# client = pybullet.connect(pybullet.DIRECT)
pybullet.GUI
:服务端打开图形GUI做渲染,需要独显,性能消耗大 pybullet.DIRECT
:不打开图形渲染,性能消耗小
设置可视化的参数:
pybullet.configureDebugVisualizer(pybullet.COV_ENABLE_RENDERING, 0)
pybullet.configureDebugVisualizer(pybullet.COV_ENABLE_GUI, 0)
pybullet.configureDebugVisualizer(pybullet.COV_ENABLE_TINY_RENDERER, 0)
pybullet.COV_ENABLE_RENDERING
:是否渲染 pybullet.COV_ENABLE_GUI
:是否打开控件 pybullet.COV_ENBALE_TINY_RENDERER
:是否使用核显渲染 0=否,1=是
在环境变量中添加资源路径,后面加载机器人就不用写绝对路径了:
pybullet.setAdditionalSearchPath(pybullet_data.getDataPath())
设置重力
设置X,Y,Z轴的重力:
pybullet.setGravity(0, 0, -9.8)
一般设置Z轴重力为g,也就是-9.8
加载模型主要是加载两种模型,即场景,机器人:
sceneID = pybullet.loadURDF('plane.urdf')
robotID = pybullet.loadURDF('r2d2.urdf', [0, 0, 0], [0, 0, 0, 1])
需要注意的是,加载机器人时,要给机器人提供初始的位置和姿态。姿态使用四元数xyzw表示。
迭代运行仿真循环迭代设置延时:
while(True):
pybullet.stepSimulation()
time.sleep(0.05)
上面使得仿真环境每0.05秒执行一步。
或者直接实时仿真:
pybullet.setRealTimeSimulation(1)
while(True):
pass
关闭服务端
pybullet.disconnect()
基础环境代码
把上面的API组合起来,就搭建了一个基础的仿真环境。全代码如下:
import time
import pybullet
import pybullet_data
if __name__ == '__main__':
# open the server
physicsClient = pybullet.connect(pybullet.GUI)
# config GUI
pybullet.configureDebugVisualizer(pybullet.COV_ENABLE_RENDERING, 0)
pybullet.configureDebugVisualizer(pybullet.COV_ENABLE_GUI, 0)
pybullet.configureDebugVisualizer(pybullet.COV_ENABLE_TINY_RENDERER, 0)
# add the resource path
pybullet.setAdditionalSearchPath(pybullet_data.getDataPath())
# set gravity
pybullet.setGravity(0, 0, -9.8)
# load scene
planeID = pybullet.loadURDF('plane.urdf')
# load robot
robotID = pybullet.loadURDF('r2d2.urdf', [0, 0, 1], [0, 0, 0, 1])
# start rendering
pybullet.configureDebugVisualizer(pybullet.COV_ENABLE_RENDERING, 1)
pybullet.setRealTimeSimulation(1)
while True:
pass
# close server
pybullet.disconnect()