def check_kin_feasibility(s0Id, s1Id):
    res = fullBody.isReachableFromState(s0Id, s1Id, True)
    if not res[0]:
        print "Error : isReachable returned False !"
        raise Exception('Error : isReachable returned False !')
    r(configs[s0Id])
    c0 = np.array(fullBody.getCenterOfMass())
    c1 = np.array(res[1])
    c2 = np.array(res[2])
    r(configs[s1Id])
    c3 = np.array(fullBody.getCenterOfMass())
    s0 = State(fullBody, sId=s0Id)
    s1 = State(fullBody, sId=s1Id)
    s0_orig = State(s0.fullBody,
                    q=s0.q(),
                    limbsIncontact=s0.getLimbsInContact())
    s1_orig = State(s1.fullBody,
                    q=s1.q(),
                    limbsIncontact=s1.getLimbsInContact())
    moving_limb = s0.contactsVariations(s1)
    smid, successMid = StateHelper.removeContact(s0_orig, moving_limb[0])
    if not successMid:
        return False

    successFeasible = True
    print "check first part"
    successFeasible = successFeasible and check_traj(s0_orig, c0, c1)
    print "check mid part"
    successFeasible = successFeasible and check_traj(smid, c1, c2)
    print "check last part"
    successFeasible = successFeasible and check_traj(s1_orig, c2, c3, True)
    return successFeasible
예제 #2
0
def check_muscod_traj(fullBody, cs, s0_, s1_):
    if cs.size() != 3:
        print("Contact sequence must be of size 3 (one step)")
        return False, False
    kin_valid = True
    stab_valid = True
    stab_valid_discretized = True
    # create copy of original states :
    s0 = State(fullBody, q=s0_.q(), limbsIncontact=s0_.getLimbsInContact())
    s1 = State(fullBody, q=s1_.q(), limbsIncontact=s1_.getLimbsInContact())
    moving_limb = s0.contactsVariations(s1)
    smid, success = StateHelper.removeContact(s0, moving_limb[0])
    if not success:
        print("Error in creation of intermediate state")
        return False, False
    phases = []
    c_array = []
    dc_array = []
    ddc_array = []
    t_array = []
    states = [s0, smid, s1]
    states_copy = [
        State(fullBody, q=s0_.q(), limbsIncontact=s0_.getLimbsInContact()),
        State(fullBody, q=smid.q(), limbsIncontact=smid.getLimbsInContact()),
        State(fullBody, q=s1_.q(), limbsIncontact=s1_.getLimbsInContact())
    ]
    for k in range(3):
        phases += [cs.contact_phases[k]]
        state_traj = stdVecToMatrix(phases[k].state_trajectory).transpose()
        control_traj = stdVecToMatrix(phases[k].control_trajectory).transpose()
        c_array = state_traj[:, :3]
        dc_array = state_traj[:, 3:6]
        ddc_array = control_traj[:, :3]
        t_array = stdVecToMatrix(phases[k].time_trajectory).transpose()

        for i in range(len(c_array)):
            #if kin_valid and not states[k].projectToCOM(c_array[i].tolist()[0],500) :
            #    kin_valid = False
            q = states_copy[k].q()
            q[-6:-3] = dc_array[i].tolist()[0]
            q[-3:] = ddc_array[i].tolist()[0]
            if stab_valid_discretized and not states_copy[
                    k].fullBody.isConfigBalanced(
                        q,
                        states_copy[k].getLimbsInContact(),
                        CoM=c_array[i].tolist()[0]):
                stab_valid_discretized = False
        for i in range(int(len(c_array) / 100)):
            q = states_copy[k].q()
            q[-6:-3] = dc_array[i * 100].tolist()[0]
            q[-3:] = ddc_array[i * 100].tolist()[0]
            if stab_valid and not states_copy[k].fullBody.isConfigBalanced(
                    q,
                    states_copy[k].getLimbsInContact(),
                    CoM=c_array[i * 100].tolist()[0]):
                stab_valid = False

    return kin_valid, stab_valid, stab_valid_discretized