from_quat#
- classmethod Rotation.from_quat(cls, quat, *, scalar_first=False)#
Initialize from quaternions.
Rotations in 3 dimensions can be represented using unit norm quaternions [1].
The 4 components of a quaternion are divided into a scalar part
w
and a vector part(x, y, z)
and can be expressed from the angletheta
and the axisn
of a rotation as follows:w = cos(theta / 2) x = sin(theta / 2) * n_x y = sin(theta / 2) * n_y z = sin(theta / 2) * n_z
There are 2 conventions to order the components in a quaternion:
scalar-first order –
(w, x, y, z)
scalar-last order –
(x, y, z, w)
The choice is controlled by scalar_first argument. By default, it is False and the scalar-last order is assumed.
Advanced users may be interested in the “double cover” of 3D space by the quaternion representation [2]. As of version 1.11.0, the following subset (and only this subset) of operations on a
Rotation
r
corresponding to a quaternionq
are guaranteed to preserve the double cover property:r = Rotation.from_quat(q)
,r.as_quat(canonical=False)
,r.inv()
, and composition using the*
operator such asr*r
.- Parameters:
- quatarray_like, shape (N, 4) or (4,)
Each row is a (possibly non-unit norm) quaternion representing an active rotation. Each quaternion will be normalized to unit norm.
- scalar_firstbool, optional
Whether the scalar component goes first or last. Default is False, i.e. the scalar-last order is assumed.
- Returns:
- rotation
Rotation
instance Object containing the rotations represented by input quaternions.
- rotation
References
[2]Hanson, Andrew J. “Visualizing quaternions.” Morgan Kaufmann Publishers Inc., San Francisco, CA. 2006.
Examples
>>> from scipy.spatial.transform import Rotation as R
A rotation can be initialzied from a quaternion with the scalar-last (default) or scalar-first component order as shown below:
>>> r = R.from_quat([0, 0, 0, 1]) >>> r.as_matrix() array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]) >>> r = R.from_quat([1, 0, 0, 0], scalar_first=True) >>> r.as_matrix() array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])
It is possible to initialize multiple rotations in a single object by passing a 2-dimensional array:
>>> r = R.from_quat([ ... [1, 0, 0, 0], ... [0, 0, 0, 1] ... ]) >>> r.as_quat() array([[1., 0., 0., 0.], [0., 0., 0., 1.]]) >>> r.as_quat().shape (2, 4)
It is also possible to have a stack of a single rotation:
>>> r = R.from_quat([[0, 0, 0, 1]]) >>> r.as_quat() array([[0., 0., 0., 1.]]) >>> r.as_quat().shape (1, 4)
Quaternions are normalized before initialization.
>>> r = R.from_quat([0, 0, 1, 1]) >>> r.as_quat() array([0. , 0. , 0.70710678, 0.70710678])