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

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

编写文件collect_expert_data.py,功能是在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()

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

(1)解析命令行参数:使用 ArgumentParser 解析命令行参数,这些参数包括世界端口、主机地址、天气条件、摄像头参数、仿真参数、输出文件夹、模型类型等。

(2)加载预训练的自编码器模型:根据命令行参数指定的模型类型(Autoencoder、AutoencoderSEM 或 VAE),加载对应的自编码器模型。

(3)创建输出文件夹:根据命令行参数指定的天气条件,创建输出文件夹,用于存储专家数据。

(4)初始化 CARLA 环境

  1. 创建 CARLA 环境实例,配置仿真环境的参数,如地图、天气、摄像头参数、tick 长度、最大帧数等。
  2. 设置交通管理器的参数,如忽略红绿灯、随机变道等。
  3. 设置车辆的自动驾驶模式并指定路线。

(5)收集专家数据

  1. 在循环中,依次执行多个仿真 episode,每个 episode 对应一个驾驶任务。
  2. 在每个 episode 中,记录车辆的观察数据、动作、奖励、下一个观察数据、完成状态和其他信息。
  3. 将数据保存到对应的输出文件中。

(6)结束仿真环境:在程序运行结束时,重置仿真环境的设置,确保环境状态的清理。

总之,上述代码用于在 CARLA 仿真环境中运行多个仿真 episode,用于记录车辆的观察数据和驾驶行为,然后将这些数据保存到指定的输出文件夹中,以便用于后续的自动驾驶代理训练和评估工作。上述代码是数据收集的关键步骤,以便训练具有驾驶经验的自动驾驶代理。

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
强化学习是一种机器学习方法,它通过试错来学习如何在特定环境采取行动以最大化奖励。CARLA是一个开源的自动驾驶仿真平台,可以用于测试和评估自动驾驶算法。下面是使用强化学习CARLA实现自动驾驶的一些步骤: 1. 安装CARLA和Python API ```shell # 安装CARLA wget https://carla-releases.s3.eu-west-3.amazonaws.com/Linux/CARLA_0.9.11.tar.gz tar -xvf CARLA_0.9.11.tar.gz # 安装Python API pip install pygame numpy networkx scipy matplotlib git clone https://github.com/carla-simulator/carla.git cd carla/PythonAPI/carla/dist easy_install carla-0.9.11-py3.7-linux-x86_64.egg ``` 2. 创建CARLA环境 ```python import carla # 连接到CARLA服务器 client = carla.Client('localhost', 2000) client.set_timeout(10.0) # 获取CARLA世界 world = client.get_world() # 设置天气和时间 weather = carla.WeatherParameters(cloudiness=10.0, precipitation=10.0, sun_altitude_angle=70.0) world.set_weather(weather) world.set_sun_position(carla.Location(x=0.0, y=0.0, z=0.0)) # 创建车辆和摄像头 blueprint_library = world.get_blueprint_library() vehicle_bp = blueprint_library.filter('vehicle.tesla.model3')[0] spawn_point = carla.Transform(carla.Location(x=50.0, y=0.0, z=2.0), carla.Rotation(yaw=180.0)) vehicle = world.spawn_actor(vehicle_bp, spawn_point) camera_bp = blueprint_library.find('sensor.camera.rgb') camera_transform = carla.Transform(carla.Location(x=1.5, z=2.4)) camera = world.spawn_actor(camera_bp, camera_transform, attach_to=vehicle) ``` 3. 实现强化学习算法 这里我们以Deep Q-Network (DQN)为例,使用Keras实现神经网络。 ```python import keras from keras.models import Sequential from keras.layers import Dense, Flatten from keras.optimizers import Adam class DQNAgent: def __init__(self, state_size, action_size): self.state_size = state_size self.action_size = action_size self.memory = deque(maxlen=2000) self.gamma = 0.95 self.epsilon = 1.0 self.epsilon_min = 0.01 self.epsilon_decay = 0.995 self.learning_rate = 0.001 self.model = self._build_model() def _build_model(self): model = Sequential() model.add(Flatten(input_shape=(1,) + self.state_size)) model.add(Dense(24, activation='relu')) model.add(Dense(24, activation='relu')) model.add(Dense(self.action_size, activation='linear')) model.compile(loss='mse', optimizer=Adam(lr=self.learning_rate)) return model def remember(self, state, action, reward, next_state, done): self.memory.append((state, action, reward, next_state, done)) def act(self, state): if np.random.rand() <= self.epsilon: return random.randrange(self.action_size) act_values = self.model.predict(state) return np.argmax(act_values[0]) def replay(self, batch_size): minibatch = random.sample(self.memory, batch_size) for state, action, reward, next_state, done in minibatch: target = reward if not done: target = (reward + self.gamma * np.amax(self.model.predict(next_state)[0])) target_f = self.model.predict(state) target_f[0][action] = target self.model.fit(state, target_f, epochs=1, verbose=0) if self.epsilon > self.epsilon_min: self.epsilon *= self.epsilon_decay # 初始化DQNAgent state_size = (800, 600, 3) action_size = 3 agent = DQNAgent(state_size, action_size) # 训练DQNAgent for e in range(EPISODES): state = env.reset() state = np.reshape(state, [1, 1] + list(state_size)) for time in range(500): action = agent.act(state) next_state, reward, done, _ = env.step(action) next_state = np.reshape(next_state, [1, 1] + list(state_size)) agent.remember(state, action, reward, next_state, done) state = next_state if done: break if len(agent.memory) > batch_size: agent.replay(batch_size) ``` 4. 运行CARLA仿真 ```shell ./CarlaUE4.sh -windowed -carla-server -benchmark -fps=20 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农三叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值