def OA(cls, o, a): """ Construct a new SO(3) 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: SO(3) rotation :rtype: SO3 instance ``SO3.OA(O, A)`` is an SO(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:: - Only the ``A`` vector is 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 :seealso: :func:`spatialmath.base.transforms3d.oa2r` """ return cls(base.oa2r(o, a), check=False)
def OA(cls, o, a): """ Create SO(3) 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: 3x3 rotation matrix :rtype: SO3 instance ``SO3.OA(O, A)`` is an SO(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(quat.r2q(tr.oa2r(angles, unit=unit)), check=False)