コード例 #1
0
    def update(self):
        self.get_logger().info('on update')

        x_star = self.controller.calc_next_point()  # Loop 1) 2) 3)

        # Wait for response
        response = self.request_service_sync(
            self.cli_target_object,
            encode_array(array=x_star.x, comm_data=self.req))

        # Do something about response

        y_star = decode_array(response)

        self.controller.add_x_y_to_T(x_star.x, y_star)  # Loop 5)
コード例 #2
0
 def obtain_y_at_x(self, x):
     self.req = encode_array(array=x, comm_data=self.req)
     self.future = self.cli_target_object.call_async(self.req)
     while True:
         if not self.isSetController:
             rclpy.spin_once(self)
         if self.future.done():
             try:
                 response = self.future.result()
             except Exception as e:
                 self.get_logger().info('Service call failed %r' % (e, ))
             else:
                 self.get_logger().info('Success!')
                 break
     y = decode_array(response)
     return y
コード例 #3
0
    def update(self):
        self.get_logger().info('on update')

        # 1) 2) 3) in Loop
        x_star = self.controller.calc_next_point()

        # 4) in Loop # Wait for response
        response = self.request_service_sync(
            self.cli_target_object,
            encode_array(array=x_star.x, comm_data=self.req))

        # 5) in Loop
        y_star = decode_array(response)
        self.controller.add_x_y_to_T(x_star.x, y_star)

        self.iter_num += 1
コード例 #4
0
    def draw_gp_result(self, msg):
        if not msg.iter_num > self.iter_num:
            if self.image_msg is None:
                pass
            else:
                self.pub_gp_result.publish(self.image_msg)
                self.get_logger().info("Published Image")
            return

        self.iter_num = msg.iter_num
        x_sampling_points = decode_array(msg.x_sampling_points).T
        mean = decode_array(msg.mean).T
        var = decode_array(msg.var).T
        train_x = decode_array(msg.train_x).T
        train_y = decode_array(msg.train_y).T

        # Figure & Axes Setting
        fig = plt.figure()
        ax = fig.add_subplot(111)
        ax.grid()
        ax.set_xlabel("x")
        ax.set_ylabel("y")
        ax.set_xlim(
            np.min(x_sampling_points) - 1,
            np.max(x_sampling_points) + 1,
        )
        ax.set_ylim(-2, 2)

        # Draw Graph
        for x_sampling_points_, mean_, var_, train_x_, train_y_ in zip(
                x_sampling_points, mean, var, train_x, train_y):

            plt.plot(x_sampling_points_, mean_)
            ax.fill_between(
                x_sampling_points_,  #TODO: 一次元しか対応していない
                mean_ - 3 * var_,  # 3σを採用
                mean_ + 3 * var_,
                facecolor='blue',
                alpha=0.5)
            plt.scatter(train_x_[:-1], train_y_[:-1], c='blue')
            plt.axvline(x=train_x_[-1], c='red')
            if self.iter_num > 2:
                plt.scatter(train_x_[-2], train_y_[-2], c='green')

        # Transform plt to numpy
        buf = io.BytesIO()  # bufferを用意
        plt.savefig(buf, format='png')  # bufferに保持
        enc = np.frombuffer(buf.getvalue(), dtype=np.uint8)  # bufferからの読み出し
        dst = cv2.imdecode(enc, 1)  # デコード
        # dst = dst[:, :, ::-1]  # BGR->RGB
        buf.close()
        plt.close()

        # Publish Image
        bridge = CvBridge()
        self.image_msg = bridge.cv2_to_imgmsg(dst, encoding="bgr8")
        try:
            self.pub_gp_result.publish(self.image_msg)
        except CvBridgeError as e:
            print(e)
        self.get_logger().info("Published Image")
コード例 #5
0
 def surface_shape_callback(self, request, response):
     x = decode_array(request)
     surface_array = self.target_object.surface_shape(x)
     # surface_shape's type is np.array, so it should be transform to list (not nest)
     response = encode_array(surface_array, response)
     return response