
本文共 1281 字,大约阅读时间需要 4 分钟。
在本教程中,我们将利用Carla API的知识,将驾驶问题转化为强化学习问题。强化学习通过试错机制来学习最优策略,而在这个问题中,我们将使用一个具体的环境模型来模拟驾驶过程。
接下来,我们将创建一个接近标准化强化学习环境的类。这个环境将提供一个以步进为单位的交互方式,称为step
方法,该方法返回观察值、奖励、是否结束当前任务以及额外信息。同时,我们还将实现一个reset
方法,根据done
标志对环境进行重置。
首先,我们需要导入必要的库以及Carla API。为了避免依赖问题,我们通过模块路径的方式来确保代码的可执行性。接下来的常量定义SHOW_PREVIEW
用于控制是否显示预览窗口,STEER_AMT
用于控制转向力的大小。
CarEnv类详细说明
class CarEnv: SHOW_CAM: bool # 是否显示预览窗口 STEER_AMT: float # 转向力的大小 im_width: int # 图像宽度 im_height: int # 图像高度 actor_list: List[Actor] # 记录所有动作的对象 front_camera: Sensor # 前置摄像头传感器 collision_hist: List[CollisionEvent] # 碰撞历史记录
这个类的详细实现如下。首先,在初始化时,连接Carla服务器,并获取模拟世界。然后,选择一个随机的起始位置,并在该位置上生成一个底盘车。同时,添加了一个前置摄像头传感器和碰撞传感器来跟踪车辆行为。
在环境重置过程中,我们首先清空碰撞历史和动作列表。随后,生成一个随机的起始位置,并在该位置上生成底盘车。前置摄像头传感器会被配置成适合当前图像大小的参数,并通过监听函数来处理获取到的图像数据。
为了确保车辆的初始位置不会导致碰撞检测过早触发,我们设置了一个4秒的等待时间。这段时间可以让碰撞传感器充分初始化,并确保车辆不会因为起始位置问题导致连续的碰撞触发。
一旦初始设置完成,环境将返回当前的前置摄像头图像,这将作为第一个观察值。
动作处理与碰撞检测
每一次动作都会通过step
方法进行处理。这个方法将参数作为对车辆的控制指令(例如油门、转向力)。车辆的速度将根据当前状态计算,并转换为公里/小时。如果发生碰撞,Done标志将被置为True,奖励将被设置为负值。车辆在低于50公里/小时时也会获得负奖励。反之,车辆在安全驾驶状态下将获得正奖励。
此外,我们还添加了对当前回合时间的检查。如果已经超过了所设定的回合时间限制,Done标志将被置为True,强迫结束当前回合。
图像处理
前置摄像头传感器会定期返回当前图像数据,这些数据将被处理为numpy数组,并转换为RGB格式。如果需要,当前帧的图像将被显示,这将有助于调试过程。
到目前为止,我们已经完成了环境的基本实现。下一篇教程中,我们将介绍一个代理类,它将基于强化学习模型与这个环境进行交互。
以上是本教程的全部内容,希望能为您的学习之路提供帮助。
发表评论
最新留言
关于作者
