Exemple #1
0
    def _compute_dense_reward_and_check_goal(self, segments_pos_0,
                                             segments_pos_1):

        # Get position of goal
        goal_pos = self.sim.getRigidBody("obstacle_goal").getPosition()

        pole_enclosed_0 = point_inside_polygon(
            np.array(segments_pos_0)[:, 0:2], goal_pos)
        pole_enclosed_1 = point_inside_polygon(
            np.array(segments_pos_1)[:, 0:2], goal_pos)
        poles_enclosed_diff = pole_enclosed_0 - pole_enclosed_1

        # Check if final goal is reached
        is_correct_height = all_points_below_z(segments_pos_0,
                                               max_z=GOAL_MAX_Z)

        # Check if grippers are close enough to each other
        position_g0 = to_numpy_array(
            self.sim.getRigidBody("gripper_0").getPosition())
        position_g1 = to_numpy_array(
            self.sim.getRigidBody("gripper_1").getPosition())
        is_grippers_close = np.linalg.norm(position_g1 - position_g0) < 0.02

        final_goal_reached = pole_enclosed_0 and is_correct_height and is_grippers_close

        return poles_enclosed_diff + 5 * float(
            final_goal_reached), final_goal_reached
Exemple #2
0
    def _is_goal_reached(self, segment_pos):
        """
        Goal is reached if the cable is closed around the center obstacle. This is the case if the segments
        are on the ground, the grippers are close to each other and the center pole is within the
        dlo polygon.
        :return:
        """

        # Get position of goal
        goal_pos = self.sim.getRigidBody("obstacle_goal").getPosition()

        # Check if goal obstacle in enclosed by dlo
        is_within_polygon = point_inside_polygon(
            np.array(segment_pos)[:, 0:2], goal_pos)

        # Check if cable has correct height
        is_correct_height = all_points_below_z(segment_pos, max_z=GOAL_MAX_Z)

        # Check if grippers are close enough to each other
        position_g0 = to_numpy_array(
            self.sim.getRigidBody("gripper_0").getPosition())
        position_g1 = to_numpy_array(
            self.sim.getRigidBody("gripper_1").getPosition())
        is_grippers_close = np.linalg.norm(position_g1 - position_g0) < 0.01

        if is_within_polygon and is_correct_height and is_grippers_close:
            return True
        return False
Exemple #3
0
def is_goal_reached(sim, segments_pos):

    # Get position of goal
    goal_pos = sim.getRigidBody("obstacle_goal").getPosition()

    # Check if goal obstacle in enclosed by dlo
    is_within_polygon = point_inside_polygon(np.array(segments_pos)[:,0:2], goal_pos)

    # Check if cable has correct height
    is_correct_height = all_points_below_z(segments_pos, max_z=GOAL_MAX_Z)

    # Check if grippers are close enough to each other
    position_g0 = to_numpy_array(sim.getRigidBody("gripper_0").getPosition())
    position_g1 = to_numpy_array(sim.getRigidBody("gripper_1").getPosition())
    is_grippers_close = np.linalg.norm(position_g1-position_g0) < 0.02

    if is_within_polygon and is_correct_height and is_grippers_close:
        return True
    return False
Exemple #4
0
def get_rigid_body_velocity(sim, name):
    """Get velocity of AGX rigid body.
    :param sim: AGX Dynamics simulation object
    :param name: name of rigid body
    :return: NumPy array with rigid body rotation
    """
    rigid_body = sim.getRigidBody(name)
    velocity = to_numpy_array(rigid_body.getVelocity())
    logger.debug("Rigid body {}, velocity: {}".format(name, velocity))

    return velocity
Exemple #5
0
def get_rigid_body_rotation(sim, name):
    """Get rotation of AGX rigid body.
    :param sim: AGX Dynamics simulation object
    :param name: name of rigid body
    :return: NumPy array with rigid body rotation
    """
    rigid_body = sim.getRigidBody(name)
    rotation = to_numpy_array(rigid_body.getRotation())
    logger.debug("Rigid body {}, rotation: {}".format(name, rotation))

    return rotation
Exemple #6
0
def get_rigid_body_position(sim, key):
    """Get position of AGX rigid body.
    :param sim: AGX Dynamics simulation object
    :param key: name of rigid body
    :return: NumPy array with rigid body position
    """
    rigid_body = sim.getRigidBody(key)
    position = to_numpy_array(rigid_body.getPosition())
    logger.debug("Rigid body {}, position: {}".format(key, position))

    return position
Exemple #7
0
    def _compute_segments_pos(self):
        segments_pos = []
        dlo = agxCable.Cable.find(self.sim, "DLO")
        segment_iterator = dlo.begin()
        n_segments = dlo.getNumSegments()
        for i in range(n_segments):
            if not segment_iterator.isEnd():
                pos = segment_iterator.getGeometry().getPosition()
                segments_pos.append(to_numpy_array(pos))
                segment_iterator.inc()

        return segments_pos
Exemple #8
0
def get_constraint_force_torque(sim, name, constraint_name):
    """Gets force an torque on rigid object, computed by a constraint defined by 'constraint_name'.
    :param sim: AGX Simulation object
    :param name: name of rigid body
    :param constraint_name: Name indicating which constraint contains force torque information for this object
    :return: force an torque
    """
    rigid_body = sim.getRigidBody(name)
    constraint = sim.getConstraint(constraint_name)

    force = agx.Vec3()
    torque = agx.Vec3()
    constraint.getLastForce(rigid_body, force, torque)

    force = to_numpy_array(force)
    torque = to_numpy_array(torque)

    logger.debug("Constraint {}, force: {}, torque: {}".format(
        constraint_name, force, torque))

    return np.concatenate((force, torque))
Exemple #9
0
def get_cable_segment_positions_and_velocities(cable):
    """Get AGX Cable segments' center of mass positions.
    :param cable: AGX Cable object
    :return: NumPy array with segments' positions
    """
    num_segments = cable.getNumSegments()
    cable_positions = np.zeros(shape=(3, num_segments))
    cable_velocities = np.zeros(shape=(3, num_segments))
    segment_iterator = cable.begin()
    for i in range(num_segments):
        if not segment_iterator.isEnd():
            position = segment_iterator.getRigidBody().getPosition()
            velocity = segment_iterator.getRigidBody().getVelocity()
            cable_positions[:, i] = to_numpy_array(position)
            cable_velocities[:, i] = to_numpy_array(velocity)
            segment_iterator.inc()
        else:
            logger.error(
                'AGX segment iteration finished early. Number or cable segments may be wrong.'
            )

    return cable_positions, cable_velocities
Exemple #10
0
def get_ring_segment_positions(sim, ring_name, num_segments=None):
    """Get ring segments positions.
    :param sim: AGX Dynamics simulation object
    :param ring_name: name of ring object
    :param num_segments: number of segments making up the ring (possibly saves search time)
    :return: NumPy array with segments' positions
    """
    if not num_segments:
        rbs = sim.getRigidBodies()
        ring_segments_positions = np.zeros(shape=(3, ))
        for rb in rbs:
            if ring_name in rb.getName():
                position = to_numpy_array(rb.getPosition())
                ring_segments_positions = np.stack(
                    [ring_segments_positions, position], axis=0)
    else:
        ring_segments_positions = np.zeros(shape=(3, num_segments + 1))
        for i in range(1, num_segments + 1):
            rb = sim.getRigidBody(ring_name + "_" + str(i))
            ring_segments_positions[:,
                                    i - 1] = to_numpy_array(rb.getPosition())

    return ring_segments_positions
Exemple #11
0
def sample_random_goal(sim, app=None, dof_vector=np.ones(3)):
    """Goal Randomization: Sample 2 points, and execute point-to-point trajectory
    :param sim: AGX Dynamics simulation object
    :param app: AGX Dynamics application object
    :param np.array dof_vector: desired degrees of freedom of the gripper(s), [x, y, z]
    """
    assert np.sum(dof_vector) >= 1, "There must be at least one degree of freedom"
    right_motor_x = sim.getConstraint1DOF("gripper_right_goal_joint_base_x").getMotor1D()
    right_motor_y = sim.getConstraint1DOF("gripper_right_goal_joint_base_y").getMotor1D()
    right_motor_z = sim.getConstraint1DOF("gripper_right_goal_joint_base_z").getMotor1D()
    right_gripper = sim.getRigidBody("gripper_right_goal")

    settling_time = 1
    n_waypoints = 2
    n_seconds = 10*n_waypoints + settling_time
    center = np.array([2 * (2 * RADIUS + SIZE_GRIPPER), 0, 0])
    waypoints = [to_numpy_array(right_gripper.getPosition())]
    scales = np.zeros(n_waypoints)
    for i in range(0, n_waypoints):
        waypoint, length = sample_sphere(center, [2 * (2 * RADIUS + SIZE_GRIPPER) + 4 * SIZE_GRIPPER,
                                                  LENGTH - 4 * SIZE_GRIPPER], [0, np.pi], [-np.pi / 2, np.pi / 2])
        waypoints.append(waypoint)
        scales[i] = length

    norm_scales = scales / sum(scales)
    time_scales = norm_scales*n_seconds

    t = sim.getTimeStamp()
    start_time = t
    while t < n_seconds:
        if app:
            app.executeOneStepWithGraphics()
        velocity = polynomial_trajectory(t, start_time, waypoints, time_scales, degree=3)
        velocity = velocity*dof_vector
        right_motor_x.setSpeed(velocity[0])
        right_motor_y.setSpeed(velocity[1])
        right_motor_z.setSpeed(velocity[2])

        t = sim.getTimeStamp()
        t_0 = t
        while t < t_0 + TIMESTEP * N_SUBSTEPS:
            sim.stepForward()
            t = sim.getTimeStamp()

    # reset timestamp, after simulation
    sim.setTimeStamp(0)
Exemple #12
0
def get_cable_segment_rotations(cable):
    """Get AGX Cable segments' center of mass rotations.
    :param cable: AGX Cable object
    :return: NumPy array with segments' rotations
    """
    num_segments = cable.getNumSegments()
    cable_segments_rotations = np.zeros(shape=(4, num_segments))
    segment_iterator = cable.begin()
    for i in range(num_segments):
        if not segment_iterator.isEnd():
            rotation = segment_iterator.getGeometry().getRotation()
            cable_segments_rotations[:, i] = to_numpy_array(rotation)
            segment_iterator.inc()
        else:
            logger.error(
                'AGX segment iteration finished early. Number or cable segments may be wrong.'
            )

    return cable_segments_rotations
Exemple #13
0
    def _get_observation(self):
        rgb_buffer = None
        depth_buffer = None
        for buffer in self.render_to_image:
            name = buffer.getName()
            if name == 'rgb_buffer':
                rgb_buffer = buffer
            elif name == 'depth_buffer':
                depth_buffer = buffer

        assert self.observation_type in ("rgb", "depth", "rgb_and_depth",
                                         "pos", "pos_and_vel")

        if self.observation_type == "rgb":
            image_ptr = rgb_buffer.getImageData()
            image_data = create_numpy_array(
                image_ptr, (self.image_size[0], self.image_size[1], 3),
                np.uint8)
            obs = np.flipud(image_data)
        elif self.observation_type == "depth":
            image_ptr = depth_buffer.getImageData()
            image_data = create_numpy_array(
                image_ptr, (self.image_size[0], self.image_size[1]),
                np.float32)
            obs = np.flipud(image_data)
        elif self.observation_type == "rgb_and_depth":

            obs = np.zeros((self.image_size[0], self.image_size[1], 4),
                           dtype=np.float32)

            image_ptr = rgb_buffer.getImageData()
            image_data = create_numpy_array(
                image_ptr, (self.image_size[0], self.image_size[1], 3),
                np.uint8)
            obs[:, :, 0:3] = np.flipud(image_data.astype(np.float32)) / 255

            image_ptr = depth_buffer.getImageData()
            image_data = create_numpy_array(
                image_ptr, (self.image_size[0], self.image_size[1]),
                np.float32)
            obs[:, :, 3] = np.flipud(image_data)
        elif self.observation_type == "pos":
            seg_pos = get_cable_segment_positions(
                cable=agxCable.Cable.find(self.sim, "DLO")).flatten()
            gripper = self.sim.getRigidBody("gripper_body")
            gripper_pos = to_numpy_array(gripper.getPosition())[0:3]
            cylinder = self.sim.getRigidBody("hollow_cylinder")
            cylinder_pos = cylinder.getPosition()
            ea = agx.EulerAngles().set(gripper.getRotation())
            gripper_rot = ea.y()

            obs = np.concatenate([
                gripper_pos, [gripper_rot], seg_pos,
                [cylinder_pos[0], cylinder_pos[1]]
            ])

        elif self.observation_type == "pos_and_vel":
            seg_pos, seg_vel = get_cable_segment_positions_and_velocities(
                cable=agxCable.Cable.find(self.sim, "DLO"))
            seg_pos = seg_pos.flatten()
            seg_vel = seg_vel.flatten()
            gripper = self.sim.getRigidBody("gripper_body")
            gripper_pos = to_numpy_array(gripper.getPosition())[0:3]
            gripper_vel = to_numpy_array(gripper.getVelocity())[0:3]
            gripper_vel_rot = to_numpy_array(gripper.getAngularVelocity())[2]
            cylinder = self.sim.getRigidBody("hollow_cylinder")
            cylinder_pos = cylinder.getPosition()
            ea = agx.EulerAngles().set(gripper.getRotation())
            gripper_rot = ea.y()

            obs = np.concatenate([
                gripper_pos, [gripper_rot], gripper_vel, [gripper_vel_rot],
                seg_pos, seg_vel, [cylinder_pos[0], cylinder_pos[1]]
            ])

        return obs
Exemple #14
0
    def _get_observation(self):
        rgb_buffer = None
        depth_buffer = None
        for buffer in self.render_to_image:
            name = buffer.getName()
            if name == 'rgb_buffer':
                rgb_buffer = buffer
            elif name == 'depth_buffer':
                depth_buffer = buffer

        assert self.observation_type in ("rgb", "depth", "rgb_and_depth",
                                         "pos", "pos_and_vel")

        if self.observation_type == "rgb":
            image_ptr = rgb_buffer.getImageData()
            image_data = create_numpy_array(
                image_ptr, (self.image_size[0], self.image_size[1], 3),
                np.uint8)
            obs = np.flipud(image_data)
        elif self.observation_type == "depth":
            image_ptr = depth_buffer.getImageData()
            image_data = create_numpy_array(
                image_ptr, (self.image_size[0], self.image_size[1]),
                np.float32)
            obs = np.flipud(image_data)
        elif self.observation_type == "rgb_and_depth":

            obs = np.zeros((self.image_size[0], self.image_size[1], 4),
                           dtype=np.float32)

            image_ptr = rgb_buffer.getImageData()
            image_data = create_numpy_array(
                image_ptr, (self.image_size[0], self.image_size[1], 3),
                np.uint8)
            obs[:, :, 0:3] = np.flipud(image_data.astype(np.float32)) / 255

            image_ptr = depth_buffer.getImageData()
            image_data = create_numpy_array(
                image_ptr, (self.image_size[0], self.image_size[1]),
                np.float32)
            obs[:, :, 3] = np.flipud(image_data)
        elif self.observation_type == "pos":

            goal_pos = to_numpy_array(
                self.sim.getRigidBody("ground").getPosition())[0:2]
            seg_pos = get_cable_segment_positions(
                cable=agxCable.Cable.find(self.sim, "DLO")).flatten()
            gripper = self.sim.getRigidBody("gripper")
            gripper_pos = to_numpy_array(gripper.getPosition())[0:3]
            obs = np.concatenate([gripper_pos, seg_pos, goal_pos])

        elif self.observation_type == "pos_and_vel":
            goal_pos = to_numpy_array(
                self.sim.getRigidBody("ground").getPosition())[0:2]
            seg_pos, seg_vel = get_cable_segment_positions_and_velocities(
                cable=agxCable.Cable.find(self.sim, "DLO"))
            seg_pos = seg_pos.flatten()
            seg_vel = seg_vel.flatten()
            gripper = self.sim.getRigidBody("gripper")
            gripper_pos = to_numpy_array(gripper.getPosition())[0:3]
            gripper_vel = to_numpy_array(gripper.getVelocity())[0:3]

            obs = np.concatenate(
                [gripper_pos, gripper_vel, seg_pos, seg_vel, goal_pos])

        return obs
Exemple #15
0
def sample_random_goal(sim, app=None, dof_vector=np.ones(3)):
    """Goal Randomization: Sample 2 points, and execute point-to-point trajectory
    :param sim: AGX Dynamics simulation object
    :param app: AGX Dynamics application object
    :param np.array dof_vector: desired degrees of freedom of the gripper(s), [x, y, z]
    """
    assert np.sum(
        dof_vector) >= 1, "There must be at least one degree of freedom"
    right_gripper = sim.getRigidBody("gripper_right_goal")
    right_motor_x = sim.getConstraint1DOF(
        "gripper_right_goal_joint_base_x").getMotor1D()
    right_motor_y = sim.getConstraint1DOF(
        "gripper_right_goal_joint_base_y").getMotor1D()
    right_motor_z = sim.getConstraint1DOF(
        "gripper_right_goal_joint_base_z").getMotor1D()

    left_gripper = sim.getRigidBody("gripper_left_goal")
    left_motor_x = sim.getConstraint1DOF(
        "gripper_left_goal_joint_base_x").getMotor1D()
    left_motor_y = sim.getConstraint1DOF(
        "gripper_left_goal_joint_base_y").getMotor1D()
    left_motor_z = sim.getConstraint1DOF(
        "gripper_left_goal_joint_base_z").getMotor1D()

    settling_time = 1
    n_seconds = 10 + settling_time
    center = np.array([0, 0, -CYLINDER_RADIUS])

    # Define trajectory waypoints
    waypoints_right = [
        to_numpy_array(right_gripper.getPosition()),
        np.array([LENGTH / 2, 0, -CYLINDER_RADIUS])
    ]
    scales_right = np.array([CYLINDER_RADIUS, 0])
    goal_point_right, scales_right[1] = sample_sphere(
        center, [2 * CYLINDER_RADIUS, LENGTH / 2], [np.pi / 2, np.pi], [
            -math.asin(CYLINDER_LENGTH / LENGTH),
            math.asin(CYLINDER_LENGTH / LENGTH)
        ])
    goal_point_right[0] = min(goal_point_right[0], CYLINDER_RADIUS)
    waypoints_right.append(goal_point_right)
    norm_scales_right = scales_right / sum(scales_right)
    time_scales_right = norm_scales_right * n_seconds

    scales_left = np.array([CYLINDER_RADIUS, 0])
    waypoints_left = [
        to_numpy_array(left_gripper.getPosition()),
        np.array([-LENGTH / 2, 0, -CYLINDER_RADIUS])
    ]
    goal_point_left, scales_left[1] = sample_sphere(
        center, [2 * CYLINDER_RADIUS, LENGTH / 2], [np.pi, 3 * np.pi / 2],
        [0, 0])
    goal_point_left[0] = max(goal_point_left[0], -CYLINDER_RADIUS)
    waypoints_left.append(goal_point_left)
    norm_scales_left = scales_left / sum(scales_left)
    time_scales_left = norm_scales_left * n_seconds

    t = sim.getTimeStamp()
    start_time = t
    while t < n_seconds:
        if app:
            app.executeOneStepWithGraphics()
        right_velocity = polynomial_trajectory(t,
                                               start_time,
                                               waypoints_right,
                                               time_scales_right,
                                               degree=3)
        right_velocity = right_velocity * dof_vector
        right_motor_x.setSpeed(right_velocity[0])
        right_motor_y.setSpeed(right_velocity[1])
        right_motor_z.setSpeed(right_velocity[2])
        left_velocity = polynomial_trajectory(t,
                                              start_time,
                                              waypoints_left,
                                              time_scales_left,
                                              degree=3)
        left_velocity = left_velocity * dof_vector
        left_motor_x.setSpeed(left_velocity[0])
        left_motor_y.setSpeed(left_velocity[1])
        left_motor_z.setSpeed(left_velocity[2])

        t = sim.getTimeStamp()
        t_0 = t
        while t < t_0 + TIMESTEP * N_SUBSTEPS:
            sim.stepForward()
            t = sim.getTimeStamp()

    # reset timestamp, after simulation
    sim.setTimeStamp(0)
Exemple #16
0
def sample_fixed_goal(sim, app=None):
    """Define the trajectory to generate fixed goal
    :param sim: AGX Dynamics simulation object
    :param app: AGX Dynamics application object
    """
    right_gripper = sim.getRigidBody("gripper_right_goal")
    right_motor_x = sim.getConstraint1DOF(
        "gripper_right_goal_joint_base_x").getMotor1D()
    right_motor_y = sim.getConstraint1DOF(
        "gripper_right_goal_joint_base_y").getMotor1D()
    right_motor_z = sim.getConstraint1DOF(
        "gripper_right_goal_joint_base_z").getMotor1D()

    left_gripper = sim.getRigidBody("gripper_left_goal")
    left_motor_x = sim.getConstraint1DOF(
        "gripper_left_goal_joint_base_x").getMotor1D()
    left_motor_y = sim.getConstraint1DOF(
        "gripper_left_goal_joint_base_y").getMotor1D()
    left_motor_z = sim.getConstraint1DOF(
        "gripper_left_goal_joint_base_z").getMotor1D()

    # Define trajectory waypoints
    waypoints_right = [
        to_numpy_array(right_gripper.getPosition()),
        np.array([LENGTH / 2, 0, -LENGTH / 2])
    ]
    waypoints_left = [
        to_numpy_array(left_gripper.getPosition()),
        np.array([-CYLINDER_RADIUS, 0, -LENGTH / 2])
    ]

    n_seconds = 20
    time_scale = np.array([n_seconds - 1])

    t = sim.getTimeStamp()
    start_time = t
    while t < n_seconds:
        if app:
            app.executeOneStepWithGraphics()
        velocity_right = polynomial_trajectory(t,
                                               start_time,
                                               waypoints_right,
                                               time_scale,
                                               degree=3)
        right_motor_x.setSpeed(velocity_right[0])
        right_motor_y.setSpeed(velocity_right[1])
        right_motor_z.setSpeed(velocity_right[2])
        velocity_left = polynomial_trajectory(t,
                                              start_time,
                                              waypoints_left,
                                              time_scale,
                                              degree=3)
        left_motor_x.setSpeed(velocity_left[0])
        left_motor_y.setSpeed(velocity_left[1])
        left_motor_z.setSpeed(velocity_left[2])

        t = sim.getTimeStamp()
        t_0 = t
        while t < t_0 + TIMESTEP * N_SUBSTEPS:
            sim.stepForward()
            t = sim.getTimeStamp()