예제 #1
0
    # load robot
    robot = Centauro(sim, fixed_base=True)

    # desired Velocity Manipulability for CoM
    desired_velocity_manip = np.array([[0.01, 0.0, 0.0], [0.0, 0.04, 0.0],
                                       [0.0, 0.0, 0.005]])

    # proportional gain
    Km = 200 * np.eye(6)

else:
    raise NotImplementedError("The given robot has not been implemented")

# Initial conditions for visualization
# Display initial and desired manipulability ellipsoid
q0 = robot.get_joint_positions()
Jcom = robot.get_center_of_mass_jacobian(q0)
velocity_manip = robot.compute_velocity_manipulability_ellipsoid(Jcom)
robot.draw_velocity_manipulability_ellipsoid(link_id=-1,
                                             JJT=10 * desired_velocity_manip,
                                             color=(0.1, 0.75, 0.1, 0.6))
ellipsoid_id = robot.draw_velocity_manipulability_ellipsoid(
    link_id=-1, JJT=10 * velocity_manip[0:3, 0:3], color=(0.75, 0.1, 0.1, 0.6))

# Run simulator
for i in count():
    robot.compute_and_draw_com_position(radius=0.03)
    print("CoM: {}".format(robot.get_center_of_mass_position()))

    # get current joint position
    qt = robot.get_joint_positions()
w = 0.01
r = 0.2

for t in count():
    # move sphere
    sphere.position = np.array([
        0.5, r * np.cos(w * t + np.pi / 2),
        (1. - r) + r * np.sin(w * t + np.pi / 2)
    ])

    # get current end-effector position and velocity in the task/operational space
    x = robot.get_link_world_positions(link_id)
    dx = robot.get_link_world_linear_velocities(link_id)

    # Get joint positions
    q = robot.get_joint_positions()

    # Get linear jacobian
    if robot.has_floating_base():
        J = robot.get_linear_jacobian(link_id, q=q)[:, qIdx + 6]
    else:
        J = robot.get_linear_jacobian(link_id, q=q)[:, qIdx]

    # Pseudo-inverse: \hat{J} = J^T (JJ^T + k^2 I)^{-1}
    Jp = robot.get_damped_least_squares_inverse(J, damping)

    # evaluate damped-least-squares IK
    dq = Jp.dot(kp * (sphere.position - x) - kd * dx)

    # set joint positions
    q = q[qIdx] + dq * dt
# OPTION 2: using Jacobian and manual damped-least-squares IK ###
elif solver_flag == 1:
    kp = 50  # 5 if velocity control, 50 if position control
    kd = 0  # 2*np.sqrt(kp)

    for _ in count():
        # get current position in the task/operational space
        # x = robot.get_link_positions(link_id, wrt_link_id)
        # dx = robot.get_link_linear_velocities(link_id, wrt_link_id)
        x = robot.get_link_world_positions(link_id)
        dx = robot.get_link_world_linear_velocities(link_id)
        print("(xd - x) = {}".format(xd - x))

        # Get joint configuration
        q = robot.get_joint_positions()

        # Get linear jacobian
        if robot.has_floating_base():
            J = robot.get_linear_jacobian(link_id, q=q)[:, qIdx + 6]
        else:
            J = robot.get_linear_jacobian(link_id, q=q)[:, qIdx]

        # Pseudo-inverse
        # Jp = robot.get_pinv_jacobian(J)
        # Jp = J.T.dot(np.linalg.inv(J.dot(J.T) + damping*np.identity(3)))   # this also works
        Jp = robot.get_damped_least_squares_inverse(J, damping)

        # evaluate damped-least-squares IK
        dq = Jp.dot(kp * (xd - x) - kd * dx)