__pow__#
- RigidTransform.__pow__()#
Compose this transform with itself n times.
A rigid transform p when raised to non-integer powers can be thought of as finding a fraction of the transformation. For example, a power of 0.5 finds a “halfway” transform from the identity to p.
This is implemented by applying screw linear interpolation (ScLERP) between p and the identity transform, where the angle of the rotation component is scaled by n, and the translation is proportionally adjusted along the screw axis.
q = p ** n
can also be expressed asq = RigidTransform.from_exp_coords(p.as_exp_coords() * n)
.If n is negative, then the transform is inverted before the power is applied. In other words,
p ** -abs(n) == p.inv() ** abs(n)
.- Parameters:
- nfloat
The number of times to compose the transform with itself.
- Returns:
RigidTransform
instanceIf the input Rotation p contains N multiple rotations, then the output will contain N rotations where the i th rotation is equal to
p[i] ** n
.
Notes
There are three notable cases: if
n == 1
then a copy of the original transform is returned, ifn == 0
then the identity transform is returned, and ifn == -1
then the inverse transform is returned.Note that fractional powers
n
which effectively take a root of rotation, do so using the shortest path smallest representation of that angle (the principal root). This means that powers ofn
and1/n
are not necessarily inverses of each other. For example, a 0.5 power of a +240 degree rotation will be calculated as the 0.5 power of a -120 degree rotation, with the result being a rotation of -60 rather than +120 degrees.Examples
>>> from scipy.spatial.transform import RigidTransform as Tf >>> import numpy as np
A power of 2 returns the transform composed with itself:
>>> tf = Tf.from_translation([1, 2, 3]) >>> (tf ** 2).translation array([2., 4., 6.]) >>> (tf ** 2).as_matrix() array([[1., 0., 0., 2.], [0., 1., 0., 4.], [0., 0., 1., 6.], [0., 0., 0., 1.]])
A negative power returns the inverse of the transform raised to the absolute value of n:
>>> (tf ** -2).translation array([-2., -4., -6.]) >>> np.allclose((tf ** -2).as_matrix(), (tf.inv() ** 2).as_matrix(), ... atol=1e-12) True
A power of 0 returns the identity transform:
>>> (tf ** 0).as_matrix() array([[1., 0., 0., 0.], [0., 1., 0., 0.], [0., 0., 1., 0.], [0., 0., 0., 1.]])
A power of 1 returns a copy of the original transform:
>>> (tf ** 1).as_matrix() array([[1., 0., 0., 1.], [0., 1., 0., 2.], [0., 0., 1., 3.], [0., 0., 0., 1.]])
A fractional power returns a transform with a scaled rotation and translated along the screw axis. Here we take the square root of the transform, which when squared recovers the original transform:
>>> tf_half = (tf ** 0.5) >>> tf_half.translation array([0.5, 1., 1.5]) >>> (tf_half ** 2).as_matrix() array([[1., 0., 0., 1.], [0., 1., 0., 2.], [0., 0., 1., 3.], [0., 0., 0., 1.]])