Esempio n. 1
0
class SpecificWorker(GenericWorker):
    logger_signal = Signal(str, str, str)

    def __init__(self, proxy_map, startup_check=False):
        super(SpecificWorker, self).__init__(proxy_map)

        self.width = 1280
        self.height = 720

        pygame.init()
        pygame.font.init()

        self.display = pygame.display.set_mode(
            (self.width, self.height), pygame.HWSURFACE | pygame.DOUBLEBUF)

        self.camera_manager = CameraManager(self.width, self.height)
        self.gnss_sensor = GNSSSensor()
        self.imu_sensor = IMUSensor()
        self.hud = HUD(self.width, self.height, self.gnss_sensor,
                       self.imu_sensor)
        self.controller = None
        self.clock = pygame.time.Clock()

        data_to_save = {
            'control': [
                'Time', 'Throttle', 'Steer', 'Brake', 'Gear', 'Handbrake',
                'Reverse', 'Manualgear'
            ],
            'communication': ['Time', 'CommunicationTime']
        }
        self.logger = Logger(self.melexlogger_proxy, 'carlaRemoteControl',
                             data_to_save)
        self.logger_signal.connect(self.logger.publish_to_logger)

        self.Period = 0

        self.previousLat = None
        self.previousLong = None

        self.currentLat = None
        self.currentLong = None

        if startup_check:
            self.startup_check()
        else:
            self.timer.timeout.connect(self.compute)
            self.timer.start(self.Period)

    def __del__(self):
        print('SpecificWorker destructor')

    def setParams(self, params):
        try:
            wheel_config = params["wheel"]
            self.controller = DualControl(self.camera_manager, self.hud,
                                          wheel_config,
                                          self.carlavehiclecontrol_proxy)

        except:
            traceback.print_exc()
            print("Error reading config params")
        return True

    @QtCore.Slot()
    def compute(self):
        if not self.previousLat and not self.previousLong:
            self.previousLat = self.gnss_sensor.latitude
            self.previousLong = self.gnss_sensor.longitude

        self.clock.tick_busy_loop(60)
        if self.controller and self.controller.parse_events(self.clock):
            exit(-1)

        if self.controller.car_moved():
            control, elapsed_time = self.controller.publish_vehicle_control()
            control_array = [
                control.throttle, control.steer, control.brake, control.gear,
                control.handbrake, control.reverse, control.manualgear
            ]
            data = ';'.join(map(str, control_array))
            self.logger_signal.emit('control', 'compute', data)
            self.logger_signal.emit('communication', 'compute',
                                    str(elapsed_time))

            self.hud.tick(self, self.clock, control)

            self.currentLat = self.gnss_sensor.latitude
            self.currentLong = self.gnss_sensor.longitude

        if self.currentLong != self.previousLong or self.currentLat != self.currentLat:
            print("\n    CURRENT POS VEHICLE -> LAT: {} , LONG: {}".format(
                self.currentLat, self.currentLong))
            self.previousLat = self.currentLat
            self.previousLong = self.currentLong

        self.camera_manager.render(self.display)
        self.hud.render(self.display)
        pygame.display.flip()

        return True

    def startup_check(self):
        QTimer.singleShot(200, QApplication.instance().quit)

    # =============== Methods for Component SubscribesTo ================
    # ===================================================================

    #
    # SUBSCRIPTION to pushRGBD method from CameraRGBDSimplePub interface
    #
    def CarCameraRGBD_pushRGBD(self, im, dep):
        self.camera_manager.images_received[im.cameraID] = im

    #
    # SUBSCRIPTION to updateSensorGNSS method from CarlaSensors interface
    #
    def CarlaSensors_updateSensorGNSS(self, gnssData):
        self.gnss_sensor.update(gnssData.latitude, gnssData.longitude,
                                gnssData.altitude, gnssData.frame,
                                gnssData.timestamp)

    #
    # SUBSCRIPTION to updateSensorIMU method from CarlaSensors interface
    #
    def CarlaSensors_updateSensorIMU(self, imuData):
        self.imu_sensor.update(imuData.accelerometer, imuData.gyroscope,
                               imuData.compass, imuData.frame,
                               imuData.timestamp)
class CarlaEnv():
    pygame.init()
    font = pygame.font.init()

    def __init__(self, world):
        #화면 크기
        n_iters = 100
        self.width = 800
        self.height = 600
        #센서 종류
        self.actor_list = []
        self.extra_list = []
        self.extra_list = []
        self.extra_controller_list = []
        self.extra_dl_list = []
        self.extra_dl_list = []
        self.player = None
        self.camera_rgb = None
        self.camera_semseg = None
        self.lane_invasion_sensor = None
        self.collision_sensor = None
        self.gnss_sensor = None
        self.waypoint = None
        self.path = []
        self.save_dir = None
        self.world = world
        self.map = world.get_map()
        self.spectator = self.world.get_spectator()
        self.hud = HUD(self.width, self.height)
        self.waypoints = self.map.generate_waypoints(3.0)
        self.lane_change_time = time.time()
        self.max_Lane_num = 4
        self.ego_Lane = 2
        self.agent = None
        self.controller = None
        self.is_first_time = True
        self.decision = None
        self.simul_time = time.time()
        self.accumulated_reward = 0
        self.end_point = 0
        self.ROI_length = 1000  #(meters)

        ## visualize all waypoints ##
        # for n, p in enumerate(self.waypoints):
        #     world.debug.draw_string(p.transform.location, 'o', draw_shadow=True,
        #                             color=carla.Color(r=255, g=255, b=255), life_time=999)

        settings = self.world.get_settings()
        # settings.no_rendering_mode = True
        # settings.synchronous_mode = True
        settings.fixed_delta_seconds = 0.02
        self.world.apply_settings(settings)
        self.extra_num = 30
        self.section = 0
        self.lane_distance_between_start = None
        self.lane_distance_between_end = None
        self.lane_change_point = None
        self.episode_start = None
        self.index = 0
        self.pre_max_Lane_num = self.max_Lane_num

        self.restart()
        self.main()

    def restart(self):
        self.decision = None
        self.simul_time = time.time()
        self.lane_change_time = time.time()
        self.max_Lane_num = 4
        self.ego_Lane = 2
        self.controller = None
        self.accumulated_reward = 0
        self.section = 0
        self.episode_start = time.time()
        self.pre_max_Lane_num = self.max_Lane_num
        self.index = 0
        print('start destroying actors.')

        if len(self.actor_list) != 0:
            # print('destroying actors.')
            # print("actor 제거 :", self.actor_list)

            for actor in self.actor_list:
                # print("finally 에서 actor 제거 :", self.actor_list)
                if actor.is_alive:
                    actor.destroy()
            print("finshed actor destroy")
            # for x in self.actor_list:
            #     try:
            #         client.apply_batch([carla.command.DestroyActors(x.id)])
            #     except:
            #         continue
        if len(self.extra_list) != 0:
            # client.apply_batch([carla.command.DestoryActors(x.id) for x in self.extra_list])
            # print("extra 제거 :", self.extra_list)
            for x in self.extra_list:
                try:
                    client.apply_batch([carla.command.DestroyActor(x.id)])
                except:
                    continue
            # for extra in self.extra_list:
            #     # print("finally 에서 actor 제거 :", self.extra_list)
            #     print(extra.is_alive)
            #     if extra.is_alive:
            #         extra.destroy()
            print("finshed extra destroy")

            # for x in self.extra_list:
            #     try:
            #         client.apply_batch([carla.command.DestroyActor(x.id)])
            #     except:
            #         continue
        print('finished destroying actors.')

        self.actor_list = []
        self.extra_list = []
        self.ROI_extra_list = []
        self.extra_controller_list = []
        self.extra_dl_list = []
        self.ROI_extra_dl_list = []
        blueprint_library = self.world.get_blueprint_library()
        # start_pose = random.choice(self.map.get_spawn_points())
        start_pose = self.map.get_spawn_points()[102]

        ##spawn points 시뮬레이션 상 출력##
        # print(start_pose)
        # for n, x in enumerate(self.map.get_spawn_points()):
        #     world.debug.draw_string(x.location, 'o', draw_shadow=True,
        #                             color=carla.Color(r=0, g=255, b=255), life_time=30)

        # self.load_traj()

        self.waypoint = self.map.get_waypoint(start_pose.location,
                                              lane_type=carla.LaneType.Driving)
        self.end_point = self.waypoint.next(400)[0].transform.location
        # print(self.waypoint.transform)
        ## Ego vehicle의 global Route 출력##
        world.debug.draw_string(self.waypoint.next(400)[0].transform.location,
                                'o',
                                draw_shadow=True,
                                color=carla.Color(r=0, g=255, b=255),
                                life_time=100)

        # print(start_pose)
        # print(self.waypoint.transform)

        # self.controller = MPCController.Controller

        self.player = world.spawn_actor(
            random.choice(blueprint_library.filter('vehicle.bmw.grandtourer')),
            start_pose)
        # print(self.player.bounding_box) # ego vehicle length

        self.actor_list.append(self.player)

        self.camera_rgb = RGBSensor(self.player, self.hud)
        self.actor_list.append(self.camera_rgb.sensor)

        # self.camera_depth =DepthCamera(self.player, self.hud)
        # self.actor_list.append(self.camera_depth.sensor)

        # self.camera_semseg = SegmentationCamera(self.player,self.hud)
        # self.actor_list.append(self.camera_semseg.sensor)

        self.collision_sensor = CollisionSensor(self.player,
                                                self.hud)  # 충돌 여부 판단하는 센서
        self.actor_list.append(self.collision_sensor.sensor)

        self.lane_invasion_sensor = LaneInvasionSensor(
            self.player, self.hud)  # lane 침입 여부 확인하는 센서
        self.actor_list.append(self.lane_invasion_sensor.sensor)

        self.gnss_sensor = GnssSensor(self.player)
        self.actor_list.append(self.gnss_sensor.sensor)

        # --------------
        # Spawn Surrounding vehicles
        # --------------

        print("Generate Extra")
        spawn_points = []
        blueprints = self.world.get_blueprint_library().filter('vehicle.*')
        blueprints = [
            x for x in blueprints
            if int(x.get_attribute('number_of_wheels')) == 4
        ]
        # print(*blueprints)
        for i in range(10, 10 * (self.extra_num) + 1, 10):
            dl = random.choice([-1, 0, 1])
            self.extra_dl_list.append(dl)
            spawn_point = None
            if dl == -1:
                spawn_point = self.waypoint.next(
                    i)[0].get_left_lane().transform
            elif dl == 0:
                spawn_point = self.waypoint.next(i)[0].transform
            elif dl == 1:
                spawn_point = self.waypoint.next(
                    i)[0].get_right_lane().transform
            else:
                print("Except ")
            spawn_point = carla.Transform(
                (spawn_point.location + carla.Location(z=1)),
                spawn_point.rotation)
            spawn_points.append(spawn_point)
            # print(blueprint_library.filter('vehicle.bmw.grandtourer'))
            # blueprint = random.choice(blueprint_library.filter('vehicle.bmw.grandtourer'))

            blueprint = random.choice(blueprints)
            # print(blueprint.has_attribute('color'))
            if blueprint.has_attribute('color'):
                # color = random.choice(blueprint.get_attribute('color').recommended_values)
                # print(blueprint.get_attribute('color').recommended_values)
                color = '255,255,255'
                blueprint.set_attribute('color', color)
            extra = self.world.spawn_actor(blueprint, spawn_point)
            self.extra_list.append(extra)
        print('Extra Genration Finished')

        self.spectator.set_transform(
            carla.Transform(
                self.player.get_transform().location + carla.Location(z=100),
                carla.Rotation(pitch=-90)))

        ROI = 1000
        # extra_target_velocity = 10
        port = 8000
        traffic_manager = client.get_trafficmanager(port)
        traffic_manager.set_global_distance_to_leading_vehicle(100.0)
        # traffic_manager.set_synchronous_mode(True) # for std::out_of_range eeror
        tm_port = traffic_manager.get_port()
        for extra in self.extra_list:
            extra.set_autopilot(True, tm_port)
            # Pure_puresuit_controller(extra, self.waypoint, None, 50)  # km/h
            # target_velocity = 30 #random.randrange(10, 40) # km/h
            # extra.enable_constant_velocity(extra.get_trzansform().get_right_vector() * target_velocity/3.6)
            traffic_manager.auto_lane_change(extra, False)
        # self.player.set_autopilot(True,tm_port)
        # traffic_manager.auto_lane_change(self.player, False)
        self.controller = Pure_puresuit_controller(self.player, self.waypoint,
                                                   self.extra_list, 70)  # km/h

        # target_velocity = 60 / 3.6
        # forward_vec = self.player.get_transform().get_forward_vector()
        # print(forward_vec)
        # velocity_vec =  target_velocity*forward_vec
        # self.player.set_target_velocity(velocity_vec)
        # print(velocity_vec)

        # print(velocity_vec)
        # client.get_trafficmanager.auto_lane_change(extra, False)
        ###Test####
        # clock = pygame.time.Clock()
        # Keyboardcontrol = KeyboardControl(self, False)
        # display = pygame.display.set_mode(
        #     (self.width, self.height),
        #     pygame.HWSURFACE | pygame.DOUBLEBUF)
        # while True:
        #     if Keyboardcontrol.parse_events(client, self, clock):
        #         return
        #     self.spectator.set_transform(
        #         carla.Transform(self.player.get_transform().location + carla.Location(z=50),
        #                         carla.Rotation(pitch=-90)))
        #     self.camera_rgb.render(display)
        #     self.hud.render(display)
        #     pygame.display.flip()
        #
        #     self.controller.apply_control()
        #     # self.world.wait_for_tick(10.0)
        #     clock.tick(30)
        #
        #     self.hud.tick(self, clock)

        #### Test Finished #####
        #### Test2 #####
        # cnt=0
        # clock = pygame.time.Clock()
        # while True:
        #     # print(self.waypoint.lane_id)
        #     self.spectator.set_transform(
        #         carla.Transform(self.player.get_transform().location + carla.Location(z=100),
        #                         carla.Rotation(pitch=-90)))
        #     cnt += 1
        #     if cnt == 100:
        #         print('수해유 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ')
        #         decision = 1
        #         self.controller.apply_control(decision)
        #     else:
        #        self.controller.apply_control()
        #     clock.tick(30)
        #### Test2 Finished #####

        # self.input_size = (self.extra_num)*4 + 1
        self.input_size = 4  #dr dv da dl
        self.output_size = 3

        # for response in client.apply_batch_sync(batch):
        #     if response.error:
        #         logging.error(response.error)
        #     else:
        #         self.extra_list.append(response.actor_id)
        print(5)

    def step(self, decision):
        SECONDS_PER_EPISODE = 1000
        plc = 10
        # decision = None
        '''
        # Simple Action (action number: 3)
        action_test = action -1
        self.vehicle.apply_control(carla.VehicleControl(throttle=1.0, steer=action_test*self.STEER_AMT))
        '''

        # Complex Action
        if decision == 0:  # LK
            plc = 0
        # elif action == -1:  # left
        #     plc += 10
        #     decision = -1
        # elif action == 1:  # right
        #     plc += 10
        #     decision = 1
        '''
        if len(self.collision_hist) != 0:
            done = True
            reward = -200 + (time.time()-self.episode_start)*15/SECONDS_PER_EPISODE
        else:
            done = False
            reward = 1
        '''
        end_length = math.sqrt(
            (self.end_point.x - self.player.get_location().x)**2 +
            (self.end_point.y - self.player.get_location().y)**2)

        done = False
        if len(self.collision_sensor.history) != 0:
            done = True
            reward = -100
        elif end_length < 15:
            done = True
            reward = 1
        elif self.max_Lane_num < self.ego_Lane:
            done = True
            reward = -100
        else:
            reward = 1 - (self.controller.desired_vel - self.controller.
                          velocity) / self.controller.desired_vel - plc
        # print(reward)
        self.accumulated_reward += reward

        if time.time() > self.episode_start + SECONDS_PER_EPISODE:
            done = True

        #state length = 4 * num of extra vehicles + 1

        state, x_static = self.get_next_state(decision)  #get now state

        # if len(state) == 29:
        #     print(" ")
        return state, x_static, decision, reward, None, None, done
        # Next State 표현 필요
    def get_next_state(self, decision=None):
        """
        dl : relative lane num after ching the lane
        dr, dv, da : now state
        """
        state = []
        for x, extra in enumerate(self.extra_list):

            if decision == 1:
                self.extra_dl_list[x] = self.extra_dl_list[x] + 1
                # self.ROI_extra_dl_list[x] =self.ROI_extra_dl_list[x]+1

            elif decision == -1:
                self.extra_dl_list[x] = self.extra_dl_list[x] - 1
                # self.ROI_extra_dl_list[x] = self.ROI_extra_dl_list[x]-1

            else:
                pass

            extra_pos = extra.get_transform().location
            extra_vel = extra.get_velocity()
            extra_acel = extra.get_acceleration()
            dr = ((extra_pos.x - self.player.get_transform().location.x)**2 +
                  (extra_pos.y - self.player.get_transform().location.y)**2 +
                  ((extra_pos.z - self.player.get_transform().location.z)**
                   2))**0.5 - abs(self.waypoint.lane_width *
                                  (self.extra_dl_list[x]))
            if isinstance(dr, complex):
                print("complex")
            dv = (self.player.get_velocity().x**2 +
                  self.player.get_velocity().y**2 +
                  self.player.get_velocity().z**2)**0.5 - (
                      extra_vel.x**2 + extra_vel.y**2 + extra_vel.z**2)**0.5

            length = 2 * extra.bounding_box.extent.x / 10  # length of extra vehicle

            # da = ((extra_acel.x - self.player.get_acceleration().x) ** 2 + (
            #         extra_acel.y - self.player.get_acceleration().y) ** 2 +
            #       (extra_acel.z - self.player.get_acceleration().z) ** 2) ** 0.5

            state_dyn = [dr, dv, length, self.extra_dl_list[x]]
            state.append(state_dyn)
            # state.append(dr)

            # state.append(dv)
            # state.append(da)
            # state.append(self.extra_dl_list[x])

        if decision == 1:
            self.ego_Lane += 1
        elif decision == -1:
            self.ego_Lane += -1
        else:
            pass
        x_static = []
        x_static.append([
            self.ego_Lane, self.controller.velocity,
            self.search_distance_valid() / self.ROI_length
        ])

        # state.append(x_static)

        # state.append(self.ego_Lane)
        out = [state, x_static]
        return out

    def search_distance_valid(self):
        # index= 4-self.ego_Lane
        # print("index :", index)
        last_lane_waypoint = self.map.get_waypoint(
            self.player.get_transform().location,
            lane_type=carla.LaneType.Driving)  #self.controller.waypoint
        search_raidus = 5
        distance = 9999
        # pre_distance = 0
        i = 0.01
        self.world.debug.draw_string(
            self.controller.waypoint.transform.location,
            'o',
            draw_shadow=True,
            color=carla.Color(r=0, g=0, b=255),
            life_time=1)
        try:
            while last_lane_waypoint.lane_id > -4:  # get waypoint of forth's lane
                last_lane_waypoint = last_lane_waypoint.get_right_lane()
            # print("lane id : ", last_lane_waypoint.lane_id)
        except:
            print("4-th lane not found")

        # self.world.debug.draw_string(last_lane_waypoint.transform.location,
        #                                  '4', draw_shadow=True,
        #                                  color=carla.Color(r=0, g=255, b=255), life_time=9999)

        # print(self.ego_Lane)
        # if self.max_Lane_num ==3:
        #     print("e")
        if self.max_Lane_num != self.pre_max_Lane_num:
            self.index += 1
            self.pre_max_Lane_num = self.max_Lane_num
        # print(self.index)
        if self.index % 2 == 0:
            while search_raidus <= distance:
                # pre_distance = distance
                distance = (
                    (last_lane_waypoint.next(i)[0].transform.location.x -
                     self.lane_change_point[self.index].x)**2 +
                    (last_lane_waypoint.next(i)[0].transform.location.y -
                     self.lane_change_point[self.index].y)**2 +
                    (last_lane_waypoint.next(i)[0].transform.location.z -
                     self.lane_change_point[self.index].z)**2)**0.5
                # if pre_distance <= distance:
                #     print("wrong")
                #     return distance + i
                if round(distance - search_raidus) > 0:
                    i += round(distance - search_raidus)
                    # break
                else:
                    return distance + i
        else:
            distance = math.hypot(
                last_lane_waypoint.transform.location.x -
                self.lane_change_point[self.index].x,
                last_lane_waypoint.transform.location.y -
                self.lane_change_point[self.index].y)
            return -distance

        # if self.max_Lane_num ==4:
        #         while search_raidus <= distance:
        #             pre_distance = distance
        #             # distance = ((last_lane_waypoint.next(i)[0].x-self.lane_start_point.x)**2+(last_lane_waypoint.next(i)[0].y-self.lane_start_point.y)**2+(last_lane_waypoint.next(i)[0].z-self.lane_start_point.z)**2)**0.5
        #             distance = ((last_lane_waypoint.next(i)[0].transform.location.x-self.lane_start_point[self.section].x)**2+(last_lane_waypoint.next(i)[0].transform.location.y-self.lane_start_point[self.section].y)**2+(last_lane_waypoint.next(i)[0].transform.location.z-self.lane_start_point[self.section].z)**2)**0.5
        #
        #             # print("distance :",distance , "i :", i)
        #             if pre_distance <= distance:
        #                 print("pre_distance <= distance error")
        #                 break
        #             elif round(distance - search_raidus) > 0:
        #                 i += round(distance - search_raidus)
        #             else:
        #                 return min(distance + i, self.ROI_length)
        #             # print("i updated :", i)
        #         # self.max_Lane_num =3
        # elif self.max_Lane_num == 3:
        #     while search_raidus <= distance:
        #         distance = ((last_lane_waypoint.next(i)[0].transform.location.x - self.lane_finished_point[
        #             self.section].x) ** 2 + (last_lane_waypoint.next(i)[0].transform.location.y -
        #                                      self.lane_finished_point[self.section].y) ** 2 + (
        #                             last_lane_waypoint.next(i)[0].transform.location.z -
        #                             self.lane_finished_point[self.section].z) ** 2) ** 0.5
        #         self.world.debug.draw_string(last_lane_waypoint.next(i)[0].transform.location,
        #                                      'o', draw_shadow=True,
        #                                      color=carla.Color(r=255, g=255, b=0), life_time=9999)
        #         if pre_distance <= distance:
        #             print("pre_distance <= distance error")
        #             break
        #         elif round(distance - search_raidus) > 0:
        #             i += round(distance - search_raidus)
        #         else:
        #             return min(distance + i, self.ROI_length)
        #
        #         if round(distance - search_raidus) > 0:
        #             i += round(distance - search_raidus)
        #         else:
        #             return max(-(distance + i), -self.ROI_length)

    def safety_check(self, decision, safe_lane_change_again_time=5):
        # print("method : ", self.agent.selection_method)
        # if decision==-1 and self.ego_Lane ==1:
        #     print("here")
        # elif decision ==1 and self.ego_Lane ==self.max_Lane_num:
        #     print("here")
        if decision != 0 and decision != None:
            if (time.time() -
                    self.lane_change_time) <= safe_lane_change_again_time:
                return 0  #즉 직진
            elif self.agent.selection_method == 'random' and decision == 1 and self.ego_Lane == self.max_Lane_num:
                action = random.randrange(-1, 1)
                return action
            elif self.agent.selection_method == 'random' and decision == -1 and self.ego_Lane == 1:
                action = random.randrange(0, 2)
                return action
            elif self.ego_Lane == self.max_Lane_num and decision == 1:
                return int(self.agent.q_value[0][0:2].argmax().item()) - 1
            elif self.ego_Lane == 1 and decision == -1:
                return int(self.agent.q_value[0]
                           [1:3].argmax().item())  #not max exception
            elif decision == 1 and self.ego_Lane != self.max_Lane_num:
                self.lane_change_time = time.time()
                return decision
            elif decision == -1 and self.ego_Lane != 1:
                self.lane_change_time = time.time()
                return decision
            else:  #3차선에서 우 차도 판단, 1차선에서 좌차선 판단
                if self.agent.selection_method == 'random' and decision == 1 and self.ego_Lane == self.max_Lane_num:
                    action = random.randrange(-1, 1)
                    return action
                elif self.agent.selection_method == 'random' and decision == -1 and self.ego_Lane == 1:
                    action = random.randrange(0, 2)
                    return action
                elif self.ego_Lane == self.max_Lane_num and decision == 1:
                    return int(self.agent.q_value[0][0:2].argmax().item()) - 1
                elif self.ego_Lane == 1 and decision == -1:
                    return int(self.agent.q_value[0][1:3].argmax().item())
        else:
            return decision

    # def safety_check_between_vehicles(self):
    #     if extra_lists

    def main_test(self):
        restart_time = time.time()
        PATH = "/home/a/RL_decision/trained_info.tar"
        print(torch.cuda.get_device_name())
        clock = pygame.time.Clock()
        Keyboardcontrol = KeyboardControl(self, False)
        display = pygame.display.set_mode((self.width, self.height),
                                          pygame.HWSURFACE | pygame.DOUBLEBUF)

        self.lane_start_point = [
            carla.Location(x=14.905815, y=-135.747452, z=0.000000),
            carla.Location(x=172.745468, y=-364.531799, z=0.000000),
            carla.Location(x=382.441040, y=-212.488907, z=0.000000)
        ]
        self.lane_finished_point = [
            carla.Location(x=14.631096, y=-205.746918, z=0.000000),
            carla.Location(x=232.962860, y=-364.149139, z=0.000000),
            carla.Location(x=376.542816, y=-10.352980, z=0.000000)
        ]
        self.lane_change_point = [
            carla.Location(x=14.905815, y=-135.747452, z=0.000000),
            carla.Location(x=14.631096, y=-205.746918, z=0.000000),
            carla.Location(x=172.745468, y=-364.531799, z=0.000000),
            carla.Location(x=232.962860, y=-364.149139, z=0.000000),
            carla.Location(x=382.441040, y=-212.488907, z=0.000000),
            carla.Location(x=376.542816, y=-10.352980, z=0.000000)
        ]

        self.world.debug.draw_string(carla.Location(x=14.905815,
                                                    y=-135.747452,
                                                    z=0.000000),
                                     'o',
                                     draw_shadow=True,
                                     color=carla.Color(r=0, g=255, b=0),
                                     life_time=9999)
        self.world.debug.draw_string(carla.Location(x=14.631096,
                                                    y=-205.746918,
                                                    z=0.000000),
                                     'o',
                                     draw_shadow=True,
                                     color=carla.Color(r=0, g=255, b=0),
                                     life_time=9999)
        # ---------------------------#

        self.world.debug.draw_string(carla.Location(x=172.745468,
                                                    y=-364.531799,
                                                    z=0.000000),
                                     'o',
                                     draw_shadow=True,
                                     color=carla.Color(r=0, g=255, b=0),
                                     life_time=9999)
        self.world.debug.draw_string(carla.Location(x=232.962860,
                                                    y=-364.149139,
                                                    z=0.000000),
                                     'o',
                                     draw_shadow=True,
                                     color=carla.Color(r=0, g=255, b=0),
                                     life_time=9999)
        # ---------------------------#
        self.world.debug.draw_string(carla.Location(x=382.441040,
                                                    y=-212.488907,
                                                    z=0.000000),
                                     'o',
                                     draw_shadow=True,
                                     color=carla.Color(r=0, g=255, b=0),
                                     life_time=9999)
        self.world.debug.draw_string(carla.Location(x=376.542816,
                                                    y=-10.352980,
                                                    z=0.000000),
                                     'o',
                                     draw_shadow=True,
                                     color=carla.Color(r=0, g=255, b=0),
                                     life_time=9999)

        lane_distance_between_points = []
        for i in range(len(self.lane_finished_point)):
            lane_distance_between_points.append(
                ((self.lane_start_point[i].x - self.lane_finished_point[i].x)**
                 2 + (self.lane_start_point[i].y -
                      self.lane_finished_point[i].y)**2 +
                 (self.lane_start_point[i].z - self.lane_finished_point[i].z)**
                 2)**0.5)

        pre_decision = None
        while True:
            # if time.time()-restart_time > 10:
            #     print("restart")
            #     self.restart()
            if Keyboardcontrol.parse_events(client, self, clock):
                return
            self.spectator.set_transform(
                carla.Transform(
                    self.player.get_transform().location +
                    carla.Location(z=50), carla.Rotation(pitch=-90)))
            self.camera_rgb.render(display)
            self.hud.render(display)
            pygame.display.flip()

            ## Get max lane ##
            # print("start get lane")
            if self.section < len(lane_distance_between_points):

                self.lane_distance_between_start = (
                    (self.player.get_transform().location.x -
                     self.lane_start_point[self.section].x)**2 +
                    (self.player.get_transform().location.y -
                     self.lane_start_point[self.section].y)**2)**0.5
                self.lane_distance_between_end = (
                    (self.player.get_transform().location.x -
                     self.lane_finished_point[self.section].x)**2 +
                    (self.player.get_transform().location.y -
                     self.lane_finished_point[self.section].y)**2)**0.5

                # print("self.lane_distance_between_start : ",self.lane_distance_between_start,"self.lane_distance_between_end :",self.lane_distance_between_end, "lane_distance_between_points[section]",lane_distance_between_points[self.section],"section :", self.section)
                if max(lane_distance_between_points[self.section], self.lane_distance_between_start, self.lane_distance_between_end) == \
                        lane_distance_between_points[self.section]:
                    self.max_Lane_num = 3
                    # world.debug.draw_string(self.player.get_transform().location, 'o', draw_shadow = True,
                    #                                 color = carla.Color(r=255, g=255, b=0), life_time = 999)

                elif max(lane_distance_between_points[self.section], self.lane_distance_between_start, self.lane_distance_between_end) == \
                        self.lane_distance_between_start and self.max_Lane_num ==3:
                    self.section += 1
                    self.max_Lane_num = 4
                    if self.section >= len(lane_distance_between_points
                                           ):  # when, section_num = 3
                        self.section = 0
            ## finished get max lane ##
            # print("finished get lane")

            self.search_distance_valid()
            # print("distance :" ,,"max_lane_num : ", self.max_Lane_num)

            if self.max_Lane_num == 3:
                self.world.debug.draw_string(
                    self.player.get_transform().location,
                    'o',
                    draw_shadow=True,
                    color=carla.Color(r=255, g=255, b=0),
                    life_time=9999)
            if time.time() - self.lane_change_time > 10:
                self.lane_change_time = time.time()
                if pre_decision is None:
                    self.decision = 1
                    self.ego_Lane += 1
                    pre_decision = 1

                elif pre_decision == 1:
                    pre_decision = -1
                    self.ego_Lane += -1
                    self.decision = -1

                elif pre_decision == -1:
                    self.decision = 1
                    self.ego_Lane += 1
                    pre_decision = 1

            else:
                self.decision = 0

            self.controller.apply_control(self.decision)
            # self.world.wait_for_tick(10.0)
            clock.tick(30)

            self.hud.tick(self, clock)

    def main(self):
        PATH = "/home/a/RL_decision/trained_info.tar"
        print(torch.cuda.get_device_name())
        clock = pygame.time.Clock()
        Keyboardcontrol = KeyboardControl(self, False)
        display = pygame.display.set_mode((self.width, self.height),
                                          pygame.HWSURFACE | pygame.DOUBLEBUF)
        self.agent = decision_driving_Agent(self.input_size, self.output_size,
                                            True, 1000, self.extra_num)
        self.lane_start_point = [
            carla.Location(x=14.905815, y=-135.747452, z=0.000000),
            carla.Location(x=172.745468, y=-364.531799, z=0.000000),
            carla.Location(x=382.441040, y=-212.488907, z=0.000000)
        ]
        self.lane_finished_point = [
            carla.Location(x=14.631096, y=-205.746918, z=0.000000),
            carla.Location(x=232.962860, y=-364.149139, z=0.000000),
            carla.Location(x=376.542816, y=-10.352980, z=0.000000)
        ]
        self.lane_change_point = [
            carla.Location(x=14.905815, y=-135.747452, z=0.000000),
            carla.Location(x=14.631096, y=-205.746918, z=0.000000),
            carla.Location(x=172.745468, y=-364.531799, z=0.000000),
            carla.Location(x=232.962860, y=-364.149139, z=0.000000),
            carla.Location(x=382.441040, y=-212.488907, z=0.000000),
            carla.Location(x=376.542816, y=-10.352980, z=0.000000)
        ]

        self.world.debug.draw_string(carla.Location(x=14.905815,
                                                    y=-135.747452,
                                                    z=0.000000),
                                     'o',
                                     draw_shadow=True,
                                     color=carla.Color(r=0, g=255, b=0),
                                     life_time=9999)
        self.world.debug.draw_string(carla.Location(x=14.631096,
                                                    y=-205.746918,
                                                    z=0.000000),
                                     'o',
                                     draw_shadow=True,
                                     color=carla.Color(r=0, g=255, b=0),
                                     life_time=9999)
        # ---------------------------#

        self.world.debug.draw_string(carla.Location(x=172.745468,
                                                    y=-364.531799,
                                                    z=0.000000),
                                     'o',
                                     draw_shadow=True,
                                     color=carla.Color(r=0, g=255, b=0),
                                     life_time=9999)
        self.world.debug.draw_string(carla.Location(x=232.962860,
                                                    y=-364.149139,
                                                    z=0.000000),
                                     'o',
                                     draw_shadow=True,
                                     color=carla.Color(r=0, g=255, b=0),
                                     life_time=9999)
        # ---------------------------#
        self.world.debug.draw_string(carla.Location(x=376.542816,
                                                    y=-10.352980,
                                                    z=0.000000),
                                     'o',
                                     draw_shadow=True,
                                     color=carla.Color(r=0, g=255, b=0),
                                     life_time=9999)
        self.world.debug.draw_string(carla.Location(x=382.441040,
                                                    y=-212.488907,
                                                    z=0.000000),
                                     'o',
                                     draw_shadow=True,
                                     color=carla.Color(r=0, g=255, b=0),
                                     life_time=9999)
        lane_distance_between_points = []
        for i in range(len(self.lane_finished_point)):
            lane_distance_between_points.append(
                (self.lane_start_point[i].x -
                 self.lane_finished_point[i].x)**2 +
                (self.lane_start_point[i].y -
                 self.lane_finished_point[i].y)**2 +
                (self.lane_start_point[i].z -
                 self.lane_finished_point[i].z)**2)

        epoch_init = 0
        # if(os.path.exists(PATH)):
        #     print("저장된 가중치 불러옴")
        #     checkpoint = torch.load(PATH)
        #
        #     self.agent.model.load_state_dict(checkpoint['model_state_dict'])
        #     device = torch.device('cuda')
        #     self.agent.model.to(device)
        #     self.agent.optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
        #     self.agent.buffer = checkpoint['memorybuffer']
        #     epoch_init = checkpoint['epoch']

        # self.agent.buffer.load_state_dict(self.save_dir['memorybuffer'])

        # self.is_first_time = False
        # controller = VehicleControl(self, True)
        # self.player.apply_control(carla.Vehicle
        # Control(throttle=1.0, steer=0.0, brake=0.0))
        # vehicles = self.world.get_actors().filter('vehicle.*')
        # for i in vehicles:
        #     print(i.id)
        try:
            n_iters = 150
            is_error = 0

            for epoch in range(epoch_init, n_iters):
                # cnt = 0
                first_time_print = True

                [state, x_static] = self.get_next_state()  #초기 상태 s0 초기화
                while (True):
                    if Keyboardcontrol.parse_events(client, self, clock):
                        return

                    self.camera_rgb.render(display)
                    self.hud.render(display)
                    pygame.display.flip()

                    self.spectator.set_transform(
                        carla.Transform(
                            self.player.get_transform().location +
                            carla.Location(z=100), carla.Rotation(pitch=-90)))

                    ## Get max lane ##
                    if self.section < len(lane_distance_between_points):
                        self.lane_distance_between_start = (
                            (self.player.get_transform().location.x -
                             self.lane_start_point[self.section].x)**2 +
                            (self.player.get_transform().location.y -
                             self.lane_start_point[self.section].y)**2)
                        self.lane_distance_between_end = (
                            (self.player.get_transform().location.x -
                             self.lane_finished_point[self.section].x)**2 +
                            (self.player.get_transform().location.y -
                             self.lane_finished_point[self.section].y)**2)

                        # print("self.lane_distance_between_start : ",self.lane_distance_between_start,"self.lane_distance_between_end :",self.lane_distance_between_end, "lane_distance_between_points[self.section]",lane_distance_between_points[self.section],"self.section :", self.section)
                        if max(lane_distance_between_points[self.section], self.lane_distance_between_start,
                               self.lane_distance_between_end) == \
                                lane_distance_between_points[self.section]:
                            self.max_Lane_num = 3
                            # world.debug.draw_string(self.player.get_transform().location, 'o', draw_shadow = True,
                            #                                 color = carla.Color(r=255, g=255, b=0), life_time = 999)

                        elif max(lane_distance_between_points[self.section], self.lane_distance_between_start,
                                 self.lane_distance_between_end) == \
                                self.lane_distance_between_start and self.max_Lane_num == 3:
                            self.section += 1
                            self.max_Lane_num = 4
                            if self.section >= len(lane_distance_between_points
                                                   ):  # when, section_num = 3
                                self.section = 0
                    ## finished get max lane ##
                    ##visualize when, max lane ==3 ##
                    if self.max_Lane_num == 3:
                        self.world.debug.draw_string(
                            self.waypoint.transform.location,
                            'o',
                            draw_shadow=True,
                            color=carla.Color(r=255, g=255, b=255),
                            life_time=9999)
                    # [self.extra_list, self.extra_dl_list] = self.agent.search_extra_in_ROI(self.extra_list,self.player,self.extra_dl_list)

                    ## finished to visualize ##

                    if self.agent.is_training:
                        ##dqn 과정##
                        # 가중치 초기화 (pytroch 내부)
                        # 입실론-그리디 행동 탐색 (act function)
                        # 메모리 버퍼에 MDP 튜플 얻기   ㅡ (step function)
                        # 메모리 버퍼에 MDP 튜플 저장   ㅡ
                        # optimal Q 추정             ㅡ   (learning function)
                        # Loss 계산                  ㅡ
                        # 가중치 업데이트              ㅡ

                        if epoch % 10 == 0:
                            # [w, b] = self.agent.model.parameters()  # unpack parameters
                            self.save_dir = torch.save(
                                {
                                    'epoch':
                                    epoch,
                                    'model_state_dict':
                                    self.agent.model.state_dict(),
                                    'optimizer_state_dict':
                                    self.agent.optimizer.state_dict(),
                                    'memorybuffer':
                                    self.agent.buffer
                                }, PATH)
                        # print(clock.get_fps())
                        # if  time.time() - self.simul_time >10 and clock.get_fps()  < 15:
                        #     self.restart()
                        #     time.sleep(3)
                        #     continue
                        if self.decision is not None:
                            [next_state, next_x_static] = self.get_next_state()
                            sample = [
                                state, x_static, self.decision, reward,
                                next_state, next_x_static, done
                            ]
                            self.agent.buffer.append(sample)

                        # print("befor act")
                        self.decision = self.agent.act(state, x_static)
                        # print("after act")

                        # print(decision)
                        # if self.decision ==1 and self.max_Lane_num==self.ego_Lane:
                        #     print( " ")
                        # print("befroe safte check/ 판단 :", self.decision, "최대 차선 :", self.max_Lane_num, "ego lane :",self.ego_Lane)

                        self.decision = self.safety_check(self.decision)
                        # print("판단 :", self.decision, "최대 차선 :", self.max_Lane_num, "ego lane :",self.ego_Lane)

                        # print("before")
                        is_error = self.controller.apply_control(self.decision)
                        # print("after")

                        # print("extra_controller 개수 :", len(self.extra_controller_list))
                        # for i in range(len(self.extra_controller_list)):
                        #     self.extra_controller_list[i].apply_control()

                        # print("before step")
                        [state, x_static, decision, reward, __, _,
                         done] = self.step(self.decision)
                        # print("after step")

                        if done:
                            print("epsilon :", self.agent.epsilon)
                            print("epoch : ", epoch, "누적 보상 : ",
                                  self.accumulated_reward)
                            writer.add_scalar('누적 보상 ',
                                              self.accumulated_reward, epoch)
                            if len(self.agent.buffer.size()
                                   ) > self.agent.batch_size:
                                # print("start learning")
                                for i in range(300):
                                    self.agent.learning()
                            # print("finished learning")
                            client.set_timeout(10)
                            self.restart()
                            break

                    else:
                        self.agent.act(state, x_static)

                    clock.tick(40)
                    self.hud.tick(self, clock)

        finally:
            print('\ndestroying %d vehicles' % len(self.extra_list))
            # client.apply_batch([carla.command.DestroyActor(x) for x in self.extra_list])

            print('destroying actors.')
            # client.apply_batch([carla.command.DestroyActors(x.id) for x in self.actor_list])
            # client.apply_batch([carla.command.DestroyActors(x.id) for x in self.extra_list])
            for actor in self.actor_list:
                # print("finally 에서 actor 제거 :", self.actor_list)
                if actor.is_alive:
                    actor.destroy()
            for extra in self.extra_list:
                # print("finally 에서 actor 제거 :", self.extra_list)
                if extra.is_alive:
                    extra.destroy()

            # pygame.quit()
            print('done.')
Esempio n. 3
0
class CarlaEnv():
    pygame.init()
    font = pygame.font.init()

    def __init__(self, world):
        #화면 크기
        self.width = 800
        self.height = 600
        #센서 종류
        self.actor_list = []
        self.extra_list = []
        self.extra_controller_list = []
        self.player = None
        self.camera_rgb = None
        self.camera_semseg = None
        self.lane_invasion_sensor = None
        self.collision_sensor = None
        self.gnss_sensor = None
        self.waypoint = None
        self.path = []

        self.world = world
        self.map = world.get_map()
        self.spectator = self.world.get_spectator()
        self.hud = HUD(self.width, self.height)
        self.waypoints = self.map.generate_waypoints(3.0)
        ## visualize all waypoints ##
        # for n, p in enumerate(self.waypoints):
        # if n>1000:
        #     break
        # world.debug.draw_string(p.transform.location, 'o', draw_shadow=True,
        #                         color=carla.Color(r=255, g=255, b=255), life_time=30)

        self.extra_num = 5
        self.control_mode = None

        self.restart()
        self.main()

    def restart(self):
        blueprint_library = world.get_blueprint_library()
        # start_pose = random.choice(self.map.get_spawn_points())
        start_pose = self.map.get_spawn_points()[102]

        ##spawn points 시뮬레이션 상 출력##
        # print(start_pose)
        # for n, x in enumerate(self.map.get_spawn_points()):
        #     world.debug.draw_string(x.location, 'o', draw_shadow=True,
        #                             color=carla.Color(r=0, g=255, b=255), life_time=30)

        # self.load_traj()

        self.waypoint = self.map.get_waypoint(start_pose.location,
                                              lane_type=carla.LaneType.Driving)
        # print(self.waypoint.transform)
        ## Ego vehicle의 global Route 출력##
        # world.debug.draw_string(self.waypoint.transform.location, 'o', draw_shadow=True,
        #                         color=carla.Color(r=0, g=255, b=255), life_time=100)

        # print(start_pose)
        # print(self.waypoint.transform)

        # self.controller = MPCController.Controller

        self.spectator.set_transform(
            carla.Transform(start_pose.location + carla.Location(z=50),
                            carla.Rotation(pitch=-90)))

        self.player = world.spawn_actor(
            random.choice(blueprint_library.filter('vehicle.bmw.grandtourer')),
            start_pose)
        self.actor_list.append(self.player)
        # vehicle.set_simulate_physics(False)

        self.camera_rgb = RGBSensor(self.player, self.hud)
        self.actor_list.append(self.camera_rgb.sensor)

        self.camera_semseg = SegmentationCamera(self.player, self.hud)
        self.actor_list.append(self.camera_semseg.sensor)

        self.collision_sensor = CollisionSensor(self.player,
                                                self.hud)  # 충돌 여부 판단하는 센서
        self.actor_list.append(self.collision_sensor.sensor)

        self.lane_invasion_sensor = LaneInvasionSensor(
            self.player, self.hud)  # lane 침입 여부 확인하는 센서
        self.actor_list.append(self.lane_invasion_sensor.sensor)

        self.gnss_sensor = GnssSensor(self.player)
        self.actor_list.append(self.gnss_sensor.sensor)

        # --------------
        # Spawn Surrounding vehicles
        # --------------

        # spawn_points = carla.Transform(start_pose.location+carla.Location(0,10,0),start_pose.rotation)  #world.get_map().get_spawn_points()
        # spawn_points = self.map.get_waypoint(spawn_points.location,lane_type=carla.LaneType.Driving)
        spawn_points = world.get_map().get_spawn_points()[85:]
        number_of_spawn_points = len(
            world.get_map().get_spawn_points())  #len(spawn_points)

        if self.extra_num <= number_of_spawn_points:
            # random.shuffle(spawn_points)
            pass
        elif self.extra_num > number_of_spawn_points:
            msg = 'requested %d vehicles, but could only find %d spawn points'
            print(msg)
            # logging.warning(msg, self.extra_num, number_of_spawn_points)
            self.extra_num = number_of_spawn_points

        blueprints = world.get_blueprint_library().filter('vehicle.*')
        blueprints = [
            x for x in blueprints
            if int(x.get_attribute('number_of_wheels')) == 4
        ]
        # blueprints = [x for x in blueprints if not x.id.endswith('isetta')]
        # blueprints = [x for x in blueprints if not x.id.endswith('carlacola')]

        # print(number_of_spawn_points)
        for n, transform in enumerate(spawn_points):

            ## surrounding vehicle 차량 spawn 지점 visualize
            #     world.debug.draw_string(transform.location, 'o', draw_shadow=True,
            #                             color=carla.Color(r=255, g=255, b=255), life_time=30)

            if n >= self.extra_num:
                break
            if transform == start_pose:
                continue
            blueprint = random.choice(blueprints)
            if blueprint.has_attribute('color'):
                color = random.choice(
                    blueprint.get_attribute('color').recommended_values)
                blueprint.set_attribute('color', color)
            if blueprint.has_attribute('driver_id'):
                driver_id = random.choice(
                    blueprint.get_attribute('driver_id').recommended_values)
                blueprint.set_attribute('driver_id', driver_id)
            # blueprint.set_attribute('role_name', 'autopilot')
            # batch.append(SpawnActor(blueprint, transform).then(SetAutopilot(FutureActor, True)))

            extra = world.spawn_actor(
                random.choice(
                    blueprint_library.filter('vehicle.bmw.grandtourer')),
                transform)
            extra_pose = self.map.get_waypoint(
                transform.location, lane_type=carla.LaneType.Driving)
            self.extra_controller_list.append(
                Pure_puresuit_controller(extra, extra_pose, None, 30))  # km/h
            # extra.set_autopilot(True)
            self.extra_list.append(extra)

        # for response in client.apply_batch_sync(batch):
        #     if response.error:
        #         logging.error(response.error)
        #     else:
        #         self.extra_list.append(response.actor_id)

    def draw_image(self, surface, image, blend=False):
        array = np.frombuffer(image.raw_data, dtype=np.dtype("uint8"))
        array = np.reshape(array, (image.height, image.width, 4))
        array = array[:, :, :3]
        array = array[:, :, ::-1]
        image_surface = pygame.surfarray.make_surface(array.swapaxes(0, 1))
        if blend:
            image_surface.set_alpha(100)
        surface.blit(image_surface, (0, 0))

    def save_traj(self, current_location):
        f = open('route.txt', 'a')
        f.write(str(current_location.transform.location.x) + " ")
        f.write(str(current_location.transform.location.y) + " ")
        f.write(str(current_location.transform.location.z))
        f.write("\n")
        f.close()

    def load_traj(self):
        f = open("route.txt", 'r')
        while True:
            line = f.readline()
            if not line: break
            _list = line.split(' ')
            _list = list(map(float, _list))
            point = carla.Transform()
            point.location.x = _list[0]
            point.location.y = _list[1]
            point.location.z = _list[2]
            self.path.append(point)
        #trajectory visualize
        # for n, x in enumerate(self.path):
        #     world.debug.draw_string(x.location, 'o', draw_shadow=True,
        #                             color=carla.Color(r=255, g=255, b=255), life_time=30)
        f.close()

    def get_gray_segimg(self, image_semseg):
        image_size = 96
        array = np.frombuffer(image_semseg.raw_data, dtype=np.dtype("uint8"))
        array = array.reshape((self.height, self.width, 4))
        array = array[:, :, :3]
        array = array[:, :, ::-1]
        array = cv2.cvtColor(array, cv2.COLOR_BGR2GRAY)

        cv2.imshow("camera.semantic_segmentation", array)
        cv2.resizeWindow('Resized Window', 100, 100)
        cv2.waitKey(1)

        array = np.reshape([cv2.resize(array, (image_size, image_size))],
                           (1, image_size, image_size))  # (1, 96, 96)

        return array

    def main(self):

        clock = pygame.time.Clock()
        display = pygame.display.set_mode((self.width, self.height),
                                          pygame.HWSURFACE | pygame.DOUBLEBUF)
        controller = Pure_puresuit_controller(self.player, self.waypoint,
                                              self.extra_list, 50)  # km/h
        Keyboardcontrol = KeyboardControl(self, False)
        # controller = VehicleControl(self, True)
        # self.player.apply_control(carla.Vehicle
        # Control(throttle=1.0, steer=0.0, brake=0.0))
        vehicles = self.world.get_actors().filter('vehicle.*')
        # for i in vehicles:
        #     print(i.id)
        cnt = 0
        decision = None
        try:
            # Create a synchronous mode context.
            with CarlaSyncMode(world,
                               self.camera_rgb.sensor,
                               self.camera_semseg.sensor,
                               fps=40) as sync_mode:
                while True:
                    if Keyboardcontrol.parse_events(client, self, clock):
                        return
                    clock.tick()

                    cnt += 1
                    if cnt == 1000:
                        print('수해유 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ')
                        decision = 1
                        aa = controller.apply_control(decision)
                    else:
                        aa = controller.apply_control()

                    for i in range(len(self.extra_controller_list)):
                        self.extra_controller_list[i].apply_control()

                    # world.debug.draw_string(aa, 'o', draw_shadow=True,
                    #                         color=carla.Color(r=255, g=255, b=255), life_time=-1)
                    # print(self.waypoint.transform)
                    # print(self.player.get_transform())
                    # print(dist)

                    self.hud.tick(self, clock)
                    # print( clock.get_fps())
                    # Advance the simulation and wait for the data.
                    snapshot, image_rgb, image_semseg = sync_mode.tick(
                        timeout=0.1)

                    # Choose the next waypoint and update the car location.
                    # self.waypoint = random.choice(self.waypoint.next(1.5))
                    # self.player.set_transform(self.waypoint.transform)
                    # self.world.debug.draw_point(self.waypoint.transform.location,size=0.1,color=carla.Color(r=255, g=255, b=255),life_time=1)

                    ## player trajactory history visualize ## -> project_to_road = false 시 차량의 궤적, True 시 차선센터 출력
                    # curent_location=self.map.get_waypoint(self.player.get_transform().location,project_to_road=True)
                    # world.debug.draw_string(curent_location.transform.location, 'o', draw_shadow=True,
                    #                         color=carla.Color(r=0, g=255, b=255), life_time=100)
                    ##이동 궤적 저장
                    # self.save_traj(curent_location)

                    # self.world.debug.draw_point(ww.transform.location,size=0.1,color=carla.Color(r=255, g=255, b=255),life_time=1)

                    self.spectator.set_transform(
                        carla.Transform(
                            self.player.get_transform().location +
                            carla.Location(z=100), carla.Rotation(pitch=-90)))

                    image_semseg.convert(
                        carla.ColorConverter.CityScapesPalette)
                    gray_image = self.get_gray_segimg(image_semseg)
                    # fps = round(1.0 / snapshot.timestamp.delta_seconds)

                    # Draw the display.
                    self.draw_image(display, image_rgb)
                    # self.draw_image(display, image_semseg, blend=False)
                    # pygame.gfxdraw.filled_circle(display,int(self.waypoint.transform.location.x),int(self.waypoint.transform.location.y),5,(255,255,255))
                    self.hud.render(display)

                    pygame.display.flip()

        finally:
            print('\ndestroying %d vehicles' % len(self.extra_list))
            # client.apply_batch([carla.command.DestroyActor(x) for x in self.extra_list])

            print('destroying actors.')
            for actor in self.actor_list:
                actor.destroy()
            for extra in self.extra_list:
                extra.destroy()

            pygame.quit()
            print('done.')