Exemplo n.º 1
0
    def reset(self):
        # camera
        dronesim.installcamera([0,-15,180], 110, 63, 0.01, 500)

        # state related property
        position_hunter = [0.0, 0.0, 10.0] # x, y, z
        orientation_hunter = [0.0, 0.0, 0.0] # roll, pitch, taw

        #the position of target is generated randomly and should not exceed the vision range of hunter
        position_target = (np.array([10.0, 0.0, 10.0]) + np.random.normal(0, 5)).tolist() # x, y, z
        orientation_target = [0.0, 0.0, 0.0] # roll, pitch, yaw
        self.roll_target, self.pitch_target, self.yaw_target, self.thrust_target = 0, 0, 0, 0

        absolute_x, absolute_y, target_in_front = dronesim.projection(position_hunter, orientation_hunter, position_target, float(self.width), float(self.height)) 
        distance = np.linalg.norm(np.array(position_hunter) - np.array(position_target))
        # invalid initialization
        while (not target_in_front or absolute_x > self.max_absolute_x or absolute_x < self.min_absolute_x or absolute_y > self.max_absolute_y or absolute_y < self.min_absolute_y or distance > self.max_initial_distance or distance < self.min_initial_distance):
            position_target = (np.array([10.0, 0.0, 10.0]) + np.random.normal(0, 5)).tolist()
            absolute_x, absolute_y, target_in_front = dronesim.projection(position_hunter, orientation_hunter, position_target, float(self.width), float(self.height)) 
            distance = np.linalg.norm(np.array(position_hunter) - np.array(position_target))

        dronesim.siminit(np.squeeze(np.asarray(position_hunter)),np.squeeze(np.asarray(orientation_hunter)), \
                         np.squeeze(np.asarray(position_target)),np.squeeze(np.asarray(orientation_target)), 20, 5)
        
        self.init_pos_target = position_target

        self.previous_distance = distance
        self.state = self.get_state()

        self.iteration = 0
        self.episodes = 0

        return self.state
    def reset(self):
        # camera
        dronesim.installcamera([0, -15, 180], 110, 63, 0.01, 500)
        # state related property
        position_hunter = [0.0, 0.0, 10.0]  # x, y, z
        orientation_hunter = [0.0, 0.0, 0.0]  # roll, pitch, taw

        # position_hunter = np.matrix([44.41015975 -3.96066086  7.88967305])
        # orientation_hunter = np.matrix([-11.276222823141545, 8.627114153116235, 27.256829024182572])
        # position_target = np.matrix([17.49014858 -5.98676401 21.02755752])

        #the position of target is generated randomly and should not exceed the vision range of hunter
        position_target = (np.array([10.0, 0.0, 10.0]) +
                           np.random.normal(0, 5)).tolist()  # x, y, z
        orientation_target = [0.0, 0.0, 0.0]  # roll, pitch, yaw
        self.roll_target, self.pitch_target, self.yaw_target, self.thrust_target = 0, 0, 0, 0
        # print('error c')
        # print('lala: ', position_hunter, orientation_hunter, position_target, self.width, self.height)
        absolute_x, absolute_y, target_in_front = dronesim.projection(
            position_hunter, orientation_hunter, position_target,
            float(self.width), float(self.height))
        # print('position: ', position_hunter)
        # print('error e')
        # print('pos_hunter: ', position_hunter)
        # print('pos_target: ', position_target)
        distance = np.linalg.norm(
            np.array(position_hunter) - np.array(position_target))
        # invalid initialization
        # print('error d')
        while (not target_in_front or absolute_x > self.max_absolute_x
               or absolute_x < self.min_absolute_x
               or absolute_y > self.max_absolute_y
               or absolute_y < self.min_absolute_y
               or distance > self.max_initial_distance
               or distance < self.min_initial_distance):
            position_target = (np.array([10.0, 0.0, 10.0]) +
                               np.random.normal(0, 5)).tolist()
            absolute_x, absolute_y, target_in_front = dronesim.projection(
                position_hunter, orientation_hunter, position_target,
                float(self.width), float(self.height))
            distance = np.linalg.norm(
                np.array(position_hunter) - np.array(position_target))

        # print(position_hunter, orientation_hunter, position_target)

        # position_hunter = np.matrix([38.5, 26.8, 30.3])
        # orientation_hunter = np.matrix([20.5,12.9,84.9])
        # position_target = np.matrix([16.4,8.8,39.9])
        # print('error a')
        dronesim.siminit(np.squeeze(np.asarray(position_hunter)),np.squeeze(np.asarray(orientation_hunter)), \
                         np.squeeze(np.asarray(position_target)),np.squeeze(np.asarray(orientation_target)), 20, 5)
        # print('error b')
        self.previous_distance = distance
        self.state = self.get_state()

        self.iteration = 0
        self.episodes = 0

        return self.state
    def get_state(self):
        position_hunter, orientation_hunter, acc_hunter, position_target, orientation_target, acc_target, thrust_hunter = dronesim.siminfo(
        )

        orientation_hunter = [
            math.degrees(degree) for degree in orientation_hunter
        ]
        orientation_target = [
            math.degrees(degree) for degree in orientation_target
        ]

        self.flag = False
        try:
            absolute_x, absolute_y, target_in_front = dronesim.projection(
                position_hunter, orientation_hunter, position_target,
                float(self.width), float(self.height))
        except ValueError:
            logger.info('###########################################')
            logger.info('episodes: {}, iteration: {}'.format(
                self.episodes, self.iteration))
            logger.info('prev pos hunter: {}'.format(self.prev_pos_hunter))
            logger.info('prev ori hunter: {}'.format(self.prev_ori_hunter))
            logger.info('prev pos target: {}'.format(self.prev_pos_target))
            logger.info('prev ori target: {}'.format(self.prev_ori_target))
            logger.info('prev acc hunter: {}'.format(self.prev_acc_hunter))
            logger.info('prev acc target: {}'.format(self.prev_acc_target))
            logger.info('prev thrust hunter: {}'.format(
                self.prev_thrust_hunter))
            logger.info('hunter position: {}'.format(position_hunter))
            logger.info('hunter ori: {}'.format(orientation_hunter))
            logger.info('target position: {}'.format(position_target))
            logger.info('target ori: {}'.format(orientation_target))
            logger.info('hunter acc: {}'.format(acc_hunter))
            logger.info('target acc: {}'.format(acc_target))
            logger.info('thrust hunter: {}'.format(thrust_hunter))
            logger.info('init pos target: {}'.format(self.init_pos_target))

            logger.info('target action: {},{},{},{}'.format(
                self.roll_target, self.pitch_target, self.yaw_target,
                self.thrust_target))
            logger.info('hunter action: {},{},{},{}'.format(
                self.test_roll_hunter, self.test_pitch_hunter,
                self.test_yaw_hunter, self.test_thrust_hunter))

            self.flag = True  # force program to terminate
            # raise ValueError
            return self.state

        self.prev_pos_hunter = position_hunter
        self.prev_ori_hunter = orientation_hunter
        self.prev_pos_target = position_target
        self.prev_ori_target = orientation_target
        self.prev_acc_hunter = acc_hunter
        self.prev_acc_target = acc_target
        self.prev_thrust_hunter = thrust_hunter
        '''
        if (1 + self.iteration) % 200 == 0:
            logger.info('episodes: {},iteration: {}'.format(self.episodes, self.iteration))
            logger.info('pos hunter: {}'.format(position_hunter))
            logger.info('pos target: {}'.format(position_target))
            logger.info('ori hunter: {}'.format(orientation_hunter))
            logger.info('ori target: {}'.format(orientation_target))
            logger.info('acc hunter: {}'.format(acc_hunter))
            logger.info('acc target: {}'.format(acc_target))
            logger.info('thrust hunter: {}'.format(thrust_hunter))
            logger.info('target action: {},{},{},{}'.format(self.roll_target, self.pitch_target, self.yaw_target, self.thrust_target))
            logger.info('hunter action: {},{},{},{}'.format(self.test_roll_hunter, self.test_pitch_hunter, self.test_yaw_hunter, self.test_thrust_hunter))
        '''
        if target_in_front:
            relative_x, relative_y = absolute_x / self.width, absolute_y / self.height
        target_coordinate_in_view = np.array((relative_x, relative_y)).flatten(
        ) if target_in_front and self.min_absolute_x < absolute_x < self.max_absolute_x and self.min_absolute_y < absolute_y < self.max_absolute_y else np.array(
            (-1, -1))

        self.distance = np.linalg.norm(
            np.array(position_hunter) - np.array(position_target))
        # get distance within hunter and target
        distance = np.array(
            [self.distance / self.max_initial_distance]
        )  # if (target_coordinate_in_view == np.array((-1, -1)))[0] else np.array([0])

        # maintain a 8-length deque
        if self.coordinate_queue is None and self.distance_queue is None:
            self.coordinate_queue = deque([target_coordinate_in_view] * 8)
            self.distance_queue = deque([distance] * self.queue_length)
        else:
            self.coordinate_queue.append(target_coordinate_in_view)
            self.coordinate_queue.popleft()

            self.distance_queue.append(distance)
            self.distance_queue.popleft()

        coordinate_state = np.concatenate(list(self.coordinate_queue))
        distance_state = np.concatenate(list(self.distance_queue))

        # define state
        state = np.concatenate([
            np.array([
                orientation_hunter[0] / self.max_roll_angle,
                orientation_hunter[1] / self.max_pitch_angle,
                orientation_hunter[2] / self.max_yaw_angle
            ]).flatten(),
            np.array((thrust_hunter - self.min_absolute_thrust) /
                     self.thrust_sensity + self.min_thrust).flatten(),
            coordinate_state, distance_state
        ], 0)

        # if self.tmp_pos.any() != None :
        #     tmp_pos = self.tmp_pos
        # self.tmp_pos = position_hunter
        return state
    def get_state(self):
        position_hunter, orientation_hunter, acc_hunter, position_target, orientation_target, acc_target, thrust_hunter = dronesim.siminfo(
        )

        # print('ori: ', orientation_hunter)

        orientation_hunter = [
            math.degrees(degree) for degree in orientation_hunter
        ]
        orientation_target = [
            math.degrees(degree) for degree in orientation_target
        ]

        try:
            absolute_x, absolute_y, target_in_front = dronesim.projection(
                position_hunter, orientation_hunter, position_target,
                float(self.width), float(self.height))
        except ValueError:
            self.distance = 100
            return self.state

        if target_in_front:
            relative_x, relative_y = absolute_x / self.width, absolute_y / self.height
        target_coordinate_in_view = np.array((relative_x, relative_y)).flatten(
        ) if target_in_front and self.min_absolute_x < absolute_x < self.max_absolute_x and self.min_absolute_y < absolute_y < self.max_absolute_y else np.array(
            (-1, -1))

        # print('!!!!####')
        # print(position_hunter, orientation_hunter, position_target)
        # print(0 < absolute_x < 256, 0 < absolute_y < 144, target_in_front)
        # print(target_coordinate_in_view)

        self.distance = np.linalg.norm(
            np.array(position_hunter) - np.array(position_target))
        # get distance within hunter and target
        distance = np.array([self.distance / self.max_initial_distance])

        # maintain a 8-length deque
        if self.coordinate_queue is None and self.distance_queue is None:
            self.coordinate_queue = deque([target_coordinate_in_view] * 8)
            self.distance_queue = deque([distance] * self.queue_length)
        else:
            self.coordinate_queue.append(target_coordinate_in_view)
            self.coordinate_queue.popleft()

            self.distance_queue.append(distance)
            self.distance_queue.popleft()

        coordinate_state = np.concatenate(list(self.coordinate_queue))
        distance_state = np.concatenate(list(self.distance_queue))

        # define state
        state = np.concatenate([
            np.array([
                orientation_hunter[0] / self.max_roll_angle,
                orientation_hunter[1] / self.max_pitch_angle,
                orientation_hunter[2] / self.max_yaw_angle
            ]).flatten(),
            np.array((thrust_hunter - self.min_absolute_thrust) /
                     self.thrust_sensity + self.min_thrust).flatten(),
            coordinate_state, distance_state
        ], 0)

        # if self.tmp_pos.any() != None :
        #     tmp_pos = self.tmp_pos
        # self.tmp_pos = position_hunter
        return state