Gym小记(五)

让你的小车跑起来吧

        CarRacing-v0环境是一个很简单的类似于循迹小车的问题,如下图所示:



        我们的目标就是控制小车在轨道内跑起来,并且尽可能快地飞驰。

        该环境给出了一个最简单的连续控制任务,它要求我们从俯视视角所得到的像素中进行学习,所以state就是96*96的图像,当然,我们在训练神经网络的时候,可以对环境给出的observation再取一个降采样,从而降低神经网络输入的维数。环境给予智能体的奖励分为两个部分:一个是随着时间的流逝,会一直付出代价,-0.1/frame,如果按照30frams/s来算的话,就是-3/s;第二部分是经过赛道上铺的瓦片所获得的奖励,每经过一个瓦片都将给予智能体1000/N的奖励,N为轨道上的总瓦片数,我们放大局部来看一下瓦片在哪:


        看出来了么?小车前方(小车方向朝上)有很多一道一道的,那就是瓦片,小车经过之后就会消失,这一点我们从小车后方没有瓦片就可以看出来,此外,如果我们的小车通过了赛道上所有的瓦片,则称这一个episode完成了。在render出来的环境的最下方有一些指示器,从左到右依次为:小车实际速度、四个ABS传感器(对,就是用在防抱死系统中的传感器,用于监测轮速)、方向盘的位置、陀螺仪。

        当然,该环境中的小车也可以用离散控制,我们可以通过参数来选择连续控制或离散控制。接下来我们分析该环境下state、observation、action所包含的具体数据。

self.action_space = spaces.Box( np.array([-1,0,0]), np.array([+1,+1,+1]))  # steer, gas, brake
self.observation_space = spaces.Box(low=0, high=255, shape=(STATE_H, STATE_W, 3))
        此外,在_step()函数中有:

self.state = self._render("state_pixels")
return self.state, step_reward, done, {}
        也就是说,state与observation保持一致,均为STATE_H*STATE_W的RGB图像,所以像素点个数为STATE_H*STATE_W*3。action则包含三个量,打方向盘、踩油门、刹车,三个量的取值范围分别为:打方向盘(-1,+1),踩油门(0,+1),刹车(0,+1)。

if action is not None:
        self.car.steer(-action[0])
        self.car.gas(action[1])
        self.car.brake(action[2])
        在方向盘的控制量上取了个负号,这是为什么呢?我们在小车的模型文件 car_dynamics.py中进行查看:

def steer(self, s):
        'control: steer s=-1..1, it takes time to rotate steering wheel from side to side, s is target position'
        self.wheels[0].steer = s
        self.wheels[1].steer = s
        可见,我们对于小车的控制是对于后轮进行控制的,想象一下,如果我们想要向右转,后轮是不是应该向左转?我们看一下示意图:

        所以在steer时语句为self.car.steer(-action[0]),当然,也可以修改steer()函数,self.wheels[0].steer=s,self.wheels[1].steer=s即可。

        至于油门的控制的话:

def gas(self, gas):
        'control: rear wheel drive'
        gas = np.clip(gas, 0, 1)
        for w in self.wheels[2:4]:
                diff = gas - w.gas
                if diff > 0.1: diff = 0.1  # gradually increase, but stop immediately
                w.gas += diff
        车轮表示为wheels的列表,下标为0,1,2,3,其中2,3表示后轮,从上面的代码中可以看出来,一次性最多加油0.1,并不能一次性加速到最快。
        再来看看小车的刹车系统:

def brake(self, b):
        'control: brake b=0..1, more than 0.9 blocks wheels to zero rotation'
        for w in self.wheels:
        w.brake = b
        从代码中可以看出,一旦brake大于0.9,就会直接让wheels停转,也就是说,直接刹车了。

        至于reward,我们前面已经提到了,现在举个例子,如果我们在732帧里完成了任务,即通过了所有瓦片,则奖励为1000-0.1*732=926.8。值得注意的是,该环境并不考虑油耗,所以,小车可以尽可能快的通过所有瓦片。episode结束的标志除了通过所有瓦片之外,还有一种结束标志就是碰撞到游戏场地的边界,此时将给予-100的奖励作为惩罚。

        最后,打印出CarRacing-v0环境的observation space和action space:

import gym
env=gym.make('CarRacing-v0')
print env.observation_space
print env.action_space
        输出结果:

      

        好了,介绍就到这里,我们可以自己尝试着玩一下:

python gym/envs/box2d/car_racing.py
        注意,这是一辆超级强劲的后轮驱动小车,非常给力,所以不要在踩下油门的同时打方向盘,你可能会转到头晕~





  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值