예제 #1
0
    def controller(self, x, t, x0):
        """ Controller.

        Parameters
        ----------

        x: state
        t: time
        x0: initial state

        """
        self.logger.debug('Time: ' + str(t))
        m = self.model.md
        n = self.model.nd
        q = np.array(x[:n])
        u = np.array(x[n:])

        # compute current muscle length and derivative
        pose = self.model.model_parameters(q=q, u=u)
        lm = self.model.lm.subs(pose)
        lm = to_np_vec(lm)
        lmd = self.model.lmd.subs(pose)
        lmd = to_np_vec(lmd)

        # compute target
        lm_des = self.target(x, t, x0)
        lmd_des = np.zeros(m)
        lmdd_des = np.zeros(m)

        # update delayed values and get current (must update first)
        self.lm_del.add(t, lm)
        self.lmd_del.add(t, lmd)

        lm_del = np.array(self.lm_del.get_delayed())
        lmd_del = np.array(self.lmd_del.get_delayed())

        lmdd_des = sp.Matrix(self.pd.compute(
            lm_del, lmd_del, lm_des, lmd_des, lmdd_des))

        tau, fm = self.musclespace.calculate_force(lmdd_des, pose)
        tau = self.__add_in_distrurbance(t, tau, pose)
        tau = to_np_vec(tau)

        # record
        self.reporter.t.append(t)
        self.reporter.q.append(q)
        self.reporter.u.append(u)
        self.reporter.lm.append(lm)
        self.reporter.lm_d.append(lm_des)
        self.reporter.fm.append(fm)
        self.reporter.tau.append(tau)

        return tau
예제 #2
0
    def controller(self, x, t, x0):
        """Default simple joint space PD controller.

        Parameters
        ----------

        x: state
        t: time
        x0: initial state

        """
        self.logger.debug('Time: ' + str(t))
        n = self.model.nd
        m = self.model.md
        q = np.array(x[:n])
        u = np.array(x[n:])
        qd = np.array(self.target(x, t, x0))
        ud = np.zeros((n))
        qddot = np.array(self.pid.compute(t, q, u, qd, ud))

        # evalutate desired lmdd_d
        pose = self.model.model_parameters(q=q, u=u)
        RDotQDot = self.model.RDotQDot.subs(pose)
        RQDDot = self.model.R.subs(pose) * sp.Matrix(qddot)
        lmdd_d = sp.Matrix(RDotQDot + RQDDot)
        lmd = to_np_vec(self.model.lmd.subs(pose))
        lmd_d = to_np_vec(self.model.R.subs(pose) * sp.Matrix(u))

        tau = self.musclespace.calculate_force(lmdd_d, pose)[0]
        tau = to_np_vec(tau)

        # store record
        self.reporter.t.append(t)
        self.reporter.q.append(q)
        self.reporter.u.append(u)
        self.reporter.qd.append(qd)
        self.reporter.lmd.append(lmd)
        self.reporter.lmd_d.append(lmd_d)
        self.reporter.tau.append(tau)

        return tau
예제 #3
0
    def __initialize_delay_components(self):
        """Initializes the delay components with the default muscle length (state(0))
        and zero length velocities.

        """
        n = self.model.nd
        m = self.model.md

        state0 = self.model.state0
        q = state0[:n]
        u = state0[n:]
        pose = self.model.model_parameters(q=q, u=u)
        self.lm0 = self.model.lm.subs(pose)
        self.lm0 = to_np_vec(self.lm0)

        delay = np.full(m, self.delay)

        self.lm_del = DelayArray(m, delay, self.lm0)
        self.lmd_del = DelayArray(m, delay, np.zeros(m))
예제 #4
0
    def controller(self, x, t, x0):
        """Controller function.

        Parameters
        ----------

        x: state
        t: time
        x0: initial state

        """
        self.logger.debug('Time: ' + str(t))
        n = self.model.nd
        q = np.array(x[:n])
        u = np.array(x[n:])
        pose = self.model.model_parameters(q=q, u=u)

        # task variables
        xc = to_np_mat(self.task.x(pose))
        uc = to_np_mat(self.task.u(pose, u))
        xd, ud, ad = self.target(x, t, x0)
        ad = sp.Matrix(self.pd.compute(xc, uc, xd, ud, ad))

        # forces
        tau, ft = self.task.calculate_force(ad, pose)
        ft = to_np_vec(ft)
        tau = to_np_vec(tau)

        # solve static optimization
        fm = None
        if self.evaluate_muscle_forces:
            m = self.model.md
            R = to_np_mat(self.model.R.subs(pose))
            RT = R.transpose()

            def objective(x):
                return np.sum(x**2)

            def inequality_constraint(x):
                return np.array(tau + RT * (x.reshape(-1, 1))).reshape(-1,)

            x0 = np.zeros(m)
            bounds = tuple([(0, self.model.Fmax[i, i]) for i in range(0, m)])
            constraints = ({'type': 'ineq', 'fun': inequality_constraint})
            sol = minimize(objective, x0,  method='SLSQP',
                           bounds=bounds,
                           constraints=constraints)
            if sol.success is False:
                raise Exception('Static optimization failed at: ' + t)

            fm = sol.x.reshape(-1,)

        # record
        self.reporter.t.append(t)
        self.reporter.q.append(q)
        self.reporter.u.append(u)
        self.reporter.x.append(np.array(xc).reshape(-1,))
        self.reporter.xd.append(np.array(xd).reshape(-1,))
        self.reporter.tau.append(tau)
        self.reporter.ft.append(ft)
        self.reporter.fm.append(fm)
        # self.fs_reporter.record(t, q, u, tau)

        return tau