se(3) twist

class Twist3(arg=None, w=None, check=True)[source]

Bases: spatialmath.twist.BaseTwist

3D twist class

A Twist class holds the parameters of a twist, a representation of a 3D rigid body transformation which is the unique elements of the Lie algebra se(3) of the corresponding SE(3) matrix.

References
  • Robotics, Vision & Control for Python, Section 2.3.2.3, P. Corke, Springer 2023.

  • Modern Robotics, Lynch & Park, Cambridge 2017

Note

Compared to Lynch & Park this module implements twist vectors with the translational components first, followed by rotational components, ie. \([\omega, \vec{v}]\).

Ad()[source]

Adjoint of 3D twist

Returns

adjoint matrix

Return type

ndarray(6,6)

S.Ad() is the 6x6 adjoint matrix of the corresponding homogeneous transformation.

For a twist representing motion from frame {B} to {A}, the adjoint will transform a twist relative to frame {A} to one relative to frame {B}.

Example:

>>> from spatialmath import Twist3
>>> S = Twist3.Rx(0.3)
>>> S.Ad()
array([[ 1.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ],
       [ 0.    ,  0.9553, -0.2955,  0.    ,  0.    ,  0.    ],
       [ 0.    ,  0.2955,  0.9553,  0.    ,  0.    ,  0.    ],
       [ 0.    ,  0.    ,  0.    ,  1.    ,  0.    ,  0.    ],
       [ 0.    ,  0.    ,  0.    ,  0.    ,  0.9553, -0.2955],
       [ 0.    ,  0.    ,  0.    ,  0.    ,  0.2955,  0.9553]])

Note

This method computes the equivalent SE(3) matrix, then the adjoint of that.

Seealso

Twist3.ad(), Twist3.SE3(), Twist3.exp()

classmethod Alloc(n=1)

Construct an instance with N default values (BasePoseList superclass method)

Parameters

n (int, optional) – Number of values, defaults to 1

Return type

Self

Returns

pose instance with n default values

X.Alloc(N) creates an instance of the pose class X with N default values, ie. len(X) will be N.

X can be considered a vector of pose objects, and those elements can be referenced X[i] or assigned to X[i] = ....

Note

The default value depends on the pose class and is the result of the empty constructor. For SO2, SE2, SO3, SE3 it is an identity matrix, for a twist class Twist2 or Twist3 it is a zero vector, for a UnitQuaternion or Quaternion it is a zero vector.

Example:

>>> x = X.Alloc(10)
>>> len(x)
10

where X is any of the SMTB classes.

classmethod Empty()

Construct an empty instance (BasePoseList superclass method)

Return type

Self

Returns

pose instance with zero values

Example:

>>> x = X.Empty()
>>> len(x)
0

where X is any of the SMTB classes.

classmethod RPY(*pos, **kwargs)[source]

Create a new 3D twist from roll-pitch-yaw angles

Parameters
  • 𝚪 (array_like or numpy.ndarray with shape=(N,3)) – roll-pitch-yaw angles

  • unit (str) – angular units: ‘rad’ [default], or ‘deg’

  • order (str) – rotation order: ‘zyx’ [default], ‘xyz’, or ‘yxz’

Returns

3D twist vector

Return type

Twist3 instance

  • Twist3.RPY(𝚪) is a 3D rotation defined by a 3-vector of roll, pitch, yaw angles \(\Gamma=(r, p, y)\) which correspond to successive rotations about the axes specified by order:

    • 'zyx' [default], rotate by yaw about the z-axis, then by pitch about the new y-axis, then by roll about the new x-axis. This is the convention for a mobile robot with x-axis forward and y-axis sideways.

    • 'xyz', rotate by yaw about the x-axis, then by pitch about the new y-axis, then by roll about the new z-axis. This is the convention for a robot gripper with z-axis forward and y-axis between the gripper fingers.

    • 'yxz', rotate by yaw about the y-axis, then by pitch about the new x-axis, then by roll about the new z-axis. This is the convention for a camera with z-axis parallel to the optical axis and x-axis parallel to the pixel rows.

If 𝚪 is an Nx3 matrix then the result is a sequence of rotations each defined by RPY angles corresponding to the rows of 𝚪.

  • Twist3.RPY(⍺, β, 𝛾) as above but the angles are provided as three scalars.

Foo bar!

Example:

>>> from spatialmath import Twist3
>>> Twist3.RPY(0.1, 0.2, 0.3)
Twist3([0, 0, 0, 0.068925, 0.21323, 0.28875])
>>> Twist3.RPY([0.1, 0.2, 0.3])
Twist3([0, 0, 0, 0.068925, 0.21323, 0.28875])
>>> Twist3.RPY(0.1, 0.2, 0.3, order='xyz')
Twist3([0, 0, 0, 0.30875, 0.18343, 0.12892])
>>> Twist3.RPY(10, 20, 30, unit='deg')
Twist3([0, 0, 0, 0.077525, 0.38485, 0.48648])
Seealso

RPY()

SymPy

supported

classmethod Rand(*, xrange=(- 1, 1), yrange=(- 1, 1), zrange=(- 1, 1), N=1)[source]

Create a new random 3D twist

Parameters
  • xrange (2-element sequence, optional) – x-axis range [min,max], defaults to [-1, 1]

  • yrange (2-element sequence, optional) – y-axis range [min,max], defaults to [-1, 1]

  • zrange (2-element sequence, optional) – z-axis range [min,max], defaults to [-1, 1]

  • N (int) – number of random transforms

Returns

SE(3) matrix

Return type

SE3 instance

Return an SE3 instance with random rotation and translation.

  • SE3.Rand() is a random SE(3) translation.

  • SE3.Rand(N=N) is an SE3 object containing a sequence of N random poses.

Example:

>>> from spatialmath import Twist3
>>> Twist3.Rand(N=2)
Twist3([
  [-0.0083994, 0.048943, 0.026766, -0.29666, 2.5864, 0.3635],
  [-0.73756, -0.36835, -0.54749, -0.44172, 0.9757, -1.8014]
])
Seealso

Rand()

classmethod Rx(theta, unit='rad')[source]

Create a new 3D twist for pure rotation about the X-axis

Parameters
  • θ (float) – rotation angle about X-axis

  • unit (str) – angular units: ‘rad’ [default], or ‘deg’

Returns

3D twist vector

Return type

Twist3 instance

  • Twist3.Rx(θ) is an SE(3) rotation of θ radians about the x-axis

  • Twist3.Rx(θ, "deg") as above but θ is in degrees

If θ is an array then the result is a sequence of rotations defined by consecutive elements.

Example:

>>> from spatialmath import Twist3
>>> Twist3.Rx(0.3)
Twist3([0, 0, 0, 0.3, 0, 0])
>>> Twist3.Rx([0.3, 0.4])
Twist3([
  [0, 0, 0, 0.3, 0, 0],
  [0, 0, 0, 0.4, 0, 0]
])
Seealso

trotx()

SymPy

supported

classmethod Ry(theta, unit='rad', t=None)[source]

Create a new 3D twist for pure rotation about the Y-axis

Parameters
  • θ (float) – rotation angle about X-axis

  • unit (str) – angular units: ‘rad’ [default], or ‘deg’

Returns

3D twist vector

Return type

Twist3 instance

  • Twist3.Ry(θ) is an SO(3) rotation of θ radians about the y-axis

  • Twist3.Ry(θ, "deg") as above but θ is in degrees

If θ is an array then the result is a sequence of rotations defined by consecutive elements.

Example:

>>> from spatialmath import Twist3
>>> Twist3.Ry(0.3)
Twist3([0, 0, 0, 0, 0.3, 0])
>>> Twist3.Ry([0.3, 0.4])
Twist3([
  [0, 0, 0, 0, 0.3, 0],
  [0, 0, 0, 0, 0.4, 0]
])
Seealso

troty()

SymPy

supported

classmethod Rz(theta, unit='rad', t=None)[source]

Create a new 3D twist for pure rotation about the Z-axis

Parameters
  • θ (float) – rotation angle about Z-axis

  • unit (str) – angular units: ‘rad’ [default], or ‘deg’

Returns

3D twist vector

Return type

Twist3 instance

  • Twist3.Rz(θ) is an SO(3) rotation of θ radians about the z-axis

  • Twist3.Rz(θ, "deg") as above but θ is in degrees

If θ is an array then the result is a sequence of rotations defined by consecutive elements.

Example:

>>> from spatialmath import Twist3
>>> Twist3.Rz(0.3)
Twist3([0, 0, 0, 0, 0, 0.3])
>>> Twist3.Rz([0.3, 0.4])
Twist3([
  [0, 0, 0, 0, 0, 0.3],
  [0, 0, 0, 0, 0, 0.4]
])
Seealso

trotz()

SymPy

supported

SE3(theta=1, unit='rad')[source]

Convert 3D twist to SE(3) matrix

Returns

an SE(3) representation

Return type

SE3 instance

S.SE3() is an SE3 object representing the homogeneous transformation equivalent to the Twist3. This is the exponentiation of the twist vector.

Example:

>>> from spatialmath import Twist3
>>> S = Twist3.Rx(0.3)
>>> S.SE3()
SE3(array([[ 1.    ,  0.    ,  0.    ,  0.    ],
           [ 0.    ,  0.9553, -0.2955,  0.    ],
           [ 0.    ,  0.2955,  0.9553,  0.    ],
           [ 0.    ,  0.    ,  0.    ,  1.    ]]))
Seealso

Twist3.exp()

classmethod Tx(x)[source]

Create a new 3D twist for pure translation along the X-axis

Parameters

x (float) – translation distance along the X-axis

Returns

3D twist vector

Return type

Twist3 instance

Twist3.Tx(x) is an se(3) translation of x along the x-axis

Example:

>>> from spatialmath import Twist3
>>> Twist3.Tx(2)
Twist3([2, 0, 0, 0, 0, 0])
>>> Twist3.Tx([2,3])
Twist3([
  [2, 0, 0, 0, 0, 0],
  [3, 0, 0, 0, 0, 0]
])
Seealso

transl()

SymPy

supported

classmethod Ty(y)[source]

Create a new 3D twist for pure translation along the Y-axis

Parameters

y (float) – translation distance along the Y-axis

Returns

3D twist vector

Return type

Twist3 instance

Twist3.Ty(y) is an se(3) translation of y along the y-axis

Example:

>>> from spatialmath import Twist3
>>> Twist3.Ty(2)
Twist3([0, 2, 0, 0, 0, 0])
>>> Twist3.Ty([2, 3])
Twist3([
  [0, 2, 0, 0, 0, 0],
  [0, 3, 0, 0, 0, 0]
])
Seealso

transl()

SymPy

supported

classmethod Tz(z)[source]

Create a new 3D twist for pure translation along the Z-axis

Parameters

z (float) – translation distance along the Z-axis

Returns

3D twist vector

Return type

Twist3 instance

Twist3.Tz(z) is an se(3) translation of z along the z-axis

Example:

>>> from spatialmath import Twist3
>>> Twist3.Tz(2)
Twist3([0, 0, 2, 0, 0, 0])
>>> Twist3.Tz([2, 3])
Twist3([
  [0, 0, 2, 0, 0, 0],
  [0, 0, 3, 0, 0, 0]
])
Seealso

transl()

SymPy

supported

classmethod UnitPrismatic(a)[source]

Construct a new 3D unit prismatic twist

Parameters

a (array_like(3)) – Twist axis or line of action

Returns

a prismatic twist

Return type

Twist instance

A prismatic twist with a line of action in the z-direction would be:


classmethod UnitRevolute(a, q, pitch=None)[source]

Construct a new 3D rotational unit twist

Parameters
  • a (array_like(3)) – Twist axis or line of action

  • q (array_like(3)) – Point on the line of action

  • p (float, optional) – pitch, defaults to None

Returns

a rotational or helical twist

Return type

Twist instance

A revolute twist with a line of action in the z-direction and passing through (1, 2, 0) would be:


__eq__(right)

Overloaded == operator (superclass method)

Returns

Equality of two operands

Return type

bool or list of bool

S1 == S2 is True if S1` is elementwise equal to ``S2.

Example:

  File "<input>", line 1, in <module>
NameError: name 'Twist3' is not defined
Traceback (most recent call last):
  File "<input>", line 1, in <module>
NameError: name 'S1' is not defined
Traceback (most recent call last):
  File "<input>", line 1, in <module>
NameError: name 'Twist3' is not defined
Traceback (most recent call last):
  File "<input>", line 1, in <module>
NameError: name 'S1' is not defined
Seealso

__ne__()

__init__(arg=None, w=None, check=True)[source]

Construct a new 3D twist object

  • Twist3() is a Twist3 instance representing null motion – the identity twist

  • Twist3(S) is a Twist3 instance from an array-like (6,)

  • Twist3(v, w) is a Twist3 instance from a moment v (3,) and direction w (3,)

  • Twist3([S1, S2, ... SN]) where each Si is a numpy array (6,)

  • Twist3(X) is a Twist3 instance with the same value as X, ie. a copy

  • Twist3([X1, X2, ... XN]) where each Xi is a Twist3 instance, is a Twist3 instance containing N motions

__mul__(right)[source]

Overloaded * operator

Parameters
  • left – left multiplicand

  • right – right multiplicand

Returns

product

Raises

ValueError

Twist composition or scaling:

  • X * Y compounds the twists X and Y

  • X * s performs elementwise multiplication of the elements of X by s

  • s * X performs elementwise multiplication of the elements of X by s

Multiplicands

Product

left

right

type

operation

Twist3

Twist3

Twist3

product of exponentials

Twist3

scalar

Twist3

element-wise product

scalar

Twist3

Twist3

element-wise product

Twist3

SE3

Twist3

exponential x SE3

Note

  1. scalar x Twist is handled by __rmul__

#. scalar multiplication is commutative but the result is not a group operation so the result will be a matrix #. Any other input combinations result in a ValueError.

For pose composition the left and right operands may be a sequence

len(left)

len(right)

len

operation

1

1

1

prod = left * right

1

M

M

prod[i] = left * right[i]

N

1

M

prod[i] = left[i] * right

M

M

M

prod[i] = left[i] * right[i]

__ne__(right)

Overloaded != operator (superclass method)

Return type

bool

S1 == S2 is True if S1` is not elementwise equal to ``S2.

Example:

>>> from spatialmath import Twist3
>>> S1 = Twist3([1,2,3,4,5,6])
>>> S2 = Twist3([1,2,3,4,5,6])
>>> S1 != S2
False
>>> S2 = Twist3([1,2,3,4,5,7])
>>> S1 != S2
True
Seealso

__ne__()

__truediv__(right)
ad()[source]

Logarithm of adjoint of 3D twist

Returns

logarithm of adjoint matrix

Return type

ndarray(6,6)

S.ad() is the 6x6 logarithm of the adjoint matrix of the corresponding homogeneous transformation.

For a twist representing motion from frame {B} to {A}, the adjoint will transform a twist relative to frame {A} to one relative to frame {B}.

Example:

>>> from spatialmath import Twist3
>>> S = Twist3.Rx(0.3)
>>> S.ad()
array([[ 0. , -0. ,  0. ,  0. , -0. ,  0. ],
       [ 0. ,  0. , -0.3,  0. ,  0. , -0. ],
       [-0. ,  0.3,  0. , -0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. , -0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. , -0.3],
       [ 0. ,  0. ,  0. , -0. ,  0.3,  0. ]])

Note

An alternative approach to computing the adjoint is to exponentiate this 6x6 matrix.

Seealso

Twist3.Ad()

append(item)

Append a value to an instance (BasePoseList superclass method)

Parameters

x (Quaternion or UnitQuaternion instance) – the value to append

Raises

ValueError – incorrect type of appended object

Appends the argument to the object’s internal list of values.

Example:

>>> x = X.Alloc(10)
>>> len(x)
10
>>> x.append(X())   # append to the list
>>> len(x)
11

where X is any of the SMTB classes.

Return type

None

clear() None -- remove all items from S
exp(theta=1, unit='rad')[source]

Exponentiate a 3D twist

Parameters
  • theta (float, optional) – rotation magnitude, defaults to None

  • units (str, optional) – rotational units, defaults to ‘rad’

Returns

SE(3) matrix

Return type

SE3 instance

  • X.exp() is the homogeneous transformation equivalent to the twist, \(e^{[S]}\)

  • X.exp(θ) as above but with a rotation of ``θ about the twist axis, \(e^{ heta[S]}\)

If len(X)==1 and len(θ)==N then the resulting SE3 object has N values equivalent to the twist \(e^{ heta_i[S]}\).

If len(X)==N and len(θ)==1 then the resulting SE3 object has N values equivalent to the twist \(e^{ heta[S_i]}\).

If len(X)==N and len(θ)==N then the resulting SE3 object has N values equivalent to the twist \(e^{ heta_i[S_i]}\).

Example:

>>> from spatialmath import SE3, Twist3
>>> T = SE3(1, 2, 3) * SE3.Rx(0.3)
>>> S = Twist3(T)
>>> S.exp(0)
SE3(array([[1., 0., 0., 0.],
           [0., 1., 0., 0.],
           [0., 0., 1., 0.],
           [0., 0., 0., 1.]]))
>>> S.exp(1)
SE3(array([[ 1.    ,  0.    ,  0.    ,  1.    ],
           [ 0.    ,  0.9553, -0.2955,  2.    ],
           [ 0.    ,  0.2955,  0.9553,  3.    ],
           [ 0.    ,  0.    ,  0.    ,  1.    ]]))

Note

  • For the second form, the twist must, if rotational, have a unit rotational component.

Seealso

spatialmath.smb.trexp()

extend(iterable)

Extend sequence of values in an instance (BasePoseList superclass method)

Parameters

x (instance of same type) – the value to extend

Raises

ValueError – incorrect type of appended object

Appends the argument’s values to the object’s internal list of values.

Example:

>>> x = X.Alloc(10)
>>> len(x)
10
>>> x.append(X.Alloc(5))   # extend the list
>>> len(x)
15

where X is any of the SMTB classes.

Return type

None

insert(i, item)

Insert a value to an instance (BasePoseList superclass method)

Parameters
  • i (int) – element to insert value before

  • item (instance of same type) – the value to insert

Raises

ValueError – incorrect type of inserted value

Inserts the argument into the object’s internal list of values.

Example:

>>> x = X.Alloc(10)
>>> len(x)
10
>>> x.insert(0, X())   # insert at start of list
>>> len(x)
11
>>> x.insert(10, X())   # append to the list
>>> len(x)
11

where X is any of the SMTB classes.

Note

If i is beyond the end of the list, the item is appended to the list

Return type

None

inv()

Inverse of Twist (superclass method)

Returns

inverse

Return type

Twist instance

Compute the inverse of each of the values within the twist instance. The inverse is the negative of the twist vector.

Example:

>>> from spatialmath import Twist3
>>> S = Twist3(SE3.Rand())
>>> S
Twist3([-0.73913, -0.63014, 1.524, -2.8597, 0.087218, 0.67055])
>>> S.inv()
Twist3([0.73913, 0.63014, -1.524, 2.8597, -0.087218, -0.67055])
>>> S * S.inv()
Twist3([1.1102e-16, 2.2204e-16, 9.992e-16, 0, -3.4306e-18, 5.8175e-18])
static isvalid(v, check=True)[source]

Test if matrix is valid twist

Parameters

x (ndarray) – array to test

Returns

Whether the value is a 6-vector or a valid 4x4 se(3) element

Return type

bool

A twist can be represented by a 6-vector or a 4x4 skew symmetric matrix, for example:

>>> from spatialmath import Twist3
>>> from spatialmath.base import skewa
>>> import numpy as np
>>> Twist3.isvalid([1, 2, 3, 4, 5, 6])
True
>>> a = skewa([1, 2, 3, 4, 5, 6])
>>> a
array([[ 0., -6.,  5.,  1.],
       [ 6.,  0., -4.,  2.],
       [-5.,  4.,  0.,  3.],
       [ 0.,  0.,  0.,  0.]])
>>> Twist3.isvalid(a)
True
>>> Twist3.isvalid(np.random.rand(4,4))
False
line()[source]

Line of action of 3D twist as a Plucker line

Returns

the 3D line of action

Return type

Line instance

X.line() is a Plucker object representing the line of the twist axis.

Example:

  File "/opt/hostedtoolcache/Python/3.7.17/x64/lib/python3.7/site-packages/spatialmath/twist.py", line 968, in <listcomp>
    return Line3([Line3(-tw.v + tw.pitch * tw.w, tw.w) for tw in self])
  File "/opt/hostedtoolcache/Python/3.7.17/x64/lib/python3.7/site-packages/spatialmath/geom3d.py", line 314, in __init__
    raise ValueError("invalid Plucker coordinates")
ValueError: invalid Plucker coordinates
pop(i=- 1)

Pop value from an instance (BasePoseList superclass method)

Parameters

i (int) – item in the list to pop, default is last

Returns

the popped value

Return type

instance of same type

Raises

IndexError – if there are no values to pop

Removes a value from the value list and returns it. The original instance is modified.

Example:

>>> x = X.Alloc(10)
>>> len(x)
10
>>> y = x.pop()  # pop the last value x[9]
>>> len(x)
9
>>> y = x.pop(0)  # pop the first value x[0]
>>> len(x)
8

where X is any of the SMTB classes.

printline(**kwargs)[source]
prod()

Product of twists (superclass method)

Returns

Product of elements

Return type

Twist2 or Twist3

For a twist instance with N values return the matrix product of those elements \(\prod_i=0^{N-1} S_i\).

Example:

>>> from spatialmath import Twist3
>>> S = Twist3.Rx([0.2, 0.3, 0.4])
>>> len(S)
3
>>> S.prod()
Twist3([0, 0, 0, 0.9, 0, 0])
>>> Twist3.Rx(0.9)
Twist3([0, 0, 0, 0.9, 0, 0])
reverse()

S.reverse() – reverse IN PLACE

skewa()[source]

Convert 3D twist to se(3)

Returns

An se(3) matrix

Return type

ndarray(4,4)

X.skewa() is the twist as a 4x4 augmented skew-symmetric matrix belonging to the group se(3). This is the Lie algebra of the corresponding SE(3) element.

Example:


unit()[source]

Unit twist

  • S.unit() is a Twist2 objec3 representing a unit twist aligned with the Twist S.

Example:

NameError: name 'S' is not defined
property A: Union[List[numpy.ndarray[Any, numpy.dtype[numpy.typing._generic_alias.ScalarType]]], numpy.ndarray[Any, numpy.dtype[numpy.typing._generic_alias.ScalarType]]]

Array value of an instance (BasePoseList superclass method)

Returns

NumPy array value of this instance

Return type

ndarray

  • X.A is a NumPy array that represents the value of this instance, and has a shape given by X.shape.

Note

This assumes that len(X) == 1, ie. it is a single-valued instance.

property N

Dimension of the object’s group

Returns

dimension

Return type

int

Dimension of the group is 3 for Twist3 and corresponds to the dimension of the space (3D in this case) to which these rigid-body motions apply.

Example:

>>> from spatialmath import Twist3
>>> x = Twist3()
>>> x.N
3
property S

Twist as a vector (superclass property)

Returns

Twist vector

Return type

ndarray(N)

  • X.S is a 3-vector if X is a Twist2 instance, and a 6-vector if X is a Twist3 instance.

Note

  • the vector is the unique elements of the se(N) representation.

  • the vector is sometimes referred to as the twist coordinate vector.

  • if len(X) > 1 then return a list of vectors.

property isprismatic

Test for prismatic twist (superclass property)

Returns

Whether twist is purely prismatic

Return type

bool

A prismatic twist has \(\vec{\omega} = 0\).

Example:

>>> from spatialmath import Twist3
>>> x = Twist3.UnitPrismatic([1,2,3])
>>> x.isprismatic
True
>>> x = Twist3.UnitRevolute([1,2,3], [4,5,6])
>>> x.isprismatic
False
property isrevolute

Test for revolute twist (superclass property)

Returns

Whether twist is purely revolute

Return type

bool

A revolute twist has \(\vec{v} = 0\).

Example:

>>> from spatialmath import Twist3
>>> x = Twist3.UnitPrismatic([1,2,3])
>>> x.isrevolute
False
>>> x = Twist3.UnitRevolute([1,2,3], [0,0,0])
>>> x.isrevolute
True
property isunit

Test for unit twist (superclass property)

Returns

Whether twist is a unit-twist

Return type

bool

A unit twist is one with a norm of 1, ie. \(\| S \| = 1\).

Example:

  File "<input>", line 1, in <module>
TypeError: 'bool' object is not callable
property pitch

Pitch of a 3D twist

Returns

the pitch of the twist

Return type

float

X.pitch() is the pitch of the twist as a scalar in units of distance per radian.

If we consider the twist as a screw, this is the distance of translation along the screw axis for a one radian rotation about the screw axis.

Example:

>>> from spatialmath import SE3, Twist3
>>> T = SE3(1, 2, 3) * SE3.Rx(0.3)
>>> S = Twist3(T)
>>> S.pitch
0.3
property pole

Pole of a 3D twist

Returns

the pole of the twist

Return type

ndarray(3)

X.pole() is a point on the twist axis. For a pure translation this point is at infinity.

Example:

>>> from spatialmath import SE3, Twist3
>>> T = SE3(1, 2, 3) * SE3.Rx(0.3)
>>> S = Twist3(T)
>>> S.pole
array([ 0.    , -2.6775,  2.435 ])
property shape

Shape of the object’s internal array representation

Returns

(6,)

Return type

tuple

property theta

Twist angle (superclass method)

Returns

magnitude of rotation (1x1) about the twist axis in radians

Return type

float

property v

Moment vector of twist

Returns

Moment vector

Return type

ndarray(3)

X.v is a 3-vector representing the moment vector of the twist.

Example:

>>> from spatialmath import Twist3
>>> t = Twist3([1, 2, 3, 4, 5, 6])
>>> t.v
array([1, 2, 3])
property w

Direction vector of twist

Returns

Direction vector

Return type

ndarray(3)

X.w is a 3-vector representing the direction vector of the twist.

Example:

>>> from spatialmath import Twist3
>>> t = Twist3([1, 2, 3, 4, 5, 6])
>>> t.w
array([4, 5, 6])