写在前面

作为强化学习的新手,写这个系列的博客主要是为了记录学习过程,同时也与大家分享自己的所见所想。前段时间发布了人生第一篇博客,是关于highway_env的自定义环境。但博客主要是关于如何创建一个自己的环境的py文件,是基于十字路口环境创建的。在经过一段时间的摸索之后,现在基本能理清楚highway_env的代码结构。希望我的分享能帮大家理清环境的实现代码,大伙都能创建出自己的强化学习自动驾驶环境。

highway_env代码结构梳理

highway_env的代码结构相对来说是很清晰的,下图的几个文件构成了环境生成的主要代码:

下面我们就详细来看看这几个文件夹。

envs文件夹

下图的文件是基于一些方法和包自带的一些环境(其中MyIntersection是自己添加的):

这些文件具体是怎么写的,等后面有时间我会更新一篇博客说一说自己的理解,在这我重点介绍一下这些文件都是基于哪些方法或者包写出来的。

首先最重要的包是envs/common中的几个文件:

如果了解强化学习基础马尔科夫决策过程,从这几个文件的命名都不难猜出它们的主要作用是什么。

首先abstract这个抽象类定义了很多抽象的方法,这些方法可以理解成抽象的MDP问题的更新过程,在使用不同智能体对于环境问题进行训练的时候,这些方法往往会被重写。

action文件可以猜到主要是定义了一些动作空间,在不同环境中我们会选取不同的动作空间。里面主要有连续和离散的动作空间可供我们选择,后面如果有需要我也会更新如何去修改动作空间。

finite_mdp定义了TTC碰撞网格,还没怎么细看,但大概作用是利用TTC计算一个状态奖励。这里面的方法会在状态空间的建立中调用。

graphics主要是可视化函数,不重要的。

observation主要是状态空间的定义,其中定义如下图形式的状态空间,感兴趣大家可以自行了解,如果大家感兴趣我在了解每一种状态空间的特点后可以出一期的博客。

以上就是在envs/common的相关代码,这些代码可以构建一个完成的MDP决策过程,但只有决策过程没有用,我们还需要参与交互的道路和汽车。这两个要素分别写在vehicle文件夹和road文件夹中。

road文件夹

还是一次对每个文件夹的大致功能进行介绍吧。

首先graphics主要是可视化的方法,以及一些渲染过程的参数设置,感兴趣大家可以看看。

lane文件定义了集中类型的车道,有抽闲车道、直线车道、正弦车道和多项式拟合车道,这些车道也是后面road建立的基础。

regulation定义了车辆的优先通行规则,比如避让直行,或者右转现行等,这些基本的交通规则。

road定义了很多生成道路的方法,要结合车道线。行驶规则以及生成车辆才能构成一条路网,而road的一些方法就是用来联系这一系列的元素。详细的大家可以参考envs/中已经配置好的环境py文件,能了解到道路的生成方式。

vehicle文件

最后是生成车辆的方法文件:

在behavior文件中主要定义了纵向和横向两种控制策略的方法,定义车辆间的行为控制,这里面不涉及动作的输入,因此这里面的方法针对所有的环境车辆和主车都适用。

controller文件定义了主车执行动作的控制逻辑,修改动作空间也需要修改这里面的控制逻辑。

dynamics是作者自己写着玩的一个动力学模型,感兴趣的同学可以结合这段代码,看能不能将运动学模型改成动力学模型。

kinematics定义的应该是一个简单的自行车运动学模型,这里可能车辆专业的同学比较清楚,主要是用车辆的x和y的速度以及航向角描述运动状态的模型,是属于比较简单的车辆运动学模型。同时将状态量以字典形式储存,后续训练的时候会使用。可以自行修改一些参数。

graphics同样是可视化方法。

最后的objects应该是将道路中所有对象都看成矩形,可以调整车的大小,同时基于几何尺寸写了碰撞检测的方法。这里面的类被调用在了kinematics,大家可以依据自己需要的环境进行参数修改,其中还定义了一个生成障碍物的方法。

总结

以上是对highway_env的代码解析,由于自身才疏学浅,很多地方可能理解有误,希望各位大佬批评指正。同时由于代码量较大,很多细节都是一笔带过,没有详细说明细节,还请见谅。后面我也会依据情况和反馈更新一些环境配置代码分析、动作空间修改,多种状态空间的对比和强化学习基础等相关内容。希望能与各位大佬多多交流学习。