Python实现自动驾驶
安装环境
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) 状态
Highway-env包中没有定义传感器,所有车辆的状态(observations)都从底层代码读取,节省了许多前期工作。根据文档介绍,状态(observations)有三种输出方式:运动学(Kinematics)、灰度图像(Grayscale image)和占用网格(Occupancy grid)。
运动学(Kinematics)
输出V*F矩阵,V代表观测的车辆数量(包括自车),F代表统计的特征数量。例如:
数据生成时默认为归一化,取值范围:[100, 100, 20, 20],也可以设置自车以外的车辆属性为地图的绝对坐标或相对于自车的相对坐标。
在定义环境时需要设置特征的参数:
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的灰度图像。
占用网格(Occupancy grid)
生成一个WHF的三维矩阵,用W*H的表格表示自车周围的车辆情况,每个格子包含F个特征。
(2) 动作
Highway-env包中的动作分为连续和离散两种。连续型动作可以直接定义油门和转向角度的值,离散型动作包含5个Meta动作:
ACTIONS_ALL = { 0: 'LANE_LEFT', 1: 'IDLE', 2: 'LANE_RIGHT', 3: 'FASTER', 4: 'SLOWER' }(3) 奖励
Highway-env包中,除了泊车场景外,均采用相同的奖励函数。
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平均时长(秒):
平均奖励:
可以看出,平均碰撞发生率随着训练次数的增加逐渐降低,每个epoch的持续时间也会逐渐延长(若发生碰撞,epoch会立即结束)。
总结
与模拟器CARLA相比,Highway-env环境包显得更加抽象,采用类似游戏的表示方式,使得算法可以在理想的虚拟环境中进行训练,而无需考虑数据获取方式、传感器精度、运算时长等现实问题。这对于端到端的算法设计和测试非常友好,但从自动控制的角度来看,可探索的方面较少,研究起来相对不太灵活。