code: def _get_observation(self):
          
  
          di = super()._get_observation()
          # proprioceptive features
          di["joint_pos"] = np.array(
              [self.sim.data.qpos[x] for x in self._ref_joint_pos_indexes]
          )
          di["joint_vel"] = np.array(
              [self.sim.data.qvel[x] for x in self._ref_joint_vel_indexes]
          )
  
          robot_states = [
              np.sin(di["joint_pos"]),
              np.cos(di["joint_pos"]),
              di["joint_vel"],
          ]
  
          if self.has_gripper:
              di["gripper_qpos"] = np.array(
                  [self.sim.data.qpos[x] for x in self._ref_gripper_joint_pos_indexes]
              )
              di["gripper_qvel"] = np.array(
                  [self.sim.data.qvel[x] for x in self._ref_gripper_joint_vel_indexes]
              )
  
              di["eef_pos"] = self.sim.data.site_xpos[self.eef_site_id]
              di["eef_quat"] = T.convert_quat(
                  self.sim.data.get_body_xquat("right_hand"), to="xyzw"
              )
  
              # add in gripper information
              robot_states.extend([di["gripper_qpos"], di["eef_pos"], di["eef_quat"]])
  
          di["robot-state"] = np.concatenate(robot_states)
          return di
docs: Returns an OrderedDict containing observations [(name_string, np.array), ...].
  
          Important keys:
              robot-state: contains robot-centric information.