def __get_force_reach(self): ori = self.inputs["in_body_orientation"].astype(np.float32) pos = self.inputs["in_body_position"].astype(np.float32) target_pos = self.inputs["in_target_position"].astype(np.float32) self.target_pos = target_pos body_euler_yaw = transformations.euler_from_quaternion(ori)[2] direction = self.target_pos - pos distance = np.linalg.norm(direction) dir_world_pos = (- math.cos(body_euler_yaw), -math.sin(body_euler_yaw)) angle = util.angle2D_sign((direction[0], direction[1]), dir_world_pos) if self.last_angle is None: self.last_angle = angle if self.last_angle - angle > math.pi: anguler_vel_yaw = 0 elif self.last_angle - angle < -math.pi: anguler_vel_yaw = 0 else: anguler_vel_yaw = self.last_angle - angle self.last_angle = angle if math.fabs(angle) < math.pi / 18.0 or distance < 0.3: return self.__get_force_straight(self.target_pos) else: power = 1.5*angle - 200.0*anguler_vel_yaw return power, -power
def __get_force_reach(self, input_dat): ori = input_dat[0] pos = input_dat[1] vel = input_dat[2] self.target_pos = input_dat[3] body_euler_yaw = transformations.euler_from_quaternion(ori)[2] direction = self.target_pos - pos distance = np.linalg.norm(direction) dir_world_pos = (-math.cos(body_euler_yaw), -math.sin(body_euler_yaw)) angle = util.angle2D_sign((direction[0], direction[1]), dir_world_pos) if self.last_angle is None: self.last_angle = angle if self.last_angle - angle > math.pi: anguler_vel_yaw = 0 elif self.last_angle - angle < -math.pi: anguler_vel_yaw = 0 else: anguler_vel_yaw = self.last_angle - angle self.last_angle = angle if math.fabs(angle) < math.pi / 18.0 or distance < 0.3: return self.__get_force_straight(ori, pos, vel, self.target_pos) else: power = 1.5 * angle - 200.0 * anguler_vel_yaw return (power, -power)
def __get_force_reach(self): ori = self.inputs["in_body_orientation"].astype(np.float32) pos = self.inputs["in_body_position"].astype(np.float32) target_pos = self.inputs["in_target_position"].astype(np.float32) self.target_pos = target_pos body_euler_yaw = transformations.euler_from_quaternion(ori)[2] direction = self.target_pos - pos distance = np.linalg.norm(direction) dir_world_pos = (-math.cos(body_euler_yaw), -math.sin(body_euler_yaw)) angle = util.angle2D_sign((direction[0], direction[1]), dir_world_pos) if self.last_angle is None: self.last_angle = angle if self.last_angle - angle > math.pi: anguler_vel_yaw = 0 elif self.last_angle - angle < -math.pi: anguler_vel_yaw = 0 else: anguler_vel_yaw = self.last_angle - angle self.last_angle = angle if math.fabs(angle) < math.pi / 18.0 or distance < 0.3: return self.__get_force_straight(self.target_pos) else: power = 1.5 * angle - 200.0 * anguler_vel_yaw return power, -power
def __get_force_reach(self, input_dat): ori = input_dat[0] pos = input_dat[1] vel = input_dat[2] self.target_pos = input_dat[3] body_euler_yaw = transformations.euler_from_quaternion(ori)[2] direction = self.target_pos - pos distance = np.linalg.norm(direction) dir_world_pos = (- math.cos(body_euler_yaw), -math.sin(body_euler_yaw)) angle = util.angle2D_sign((direction[0], direction[1]), dir_world_pos) if self.last_angle is None: self.last_angle = angle if self.last_angle - angle > math.pi: anguler_vel_yaw = 0 elif self.last_angle - angle < -math.pi: anguler_vel_yaw = 0 else: anguler_vel_yaw = self.last_angle - angle self.last_angle = angle if math.fabs(angle) < math.pi / 18.0 or distance < 0.3: return self.__get_force_straight(ori, pos, vel, self.target_pos) else: power = 1.5*angle - 200.0*anguler_vel_yaw return (power, -power)