Gym学习(3)创建Pybullet的Gym环境

本文参考自csdn博主:born-in-freedom

OpenAI Gym是强化学习领域的事实标准。研究员使用Gym来与Gym中的基准比较他们的算法。Gym暴露通用的接口,方便开发。两个重要的设计决定造就了这样的通用接口:

RL的两个核心的概念是agent和environment。Gym只提供了environment的抽象接口,agent没有,理由是可以创造出很复杂的agent。
在一个特定环境的RL算法的性能可以从两个方面来衡量:
(1) 最终的表现 (2) 学习需要的时间

1.Pybullet安装

Pybullet的安装十分简单,直接pip安装即可

pip install pybullet

Gym学习(3)创建Pybullet的Gym环境_第1张图片
安装好之后可以在site-packages文件夹下看到如上图所示的文件
Gym学习(3)创建Pybullet的Gym环境_第2张图片
我们可以在终端运行一下库中写好的环境案例
比如,我运行loadpanda案例,在terminal中输入以下命令

python -m pybullet_envs.examples.loadpanda.py

Gym学习(3)创建Pybullet的Gym环境_第3张图片

2.为Pandas机器人创建一个Gym环境

自定义注册Gym环境内容参考上篇
Gym学习(2)自定义注册Gym环境

  • gym-pandas/setup.py的内容如下:
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']
)
  • gym-pandas/gym_pandas/init.py
from gym.envs.registration import register

register(
    id='panda-v0',
    entry_point='gym_pandas.envs:PandasEnv'
)
  • gym-pandas/gym_pandas/envs/init.py
from gym_pandas.envs.pandas_env import PandasEnv
  • gym-pandas/gym_pandas/envs/pandas_env.py
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()

3.发布你的环境到社区(PyPI)

如果你想把你封装的环境发布到PyPI上供其他人使用, 应该按照如下步骤:

  1. 在PyPI上创建一个账户
  2. 安装以下包
pip install setuptools wheel twine

● 编译

python setup.py sdist bdist_wheel

● 上传

twine upload dist/*

但是注意, 以gym-panda这个名字上传是会失败的, 因为有同名的存在.所以我这里用的是gym-pandas作为名字
Gym学习(3)创建Pybullet的Gym环境_第4张图片

Gym学习(3)创建Pybullet的Gym环境_第5张图片
Gym学习(3)创建Pybullet的Gym环境_第6张图片

4.使用pandas gym环境

安装

  • 从PyPI安装
pip install gym-pandas

在这里插入图片描述
有如上问题是因为我用的阿里云镜像,镜像中只有大佬们的包,所以找不到我们的包
如果想用这种方法安装怎么解决呢
Gym学习(3)创建Pybullet的Gym环境_第7张图片
左边有download file,可以下下来whl文件然后安装,具体的方法自行百度whl包安装方法
或者如果本地有的话
进入到gym-pandas目录,运行pip命令

pip install -e .

Gym学习(3)创建Pybullet的Gym环境_第8张图片

  • 从源码安装
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()

Gym学习(3)创建Pybullet的Gym环境_第9张图片

参考资料:https://guyuehome.com/34390

你可能感兴趣的:(gym学习,gym,python,pybullet)