Skip to content

Dual Quaternions for SE(3)

February 25, 2025

Michael Bauer

Introduction

At ReSim we use Lie groups for a variety of reasons. One good reason for choosing to express our robotics algorithms and libraries in terms of Lie groups is that they are an abstraction for rigid body transformations, rotations, and other relevant transformations, meaning we can write common algorithms to solve a variety of problems. This, of course, is very appealing to software engineers, who always love a good abstraction. As an example, the Sophus library includes a single header which provides a template implementation of ceres::Manifold for any Lie group defined in a similar manner to the ones implemented in that library. For those unfamiliar with CERES, the upshot of this is that Lie-group-valued parameters (e.g. camera extrinsics) can be easily optimized based on logged robotics data if those parameters are expressed using Sophus's library.

This abstraction goes even deeper: even for a particular Lie group such as \(\text{SO}(3)\) or \(\text{SE}(3)\), we have multiple choices of how to implement it. You may be familiar with how unit quaternions can be used to represent 3D orientation (if not I highly recomment this video and this follow-up video from 3Blue1Brown). Unit Quaternions are one possible way of representing \(\text{SO}(3)\) and they have some advantages, including the ability to compose transforms rapidly, compared to the matrix representation of \(\text{SO}(3)\) (i.e. rotation matrices). However, rotation matrices are able to act on (i.e. rotate) points/vectors in fewer floating-point operations (FLOPs) than unit quaternions. The point is that one may have software design reasons for preferring one implementation of \(\text{SO}(3)\) over another in certain contexts, and this is true for other groups as well.

In this post, we explore an alternative way to represent \(\text{SE}(3)\) using unit dual quaternions, which is different from our approach in the open-core repository. Rather than rigorously proving every claim or covering all possible operations, we aim to provide a high-level overview. We'll discuss how to compose transformations, express algebra elements as dual quaternions, and derive the exponential map. Our goal is to build intuition that may be useful for other representations of \(\text{SE}(3)\) and beyond.

Quaternions

Quaternions are a number system introduced by William Hamilton that can be seen as an extension of the complex numbers. They have gained popularity in 3D graphics in the 21st Century due to their ability to store orientations efficiently (with just 4 floating point values) and their ability to be composed efficiently (16 multiplications vs 27 for composing rotation matrices), although they do have some disadvantages such as their inability to uniquely represent a given orientation (there are exactly two unit quaternions that represent a given orientation) and their lower efficiency at transforming points (15 multiplications vs 9 for rotation matrices). Here’s how they work in a nutshell. Analogous to how complex numbers are built off the definition of a constant \(i\) such that \(i^2=-1\), quaternions are defined based on three such values: \(i\), \(j\), and \(k\) such that \(i^2=j^2=k^2=ijk=-1\). From these rules, one can also infer:

\[ \begin{aligned}jk&=i&kj&=-i\\ki&=j&ik&=-j\\ ij&=k&ji&=-k\end{aligned} \]

Note how these values do not commute. Similar to complex numbers, quaternions also have a real part, so in general, the set of all quaternions can be written as:

\[ \mathbb{Q}=\left\{w+xi+yj+zk|(w,x,y,z)\in\mathbb{R}^4\right\} \]

Where \(w\) is the real part of the quaternion. As a notational matter, we often refer to the non-real part of the quaternion \(xi+yj+zk\) as the “vector part” and write the whole quaternion as a tuple of it’s real part and vector part:

\[ q=w+xi+yj+zk=(w,\vec \nu),\quad\text{where}\,\,\,\vec \nu=[x\,y\,z]^T \]

Doing so allows us to express multiplication between two quaternions according to the above rules like so:

\[ q_1 q_2=(w_1,\vec \nu_1)(w_2,\vec \nu_2)=(w_1 w_2 - \vec \nu_1\cdot \vec \nu_2, w_1\vec \nu_2 + w_2 \vec \nu_1 + \vec \nu_1 \times \vec \nu_2) \]

This product is referred to as the "Hamilton product". Verifying this formula based on the above rules is left as an exercise to the reader. From this expression, we can also note the fact that quaternion multiplication is not commutative due to the fact that \(i\), \(j\), and \(k\) do not commute.

Like complex numbers, quaternions also have the notion of a conjugate defined such that:

\[ q^* = (w,\nu)^*=(w,-\nu) \]

And the concept of a norm (a.k.a. modulus) defined by:

\[ |q|=\sqrt{qq^*}=\sqrt{q^*q} \]

And the concept of a multiplicative inverse \(q^{-1}\) such that:

\[ qq^{-1}=q^{-1}q=1 \]

Unit quaternions (i.e. those for which \(|q| = 1\)) can be used to represent 3D rotations as elucidated by the aforementioned videos.

Dual Numbers

Just like quaternions, the Dual Number system is another number system that is similar to the complex numbers. Instead of defining a constant \(i\) such that \(i^2=-1\), dual numbers define a constant \(\varepsilon\) such that \(\varepsilon^2 = 0\). In other words, dual numbers look like \(a + \varepsilon b\) for \(a,b\in\mathbb{R}\) and muliplying them works like so:

\[ (a + \varepsilon b)(c + \varepsilon d) = ac + \varepsilon (bc + ad) \]

Where the \(\varepsilon^2\) drops out since it's zero. Doing this becomes useful for numerous applications including automatic differentiation where the rules of dual multiplication effectively enforce the product rule. This is not actually the way we leverage dual numbers when representing \(\text{SE}(3)\), however. To see how we do, we'll have to take a deeper look at dual quaternions.

Dual Quaternions

Even more interesting things begin to happen when we combine quaternions and dual numbers together. We do this by imagining a dual number whose real and dual parts \(q\) and \(r\) are themselves quaternions.

\[ Q = q + \varepsilon r =(s,u)+\varepsilon (t, \nu) \]

Multiplying such objects together works as one would expect. That is to say you multiply them using the distributive property and apply the rules outlined above regarding the quaternion constants \(i\), \(j\), and \(k\) and the dual constant \(\varepsilon\). Importantly, \(\varepsilon\) is allowed to commute with \(i\), \(j\), and \(k\) even though they don’t commute with each other. This ends up looking like so:

\[ \begin{aligned}Q_1 Q_2 &= (q_1 + \varepsilon r_1)(q_2 + \varepsilon r_2) \\ &= q_1q_2 + \varepsilon(r_1q_2 + q_1 r_2)\end{aligned} \]

Define the conjugate \(Q^*\) such that:

\[ Q^* = (s, -u) + \varepsilon (t, -\nu) \]

And define the norm of a dual quaternion like so:

\[ \begin{aligned} ||Q||^2 &= Q Q^* \\ &= \left[(s, u) + \varepsilon(t, \nu)\right]\left[(s, -u) + \varepsilon(t, -\nu)\right] \\ &= s^2 + u\cdot u + 2\varepsilon(ts + \nu\cdot u) \end{aligned} \]

With this definition we define unit dual quaternions as those with unit norm:

\[ ||Q||^2 = s^2 + u\cdot u + 2\varepsilon(ts + \nu\cdot u) = 1 \]

If we define \(q_r := (s, u)\) as our real (i.e. non-dual) part, this implies that unit dual quaternions must have \(|q_r| = 1\). We also must satisfy \(ts + \nu\cdot u = 0\), and it turns out we can guarantee this by re-writing our dual part as \((t, \nu) = (0, d)q_r\) (with \(d\in\mathbb{R}^3\)), where we can compute \(d\) by using the fact that \((0, d) = (t, \nu)q_r^*\). Therefore, we can write any unit dual quaternion in the form:

\[ Q = q_r + \epsilon (0, d)q_r \]

For some unit quaternion \(q_r\) and some three vector \(d\).

We claim that the set of unit dual quaternions under the above product is a group. Notably it has the following properties:

  1. It is closed under multiplication. One can relatively easily show that for dual quaternions \(Q\) and \(U\), \((QU)^* = U^*Q^*\). From here, it's easy to see that the norm of a product is a product of norms for dual quaternions by directly substituting \(QU\) into the definition of the norm. This implies closure for the set of unit dual quaternions under multiplication.

  2. The product operation is associative. This follows from the associativity of the Hamilton and dual products, although we don't explicitly demonstrate this here.

  3. Every unit dual quaternion has an inverse element, given by \(Q^{-1} = Q^*\) and an identity element given by \(1\) such that \(Q\cdot 1 = Q\). By definition, we see that \(Q Q^{*}=1\) and since \(Q = \left(Q^*\right)^*\), we also know \(Q^*Q = 1\)

The unit dual quaternions are also a differentiable manifold. A rough argument for this could use the fact that we have a differentiable mapping \(f\) from \(\mathbb{Q}_1\times \mathbb{R}^3\) (where \(\mathbb{Q}_1\) is the set of unit quaternions) to the unit dual quaternions \(\mathbb{D}_1\). This mapping is given by \(f(q_r, d) = q_r + \varepsilon(0, d)q_r\). Since \(\mathbb{Q}_1\) and \(\mathbb{R}^3\) are differentiable manifolds, you can use their charts to define appropriate charts on \(\mathbb{D}_1\) to prove that it is as well.

Since \(\mathbb{D}_1\) is a group and a differentiable manifold, we can say that it is a Lie group.

Tangent Vectors

Let \(\mathbb{D}_1\) be the set of unit dual quaternions. Now, let's assume that we have a curve \(\gamma: \mathbb{R} \rightarrow \mathbb{D}_1\) that has \(\gamma(0) = 1\). Describe this curve by its components like so:

\[ \gamma(\tau) = (s(\tau), u(\tau)) + \varepsilon(t(\tau), \nu(\tau)) \]

Where \(s, t: \mathbb{R}\rightarrow\mathbb{R}\) are real curves and \(u, \nu: \mathbb{R}\rightarrow\mathbb{R}^3\) are vector curves.

We know that the curve satisfies the unit constraint:

\[ 1 = \left[(s, u) + \varepsilon(t, \nu)\right]\left[(s, -u) + \varepsilon(t, -\nu)\right] \]

Differentiating this, we see:

\[ 0 = \left[(s', u') + \varepsilon(t', \nu')\right]\left[(s, -u) + \varepsilon(t, -\nu)\right] + \left[(s, u) + \varepsilon(t, \nu)\right]\left[(s', -u') + \varepsilon(t', -\nu')\right] \]

Evaluating this at the identity where \((s, u, t, \nu) = (1, 0, 0, 0)\) we see:

\[ 0 = \left[(s', u') + \varepsilon(t', \nu')\right] + \left[(s', -u') + \varepsilon(t', -\nu')\right] \]

By inspection of this expression, we can see that it is satisfied whenver \(s' = t' = 0\). These two constraints reduce the eight degrees of freedom inherent in the dual quaternion number system to six, which intuitively matches the number of degrees of freedom of \(\text{SE}(3)\). We can therefore write our tangent vectors at the identity (i.e. Lie algebra elements) like so:

\[ \gamma'(0) = \frac{1}{2}(0, \omega) + \frac{1}{2}\varepsilon(0, v) \]

where \(v\) is unrelated to the \(\nu\) used above. We've used \(\omega\) and \(v\) here as these will end up corresponding to angular and linear velocities. The reason for the factor of \(1/2\) will be elucidated later.

Correspondence to SE(3)

So far, we've claimed that unit dual quaternions are a Lie group and shown what the derivatives at the identity should look like. We also claim that unit dual quaternions are related to \(\text{SE}(3)\). To explore this, we first designate the tangent space at the identity as \(T\mathbb{D}_1\). The elements of this space are dual quaternions of the form \((1/2)(0, \omega) + (1/2)\varepsilon (0, v)\). We claim that this space is isomorphic to \(\mathfrak{se}(3)\) when equipped with an appropriate bracket operation. To do this, we define the bracket very simply like so. For

\[ \begin{aligned} k_1 &= (1/2)(0, \omega_1) + (1/2)\varepsilon (0, v_1) \\ k_2 &= (1/2)(0, \omega_2) + (1/2)\varepsilon (0, v_2) \end{aligned} \]

Define the bracket as the commutator:

\[ [k_1, k_2] = k_1 k_2 - k_2 k_1 \]

One can relatively easily verify that this satisfies, closure, bilinearity, the alternating property, and the Jacobi identity, so it is a valid choice. This can be seen when one works out the algebra:

\[ [k_1, k_2] = \frac{1}{2}(0, \omega_1 \times \omega_2) + \frac{1}{2}\varepsilon(0, \omega_1 \times v_2 - \omega_2 \times v_1) \]

Note that the Lie algebra is not closed under the Hamilton/dual product, but is under the bracket. If we define \(k_3\) by \(k_3 \equiv [k_1, k_2]\) and define \(\omega_3\) and \(v_3\) as its angular and linear velocity respectively, then we can read from the above expression:

\[ \begin{aligned} \omega_3 &= \omega_1 \times \omega_2 \\ v_3 &= \omega_1 \times v_2 - \omega_2 \times v_1 \end{aligned} \]

If we look at the common matrix form for \(\mathfrak{se}(3)\), its members are usually expressed as matrices of the following form:

\[ X = \begin{bmatrix} \omega_{\times} & v \\ 0 & 0 \end{bmatrix} \]

And if one computes the bracket for \(\mathfrak{se}(3)\) they'll get:

\[ [X_1, X_2] = \begin{bmatrix} (\omega_1 \times \omega_2)_\times & [\omega_1 \times v_2 - \omega_2 \times v_1] \\ 0 & 0 \end{bmatrix} \]

By comparing this with the bracket we defined on \(T\mathbb{D}_1\), we see that both algebras have the same structure (i.e. you could compute the structure constants for each and they would be identical). Note that the choice of \((1/2)\) prefactors in the form of our tangent vectors allows the structure constants to match (rather than differing by a constant factor) and for us to interpret the vector components of our dual quaternion tangents as angular velocity and linear velocity directly.

This all means there is a linear isomorphism \(\phi\) that maps \(\mathfrak{se}(3)\) to \(T\mathbb{D}_1\). The upshot of this is that we can apply the Lie group homomorphisms theorem.

Lie Homomorphisms Theorem (Hall Theorem 5.6)

If \(\phi: Lie(G) \rightarrow Lie(H)\) is a Lie algebra homomorphism and if \(G\) is simply connected, then there exists a (unique) Lie group homomorphism \(f: G\rightarrow H\) such that \(\phi = df\).

The proof for this is quite fascinating and I recommend having a look at Lie Groups, Lie Algebras, and Representations: An Elementary Introduction by Brian Hall. The Baker-Campbell-Hausdorff formula is used to establish a local homomorphism near the identity which is extended to the entirety of the domain employing the fact that it's simply connected.

It turns out that the set of unit dual quaternions \(\mathbb{D}_1\) is simply connected. As we sketched above, the Lie algebra of \(\mathbb{D}_1\) is homomorphic to the Lie algebra of \(\text{SE}(3)\), therefore there exists a homomorphism \(\phi: \mathbb{D}_1\rightarrow \text{SE}(3)\). Recall the defining property of homomorphisms. For \(Q_1, Q_2\in\mathbb{D}_1\):

\[ \phi(Q_1 Q_2) = \phi(Q_1)\phi(Q_2) \]

This means that we can work with dual quaternions in our code, composing them and such as we see fit, while always getting the same result we would have gotten using elements of \(\text{SE}(3)\)

Warning

We do have to be careful when taking the unit dual quaternion logarithm as its codomain is larger than the \(\text{SE}(3)\) logarithm. This could result in the logarithm giving us values that the \(\text{SE}(3)\) logarithm could not. In practice, we just define it so it's equivalent to \((\log \circ\, \phi)\).

On a related note, it turns out that \(\text{SE}(3)\) is not simply connected and this homomorphism is not invertible (i.e. we can't apply the theorem in the opposite direction). The reason for this is that, as we'll see below, \(Q\in \mathbb{D}_1\) and \(-Q\) actually map to the same element of \(\text{SE}(3)\) by \(\phi\).

To get a sense for what \(\phi\) looks like, lets compute the quaternion exponential for tangent vectors of the above form. To do this, we simply plug them into the power series definition of the exponential and grind out the algebra (see the appendix). The expression you end up with looks like this:

\[ \begin{array}{rcl}X&:=&(0,\omega/2)+\varepsilon(0,v/2) \\ \omega' &:=& \omega/2 \\ v' &:=& v/2 \\ \theta' &:=& ||\omega'|| = ||\omega||/2 \\ a_\theta &:=& \frac{\sin\theta}{\theta} \\ b_\theta &:=& \frac{\cos\theta - a(\theta)}{\theta^2} \\ \exp(X)&=& \left(\cos\theta',\omega'a_{\theta'}\right) + \varepsilon\left[-(\omega'\cdot v')a_{\theta'}, v'a_{\theta'}+\omega'(w'\cdot v')b_{\theta'}\right]\end{array} \]

If we plug a pure rotation (\(v = 0\)) into this, we get:

\[ Q_R = \left(\cos \tfrac{\theta}{2}, \tfrac{\omega}{\theta}\sin\tfrac{\theta}{2}\right):= q_r \]

Note that there's no dual part. You may recognize this as a unit quaternion that one might use for three dimensional rotation, which is very encouraging, and we define this as the non-dual quaternion \(q_r\) for the sake of brevity.

Now if we plug in a pure translation (\(\omega = 0\)) of \(t = v \cdot 1\), we get:

\[ Q_t = 1 + \frac{1}{2}\varepsilon (0, t) \]

Typically, we like to think of an \(\text{SE}(3)\) as a translation composed with a rotation:

\[ Q = Q_tQ_R = (1 + \varepsilon(0, t/2))q_r = q_r + \varepsilon (0, t/2)q_r \]

This expression tells us that we can get the rotation quaternion from our dual quaternion just by taking the real (i.e. non-dual) part of it. Then we can get the translation by taking the dual part, multiplying it by two, and right multiplying by \(q_r^{-1} = q_r^*\). Quite encouragingly, it also matches the form we derived for unit dual quaternions above.

Feel free to use the following calculator to familiarize yourself with the behavior of the dual quaternion exponential. It shows how the corresponding \(\text{SE}(3)\) transform relates two frames.

Seeing Double

Those familiar with \(\text{SO}(3)\) may know that its exponential has the following property:

\[ \exp(\omega) = \exp\left[\frac{\omega}{||\omega||}(||\omega|| + 2\pi n )\right] \quad\forall n\in\mathbb{Z} \]

This is just a fancy way of stating that if you keep rotating around the same axis, you'll periodically end up back at the same orientation. Conventionally this multivaluedness leads to a branch cut at \(||\omega|| = \pi\) when defining the logarithm so that the bijective region of \(\exp\)/\(\log\) is \(||\omega|| < \pi\)

However, if we plug such tangent vectors into our expression for \(q_r\), we'll see:

\[ \begin{aligned} q_{rn} &= \left(\cos\tfrac{\theta + 2\pi n}{2}, \tfrac{\omega}{||\omega||} \sin\tfrac{\theta + 2\pi n}{2}\right) \\ &= \left(\cos\left(\tfrac{\theta}{2} + \pi n\right), \tfrac{\omega}{||\omega||} \sin\left(\tfrac{\theta}{2} + \pi n\right)\right) \\ &= \left\{ \begin{array}{rl} q_r & n \,\,\text{ even} \\ -q_r & n \,\,\text{ odd}\end{array}\right. \end{aligned} \]

What this tells us is that \(q_r\) and \(-q_r\) represent exactly the same element of \(\text{SO}(3)\) making the unit quaternions a double cover of \(\text{SO}(3)\). Since a factor of \(q_r\) appears in both terms of our expression above for \(Q\), it happens to be the case that \(Q\) and \(-Q\) represent exactly the same element of \(\text{SE}(3)\) making the unit dual quaternions a double cover of \(\text{SE}(3)\). This shows that there isn't an inverse of our homomorphism \(\phi\) because there are two elements in \(\mathbb{D}_1\) which \(\phi\) maps to each element of \(\text{SE}(3)\) so \(\phi\) is not injective.

Conclusion

In summary, dual quaternions with unit norm are a Lie group and a double cover of \(\text{SE}(3)\) so we can use them to represent 3D rigid body transformations in our robotics software. In certain cases, this may be advantagous to save space or computation time. We showed that \(\mathbb{D}_1\) and \(\text{SE}(3)\) share the same Lie algebra so we don't need to change our handling of tangent vectors in any way. In fact the dynamics simulation from our prior ReSim U post was formulated using unit dual quaternions. The only reason why these Lie groups aren't wholly isomorphic is due to the fact that \(\text{SE}(3)\) is not simply connected whereas the unit dual quaternions are. This relationship is in many ways analogous to the relationshp between \(\text{SO}(3)\) and the ordinary unit quaternions.

Appendix: Dual Quaternion Exponential Derivation

To keep this from being more painful than it has to, we'll remove the factor of \(2\) from \(\omega\) and \(v\), only re-introducing it in the final expressions.

\[ \begin{aligned}\exp(X) &= \sum_{n=0}^\infty \frac{1}{n!} [(0, \omega) + \varepsilon(0, v)]^n \\&=\sum_{n=0}^\infty \frac{1}{n!}(0,\omega)^n+\varepsilon \left((0, v) + \frac{1}{2}((0, \omega)(0, v) + (0,v)(0, \omega)) + \cdots\right)\end{aligned} \]
\[ \begin{aligned}\exp(X) &=\sum_{n=0}^\infty \frac{1}{n!}(0,\omega)^n + \sum_{n=0}^\infty\sum_{k=0}^\infty \frac{1}{(n+k+1)!}(0,\omega)^n(0,v)(0,\omega)^k\end{aligned} \]

Let’s start by tackling the first term:

\[ \begin{aligned}\exp(\omega) &= \sum_{n=0}^\infty\frac{1}{n!}(0,\omega)^n\\ (0,\omega)^0 &= (1,0) \\ (0, \omega)^1 &= (0, \omega) \\ (0, \omega)^2 &= -||\omega||^2(1, 0) \\\end{aligned} \]

So:

\[ \begin{aligned}\exp(\omega) &= \left(\sum_{n=0}^\infty \frac{(-1)^n}{(2n)!}||\omega||^{2n},\frac{\omega }{||\omega||}\sum_{n=0}^\infty \frac{(-1)^n}{(2n+1)!}||\omega||^{2n+1}\right) \\ &=(\cos\tfrac{\theta}{2}, n\sin\tfrac \theta 2)\end{aligned} \]

Where \(n = \omega/||\omega||\) and we’ve re-introduced the factor of \(1/2\) we removed from \(\omega\) at the beginning of this derivation to show that we get exactly the form we expect for the rotation part \(q_r=(\cos \tfrac \theta 2,n\sin \tfrac \theta 2)\) of the dual quaternion. Now we look at the translation part:

\[ \begin{aligned}T :=& \sum_{n=0}^\infty\sum_{k=0}^\infty \frac{1}{(n+k+1)!}(0,\omega)^{n}(0,v)(0,\omega)^{k} \\ =&\sum_{n=0}^\infty\sum_{k=0}^\infty \frac{1}{(2(n+k)+1)!}(0,\omega)^{2n}(0,v)(0,\omega)^{2k} \\ &+\sum_{n=0}^\infty\sum_{k=0}^\infty \frac{1}{(2(n+k)+2)!}(0,\omega)^{2n + 1}(0,v)(0,\omega)^{2k} \\ &+\sum_{n=0}^\infty\sum_{k=0}^\infty \frac{1}{(2(n+k)+2)!}(0,\omega)^{2n}(0,v)(0,\omega)^{2k+1} \\ &+ \sum_{n=0}^\infty\sum_{k=0}^\infty \frac{1}{(2(n+k)+3)!}(0,\omega)^{2n+1}(0,v)(0,\omega)^{2k+1} \\ =&\sum_{n=0}^\infty\sum_{k=0}^\infty \frac{1}{(2(n+k)+1)!}(0,v)(0,\omega)^{2(n+k)} \\ &+\sum_{n=0}^\infty\sum_{k=0}^\infty \frac{1}{(2(n+k)+2)!}(0,\omega)(0,v)(0,\omega)^{2(n+k)} \\ &+\sum_{n=0}^\infty\sum_{k=0}^\infty \frac{1}{(2(n+k)+2)!}(0,v)(0,\omega)^{2(n+k)+1} \\ &+ \sum_{n=0}^\infty\sum_{k=0}^\infty \frac{1}{(2(n+k)+3)!}(0,\omega)(0,v)(0,\omega)^{2(n + k)+1} \\ =&\sum_{n=0}^\infty\frac{n+1}{(2n+1)!}(0,v)(0,\omega)^{2n} \\ &+\sum_{n=0}^\infty\frac{n+1}{(2n+2)!}(0,\omega)(0,v)(0,\omega)^{2n} \\ &+\sum_{n=0}^\infty \frac{n+1}{(2n+2)!}(0,v)(0,\omega)^{2n+1} \\ &+ \sum_{n=0}^\infty\frac{n+1}{(2n+3)!}(0,\omega)(0,v)(0,\omega)^{2n+1}\end{aligned} \]

Where we’ve used the fact that \((0,\omega)^{2n}\) is real and hence commutes with \((0,v)\). Now break this down term-by-term:

\[ \begin{aligned}\text{I} :=&\sum_{n=0}^\infty\frac{n+1}{(2n+1)!}(0,v)(0,\omega)^{2n} \\=& \frac{1}{2}\sum_{n=0}^\infty\frac{1}{(2n)!}(0,v)(0,\omega)^{2n} + \frac{1}{2}\sum_{n=0}^\infty\frac{1}{(2n + 1)!}(0,v)(0,\omega)^{2n} \\ =& \frac{1}{2}(0,v)\cosh(0,\omega) - \frac{1}{2||\omega||^2}(0,v)(0,\omega)\sinh(0,\omega) \\ =& \frac 1 2 (0, v) \cos||\omega|| - \frac 1 {2||\omega||^3}(0,v)(0,\omega)(0,\omega)\sin||\omega|| \\ =&\frac 1 2 (0, v) \cos||\omega|| + \frac 1 {2||\omega||}(0,v)\sin||\omega|| \\ \text{II} :=& \sum_{n=0}^\infty\frac{n+1}{(2n+2)!}(0,\omega)(0,v)(0,\omega)^{2n} \\ =& -\frac{1}{2||\omega||^2}(0,\omega)(0,v)(0,\omega)\sinh(0,\omega) \\ =& \frac{1}{2||\omega||}(0,\omega)(0,v)\sin ||\omega|| \\ \text{III} :=& \sum_{n=0}^\infty \frac{n+1}{(2n+2)!}(0,v)(0,\omega)^{2n+1} \\=&\frac{1}{2}(0,v)\sinh(0,\omega) \\ =&\frac{1}{2||\omega||}(0,v)(0,\omega)\sin||\omega|| \\ \text{IV}:=&\sum_{n=0}^\infty\frac{n+1}{(2n+3)!}(0,\omega)(0,v)(0,\omega)^{2n+1} \\ =&\frac{1}{2}\sum_{n=0}^\infty \frac{1}{(2n + 2)!}(0,\omega)(0,v)(0,\omega)^{2n+1} - \frac{1}{2}\sum_{n=0}^\infty \frac{1}{(2n + 3)!}(0,\omega)(0,v)(0,\omega)^{2n+1} \\ =& -\frac{1}{2||\omega||^2}(0,\omega)(0,v)(0,\omega)(\cosh(0,\omega) - 1) \\ &+\frac{1}{2||\omega||^2}(0,\omega)(0,v)(\sinh(0,\omega) - (0,\omega)) \\ =& -\frac{1}{2||\omega||^2}(0,\omega)(0,v)(0,\omega)\cosh(0,\omega) \\ &+\frac{1}{2||\omega||^2}(0,\omega)(0,v)\sinh(0,\omega)\\=& -\frac{1}{2||\omega||^2}(0,\omega)(0,v)(0,\omega)\cos ||\omega|| \\ &+\frac{1}{2||\omega||^3}(0,\omega)(0,v)(0, \omega)\sin ||\omega||\\ \end{aligned} \]

So:

\[ \begin{aligned}T=&\,\,\text{I}+\text{II}+\text{III}+\text{IV}\\ =&\left(-\omega\cdot v\tfrac{\sin||\omega||}{||\omega||}, v\tfrac{\sin||\omega||}{||\omega||} + \tfrac{\omega}{||\omega||^2}(\omega\cdot v)(\cos||\omega|| - \tfrac{\sin||\omega||}{||\omega||})\right)\end{aligned} \]

And:

\[ \begin{aligned}\exp[(0,\omega)+\varepsilon(0,v)] =& \left(\cos||\omega||, \omega \tfrac {\sin||\omega||}{||\omega||}\right) \\ &+ \varepsilon\left(-\omega\cdot v\tfrac{\sin||\omega||}{||\omega||}, v\tfrac{\sin||\omega||}{||\omega||} + \tfrac{\omega}{||\omega||^2}(\omega\cdot v)(\cos||\omega|| - \tfrac{\sin||\omega||}{||\omega||})\right)\end{aligned} \]

Re-introducing the factor of \(1/2\) into the basis we’re using for our algebra, we have:

\[ \boxed{\begin{array}{rcl}X&:=&(0,\omega/2)+\varepsilon(0,v/2) \\ \omega' &:=& \omega/2 \\ v' &:=& v/2 \\ \theta' &:=& ||\omega'|| = ||\omega||/2 \\ a_\theta &:=& \frac{\sin\theta}{\theta} \\ b_\theta &:=& \frac{\cos\theta - a(\theta)}{\theta^2} \\ \exp(X)&=& \left(\cos\theta',\omega'a_{\theta'}\right) + \varepsilon\left[-(\omega'\cdot v')a_{\theta'}, v'a_{\theta'}+\omega'(w'\cdot v')b_{\theta'}\right]\end{array}} \]

For small \(\theta'\), we should use small angle approximations:

\[ \begin{array}{rcrlrlrlrl}a_\theta &\approx& &1 &-& x^2/6 &+& x^4/120 &+&O(\theta^6)\\ b_\theta &\approx& -& 1/3 &+& x^2/30 &-& x^4/840 &+&O(\theta^6)\end{array} \]