code: def setup_inverse_kinematics(self):
          
  
          # Set up a connection to the PyBullet simulator.
          p.connect(p.DIRECT)
          p.resetSimulation()
  
          # get paths to urdfs
          self.robot_urdf = pjoin(
              self.bullet_data_path, "sawyer_description/urdf/sawyer_arm.urdf"
          )
  
          # load the urdfs
          self.ik_robot = p.loadURDF(self.robot_urdf, (0, 0, 0.9), useFixedBase=1)
  
          # Simulation will update as fast as it can in real time, instead of waiting for
          # step commands like in the non-realtime case.
          p.setRealTimeSimulation(1)
docs: This function is responsible for doing any setup for inverse kinematics.
          Inverse Kinematics maps end effector (EEF) poses to joint angles that
          are necessary to achieve those poses.