예제 #1
0
파일: trajectories.py 프로젝트: nim65s/HQP
 def __call__(self, t):
     assert t >= 0.0, "Time must be non-negative"
     i = int(t / self._dt)
     if (i >= self._x_ref.shape[1]):
         raise ValueError(
             "Specified time exceeds the duration of the trajectory: " +
             str(t))
     M = self._M_ref[i]
     M.translation = self._x_ref[:, i]
     v = Motion.Zero()
     a = Motion.Zero()
     v.linear = self._v_ref[:, i]
     a.linear = self._a_ref[:, i]
     return (M, v, a)
def MotionFromVec(vect):
    if vect.shape[0] != 6 or vect.shape[1] != 1:
        raise ValueError("MotionFromVec take as input a vector of size 6")
    m = Motion.Zero()
    m.linear = np.matrix(vect[0:3])
    m.angular = np.matrix(vect[3:6])
    return m
 def compute_for_normalized_time(self, t):
     if t < 0:
         print "Trajectory called with negative time."
         return self.compute_for_normalized_time(0)
     elif t > self.t_total:
         print "Trajectory called after final time."
         return self.compute_for_normalized_time(self.t_total)
     self.M = SE3.Identity()
     self.v = Motion.Zero()
     self.a = Motion.Zero()
     self.M.translation = self.curves(t)
     self.v.linear = self.curves.d(t)
     self.a.linear = self.curves.dd(t)
     #rotation :
     if self.curves.isInFirstNonZero(t):
         self.M.rotation = self.placement_init.rotation.copy()
     elif self.curves.isInLastNonZero(t):
         self.M.rotation = self.placement_end.rotation.copy()
     else:
         # make a slerp between self.effector_placement[id][0] and [1] :
         quat0 = Quaternion(self.placement_init.rotation)
         quat1 = Quaternion(self.placement_end.rotation)
         t_rot = t - self.t_mid_begin
         """
   print "t : ",t
   print "t_mid_begin : ",self.t_mid_begin
   print "t_rot : ",t_rot
   print "t mid : ",self.t_mid
   """
         assert t_rot >= 0, "Error in the time intervals of the polybezier"
         assert t_rot <= (self.t_mid + 1e-6
                          ), "Error in the time intervals of the polybezier"
         u = t_rot / self.t_mid
         # normalized time without the pre defined takeoff/landing phases
         self.M.rotation = (quat0.slerp(u, quat1)).matrix()
         # angular velocity :
         dt = 0.001
         u_dt = dt / self.t_mid
         r_plus_dt = (quat0.slerp(u + u_dt, quat1)).matrix()
         self.v.angular = pin.log3(self.M.rotation.T * r_plus_dt) / dt
         r_plus2_dt = (quat0.slerp(u + (2. * u_dt), quat1)).matrix()
         next_angular_velocity = pin.log3(r_plus_dt.T * r_plus2_dt) / dt
         self.a.angular = (next_angular_velocity - self.v.angular) / dt
         #r_plus_dt = (quat0.slerp(u+u_dt,quat1)).matrix()
         #next_angular_vel = (pin.log3(self.M.rotation.T * r_plus_dt)/dt)
         #self.a.angular = (next_angular_vel - self.v.angular)/dt
     return self.M, self.v, self.a
예제 #4
0
    def __call__(self, t):
        assert (t - self._t_init
                ) >= 0.0, "Time must be greater than or equal to t_init"
        i = int((t - self._t_init) / self._dt)
        if (i >= self._x_ref.shape[1]):
            i = self._x_ref.shape[1] - 1


#       raise ValueError("Specified time exceeds the duration of the trajectory: "+str(t));

        M = self._M_final
        v = Motion.Zero()
        a = Motion.Zero()
        M.translation = self._x_ref[:, i]
        v.linear = self._v_ref[:, i]
        a.linear = self._a_ref[:, i]
        return (M, v, a)
 def __init__(self, placement_init, placement_final, time_interval):
     RefTrajectory.__init__(self, "TrajectorySE3LinearInterp")
     self.placement_init = placement_init
     self.placement_final = placement_final
     self.t0 = time_interval[0]
     self.t1 = time_interval[1]
     self.length = self.t1 - self.t0
     self.quat0 = Quaternion(self.placement_init.rotation)
     self.quat1 = Quaternion(self.placement_final.rotation)
     self.M = SE3.Identity()
     self.v = Motion.Zero()
     self.a = Motion.Zero()
     # constant velocity and null acceleration :
     self.v.linear = (placement_final.translation -
                      placement_final.translation) / self.length
     self.v.angular = pin.log3(placement_final.rotation.T *
                               placement_final.rotation) / self.length
def MotionFromVec(vect):
    """
    Convert a vector of size 6 to a pinocchio.Motion object. See MotiontoVec()
    :param vect: a numpy array or matrix of size 6
    :return: a Motion object
    """
    if vect.shape[0] != 6 or vect.shape[1] != 1:
        raise ValueError("MotionFromVec take as input a vector of size 6")
    m = Motion.Zero()
    m.linear = np.array(vect[0:3])
    m.angular = np.array(vect[3:6])
    return m
    def __init__(self, curves, placement_init, placement_end, time_interval):
        RefTrajectory.__init__(self, "BezierTrajectory")
        self.placement_init = placement_init
        self.placement_end = placement_end
        self.curves = curves
        self.time_interval = time_interval
        self.t_total = curves.max()
        assert abs(
            self.t_total - (time_interval[1] - time_interval[0])
        ) <= 1e-4, "time interval is not coherent with the length of the Bezier curves"
        assert len(
            curves.times
        ) % 2 == 0, "PolyBezier object contain an even number of curves, not implemented yet."
        id_mid = len(curves.times) / 2
        # retrieve the timings of the middle segment (duration and begin/end wrt to the other curves)
        self.t_mid_begin = curves.times[id_mid - 1]
        self.t_mid_end = curves.times[id_mid]
        self.t_mid = curves.curves[curves.numCurves() / 2].max()

        curves.computeDerivates()

        self.M = SE3.Identity()
        self.v = Motion.Zero()
        self.a = Motion.Zero()
예제 #8
0
def createMultiphaseShootingProblem(rmodel, rdata, csw, timeStep):
    """
  Create a Multiphase Shooting problem from the output of the centroidal solver.

  :params rmodel: robot model of type pinocchio::model
  :params rdata: robot data of type pinocchio::data
  :params csw: contact sequence wrapper of type ContactSequenceWrapper
  :params timeStep: Scalar timestep between nodes.

  :returns list of IntegratedActionModels
  """

    # -----------------------
    # Define Cost weights
    class Weights:
        com = 1e1
        regx = 1e-3
        regu = 0.
        swing_patch = 1e6
        forces = 0.
        contactv = 1e3
        # Define state cost vector for WeightedActivation
        ff_orientation = 1e1
        xweight = np.array([0] * 3 + [ff_orientation] * 3 + [1.] * (rmodel.nv - 6) + [1.] * rmodel.nv)
        xweight[range(18, 20)] = ff_orientation
        # for patch in swing_patch:  w.swing_patch.append(100.);
        # Define weights for the impact costs.
        imp_state = 1e2
        imp_com = 1e2
        imp_contact_patch = 1e6
        imp_act_com = m2a([0.1, 0.1, 3.0])

        # Define weights for the terminal costs
        term_com = 1e8
        term_regx = 1e4

    w = Weights()
    # ------------------------

    problem_models = []
    actuationff = ActuationModelFreeFloating(rmodel)
    State = StatePinocchio(rmodel)

    active_contact_patch = set()
    active_contact_patch_prev = set()
    for nphase, phase in enumerate(csw.cs.contact_phases):
        t0 = phase.time_trajectory[0]
        t1 = phase.time_trajectory[-1]
        N = int(round((t1 - t0) / timeStep)) + 1
        contact_model = ContactModelMultiple(rmodel)

        # Add contact constraints for the active contact patches.
        # Add SE3 cost for the non-active contact patches.
        swing_patch = []
        active_contact_patch_prev = active_contact_patch.copy()
        active_contact_patch.clear()
        for patch in csw.ee_map.keys():
            if getattr(phase, patch).active:
                active_contact_patch.add(patch)
                active_contact = ContactModel6D(rmodel,
                                                frame=rmodel.getFrameId(csw.ee_map[patch]),
                                                ref=getattr(phase, patch).placement)
                contact_model.addContact(patch, active_contact)
                # print nphase, "Contact ",patch," added at ", getattr(phase,patch).placement.translation.T
            else:
                swing_patch.append(patch)

        # Check if contact has been added in this phase. If this phase is not zero,
        # add an impulse model to deal with this contact.
        new_contacts = active_contact_patch.difference(active_contact_patch_prev)
        if nphase != 0 and len(new_contacts) != 0:
            # print nphase, "Impact ",[p for p in new_contacts]," added"
            imp_model = ImpulseModelMultiple(
                rmodel, {
                    "Impulse_" + patch: ImpulseModel6D(rmodel, frame=rmodel.getFrameId(csw.ee_map[patch]))
                    for patch in new_contacts
                })
            # Costs for the impulse of a new contact
            cost_model = CostModelSum(rmodel, nu=0)
            # State
            cost_regx = CostModelState(rmodel,
                                       State,
                                       ref=rmodel.defaultState,
                                       nu=actuationff.nu,
                                       activation=ActivationModelWeightedQuad(w.xweight))
            cost_model.addCost("imp_regx", cost_regx, w.imp_state)
            # CoM
            cost_com = CostModelImpactCoM(rmodel, activation=ActivationModelWeightedQuad(w.imp_act_com))
            cost_model.addCost("imp_CoM", cost_com, w.imp_com)
            # Contact Frameplacement
            for patch in new_contacts:
                cost_contact = CostModelFramePlacement(rmodel,
                                                       frame=rmodel.getFrameId(csw.ee_map[patch]),
                                                       ref=SE3(np.identity(3), csw.ee_splines[patch].eval(t0)[0]),
                                                       nu=actuationff.nu)
                cost_model.addCost("imp_contact_" + patch, cost_contact, w.imp_contact_patch)

            imp_action_model = ActionModelImpact(rmodel, imp_model, cost_model)
            problem_models.append(imp_action_model)

        # Define the cost and action models for each timestep in the contact phase.
        # untill [:-1] because in contact sequence timetrajectory, the end-time is
        # also included. e.g., instead of being [0.,0.5], time trajectory is [0,0.5,1.]
        for t in np.linspace(t0, t1, N)[:-1]:
            cost_model = CostModelSum(rmodel, actuationff.nu)

            # For the first node of the phase, add cost v=0 for the contacting foot.
            if t == 0:
                for patch in active_contact_patch:
                    cost_vcontact = CostModelFrameVelocity(rmodel,
                                                           frame=rmodel.getFrameId(csw.ee_map[patch]),
                                                           ref=m2a(Motion.Zero().vector),
                                                           nu=actuationff.nu)
                    cost_model.addCost("contactv_" + patch, cost_vcontact, w.contactv)

            # CoM Cost
            cost_com = CostModelCoM(rmodel, ref=m2a(csw.phi_c.com_vcom.eval(t)[0][:3, :]), nu=actuationff.nu)
            cost_model.addCost("CoM", cost_com, w.com)

            # Forces Cost
            for patch in contact_model.contacts.keys():
                cost_force = CostModelForce(rmodel,
                                            contactModel=contact_model.contacts[patch],
                                            ref=m2a(csw.phi_c.forces[patch].eval(t)[0]),
                                            nu=actuationff.nu)
                cost_model.addCost("forces_" + patch, cost_force, w.forces)
            # Swing patch cost
            for patch in swing_patch:
                cost_swing = CostModelFramePlacement(rmodel,
                                                     frame=rmodel.getFrameId(csw.ee_map[patch]),
                                                     ref=SE3(np.identity(3), csw.ee_splines[patch].eval(t)[0]),
                                                     nu=actuationff.nu)
                cost_model.addCost("swing_" + patch, cost_swing, w.swing_patch)
                # print t, "Swing cost ",patch," added at ", csw.ee_splines[patch].eval(t)[0][:3].T

            # State Regularization
            cost_regx = CostModelState(rmodel,
                                       State,
                                       ref=rmodel.defaultState,
                                       nu=actuationff.nu,
                                       activation=ActivationModelWeightedQuad(w.xweight))
            cost_model.addCost("regx", cost_regx, w.regx)
            # Control Regularization
            cost_regu = CostModelControl(rmodel, nu=actuationff.nu)
            cost_model.addCost("regu", cost_regu, w.regu)

            dmodel = DifferentialActionModelFloatingInContact(rmodel, actuationff, contact_model, cost_model)
            imodel = IntegratedActionModelEuler(dmodel, timeStep=timeStep)
            problem_models.append(imodel)

    # Create Terminal Model.
    contact_model = ContactModelMultiple(rmodel)
    # Add contact constraints for the active contact patches.
    swing_patch = []
    t = t1
    for patch in csw.ee_map.keys():
        if getattr(phase, patch).active:
            active_contact = ContactModel6D(rmodel,
                                            frame=rmodel.getFrameId(csw.ee_map[patch]),
                                            ref=getattr(phase, patch).placement)
            contact_model.addContact(patch, active_contact)
    cost_model = CostModelSum(rmodel, actuationff.nu)
    # CoM Cost
    cost_com = CostModelCoM(rmodel, ref=m2a(csw.phi_c.com_vcom.eval(t)[0][:3, :]), nu=actuationff.nu)
    cost_model.addCost("CoM", cost_com, w.term_com)

    # State Regularization
    cost_regx = CostModelState(rmodel,
                               State,
                               ref=rmodel.defaultState,
                               nu=actuationff.nu,
                               activation=ActivationModelWeightedQuad(w.xweight))
    cost_model.addCost("regx", cost_regx, w.term_regx)

    dmodel = DifferentialActionModelFloatingInContact(rmodel, actuationff, contact_model, cost_model)
    imodel = IntegratedActionModelEuler(dmodel)
    problem_models.append(imodel)
    problem_models.append
    return problem_models
예제 #9
0
파일: trajectories.py 프로젝트: nim65s/HQP
 def __init__(self, name, Mref):
     self._name = name
     self._dim = 6
     self._Mref = Mref
     self._v_ref = Motion.Zero()
     self._a_ref = Motion.Zero()
    def __call__(self, t):
        # assert t <= self.time_intervals[-1][1], "t must be lower than the final time tf={}".format(self.time_intervals[-1][1])

        index = len(self.t0_l) - 1
        if t > self.time_intervals[1]:
            t = self.time_intervals[1]
        elif t < self.time_intervals[0]:
            t = self.time_intervals[0]
            index = 0
        else:
            for k in range(len(self.t0_l)):
                if self.t0_l[k] > t:
                    index = k - 1
                    break

        xyz_polycoeff = self.polycoeff_l[index]
        dxyz_polycoeff = self.dpolycoeff_l[index]
        ddxyz_polycoeff = self.ddpolycoeff_l[index]

        t0 = self.time_intervals[0]
        t1 = self.time_intervals[1]

        if t0 == t1:
            tau = 0.
            dtau_dt = 0.
        else:
            tau = (t - t0) / (t1 - t0)
            dtau_dt = 1.

        # Evaluate X
        x = polyval(tau, xyz_polycoeff[0])
        if len(dxyz_polycoeff[0]):
            x_dot = polyval(tau, dxyz_polycoeff[0]) * dtau_dt
        else:
            x_dot = 0.

        if len(ddxyz_polycoeff[0]):
            x_dotdot = polyval(tau, ddxyz_polycoeff[0]) * dtau_dt**2
        else:
            x_dotdot = 0.

        # Evaluate Y
        y = polyval(tau, xyz_polycoeff[1])
        if len(dxyz_polycoeff[1]):
            y_dot = polyval(tau, dxyz_polycoeff[1]) * dtau_dt
        else:
            y_dot = 0.

        if len(ddxyz_polycoeff[1]):
            y_dotdot = polyval(tau, ddxyz_polycoeff[1]) * dtau_dt**2
        else:
            y_dotdot = 0.

        # Evaluate Z
        x0 = polyval(0., xyz_polycoeff[0])
        x1 = polyval(1., xyz_polycoeff[0])
        if x0 == x1:
            tau_x = 0.
            dtau_x_dt = 0.
        else:
            tau_x = (x - x0) / (x1 - x0)
            dtau_x_dt = x_dot

        z = polyval(tau_x, xyz_polycoeff[2])
        if len(dxyz_polycoeff[2]):
            z_dot = polyval(tau_x, dxyz_polycoeff[2]) * x_dot
        else:
            z_dot = 0.

        if len(ddxyz_polycoeff[2]):
            z_dotdot = polyval(tau_x, ddxyz_polycoeff[2]) * x_dot**2 + polyval(tau_x, dxyz_polycoeff[2]) * x_dotdot
        else:
            z_dotdot = 0.

        M = SE3.Identity()
        v = Motion.Zero()
        a = Motion.Zero()

        M.translation = np.matrix([x, y, z]).T
        M.rotation = self._R
        v.linear = np.matrix([x_dot, y_dot, z_dot]).T
        a.linear = np.matrix([x_dotdot, y_dotdot, z_dotdot]).T

        return M, v, a
sot.push(taskCom.task.name)
sot.push(taskLH.task.name)
sot.push(taskRH.task.name)

toe = TOE("test_entity_toe")
id4 = ((1.0, 0.0, 0.0, 0.0), (0.0, 1.0, 0.0, 0.0), (0.0, 0.0, 1.0, 0.0),
       (0.0, 0.0, 0.0, 1.0))
epsilon = 0.1
ref_offset = 0.1
tau_offset = np.asarray((ref_offset, ) * njoints).squeeze()
toe.init(urdfPath, id4, epsilon, OperationalPointsMap['waist'],
         OperationalPointsMap['chest'])
plug(robot.device.state, toe.base6d_encoders)
toe.gyroscope.value = (0., 0., 0.)

gravity = Motion.Zero()
gravity.linear = np.asarray((0.0, 0.0, -9.81))

# -------------------------------------------------------------------------------
# ----- MAIN LOOP ---------------------------------------------------------------
# -------------------------------------------------------------------------------
robot.device.increment(dt)
np.set_printoptions(suppress=True)


def runner(n):
    for i in range(n):
        q_pin = fromSotToPinocchio(robot.device.state.value)
        q_pin[0, :6] = 0.0
        q_pin[0, 6] = 1.0
        nvZero = np.asarray((0.0, ) * pinocchioRobot.model.nv)
예제 #12
0
 def __call__(self, t):
     return (self._Mref, Motion.Zero(), Motion.Zero())