Motor decomposition¶
A motor is a rigid-body motion written as a rotation followed by a translation:
where
- \(R(\theta, \hat{a}) = c - s B\) is a rotor about the unit axis \(\hat{a}\), with \(c = \cos(\theta/2)\), \(s = \sin(\theta/2)\), and \(B\) the unit bivector of the rotation plane (the dual of \(\hat{a}\));
- \(T(\mathbf{t}) = 1 - \tfrac{1}{2}\,\mathbf{t} \wedge e_\infty\) is a translation by \(\mathbf{t}\).
Every motor can be rewritten as a screw: a translation along the rotation axis composed with a general rotor — a rotation about an axis that has been displaced away from the origin:
Motor is stored internally in this normalized form: a GeneralRotor
(angle, axis, origin) plus a Translator whose vector lies along the
axis.
Decomposition¶
Split the translation into a component along the axis and one perpendicular to it:
The axis displacement \(\mathbf{v}\) (perpendicular to the axis) is then
The axial part \(\mathbf{u}\) becomes the translation along the screw axis and \(\mathbf{v}\) becomes the origin of the general rotor.
Special cases¶
- Pure rotation (\(\mathbf{t} = 0\)): \(\mathbf{u} = \mathbf{v} = 0\).
- Pure screw (\(\mathbf{t}_\perp = 0\)): \(\mathbf{v} = 0\), \(\mathbf{u} = \mathbf{t}\).
- Pure translation (\(\theta \approx 0\)): the screw pitch is infinite and \(\cot(\theta/2)\) diverges, so the code falls back to \(\mathbf{u} = \mathbf{t}\), \(\mathbf{v} = 0\) with an identity rotation.
Worked example¶
Take \(R(\pi/2, \hat z)\) and \(\mathbf{t} = (1, 1, 1)\). Then
and, because \(\cot(\pi/4) = 1\),
The motor is therefore a \(90^\circ\) rotation about the axis through \((0, 1, 0)\) parallel to \(\hat z\), composed with a translation of \(1\) along \(\hat z\).