code: def ToEulerAngles(self):
      qsq = self.q**2
      k = (
          2.0
          * (self.q[0] * self.q[3] + self.q[1] * self.q[2])
          / qsq.sum()
      )
  
      if (1.0 - k) < np.finfo("float").eps:  # north pole singularity
          return (
              2.0 * np.arctan2(self.q[1], self.q[0]),
              0.5 * np.pi,
              0.0,
          )
      if (1.0 + k) < np.finfo("float").eps:  # south pole singularity
          return (
              -2.0 * np.arctan2(self.q[1], self.q[0]),
              -0.5 * np.pi,
              0.0,
          )
  
      yaw = np.arctan2(
          2.0 * (self.q[0] * self.q[2] - self.q[1] * self.q[3]),
          qsq[0] + qsq[1] - qsq[2] - qsq[3],
      )
      pitch = np.arcsin(k)
      roll = np.arctan2(
          2.0 * (self.q[0] * self.q[1] - self.q[2] * self.q[3]),
          qsq[0] - qsq[1] + qsq[2] - qsq[3],
      )
  
      return yaw, pitch, roll
  
imports: import numpy
label_desc: Use image node_id 23 for calling the Quaternion obj's underlying member method code with example usage: obj.ToEulerAngles() and returns: yaw,  pitch,  roll, unknown,  unknown,  int, unknown,  unknown,  int