code: def start_frame_grabber(self, pipeline_string=None):
      if not self.is_launched:
          raise GameError(
              f"Game '{self.__class__.__name__}' is not running..."
          )
  
      if self.frame_grabber_process is not None:
          self.stop_frame_grabber()
  
      frame_grabber_command = f"serpent grab_frames {self.window_geometry['width']} {self.window_geometry['height']} {self.window_geometry['x_offset']} {self.window_geometry['y_offset']}"
  
      pipeline_string = (
          pipeline_string or self.frame_transformation_pipeline_string
      )
  
      if pipeline_string is not None:
          frame_grabber_command += f" {pipeline_string}"
  
      self.frame_grabber_process = subprocess.Popen(
          shlex.split(frame_grabber_command)
      )
  
      signal.signal(signal.SIGINT, self._handle_signal_frame_grabber)
      signal.signal(signal.SIGTERM, self._handle_signal_frame_grabber)
  
      atexit.register(
          self._handle_signal_frame_grabber, 15, None, False
      )
  
imports: import warnings
  import offshoot
  import subprocess
  import signal
  import shlex
  import time
  import os, os.path
  import atexit
  from serpent.game_agent import GameAgent
  from serpent.game_launchers import *
  from serpent.window_controller import WindowController
  from serpent.input_controller import InputController, InputControllers
  from serpent.frame_grabber import FrameGrabber
  from serpent.game_frame_limiter import GameFrameLimiter
  from serpent.sprite import Sprite
  from serpent.utilities import clear_terminal, is_windows, SerpentError
  import skimage.io
  import skimage.color
  import numpy
  from redis import StrictRedis
  from serpent.config import config
label_desc: Use image node_id 14 for calling the Game obj's underlying member method code with example usage: obj.start_frame_grabber(pipeline_string) without return types