互联网资讯 / 人工智能 · 2024年1月4日 0

用Python实现AI自动驾驶

安装环境

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环境包明显更加抽象化,用类似游戏的表示方式,使得算法可以在一个理想的虚拟环境中得到训练,而不用考虑数据获取方式、传感器精度、运算时长等现实问题。对于端到端的算法设计和测试非常友好,但从自动控制的角度来看,可以入手的方面较少,研究起来不太灵活。