예제 #1
0
    def __init__(self,
                 name,
                 parent,
                 parent_param,
                 c=np.zeros(2),
                 d=1,
                 gain=1,
                 eta=2,
                 w=1):
        assert parent_param is not None
        self.d = d

        psi = None
        J = None
        J_dot = None

        def RMP_func(x, x_dot):
            G = w
            grad_Phi = gain * x * w
            Bx_dot = eta * w * x_dot
            M = G
            f = -grad_Phi - Bx_dot

            return f, M

        RMPLeaf.__init__(self, name, parent, parent_param, psi, J, J_dot,
                         RMP_func)
예제 #2
0
    def __init__(self, name, parent, R=1, epsilon=1e-8, alpha=1e-5, eta=0):

        self.R = R

        def psi(y):
            N = int(y.size / 2)
            y1 = y[:N]
            y2 = y[N:]
            return np.array(norm(y1 - y2) / R - 1).reshape(-1, 1)

        def J(y):
            N = int(y.size / 2)
            y1 = y[:N]
            y2 = y[N:]
            return np.concatenate(
                (1.0 / norm(y1 - y2) * (y1 - y2).T / R, -1.0 / norm(y1 - y2) *
                 (y1 - y2).T / R),
                axis=1)

        def J_dot(y, y_dot):
            N = int(y.size / 2)
            y1 = y[:N]
            y2 = y[N:]
            y1_dot = y_dot[:N]
            y2_dot = y_dot[N:]
            return np.concatenate(
                (np.dot(y1_dot.T, (-1 / norm(y1 - y2)**3 * np.dot(
                    (y1 - y2),
                    (y1 - y2).T) + 1 / norm(y1 - y2) * np.eye(N))) / R,
                 np.dot(y2_dot.T, (-1 / norm(y1 - y2)**3 * np.dot(
                     (y1 - y2),
                     (y1 - y2).T) + 1 / norm(y1 - y2) * np.eye(N))) / R),
                axis=1)

        def RMP_func(x, x_dot):
            if x < 0:
                w = 1e10
                grad_w = 0
            else:
                w = 1.0 / x**4
                grad_w = -4.0 / x**5
            u = epsilon + np.minimum(0, x_dot) * x_dot
            g = w * u

            grad_u = 2 * np.minimum(0, x_dot)
            grad_Phi = alpha * w * grad_w
            xi = 0.5 * x_dot**2 * u * grad_w

            M = g + 0.5 * x_dot * w * grad_u
            M = np.minimum(np.maximum(M, -1e5), 1e5)

            Bx_dot = eta * g * x_dot

            f = -grad_Phi - xi - Bx_dot
            f = np.minimum(np.maximum(f, -1e10), 1e10)

            return f, M

        RMPLeaf.__init__(self, name, parent, None, psi, J, J_dot, RMP_func)
예제 #3
0
    def __init__(self,
                 name,
                 parent,
                 parent_param,
                 c,
                 R=1,
                 epsilon=0.2,
                 alpha=1e-5,
                 eta=0):

        self.R = R
        self.alpha = alpha
        self.eta = eta
        self.epsilon = epsilon

        if parent_param:
            psi = None
            J = None
            J_dot = None

        else:
            if c.ndim == 1:
                c = c.reshape(-1, 1)

            N = c.size

            psi = lambda y: np.array(norm(y - c) / R - 1).reshape(-1, 1)
            J = lambda y: 1.0 / norm(y - c) * (y - c).T / R
            J_dot = lambda y, y_dot: np.dot(y_dot.T, (-1 / norm(
                y - c)**3 * np.dot(
                    (y - c), (y - c).T) + 1 / norm(y - c) * np.eye(N))) / R

        def RMP_func(x, x_dot):
            if x < 0:
                w = 1e10
                grad_w = 0
            else:
                w = 1.0 / x**4
                grad_w = -4.0 / x**5
            u = epsilon + np.minimum(0, x_dot) * x_dot
            g = w * u

            grad_u = 2 * np.minimum(0, x_dot)
            grad_Phi = alpha * w * grad_w
            xi = 0.5 * x_dot**2 * u * grad_w

            M = g + 0.5 * x_dot * w * grad_u
            M = np.minimum(np.maximum(M, -1e5), 1e5)

            Bx_dot = eta * g * x_dot

            f = -grad_Phi - xi - Bx_dot
            f = np.minimum(np.maximum(f, -1e10), 1e10)

            return (f, M)

        RMPLeaf.__init__(self, name, parent, parent_param, psi, J, J_dot,
                         RMP_func)
예제 #4
0
    def __init__(self,
                 name,
                 parent,
                 y_g,
                 w_u=10,
                 w_l=1,
                 sigma=1,
                 alpha=1,
                 eta=2,
                 gain=3,
                 tol=0.005):
        """

        :param name:
        :param parent:
        :param y_g:
        :param w_u:
        :param w_l:
        :param sigma:
        :param alpha:
        :param eta:
        :param gain: desired acceleration gain with unit (rad/s)
        :param tol: tolerance for considering reached the position
        """
        if y_g.ndim == 1:
            y_g = y_g.reshape(-1, 1)
        N = y_g.size
        psi = lambda y: (y - y_g)
        J = lambda y: np.eye(N)
        J_dot = lambda y, y_dot: np.zeros((N, N))

        def RMP_func(x, x_dot):
            x_norm = norm(x)  # 2-norm ||x||

            beta = np.exp(-x_norm**2 / 2 / (sigma**2))
            w = (w_u - w_l) * beta + w_l
            s = (1 - np.exp(-2 * alpha * x_norm)) / (
                1 + np.exp(-2 * alpha * x_norm))

            G = w * np.eye(N)
            if x_norm > tol:
                grad_Phi = s / x_norm * w * x * gain
            else:
                grad_Phi = 0
            Bx_dot = eta * w * x_dot  # equivalent to M and G, eta the damping factor
            grad_w = -beta * (w_u - w_l) / sigma**2 * x

            x_dot_norm = norm(x_dot)
            xi = -0.5 * (x_dot_norm**2 * grad_w -
                         2 * np.dot(np.dot(x_dot, x_dot.T), grad_w))

            M = G
            f = -grad_Phi - Bx_dot - xi

            return f, M

        RMPLeaf.__init__(self, name, parent, None, psi, J, J_dot, RMP_func)
예제 #5
0
    def __init__(self, name, parent, w=1, eta=1):
        psi = lambda y: y
        J = lambda y: np.eye(2)
        J_dot = lambda y, y_dot: np.zeros((2, 2))

        def RMP_func(x, x_dot):
            G = w
            Bx_dot = eta * w * x_dot
            M = G
            f = -Bx_dot

            return f, M

        RMPLeaf.__init__(self, name, parent, None, psi, J, J_dot, RMP_func)
예제 #6
0
    def __init__(self,
                 name,
                 parent,
                 parent_param,
                 c=np.zeros(2),
                 R=1,
                 epsilon=1e-8,
                 alpha=1e-5,
                 eta=0):

        assert parent_param is not None

        self.R = R
        self.alpha = alpha
        self.eta = eta
        self.epsilon = epsilon
        self.x_dot_real = None

        psi = None
        J = None
        J_dot = None

        def RMP_func(x, x_dot, x_dot_real):
            if x < 0:
                w = 1e10
                grad_w = 0
            else:
                w = 1.0 / x**4
                grad_w = -4.0 / x**5
            u = epsilon + np.minimum(0, x_dot) * x_dot
            g = w * u

            grad_u = 2 * np.minimum(0, x_dot)
            grad_Phi = alpha * w * grad_w
            xi = 0.5 * x_dot * x_dot_real * u * grad_w

            M = g + 0.5 * x_dot * w * grad_u
            M = np.minimum(np.maximum(M, -1e5), 1e5)

            Bx_dot = eta * g * x_dot

            f = -grad_Phi - xi - Bx_dot
            f = np.minimum(np.maximum(f, -1e10), 1e10)

            return f, M

        RMPLeaf.__init__(self, name, parent, parent_param, psi, J, J_dot,
                         RMP_func)
예제 #7
0
    def __init__(self, name, parent, d=1, gain=1, eta=2, w=1):
        def psi(y):
            N = int(y.size / 2)
            y1 = y[:N]
            y2 = y[N:]
            return np.array(norm(y1 - y2) - d).reshape(-1, 1)

        def J(y):
            N = int(y.size / 2)
            y1 = y[:N]
            y2 = y[N:]
            return np.concatenate(
                (1.0 / norm(y1 - y2) * (y1 - y2).T, -1.0 / norm(y1 - y2) *
                 (y1 - y2).T),
                axis=1)

        def J_dot(y, y_dot):
            N = int(y.size / 2)
            y1 = y[:N]
            y2 = y[N:]
            y1_dot = y_dot[:N]
            y2_dot = y_dot[N:]
            return np.concatenate(
                (np.dot(y1_dot.T, (-1 / norm(y1 - y2)**3 * np.dot(
                    (y1 - y2), (y1 - y2).T) + 1 / norm(y1 - y2) * np.eye(N))),
                 np.dot(y2_dot.T, (-1 / norm(y1 - y2)**3 * np.dot(
                     (y1 - y2),
                     (y1 - y2).T) + 1 / norm(y1 - y2) * np.eye(N)))),
                axis=1)

        def RMP_func(x, x_dot):
            G = w
            grad_Phi = gain * x * w
            Bx_dot = eta * w * x_dot
            M = G
            f = -grad_Phi - Bx_dot

            return (f, M)

        RMPLeaf.__init__(self, name, parent, None, psi, J, J_dot, RMP_func)