コード例 #1
0
    def step(self, state, model=False):
        r_c, z_c, dz_c, r_c_old, p, r, q, dq, u_r, vel_q, x_2, y_2 = state

        #Inputs
        z_r = np.array([self.function.f(*pt) for pt in r]) #Mimick measurements on robots
        hessian = self.function.hessian_f(r_c[0], r_c[1]) #True value

        if model:
            z_c_k, dz_c_k, p_k = kalmanFilter(z_c, dz_c, r, z_r, r_c, r_c_old, p, hessian)
            z_c_p, dz_c_p, p_p = model.predict(z_c, dz_c, r, z_r, r_c, r_c_old, p, hessian)
            # var1.push(z_c_k, z_c_p)
            # var2.push(dz_c_k[0], dz_c_p[0])
            # var3.push(dz_c_k[1], dz_c_p[1])
            z_c = z_c_k
            dz_c = dz_c_k
            p = p_k
        else:
            z_c, dz_c, p = kalmanFilter(z_c, dz_c, r, z_r, r_c, r_c_old, p, hessian)
        # z_c = f(r_c[0], r_c[1])
        # dz_c = dz_f(r_c[0], r_c[1])

        r_c_old = r_c
        r_c, x_2, y_2 = formationCenter(r_c, z_c, dz_c, hessian, x_2, y_2,
                                           self.function.mu_f, self.function.z_desired)
        r_c_p, x_2_p, y_2_p = formationCenter(r_c, z_c_p, dz_c_p, hessian, x_2, y_2,
                                           self.function.mu_f, self.function.z_desired)
        var1.push(r_c[0], r_c_p[0])
        var2.push(r_c[1], r_c_p[1])
        var3.push(x_2[0], x_2_p[0])
        var4.push(x_2[1], x_2_p[1])

        r, q, dq, u_r, vel_q = formationControl(r_c, r, q, dq, u_r, vel_q)

        state = [r_c, z_c, dz_c, r_c_old, p, r, q, dq, u_r, vel_q, x_2, y_2]
        data = [r_c, z_c, dz_c, hessian, r, z_r, p]

        return state, data
コード例 #2
0
    def step(self, t, model=False):
        r_c, z_c, dz_c, r_c_old, p, r, q, dq, u_r, vel_q, x_2, y_2, z_r = self.state

        #Inputs
        z_r = np.array([self.function.f(*pt)
                        for pt in r])  #Mimick measurements on robots
        hessian = self.function.hessian_f(r_c[0], r_c[1])  #True value
        z_c = self.function.f(*r_c)  # Measure field value at center
        # dz_c = self.function.dz_f(*r_c) # Measure gradient value at the center

        if model:
            # z_c_k, dz_c_k, p_k, data = kalmanFilter(z_c, dz_c, r, z_r, r_c, r_c_old, p, hessian)
            z_c_p, dz_c_p, p_p, data = self.kalmanFilter(
                z_c, dz_c, r, z_r, r_c, r_c_old, p, hessian, model)

            z_c = z_c_p
            dz_c = dz_c_p
            p = p_p

        else:
            z_c, dz_c, p, data = self.kalmanFilter(z_c, dz_c, r, z_r, r_c,
                                                   r_c_old, p, hessian)
        # z_c = f(r_c[0], r_c[1])
        # dz_c = dz_f(r_c[0], r_c[1])

        r_c_old = r_c
        # We dont need to calculate force. Velocity is sufficient.
        # If we dont do this, fc only tracks gradient, not at desired field value, but where it was left to start with.
        r_c, x_2, y_2 = formationCenter(r_c, z_c, dz_c, hessian, x_2, y_2,
                                        self.function.mu_f,
                                        self.function.z_desired)

        r, q, dq, u_r, vel_q = formationControl(r_c, r, dz_c, q, dq, u_r,
                                                vel_q, t)

        self.old_state = self.state
        self.state = [
            r_c, z_c, dz_c, r_c_old, p, r, q, dq, u_r, vel_q, x_2, y_2, z_r
        ]
        # data = [r_c, z_c, dz_c, hessian, r, z_r, p]

        return data
コード例 #3
0
    def stepFunction(self, function, plot=False, collect=False, test=False):
        p = params.Params()
        r_c, r_c_old, x_2, y_2, r = p.r_c, p.r_c, 0, 0, p.r
        r_c_plot = [r_c]
        r_plot = [r]
        q, dq, u_r, vel_q = p.q, p.dq, p.u_r, p.vel_q
        trainData, model = False, False
        if collect:
            trainData = []
        if test:
            model_orig = load_model("hessian.h5")
            scaler = pkl.load(open("hessian_scaler.p", "rb"))
            # re-define the batch size
            batch_size = 1
            # re-define model
            model = Sequential()
            model.add(LSTM(22, batch_input_shape=(batch_size, 1, 21), stateful=True))
            model.add(Dense(4))
            # copy weights
            weights = model_orig.get_weights()
            model.set_weights(weights)
            # compile model
            model.compile(loss='mean_squared_error', optimizer='adam')
            print(model.summary())

        hessian = function.hessian_f(r_c[0], r_c[1])
        z_c = function.f(r_c[0], r_c[1])
        dz_c = function.dz_f(r_c[0], r_c[1])
        y_2 = dz_c / norm(dz_c)
        x_2 = p.rotateRight @ y_2

        for i in range(10000):
            # Decoupled: Ideal test.
            z_c = function.f(r_c[0], r_c[1])
            dz_c = function.dz_f(r_c[0], r_c[1])
            realHessian = []
            predictedHessians = []
            if collect:
                hessian = function.hessian_f(r_c[0], r_c[1])
            if test:
                realHessian.append(np.linalg.det(function.hessian_f(r_c[0], r_c[1])))
                predictedHessians.append(np.linalg.det(hessian))

            z_r = np.array([function.f(*pt) for pt in r])
            # hessian = [[0, 0], [0, 0]]
            r_c, x_2, y_2 = formationCenter(r_c, z_c, dz_c, hessian, x_2, y_2, function.mu_f, function.z_desired)
            r, q, dq, u_r, vel_q = formationControl(r_c, r, dz_c, q, dq, u_r, vel_q, i)
            state = np.concatenate([r_c, [z_c], dz_c, *r, z_r, *hessian])
            if collect:
                trainData.append(state)
            if test:
                state = scaler.transform(state.reshape(1,-1))
                hessian = model.predict(np.reshape(state, (state.shape[0], 1, state.shape[1])),
                                                    batch_size=1)[0].reshape(2,2)
            # pltVar.push(hessian[0][0])
            if plot:
                r_c_plot.append(r_c)
                if i % 150 == 0:
                    r_plot.append(r)

        if plot:
            x = np.linspace(-10, 10, 200)
            y = np.linspace(-10, 10, 200)
            xx, yy = np.meshgrid(x, y)
            z = function.f(xx, yy)

            plt.contour(x, y, z, [function.z_desired])
            plt.plot(*zip(*r_c_plot), 'b')
            for r in r_plot:
                plt.plot([r[0, 0], r[1, 0]], [r[0, 1], r[1, 1]], 'yo-')
                plt.plot([r[2, 0], r[3, 0]], [r[2, 1], r[3, 1]], 'go-')
            plt.title(function.name)
            # plt.show()
            plt.savefig("{}_hessianEstimation.pdf".format(function.name), bbox_inches='tight')
            plt.close()
        # pltVar.plot()

        if collect:
            trainData = pd.DataFrame(trainData)
        print("Finished stepping through function: {}\n".format(function.name))
        if test:
            print("Hessian error is: {}".format(math.sqrt(mean_squared_error(realHessian, predictedHessians))))
        return trainData
コード例 #4
0
            # c.T @ .. @ c = 3x4 @ 4x4 @ 4x3 = 3x3
            p = np.linalg.inv(
                np.linalg.inv(p_e) +
                c.T @ np.linalg.inv(d @ u @ d.T + R) @ c)  # 3x3

            z_c = s[0]
            dz_c = s[1:]
            # return z_c, dz, p
            # End of Kalman filter

            p_det.append(np.linalg.det(p))
            # z_c = f(r_c[0], r_c[1])
            # dz_c = dz_f(r_c[0], r_c[1])
            # print(dz_c)
            r_c_old = r_c
            r_c, x_2, y_2 = formationCenter(r_c, z_c, dz_c, hessian, x_2, y_2,
                                            function.mu_f, function.z_desired)

            r, q, dq, u_r, vel_q = formationControl(r_c, r, q, dq, u_r, vel_q)

            hessian_state = np.concatenate(
                [r_c, [z_c], dz_c, *r, z_r, *hessian])
            hessian_state = scaler_hessian.transform(
                hessian_state.reshape(1, -1))
            hessian = model_hessian.predict(np.reshape(
                hessian_state,
                (hessian_state.shape[0], 1, hessian_state.shape[1])),
                                            batch_size=1)[0].reshape(2, 2)
            r_c_plot.append(r_c)
            if i % 150 == 0:
                r_plot.append(r)