Advertisement

(17-7-02)基于强化学习的自动驾驶系统:收集CARLA环境中的专家驾驶数据

阅读量:

17.8.3 收集CARLA环境中的专家驾驶数据

根据需求生成名为collect_expert_data.py的Python文件,在CARLA仿真环境中负责收集专家数据。这些数据通常来源于经验丰富的人类驾驶员在仿真环境中完成驾驶任务时所记录的行为模式,并被用于训练和评估自动驾驶代理的效果。具体来说,在此脚本中会展示如何实现这一功能。

复制代码
 if __name__=='__main__':

    
     argparser = ArgumentParser()
    
     argparser.add_argument('--world-port', type=int, default=config.WORLD_PORT)
    
     argparser.add_argument('--host', type=str, default=config.WORLD_HOST)
    
     argparser.add_argument('--weather', type=str, default='ClearNoon',
    
                        choices=['ClearNoon', 'ClearSunset', 'CloudyNoon', 'CloudySunset',
    
                                 'WetNoon', 'WetSunset', 'MidRainyNoon', 'MidRainSunset',
    
                                 'WetCloudyNoon', 'WetCloudySunset', 'HardRainNoon',
    
                                 'HardRainSunset', 'SoftRainNoon', 'SoftRainSunset'],
    
                                 help='Weather preset')
    
     argparser.add_argument('--cam_height', type=int, default=config.CAM_HEIGHT, help="Camera height")
    
     argparser.add_argument('--cam_width', type=int, default=config.CAM_WIDTH, help="Camera width")
    
     argparser.add_argument('--fov', type=int, default=config.CAM_FOV, help="Camera field of view")
    
     argparser.add_argument('--nb_episodes', type=int, default=90, help="Number of episodes to run")
    
     argparser.add_argument('--tick', type=float, default=config.TICK, help="Sensor tick length")
    
  
    
     argparser.add_argument('--out_folder', type=str, default=config.EXPERT_DATA_FOLDER, help="Output folder")
    
     argparser.add_argument('--model', type=str, default=config.AE_MODEL, help='model',
    
                        choices=['Autoencoder', 'AutoencoderSEM', 'VAE'])
    
     argparser.add_argument('--autoencoder_model', type=str, help="Autoencoder model path", default=config.AE_PRETRAINED)
    
     argparser.add_argument('--from_ep', type=int, default=0, help="Start episode number (for resuming)")
    
     argparser.add_argument('-no_exo_vehicles', help="Use exo vehicles", action='store_false')
    
  
    
     args = argparser.parse_args()
    
  
    
     if args.model=='AutoencoderSEM':
    
     autoencoder = AutoencoderSEM.load_from_checkpoint(args.autoencoder_model)
    
     elif args.model=='VAE':
    
     autoencoder = VAE.load_from_checkpoint(args.autoencoder_model)
    
     elif args.model=='Autoencoder':
    
     autoencoder = Autoencoder.load_from_checkpoint(args.autoencoder_model)
    
     else:
    
     raise ValueError(f"Unknown model {args.model}")
    
  
    
     autoencoder.freeze()
    
     autoencoder.eval()
    
  
    
     out_folder = os.path.join(args.out_folder, args.weather)
    
  
    
     os.makedirs(out_folder, exist_ok=True)
    
  
    
     env = CarlaEnv(autoencoder, args.world_port, args.host, config.TRAIN_MAP, args.weather,
    
              args.cam_height, args.cam_width, args.fov, args.tick, 1000, exo_vehicles=args.no_exo_vehicles)
    
     
    
     spawn_points = env.map.get_spawn_points()
    
     possible_routes = Route.get_possibilities(config.TRAIN_MAP)
    
     routes = [[possible_routes[0]().end.location],
    
         [possible_routes[1]().end.location],
    
         [possible_routes[2]().end.location]]
    
     
    
     for i in range(len(routes)):
    
     os.makedirs(os.path.join(out_folder, f'Route_{i}'), exist_ok=True)
    
  
    
     try:    
    
  
    
     for episode in range(args.from_ep, args.nb_episodes):
    
         print("Episode {}".format(episode))
    
  
    
         route_id = episode % len(routes)
    
  
    
         route = routes[route_id]
    
  
    
         obs = env.reset(route_id)
    
  
    
         env.traffic_manager.ignore_lights_percentage(env.ego_vehicle, 100)
    
         env.traffic_manager.random_left_lanechange_percentage(env.ego_vehicle, 0)
    
         env.traffic_manager.random_right_lanechange_percentage(env.ego_vehicle, 0)
    
         env.traffic_manager.auto_lane_change(env.ego_vehicle, False)
    
         env.traffic_manager.set_desired_speed(env.ego_vehicle, 35.)
    
         env.traffic_manager.distance_to_leading_vehicle(env.ego_vehicle, 4.0)
    
  
    
         env.traffic_manager.set_path(env.ego_vehicle, route)
    
  
    
         env.ego_vehicle.set_autopilot(True)
    
  
    
         done = False
    
         data = []
    
         while not done:
    
             control = env.ego_vehicle.get_control()
    
             action = [control.steer, 0.0]
    
             if control.throttle > control.brake:
    
                 action[1] = control.throttle
    
             else:
    
                 action[1] = -control.brake
    
             obs_t1, reward, done, info = env.step(action)
    
  
    
             if info["speed"] < 1e-6 and action[1] <= 0.0: #Avoid getting stuck when learning
    
                 action[1] = -0.05
    
  
    
             data.append([obs, action, reward, obs_t1, done, info])
    
  
    
             obs = obs_t1
    
  
    
         out_file = os.path.join(out_folder, f"Route_{route_id}", f"{episode}.pkl")
    
         with open(out_file, 'wb') as f:
    
             pickle.dump(data, f)
    
         print(f"End of episode {episode} - {len(data)} steps")
    
     finally:
    
     env.reset_settings()

上述代码的具体实现流程如下所示:

解析终端参数:该系统通过ArgumentParser解析终端配置,并包含全球连接端口、设备IP地址、气候设置、成像设置以及模拟配置等详细信息。其中涉及全局连接端口数值范围的选择以及设备IP地址的具体分配策略。

(2)导入预训练的自编码器架构:根据命令行参数指定的类型(Autoencoder、AutoencoderSEM 或 VAE),导入相应的自编码器架构。

(3)生成指定路径下的气象数据存储区域:基于气候条件指定的输入参数,在命令行环境中设置目标路径后执行程序操作以建立气象数据分析索引结构

(4)初始化 CARLA 环境

  1. 建立 CARLA 环境实例,并对仿真环境的各项参数进行设置。
  2. 配置交通管理器的各项参数,并允许车辆在特定条件下做出相应的反应。
  3. 启动自动驾驶功能,并为车辆设定具体的行驶路线。

(5)收集专家数据

  1. 在循环过程中, 按顺序执行多个模拟场景episode, 并使每个episode相当于一个驾驶任务.
  2. 对于每个episode而言, 在其中被记录了车辆的观测数据和动作序列以及奖励值和下一状态等信息.
  3. 将被保存至相应的输出文件中.

完成关闭仿真环境,在程序退出后设置其初始状态以确保干净的开始。

综上所述,在CARLA仿真环境中运行多个episode的过程主要针对的是获取车辆观测数据以及其行驶行为的数据记录。随后将这些采集到的数据存储至预设的目标文件夹中,并为后续开展自动驾驶代理模型的训练与验证工作提供必要的基础支持。这段代码在整个数据收集过程中扮演着关键角色,并以期训练具备行驶经验的人工智能自动驾驶代理系统

全部评论 (0)

还没有任何评论哟~