code: def update(self, frame_to, frame_from=None, **kwargs):
          
          # save a random number for this update
          self._updated = np.random.random()
  
          # if no frame specified, use base frame
          if frame_from is None:
              frame_from = self.base_frame
          # convert various kwargs to a single matrix
          matrix = kwargs_to_matrix(**kwargs)
  
          # create the edge attributes
          attr = {'matrix': matrix, 'time': time.time()}
          # pass through geometry to edge attribute
          if 'geometry' in kwargs:
              attr['geometry'] = kwargs['geometry']
  
          # add the edges
          changed = self.transforms.add_edge(frame_from,
                                             frame_to,
                                             **attr)
          # set the node attribute with the geometry information
          if 'geometry' in kwargs:
              nx.set_node_attributes(
                  self.transforms,
                  name='geometry',
                  values={frame_to: kwargs['geometry']})
          # if the edge update changed our structure
          # dump our cache of shortest paths
          if changed:
              self._paths = {}
docs: Update a transform in the tree.
  
          Parameters
          ---------
          frame_from : hashable object
            Usually a string (eg 'world').
            If left as None it will be set to self.base_frame
          frame_to :  hashable object
            Usually a string (eg 'mesh_0')
          matrix : (4,4) float
            Homogenous transformation matrix
          quaternion :  (4,) float
            Quaternion ordered [w, x, y, z]
          axis : (3,) float
            Axis of rotation
          angle :  float
            Angle of rotation, in radians
          translation : (3,) float
            Distance to translate
          geometry : hashable
            Geometry object name, e.g. 'mesh_0'