def RPY(cls, angles, *, order='zyx', unit='rad'): """ Create an SO(3) rotation from roll-pitch-yaw angles :param angles: 3-vector of roll-pitch-yaw angles :type angles: array_like or numpy.ndarray with shape=(N,3) :param unit: angular units: 'rad' [default], or 'deg' :type unit: str :param unit: rotation order: 'zyx' [default], 'xyz', or 'yxz' :type unit: str :return: 3x3 rotation matrix :rtype: SO3 instance ``SO3.RPY(angles)`` is an SO(3) rotation defined by a 3-vector of roll, pitch, yaw angles :math:`(r, p, y)` which correspond to successive rotations about the axes specified by ``order``: - 'zyx' [default], rotate by yaw about the z-axis, then by pitch about the new y-axis, then by roll about the new x-axis. Convention for a mobile robot with x-axis forward and y-axis sideways. - 'xyz', rotate by yaw about the x-axis, then by pitch about the new y-axis, then by roll about the new z-axis. Covention for a robot gripper with z-axis forward and y-axis between the gripper fingers. - 'yxz', rotate by yaw about the y-axis, then by pitch about the new x-axis, then by roll about the new z-axis. Convention for a camera with z-axis parallel to the optic axis and x-axis parallel to the pixel rows. If ``angles`` is an Nx3 matrix then the result is a sequence of rotations each defined by RPY angles correponding to the rows of angles. :seealso: :func:`~spatialmath.pose3d.SE3.rpy`, :func:`~spatialmath.pose3d.SE3.RPY`, :func:`spatialmath.base.transforms3d.rpy2r` """ if argcheck.isvector(angles, 3): return cls(tr.rpy2r(angles, order=order, unit=unit)) else: return cls([tr.rpy2r(a, order=order, unit=unit) for a in angles])
def RPY(cls, *angles, unit='rad', order='zyx', ): r""" Construct a new SO(3) from roll-pitch-yaw angles :param angles: roll-pitch-yaw angles :type angles: array_like(3), array_like(n,3) :param unit: angular units: 'rad' [default], or 'deg' :type unit: str :param order: rotation order: 'zyx' [default], 'xyz', or 'yxz' :type order: str :return: SO(3) rotation :rtype: SO3 instance - ``SO3.RPY(angles)`` is an SO(3) rotation defined by a 3-vector of roll, pitch, yaw angles :math:`(\alpha, \beta, \gamma)`. If ``angles`` is an Nx3 matrix then the result is a sequence of rotations each defined by RPY angles corresponding to the rows of angles. The angles correspond to successive rotations about the axes specified by ``order``: - ``'zyx'`` [default], rotate by yaw about the z-axis, then by pitch about the new y-axis, then by roll about the new x-axis. Convention for a mobile robot with x-axis forward and y-axis sideways. - ``'xyz'``, rotate by yaw about the x-axis, then by pitch about the new y-axis, then by roll about the new z-axis. Convention for a robot gripper with z-axis forward and y-axis between the gripper fingers. - ``'yxz'``, rotate by yaw about the y-axis, then by pitch about the new x-axis, then by roll about the new z-axis. Convention for a camera with z-axis parallel to the optic axis and x-axis parallel to the pixel rows. - ``SO3.RPY(⍺, β, 𝛾)`` as above but the angles are provided as three scalars. Example: .. runblock:: pycon >>> from spatialmath import SO3 >>> SO3.RPY(0.1, 0.2, 0.3) >>> SO3.RPY([0.1, 0.2, 0.3]) >>> SO3.RPY(0.1, 0.2, 0.3, order='xyz') >>> SO3.RPY(10, 20, 30, 'deg') :seealso: :func:`~spatialmath.pose3d.SE3.rpy`, :func:`~spatialmath.pose3d.SE3.RPY`, :func:`spatialmath.base.transforms3d.rpy2r` """ if len(angles) == 1: angles = angles[0] # angles = base.getmatrix(angles, (None, 3)) # return cls(base.rpy2r(angles, order=order, unit=unit), check=False) if base.isvector(angles, 3): return cls(base.rpy2r(angles, unit=unit, order=order), check=False) else: return cls([base.rpy2r(a, unit=unit, order=order) for a in angles], check=False)
def RPY(cls, angles, *, order='zyx', unit='rad'): """ Create an SO(3) rotation from roll-pitch-yaw angles :param angles: 3-vector of roll-pitch-yaw angles :type angles: array_like :param unit: angular units: 'rad' [default], or 'deg' :type unit: str :param unit: rotation order: 'zyx' [default], 'xyz', or 'yxz' :type unit: str :return: 3x3 rotation matrix :rtype: SO3 instance ``SO3.RPY(ANGLES)`` is an SO(3) rotation defined by a 3-vector of roll, pitch, yaw angles :math:`(r, p, y)` which correspond to successive rotations about the axes specified by ``order``: - 'zyx' [default], rotate by yaw about the z-axis, then by pitch about the new y-axis, then by roll about the new x-axis. Convention for a mobile robot with x-axis forward and y-axis sideways. - 'xyz', rotate by yaw about the x-axis, then by pitch about the new y-axis, then by roll about the new z-axis. Covention for a robot gripper with z-axis forward and y-axis between the gripper fingers. - 'yxz', rotate by yaw about the y-axis, then by pitch about the new x-axis, then by roll about the new z-axis. Convention for a camera with z-axis parallel to the optic axis and x-axis parallel to the pixel rows. :seealso: :func:`~spatialmath.pose3d.SE3.rpy`, :func:`~spatialmath.pose3d.SE3.RPY`, :func:`spatialmath.base.transforms3d.rpy2r` """ return cls(quat.r2q(tr.rpy2r(angles, unit=unit, order=order)), check=False)