本文参考自csdn博主:born-in-freedom
OpenAI Gym是强化学习领域的事实标准。研究员使用Gym来与Gym中的基准比较他们的算法。Gym暴露通用的接口,方便开发。两个重要的设计决定造就了这样的通用接口:
RL的两个核心的概念是agent和environment。Gym只提供了environment的抽象接口,agent没有,理由是可以创造出很复杂的agent。
在一个特定环境的RL算法的性能可以从两个方面来衡量:
(1) 最终的表现 (2) 学习需要的时间
Pybullet的安装十分简单,直接pip安装即可
pip install pybullet
安装好之后可以在site-packages文件夹下看到如上图所示的文件
我们可以在终端运行一下库中写好的环境案例
比如,我运行loadpanda案例,在terminal中输入以下命令
python -m pybullet_envs.examples.loadpanda.py
自定义注册Gym环境内容参考上篇
Gym学习(2)自定义注册Gym环境
import setuptools
from pathlib import Path
setuptools.setup(
name='gym_pandas',
version='0.0.1',
description='An OpenAI Gym Env for Pandas',
long_description=Path('README.md').read_text(),
long_description_content_type='text/markdown',
packages=setuptools.find_packages(include='gym_pandas*'),
install_requires=['gym']
)
from gym.envs.registration import register
register(
id='panda-v0',
entry_point='gym_pandas.envs:PandasEnv'
)
from gym_pandas.envs.pandas_env import PandasEnv
import gym
from gym import error,spaces,utils
from gym.utils import seeding
import os
import pybullet as p
import pybullet_data
import math
import numpy as np
import random
class PandasEnv(gym.Env):
metadata = {'render.modes':['human']}
def __init__(self):
p.connect(p.GUI)
p.resetDebugVisualizerCamera(cameraDistance=1.5,cameraYaw=0,\
cameraPitch=-40,cameraTargetPosition=[0.55,-0.35,0.2])
self.action_space=spaces.Box(np.array([-1]*4),np.array([1]*4))
self.observation_space=spaces.Box(np.array([-1]*5),np.array([1]*5))
def step(self,action):
p.configureDebugVisualizer(p.COV_ENABLE_SINGLE_STEP_RENDERING)
orientation=p.getQuaternionFromEuler([0.,-math.pi,math.pi/2.])
dv=0.005
dx=action[0]*dv
dy=action[1]*dv
dz=action[2]*dv
fingers=action[3]
currentPose=p.getLinkState(self.pandaUid,11)
#currentPosition=currentPose[0]
currentPosition=currentPose[4]
newPosition=[currentPosition[0]+dx,
currentPosition[1]+dy,
currentPosition[2]+dz]
jointPoses=p.calculateInverseKinematics(self.pandaUid,11,newPosition,orientation)[0:7]
p.setJointMotorControlArray(self.pandaUid,list(range(7))+[9,10],p.POSITION_CONTROL,list(jointPoses)+2*[fingers])
p.stepSimulation()
state_object,_=p.getBasePositionAndOrientation(self.objectUid)
state_robot=p.getLinkState(self.pandaUid,11)[0]
state_fingers=(p.getJointState(self.pandaUid,9)[0],p.getJointState(self.pandaUid,10)[0])
if state_object[2]>0.45:
reward=1
done=True
else:
reward=0
done=False
info=state_object
observation=state_robot+state_fingers
return observation,reward,done,info
def reset(self):
p.resetSimulation()
p.configureDebugVisualizer(p.COV_ENABLE_RENDERING,0)
p.setGravity(0,0,-10)
p.setAdditionalSearchPath(pybullet_data.getDataPath())
planeUid=p.loadURDF("plane.urdf",basePosition=[0,0,-0.65])
rest_poses=[0,-0.215,0,-2.57,0,2.356,2.356,0.08,0.08]
self.pandaUid=p.loadURDF("franka_panda/panda.urdf",useFixedBase=True)
for i in range(7):
p.resetJointState(self.pandaUid,i,rest_poses[i])
tableUid=p.loadURDF("table/table.urdf",basePosition=[0.5,0,-0.65])
trayUid=p.loadURDF("tray/traybox.urdf",basePosition=[0.65,0,0])
state_object=[random.uniform(0.5,0.8),random.uniform(-0.2,0.2),0.05]
self.objectUid=p.loadURDF("ramdom_urdfs/000/000.urdf",basePosition=state_object)
state_robot=p.getLinkState(self.pandaUid,11)[0]
state_fingers=(p.getJointState(self.pandaUid,9)[0],p.getJointState(self.pandaUid,10)[0])
observation=state_robot+state_fingers
p.configureDebugVisualizer(p.COV_ENABLE_RENDERING,1)
return observation
def render(self,mode='human'):
view_matrix=p.computeViewMatrixFromYawPitchRoll(cameraTargetPosition=[0.7,0,0.05],
distance=.7,
yaw=90,
pitch=-70,
roll=0,upAxisIndex=2)
proj_matrix=p.computeProjectionMatrixFOV(fov=60,aspect=float(960)/720,
nearVal=0.1,
farVal=100.0)
(_,_,px,_,_)=p.getCameraImage(width=960,height=720,
viewMatrix=view_matrix,
projectionMatrix=proj_matrix,
renderer=p.ER_BULLET_HARDWARE_OPENGL)
rgb_array=np.array(px,dtype=np.uint8)
rgb_array=np.reshape(rgb_array,(720,960,4))
rgb_array=rgb_array[:,:,:3]
return rgb_array
def close(self):
p.disconnect()
如果你想把你封装的环境发布到PyPI上供其他人使用, 应该按照如下步骤:
pip install setuptools wheel twine
● 编译
python setup.py sdist bdist_wheel
● 上传
twine upload dist/*
但是注意, 以gym-panda这个名字上传是会失败的, 因为有同名的存在.所以我这里用的是gym-pandas作为名字
安装
pip install gym-pandas
有如上问题是因为我用的阿里云镜像,镜像中只有大佬们的包,所以找不到我们的包
如果想用这种方法安装怎么解决呢
左边有download file,可以下下来whl文件然后安装,具体的方法自行百度whl包安装方法
或者如果本地有的话
进入到gym-pandas目录,运行pip命令
pip install -e .
git clone https://github.com/borninfreedom/gym-panda.git
cd gym-panda
pip install -e .
使用
我们写一个简单的测试程序, 在gym-pandas文件夹下, 建立test文件夹, 新建test.py
import gym
import gym_panda
env=gym.make('pandas-v0')
env.reset()
for _ in range(1000):
env.render()
env.step(env.action_space.sample())
env.close()
参考资料:https://guyuehome.com/34390