AGV所需环境搭建

首先是定义函数init()

    def init(self):
        #初始速度和位置
        self.speed=0.05
        self.position=[0,0]
        #所处的位置范围
        self.lowposition=-2
        self.highposition=2
        #速度范围
        self.lowspeed=0.05
        self.highspeed=0.1
        #动作空间
        self.actions=gym.spaces.Discrete(5)#前进,后退,向左,向右,不动
        self.max_speed=0.7
        #小车所受水平方向合力,重力
        self.force=0.001
        self.gravity=0.0025
        self.low=np.array([self.lowposition,self.lowspeed],dtype=np.float32)
        self.high=np.array([self.lowposition,self.lowspeed],dtype=np.float32)
        #设置一个运行的区域
        self.movingspace=gym.spaces.Box(self.low,self.high,dtype=np.float32)

在其中需要定义属性有:

速度speed,并且需要格局实际情况设置maxspeed和minspeed

所有可能动作的状态,这一点可以使用

import gym
action_spaces=gym.spaces.Discrete(n)
action_spaces.sample()

n即代表状态的数量,状态值从0开始。sample()函数则从动作空间中随机选取一个状态值

位置position,设置在二维平面内position的范围是(-2,-2)——(2,2)

设置运动过程中受到水平方向的合力以及重力,这些力会造成速度的改变

step函数:

    def step(self,action):
        if(action not in self.actions):
            return "Wrong action"
        #这里直接使用了原文的公式,但是不太确定为什么是这个公式,cos?
        self.speed+=(action - 1) * self.force + math.cos(3 * self.position) * (-self.gravity)
        self.speed=np.clip(self.speed,-self.max_speed,self.max_speed)
        #小车不断运动
        if action==0:
            #前进
            self.position[1]+=self.speed
        elif action==1:
            #后退
            self.position[1]-=self.speed
        elif action==2:
            self.position[0]-=self.speed
        elif action==3:
            self.position[0]+=self.speed
        else:
            pass
        #限制position位置
        self.position[0]=np.clip(self.position[0],self.lowposition,self.highposition)
        self.position[1]=np.clip(self.position[1],self.lowposition,self.highposition)
        if (self.position[0]==self.highposition or self.position[1]==self.highposition) and self.speed>0:
            self.speed=0
        elif (self.position[0]==self.lowposition or self.position[1]==self.lowposition) and self.speed<0:
            self.speed=0

  这一函数定义每一步小车运行的情况,首先判断输入的动作是否存在(即0-4),之后更新速度值,更新之后根据动作值更新位置,position=position+speed。

  将speed和position限制在规定好的范围内(lowspeed,highspeed),(lowposition,highposition)

self.position[0]=np.clip(self.position[0],self.lowposition,self.highposition)

判断位置是否到达边界,到达边界后小车停止运动

reset函数:

每当小车抵达边界,将其重置,重置方式为在要求范围内获取随机数

遇到困难:

关于注册方面还是存在一些疑惑

#注册
#打开.\Lib\site-packages\gym\envs\__init__.py在其中加入如下代码段,对自定义的环境进行注册
这里的id以及point 的最后要改为自己的环境名称
# user
# ---------
register(
    id='GridWorld-v1',
    entry_point='gym.envs.user:GridEnv1',
    max_episode_steps=200,
    reward_threshold=100.0,
    )


#放入库中
#打开\Lib\site-packages\gym\envs在这里新建user文件夹,并在user文件夹中新建__init__.py文件
在init.py文件中加入如下代码
from gym.envs.user.grid_mdp_v1 import GridEnv1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值