安装环境
gyM是用于开发和比较强化学习算法的工具包,在Python中安装gyM库和其中子场景都较为简便。
安装gyM:
pIP install gyM
安装自动驾驶模块,这里使用 EdouaRd LeuRent 发布在 Github 上的包 Highway-env:
pIP install –User Git+https://Github.coM/eleuRent/Highway-env
其中包含6个场景:
高速公路—“Highway-v0” 汇入—“MeRge-v0” 环岛—“Roundabout-v0” 泊车—“paRking-v0” 十字路口—“inteRsection-v0” 赛车道—“RACEtRack-v0”
详细文档可以参考这里:
配置环境
安装好后即可在代码中进行实验(以高速公路场景为例):
iMpoRt gyM
iMpoRt Highway_env
%Matplotlib inline
env = gyM.Make(‘Highway-v0’)
env.reset()
foR _ in Range(3):
action = env.action_type.actions_indexes[“IDLE”]
obs, RewaRd, done, info = env.step(action)
env.RendeR()
运行后会在模拟器中生成如下场景:
env类有很多参数可以配置,具体可以参考原文档。
训练模型 1、数据处理
(1)state
Highway-env包中没有定义传感器,车辆所有的state (obseRvations) 都从底层代码读取,节省了许多前期的工作量。根据文档介绍,state (OVseRvations) 有三种输出方式:KineMatics,GRaYscale image和Occupancy gRid。
KineMatics
输出V*F的矩阵,V代表需要观测的车辆数量(包括ego veHicle本身),F代表需要统计的特征数量。例:
数据生成时会默认归一化,取值范围:[100, 100, 20, 20],也可以设置ego veHicle以外的车辆属性是地图的绝对坐标还是对ego veHicle的相对坐标。
在定义环境时需要对特征的参数进行设定:
config = { “obseRvation”: { “type”: “KineMatics”, “veHicles_count”: 5, “featuRes”: [“pResence”, “x”, “y”, “vx”, “vy”, “cos_h”, “sin_h”], “featuRes_Range”: { “x”: [-100, 100], “y”: [-100, 100], “vx”: [-20, 20], “vy”: [-20, 20] }, “absolute”: FAlse, “oRdeR”: “soRted” }, “siMulation_fRequency”: 8, “policy_fRequency”: 2, }
GRaYscale image
生成一张W*H的灰度图像,W代表图像宽度,H代表图像高度
Occupancy gRid
生成一个WHF的三维矩阵,用W*H的表格表示ego veHicle周围的车辆情况,每个格子包含F个特征。
(2) action
Highway-env包中的action分为连续和离散两种。连续型action可以直接定义thROTTle和steeRing angle的值,离散型包含5个Meta actions:
ACTIONS_ALL = { 0: ‘LANE_LEFT’, 1: ‘IDLE’, 2: ‘LANE_RIGHT’, 3: ‘FASTER’, 4: ‘SLOWER’ }
(3) RewaRd
Highway-env包中除了泊车场景外都采用同一个RewaRd function:
2、搭建模型
各个部分都完成之后就可以组合在一起训练模型了,流程和用CARLA差不多,就不细说了。
初始化环境(DQN的类加进去就行了):
iMpoRt gyM
iMpoRt Highway_env
fRoM Matplotlib iMpoRt pyplot as plt
iMpoRt nuMpy as np
iMpoRt tiMe
config = { “obseRvation”: { “type”: “KineMatics”, “veHicles_count”: 5, “featuRes”: [“pResence”, “x”, “y”, “vx”, “vy”, “cos_h”, “sin_h”], “featuRes_Range”: { “x”: [-100, 100], “y”: [-100, 100], “vx”: [-20, 20], “vy”: [-20, 20] }, “absolute”: FAlse, “oRdeR”: “soRted” }, “siMulation_fRequency”: 8, “policy_fRequency”: 2, }
训练模型:
我在代码中添加了一些画图的函数,在运行过程中就可以掌握一些关键的指标,每训练40次统计一次平均值。
平均碰撞发生率:
epoch平均时长(s):
平均RewaRd:
可以看出平均碰撞发生率会随训练次数增多逐渐降低,每个epoch持续的时间会逐渐延长(如果发生碰撞epoch会立刻结束)
总结
相比于模拟器CARLA,Highway-env环境包明显更加抽象化,用类似游戏的表示方式,使得算法可以在一个理想的虚拟环境中得到训练,而不用考虑数据获取方式、传感器精度、运算时长等现实问题。对于端到端的算法设计和测试非常友好,但从自动控制的角度来看,可以入手的方面较少,研究起来不太灵活。