def EulerVec(cls, w): r""" Construct a new SO(3) rotation matrix from an Euler rotation vector :param ω: rotation axis :type ω: 3-element array_like :return: SO(3) rotation :rtype: SO3 instance ``SO3.EulerVec(ω)`` is a unit quaternion that describes the 3D rotation defined by a rotation of :math:`\theta = \lVert \omega \rVert` about the unit 3-vector :math:`\omega / \lVert \omega \rVert`. Example: .. runblock:: pycon >>> from spatialmath import SO3 >>> SO3.EulerVec([0.5,0,0]) .. note:: :math:`\theta \eq 0` the result in an identity matrix, otherwise ``V`` must have a finite length, ie. :math:`|V| > 0`. :seealso: :func:`~spatialmath.pose3d.SE3.angvec`, :func:`~spatialmath.base.transforms3d.angvec2r` """ assert base.isvector(w, 3), 'w must be a 3-vector' w = base.getvector(w) theta = base.norm(w) return cls(base.angvec2r(theta, w), check=False)
def AngVec(cls, theta, v, *, unit='rad'): r""" Construct a new SO(3) rotation matrix from rotation angle and axis :param theta: rotation :type theta: float :param unit: angular units: 'rad' [default], or 'deg' :type unit: str :param v: rotation axis, 3-vector :type v: array_like :return: SO(3) rotation :rtype: SO3 instance ``SO3.AngVec(theta, V)`` is an SO(3) rotation defined by a rotation of ``THETA`` about the vector ``V``. .. note:: :math:`\theta \eq 0` the result in an identity matrix, otherwise ``V`` must have a finite length, ie. :math:`|V| > 0`. :seealso: :func:`~spatialmath.pose3d.SE3.angvec`, :func:`spatialmath.base.transforms3d.angvec2r` """ return cls(base.angvec2r(theta, v, unit=unit), check=False)
def AngVec(cls, theta, v, *, unit='rad'): """ Create an SO(3) rotation matrix from rotation angle and axis :param theta: rotation :type theta: float :param unit: angular units: 'rad' [default], or 'deg' :type unit: str :param v: rotation axis, 3-vector :type v: array_like :return: 3x3 rotation matrix :rtype: SO3 instance ``SO3.AngVec(THETA, V)`` is an SO(3) rotation defined by a rotation of ``THETA`` about the vector ``V``. Notes: - If ``THETA == 0`` then return identity matrix. - If ``THETA ~= 0`` then ``V`` must have a finite length. :seealso: :func:`~spatialmath.pose3d.SE3.angvec`, :func:`spatialmath.base.transforms3d.angvec2r` """ return cls(quat.r2q(tr.angvec2r(theta, v, unit=unit)), check=False)
def Omega(cls, w): return cls(quat.r2q(tr.angvec2r(tr.norm(w), tr.unitvec(w))), check=False)