基于PPO自定义highway-env场景的车辆换道决策

这篇具有很好参考价值的文章主要介绍了基于PPO自定义highway-env场景的车辆换道决策。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 场景描述

如下图所示,自车(蓝车)与前车(白车)在同一车道行驶, 自车初速度为 27m/s,前车以22m/s的速度匀速行驶,两车相距 80m:
highway-env ppo,深度学习,人工智能,pytorch目标:自车通过换道,超越前车

2. 代码实现

这里的强化学习采用的是基于stable-baseline3所集成的PPO算法,算法可参考该博客Proximal Policy Optimization近端策略优化(PPO)。
环境初始化测试的代码可见博客highway-env自定义高速路环境

2.1 依赖包版本

gym == 0.21.0
highway-env == 1.5
stable-baselines3 == 1.6.2

2.2 代码

模型训练:

"""
@Author: Fhz
@Create Date: 2023/3/23 22:15
@File: rewrite_Fhz.py
@Description: 
@Modify Person Date: 
"""
import highway_env
from highway_env.envs.common.abstract import AbstractEnv
from highway_env.road.road import Road, RoadNetwork
from highway_env.envs.common.action import Action
from highway_env.vehicle.controller import ControlledVehicle
from highway_env.vehicle.kinematics import Vehicle
from stable_baselines3 import PPO
import numpy as np


LANES = 2
ANGLE = 0
START = 0
LENGHT = 200
SPEED_LIMIT = 30
SPEED_REWARD_RANGE = [10, 30]
COL_REWARD = -1
HIGH_SPEED_REWARD = 0
RIGHT_LANE_REWARD = 0
DURATION = 500.0


class myEnv(AbstractEnv):

    @classmethod
    def default_config(cls) -> dict:
        config = super().default_config()
        config.update(
            {
                'observation': {
                    'type': 'Kinematics',
                    "absolute": True,
                    "normalize": False,
                },
                'action': {'type': 'DiscreteMetaAction',
                           'target_speeds': np.array([10,20,30]) # 目标速度设置
                           },
                "features": ["x", "y", "vx", "vy"],
                "features_range": {
                    "x": [-10000, 10000],
                    "y": [-10000, 10000],
                    "vx": [-10, 10],
                    "vy": [-10, 30]},

                "reward_speed_range": SPEED_REWARD_RANGE,
                "simulation_frequency": 20,
                "policy_frequency": 20,
                'screen_width': 1200,
                'screen_height': 150,
                # "other_vehicles": 5,
                # "centering_position": [0.3, 0.5],
            }
        )
        return config

    def _reset(self) -> None:
        self._create_road()
        self._create_vehicles()


    def _create_road(self) -> None:
        self.road = Road(
            network=RoadNetwork.straight_road_network(LANES, speed_limit=SPEED_LIMIT),
            np_random=self.np_random,
            record_history=False,
        )

    # 创建车辆
    def _create_vehicles(self) -> None:

        # 自车
        vehicle = Vehicle.create_random(self.road, speed=27, lane_id=1, spacing=0.3)
        vehicle = self.action_type.vehicle_class(
            self.road,
            vehicle.position,
            vehicle.heading,
            vehicle.speed,
        )
        self.vehicle = vehicle
        self.road.vehicles.append(vehicle)

        # 周围车辆1
        vehicle = Vehicle.create_random(self.road, speed=22, lane_id=1, spacing=0.35)
        vehicle = self.action_type.vehicle_class(
            self.road,
            vehicle.position + [75,0], # 初始化目标场景,不加这一项的话,默认距离为5
            vehicle.heading,
            vehicle.speed,
        )
        self.road.vehicles.append(vehicle)
        vehicle.color = (255, 255, 255)

    # 重写的奖励函数
    def _reward(self, action: Action) -> float:
        reward_all = 0

        # 速度奖励,通过惩罚使得最低车速为20
        r_speed = (1/10) * (self.vehicle.speed - 20)
        
        # 目标车道奖励
        ego_lane = self.vehicle.lane_index[2]
        if ego_lane == 1:
            r_target_lane = 0
        else:
            r_target_lane = 0.1

        # 碰撞后奖励
        if self.vehicle.crashed:
            print("撞上了!")
            r_collsion = -180
        else:
            r_collsion = 0

        # 车辆横向位移偏出车道奖励
        r_out = 0
        r_change_lane = 0
        ego_pos_x = self.vehicle.position[1]

        if ego_pos_x > 4 and ego_pos_x < 0:
            r_target_lane = 0
            r_out = -200
            print("车离开车道!")
            self.vehicle.crashed = True # 与路沿碰撞
            return r_speed + r_out + r_collsion + r_target_lane

        reward_all = r_speed + r_out + r_collsion + r_target_lane

        return reward_all

    def _is_terminal(self) -> bool:

        # return (
        #         self.vehicle.crashed
        #         or self.time >= DURATION
        #         or (False and not self.vehicle.on_road)
        # )

        if self.vehicle.crashed:
            return True

        if self.time >= DURATION:
            print("时间到了!")
            return True

        if False and not self.vehicle.on_road:
            print("车不在路上了!")
            return True

        return False


if __name__ == '__main__':
    env = myEnv()

    model = PPO('MlpPolicy', env,
                policy_kwargs=dict(net_arch=[256, 256]),
                learning_rate=5e-4,
                batch_size=32,
                gamma=0.8,
                verbose=1,
                tensorboard_log="highway_dqn/")
    model.learn(int(1e5))
    model.save("highway_dqn/PPOmodel")

训练结果:
highway-env ppo,深度学习,人工智能,pytorch
highway-env ppo,深度学习,人工智能,pytorch
模型测试代码:

"""
@Author: Fhz
@Create Date: 2023/3/23 22:15
@File: rewrite_Fhz.py
@Description: 
@Modify Person Date: 
"""
import highway_env
from highway_env.envs.common.abstract import AbstractEnv
from highway_env.road.road import Road, RoadNetwork
from highway_env.envs.common.action import Action
from highway_env.vehicle.controller import ControlledVehicle
from highway_env.vehicle.kinematics import Vehicle
from stable_baselines3 import PPO
import numpy as np


LANES = 2
ANGLE = 0
START = 0
LENGHT = 200
SPEED_LIMIT = 30
SPEED_REWARD_RANGE = [10, 30]
COL_REWARD = -1
HIGH_SPEED_REWARD = 0
RIGHT_LANE_REWARD = 0
DURATION = 500.0


class myEnv(AbstractEnv):

    @classmethod
    def default_config(cls) -> dict:
        config = super().default_config()
        config.update(
            {
                'observation': {
                    'type': 'Kinematics',
                    "absolute": True,
                    "normalize": False,
                },
                'action': {'type': 'DiscreteMetaAction',
                           'target_speeds': np.array([10,20,30]) # 目标速度设置
                           },
                "features": ["x", "y", "vx", "vy"],
                "features_range": {
                    "x": [-10000, 10000],
                    "y": [-10000, 10000],
                    "vx": [-10, 10],
                    "vy": [-10, 30]},

                "reward_speed_range": SPEED_REWARD_RANGE,
                "simulation_frequency": 20,
                "policy_frequency": 20,
                'screen_width': 1200,
                'screen_height': 150,
                # "other_vehicles": 5,
                # "centering_position": [0.3, 0.5],
            }
        )
        return config

    def _reset(self) -> None:
        self._create_road()
        self._create_vehicles()


    def _create_road(self) -> None:
        self.road = Road(
            network=RoadNetwork.straight_road_network(LANES, speed_limit=SPEED_LIMIT),
            np_random=self.np_random,
            record_history=False,
        )

    # 创建车辆
    def _create_vehicles(self) -> None:

        # 自车
        vehicle = Vehicle.create_random(self.road, speed=27, lane_id=1, spacing=0.3)
        vehicle = self.action_type.vehicle_class(
            self.road,
            vehicle.position,
            vehicle.heading,
            vehicle.speed,
        )
        self.vehicle = vehicle
        self.road.vehicles.append(vehicle)

        # 周围车辆1
        vehicle = Vehicle.create_random(self.road, speed=22, lane_id=1, spacing=0.35)
        vehicle = self.action_type.vehicle_class(
            self.road,
            vehicle.position + [75,0], # 初始化目标场景,不加这一项的话,默认距离为5
            vehicle.heading,
            vehicle.speed,
        )
        self.road.vehicles.append(vehicle)
        vehicle.color = (255, 255, 255)

    # 重写的奖励函数
    def _reward(self, action: Action) -> float:
        reward_all = 0

        # 速度奖励,通过惩罚使得最低车速为20
        r_speed = (1/10) * (self.vehicle.speed - 20)
        
        # 目标车道奖励
        ego_lane = self.vehicle.lane_index[2]
        if ego_lane == 1:
            r_target_lane = 0
        else:
            r_target_lane = 0.1

        # 碰撞后奖励
        if self.vehicle.crashed:
            print("撞上了!")
            r_collsion = -180
        else:
            r_collsion = 0

        # 车辆横向位移偏出车道奖励
        r_out = 0
        r_change_lane = 0
        ego_pos_x = self.vehicle.position[1]

        if ego_pos_x > 4 and ego_pos_x < 0:
            r_target_lane = 0
            r_out = -200
            print("车离开车道!")
            self.vehicle.crashed = True # 与路沿碰撞
            return r_speed + r_out + r_collsion + r_target_lane

        reward_all = r_speed + r_out + r_collsion + r_target_lane

        return reward_all

    def _is_terminal(self) -> bool:

        # return (
        #         self.vehicle.crashed
        #         or self.time >= DURATION
        #         or (False and not self.vehicle.on_road)
        # )

        if self.vehicle.crashed:
            return True

        if self.time >= DURATION:
            print("时间到了!")
            return True

        if False and not self.vehicle.on_road:
            print("车不在路上了!")
            return True

        return False


if __name__ == '__main__':
    env = myEnv()

    model = PPO.load("highway_dqn/PPOmodel", env=env)

    eposides = 10
    for eq in range(eposides):
        obs = env.reset()
        env.render()

        rewards = 0
        done = False
        while not done:
            # action = env.action_space.sample()
            action, _state = model.predict(obs, deterministic=True)
            action = action.item()
            print("The action is: {}".format(action))
            obs, reward, done, info = env.step(action)
            print("The speed of ego vehicle: {}, other vehicle: {}".format(obs[0, 3], obs[1, 3]))
            env.render()
            rewards += reward
        print(rewards)

验证视频为:视频

3. 相关资料

highway-env手册:地址
highway-env自定义高速路环境
基于强化学习A2C快速路车辆决策控制
基于DQN强化学习的高速路决策控制文章来源地址https://www.toymoban.com/news/detail-775517.html

到了这里,关于基于PPO自定义highway-env场景的车辆换道决策的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 自动驾驶——基于五次多项式螺旋线方程的换道曲线规划

    1.BackGround 已知:换道初始纵坐标y0(横向距离),换道初始航向角tan0,换道时间t,换道结束纵坐标yf,换道结束航向角tanf,车速VehSpd,曲线中点曲率q且曲率变化率为0。求解期望的规划曲线。 2.Algorithm 3.Reference 自动驾驶——ADAS车道线方程推导 基于多项式采样的换道路径规划

    2024年02月08日
    浏览(54)
  • leveldb自定义env

    由于项目需求,需要自定义LevelDB的env,也就是以块接口实现env中各个文件接口,在网上没找到类似的代码,就打算自己参照 util/env_posix.cc 实现一个简单的demo,等到功能实现差不多的时候,却发现leveldb有一个类似功能的代码 helpers/memenv/memenv.cc ,且各方面都写的比我好,故这

    2024年02月02日
    浏览(32)
  • 面向高速公路车辆切入场景的自动驾驶测试用例生成方法

    1 前言 自动驾驶汽车为解决“交通事故、交通拥堵、环境污染、能源短缺”等问题提供了新的途径[1]。科学完善的测试验证评价体系对提高自动驾驶汽车的研发效率、健全相关法律法规、推进智能交通发展至关重要[2]。自2009年起,谷歌自动驾驶汽车已经进行了超过560万km公共

    2024年02月10日
    浏览(30)
  • 浅析TSINGSEE青犀视频AI智能分析网关车辆检测/车牌识别算法及应用场景

    在数字化时代,随着大众对出行要求的提升,汽车数量也成与日俱增,为城市与交通管理带来了许多困扰。旭帆科技为给交通管理和车辆安全提供高效的解决方案,特此研发了AI智能车辆检测与车牌识别算法。 旭帆科技TSINGSEE青犀视频AI车辆检测、车牌识别算法融合了ORC识别、

    2024年02月09日
    浏览(29)
  • 基于视觉的车辆防碰撞系统

    摘 要 随着时代的变迁和科学技术的高速发展,汽车越来越融入到了人们的生活节奏中,然而由汽车所带来的交通安全问题也愈发严重,不容忽视。针对这个问题,如何避免道路上的其他车辆和障碍物碰撞而导致的交通事故成为了当今的研究热点之一。同时,基于视觉的技术

    2024年02月02日
    浏览(32)
  • 基于OpenCV的车辆检测与记数

    本文提出一种简单有效的基于opencv的车辆检测与计数方法。 首先通过高速公路上的摄像头 获取到一段车流量视频 , 先预处理 :利用灰度线性变换,为了只关注视频中车辆移动的特征,不关注不同车辆的不同颜色的干扰特征; 然后对灰度视频去除背景 ,进一步抑制车辆外的

    2024年02月03日
    浏览(29)
  • MATLAB基于视频的车辆检测方法

    摘要 改革开放以后,随着经济的高速发展,交通问题越来越开始影响着人们的生产和生活,由于汽车拥有量的急剧增加,城市交通问题日益严重,因此交通问题开始成为人们关心的社会热点。在我国,近年来,交通事故频繁发生,有效的交通监测和管理已迫在眉睫。 本文主

    2023年04月25日
    浏览(25)
  • 基于SpringBoot的车辆管理系统

    目录 前言  一、技术栈 二、系统功能介绍 员工信息管理 证件信息管理 车辆信息管理 事故登记管理 事故登记 保养登记 违章登记 三、核心代码 1、登录模块  2、文件上传模块 3、代码封装 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步

    2024年02月07日
    浏览(27)
  • 基于MATLAB车辆防碰撞系统仿真

    近年来,汽车行业的飞速发展使得我国的汽车保有量快速增长,但由此引发的交通事故导致的人员伤亡数量仍居高不下。从保护人身安全和降低交通事故发生的可能性的角度出发,车辆防碰撞系统能够使驾驶员在没注意到与前方车辆有碰撞危险的情况下采取自动紧急制动措施

    2024年02月08日
    浏览(28)
  • SUMO与python联合仿真(跟驰与换道)

    这几天做了几个sumo与python联合仿真的实验,虽然设计的场景相对来说不是很复杂,但是我觉得挺有收获的,期间也经历了很多大大的坑,下面来分享一下。 问题1:在sumo与python联合仿真时,配置环境变量 (%E5%A4%A7%E5%9D%91%E6%80%BB%E7%BB%93.assets/1686476392225.png) 点开之后设置三部分

    2024年02月05日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包