def Eul(cls, *angles, unit='rad'): r""" Construct a new SO(3) from Euler angles :param 𝚪: Euler angles :type 𝚪: array_like or numpy.ndarray with shape=(N,3) :param unit: angular units: 'rad' [default], or 'deg' :type unit: str :return: SO(3) rotation :rtype: SO3 instance ``SO3.Eul(𝚪)`` is an SO(3) rotation defined by a 3-vector of Euler angles :math:`\Gamma = (\phi, \theta, \psi)` which correspond to consecutive rotations about the Z, Y, Z axes respectively. If ``𝚪`` is an Nx3 matrix then the result is a sequence of rotations each defined by Euler angles corresponding to the rows of ``angles``. ``SO3.Eul(φ, θ, ψ)`` as above but the angles are provided as three scalars. Example: .. runblock:: pycon >>> from spatialmath import SO3 >>> SO3.Eul(0.1, 0.2, 0.3) >>> SO3.Eul([0.1, 0.2, 0.3]) >>> SO3.Eul(10, 20, 30, 'deg') :seealso: :func:`~spatialmath.pose3d.SE3.eul`, :func:`~spatialmath.pose3d.SE3.Eul`, :func:`~spatialmath.base.transforms3d.eul2r` """ if len(angles) == 1: angles = angles[0] if base.isvector(angles, 3): return cls(base.eul2r(angles, unit=unit), check=False) else: return cls([base.eul2r(a, unit=unit) for a in angles], check=False)
def Eul(cls, angles, *, unit='rad'): r""" Construct a new SO(3) from Euler angles :param 𝚪: Euler angles :type 𝚪: array_like or numpy.ndarray with shape=(N,3) :param unit: angular units: 'rad' [default], or 'deg' :type unit: str :return: SO(3) rotation :rtype: SO3 instance ``SO3.Eul(𝚪)`` is an SO(3) rotation defined by a 3-vector of Euler angles :math:`\Gamma = (\phi, \theta, \psi)` which correspond to consecutive rotations about the Z, Y, Z axes respectively. If ``𝚪`` is an Nx3 matrix then the result is a sequence of rotations each defined by Euler angles corresponding to the rows of ``angles``. :seealso: :func:`~spatialmath.pose3d.SE3.eul`, :func:`~spatialmath.pose3d.SE3.Eul`, :func:`~spatialmath.base.transforms3d.eul2r` """ if base.isvector(angles, 3): return cls(base.eul2r(angles, unit=unit), check=False) else: return cls([base.eul2r(a, unit=unit) for a in angles], check=False)
def Eul(cls, angles, *, unit='rad'): """ Create an SO(3) rotation from Euler angles :param angles: 3-vector of Euler angles :type angles: array_like or numpy.ndarray with shape=(N,3) :param unit: angular units: 'rad' [default], or 'deg' :type unit: str :return: 3x3 rotation matrix :rtype: SO3 instance ``SO3.Eul(angles)`` is an SO(3) rotation defined by a 3-vector of Euler angles :math:`(\phi, \theta, \psi)` which correspond to consecutive rotations about the Z, Y, Z axes respectively. If ``angles`` is an Nx3 matrix then the result is a sequence of rotations each defined by Euler angles correponding to the rows of angles. :seealso: :func:`~spatialmath.pose3d.SE3.eul`, :func:`~spatialmath.pose3d.SE3.Eul`, :func:`spatialmath.base.transforms3d.eul2r` """ if argcheck.isvector(angles, 3): return cls(tr.eul2r(angles, unit=unit)) else: return cls([tr.eul2r(a, unit=unit) for a in angles])
def Eul(cls, angles, *, unit='rad'): """ Create an SO(3) rotation from Euler angles :param angles: 3-vector of Euler angles :type angles: array_like :param unit: angular units: 'rad' [default], or 'deg' :type unit: str :return: 3x3 rotation matrix :rtype: SO3 instance ``SO3.Eul(ANGLES)`` is an SO(3) rotation defined by a 3-vector of Euler angles :math:`(\phi, \theta, \psi)` which correspond to consecutive rotations about the Z, Y, Z axes respectively. :seealso: :func:`~spatialmath.pose3d.SE3.eul`, :func:`~spatialmath.pose3d.SE3.Eul`, :func:`spatialmath.base.transforms3d.eul2r` """ return cls(quat.r2q(tr.eul2r(angles, unit=unit)), check=False)