def OA(cls, o, a): """ Create SE(3) pure rotation from two vectors :param o: 3-vector parallel to Y- axis :type o: array_like :param a: 3-vector parallel to the Z-axis :type o: array_like :return: 4x4 homogeneous transformation matrix :rtype: SE3 instance ``SE3.OA(O, A)`` is an SE(3) rotation defined in terms of vectors parallel to the Y- and Z-axes of its reference frame. In robotics these axes are respectively called the orientation and approach vectors defined such that R = [N O A] and N = O x A. Notes: - The A vector is the only guaranteed to have the same direction in the resulting rotation matrix - O and A do not have to be unit-length, they are normalized - O and A do not have to be orthogonal, so long as they are not parallel - The vectors O and A are parallel to the Y- and Z-axes of the equivalent coordinate frame. :seealso: :func:`spatialmath.base.transforms3d.oa2r` """ return cls(tr.oa2tr(o, a), check=False)
def OA(cls, o, a): r""" Create an SE(3) pure rotation from two vectors :param o: 3-vector parallel to Y- axis :type o: array_like :param a: 3-vector parallel to the Z-axis :type a: array_like :return: SE(3) matrix :rtype: SE3 instance ``SE3.OA(o, a)`` is an SE(3) rotation defined in terms of vectors ``o`` and ``a`` respectively parallel to the Y- and Z-axes of its reference frame. In robotics these axes are respectively called the *orientation* and *approach* vectors defined such that :math:`\mathbf{R} = [n, o, a]` and :math:`n = o \times a`. .. note:: - The ``a`` vector is the only guaranteed to have the same direction in the resulting rotation matrix - ``o`` and ``a`` do not have to be unit-length, they are normalized - ``o`` and ``a`` do not have to be orthogonal, so long as they are not parallel ``o`` is adjusted to be orthogonal to ``a``. Example:: >>> SE3.OA([1, 0, 0], [0, 0, -1]) SE3(array([[-0., 1., 0., 0.], [ 1., 0., 0., 0.], [ 0., 0., -1., 0.], [ 0., 0., 0., 1.]])) :seealso: :func:`~spatialmath.base.transforms3d.oa2r` """ return cls(base.oa2tr(o, a), check=False)