# Coscrews¶

## Overview¶

Just as the linear and angular velocities can be combined into a single $$6 \times 1$$ column vector, forces and moments can be combined in a single quantity called a wrench. A wrench is dual to a screw, i.e., it is a linear operator on a screw. In older literature, a wrench is often referred to as another kind of screw. In modern literature, a wrenches are referred to as a coscrews . A superscript $$^*$$ is used to distinguish a coscrew from a screw. A wrench,
$$\underline{\mathbf{f}}^*$$, is defined as
(1)$\begin{split}\underline{\mathbf{f}}^*=\begin{Bmatrix}\underline{f}\\ \underline{\tau}\end{Bmatrix}= \begin{Bmatrix} f_x\\ f_y\\ f_z\\ \tau_x\\ \tau_y\\ \tau_z \end{Bmatrix}\end{split}$

### Coadjoint Matrix $$[Ad]^*$$¶

As coscrews are dual to screws, they are transformed differently than screws. The following simple example illustrates how coscrews are transformed. The power imparted by a linear combination of a wrench and screw is invariant, regardless of the coordinate system in which it is expressed. The power imparted by a given wrench and screw, the scalar quantity $$p$$, is given as

(2)$p = \underline{f}\cdot \underline{v} + \underline{\tau} \cdot \underline{\omega}= \underline{\mathbf{f}}^* \cdot \underline{\mathbf{v}} = \underline{\mathbf{f}}^{*T}\underline{\mathbf{v}}$

Recall that the operator for transforming screw quantities is

(3)$\begin{split}[Ad]=\begin{bmatrix} R & \tilde{r}R\\ 0 & R \end{bmatrix}\end{split}$

Therefore

(4)$\begin{split}p = \underline{\mathbf{f}}^{*T}\underline{\mathbf{v}}= \underline{\mathbf{f}}^{*T} [Ad]^{-1}[Ad]\underline{\mathbf{v}}= \underline{\mathbf{f}}^{*T} \begin{bmatrix} R^T & \tilde{r}R^T\\ 0 & R^T \end{bmatrix} \begin{bmatrix} R & \tilde{r}R\\ 0 & R \end{bmatrix} \underline{\mathbf{v}}= \underline{\mathbf{f}^*}' \cdot \underline{\mathbf{v}}'\end{split}$

And

(5)$\begin{split}\underline{\mathbf{f}^*}'= [Ad]^{-T}\underline{\mathbf{f}}^*=[Ad]^*\underline{\mathbf{f}}^* = \begin{bmatrix} R & 0\\ \tilde{r}R & R \end{bmatrix} \underline{\mathbf{f}}^*\end{split}$

Therefore, the $$6\times6$$ coadjoint transformation matrix for transforming coscrews is  :

(6)$\begin{split}[Ad]^* = \begin{bmatrix} R & 0\\ \tilde{r}R & R \end{bmatrix}\end{split}$
  Note that the linear components of force and velocity are found in the top position of the velocity screw and wrenches; the angular components are found in the lower position. This convention allows power to be computed using the linear algebra dot product operator. Many authors swap the angular and linear terms in screw and wrench quantities, in which case the dot product does not yield power, and a special “reciprocal product” operator, denoted as $$\odot$$ is used. For example, if angular terms are placed above the velocity screws, a reciprocal product is used to combine screw and coscrew quantities as: $$p = \underline{f}\cdot{\underline{v}} + \underline{\tau} \cdot \underline{\omega}=\mathscr{\underline{W}} \odot \underline{\} = \begin{Bmatrix}\underline{f}\\ \underline{\tau} \end{Bmatrix}^T \begin{bmatrix} 0 & I\\ I & 0 \end{bmatrix} \begin{Bmatrix} \underline{\omega}\\ \underline{v} \end{Bmatrix}$$ Certainly, no convention is more correct than another, however keeping linear and angular components in the same position in screws and coscrews does have its advantages: (1) it obviates the need to introduce an additional reciprocal product operator, and (2) when formulating the equations of motion, the generalized mass matrix is symmetric, allowing the equations to be solved more efficiently using standard numerical methods.

### Constraint Forces¶

Consider two bodies pinned together by a revolute joint aligned with the $$z$$ axis of its local coordinate frame, $$a$$. If the joint is modeled without friction, then no torques about the joint axis can be transmitted from the first body to the second body. The only forces that can be imparted from one joint to the next are those orthogonal to the joint’s axis. If a spatial wrench $$\underline{\mathbf{f}}^*_a$$ is applied to the joint, the non–working joint reaction forces are given by

(7)$\begin{split}\bar{H}^*_a\underline{\mathbf{f}}^*_a= \begin{bmatrix} 1 & 0 & 0 & 0 & 0 & 0\\ 0 & 1 & 0 & 0 & 0 & 0\\ 0 & 0 & 1 & 0 & 0 & 0\\ 0 & 0 & 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 0 & 0 & 0\\ \end{bmatrix}\underline{\mathbf{f}}^*_a\end{split}$

The coadjoint transformation matrix, $$[Ad]^*$$, from Eq. (6) provides a convenient and compact method to express constraint forces in other coordinate systems.

(8)$\begin{split}\bar{H}^*_0=[Ad]^*_{0a}\begin{bmatrix} 1 & 0 & 0 & 0 & 0 & 0\\ 0 & 1 & 0 & 0 & 0 & 0\\ 0 & 0 & 1 & 0 & 0 & 0\\ 0 & 0 & 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 0 & 0 & 0\\ \end{bmatrix}= \begin{bmatrix} R_{0a} & 0\\ \tilde{r}_{0a}R_{0a} & R_{0a} \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & 0 & 0 & 0\\ 0 & 1 & 0 & 0 & 0 & 0\\ 0 & 0 & 1 & 0 & 0 & 0\\ 0 & 0 & 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 0 & 0 & 0\\ \end{bmatrix}\end{split}$

Second, consider the case where working forces may be applied in a joint, such as in a robotic actuator. The torque provided by the motor required to resist the applied wrench $$\underline{f}_a^*$$ is given by

(9)$\begin{split}\bar{h}^*_0\underline{\mathbf{f}}_a^*=[Ad]^*\begin{bmatrix} 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 1\\ \end{bmatrix}\underline{\mathbf{f}}_a^*= \begin{bmatrix} R_{0a} & 0\\ \tilde{r}_{0a}R_{0a} & R_{0a} \end{bmatrix} \begin{bmatrix} 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 1\\ \end{bmatrix}\underline{\mathbf{f}}_a^*\end{split}$

From Eqs. (8) and (9) it follows that

(10)$[Ad]^*=[\bar{H}^* \cup \underline{\mathbf{h}}^*]$

(11)$\bar{H}^{T} \underline{\mathbf{h}}^* = 0$

as each of the columns of $$\bar{H}^*$$ are orthogonal to $$\underline{\mathbf{h}}^*$$.

In the present example, $$[\bar{H}^* \cup \underline{\mathbf{h}}^*]=[\bar{H}^* \underline{\mathbf{h}}^*]$$, as $$\underline{\mathbf{h}}^*$$ occurs in the last column of $$[Ad]^*$$, however in the general case, $$\underline{\mathbf{h}}^*$$ may occur in a different column of $$[Ad]^*$$, corresponding to the type of primitive joint. In the following discussion, the $$\cup$$ symbol is dropped with the understanding that the matrix $$\underline{\mathbf{h}}^*$$ occurs in its respective column, interspersed within the columns of $$\bar{H}^*$$.

### Derivative operator matrices: $$[ad]^*$$¶

The left derivative operator for $$[Ad]^*$$ matrices is:

(12)$\begin{split}[ad]^* = \dot{[Ad]^*}[Ad]^{*-1} = \begin{bmatrix} 0 & -\omega_z & \omega_{y} & 0 & 0 & 0\\ \omega_z & 0 & -\omega_x & 0 & 0 & 0\\ -\omega_y & \omega_x & 0 & 0 & 0 & 0\\ 0 & -v_z & v_y & 0 & -\omega_z & \omega_{y} \\ v_z & 0 & -v_x & \omega_z & 0 & -\omega_x\\ -v_y & v_x & 0 & -\omega_y & \omega_x & 0 \end{bmatrix}= \begin{bmatrix} \tilde{\omega} & 0\\ \tilde{v} & \tilde{\omega} \end{bmatrix}\end{split}$

## Double precision¶

union ksl_coscrew_t
#include <coscrew.h>

double precision coscrew (i.e. a linear operator on a screw), consisting of a linear and angular vector pair in function space.

Public Members

double at
struct ksl_coscrew_t::[anonymous] [anonymous]

anyonymous union allows accessing coscrew quantities at specified index

ksl_vec3_t lin

bound linear vector, e.g. force or linear momentum

ksl_vec3_t ang

free angular vector, e.g. moment/torque or angular momentum

struct ksl_coscrew_t::[anonymous] [anonymous]

anyonymous union allows accessing coscrew quantities by its linear and angular vector components

double m0
double m1
double m2
double m3
double m4
double m5
struct ksl_coscrew_t::[anonymous] [anonymous]

anonymous union allows accessing coscrew quantities by field name

ksl_coscrew_t ksl_coscrew(const double m0, const double m1, const double m2, const double m3, const double m4, const double m5)

double precision screw constructor

ksl_coscrew_t *ksl_coscrew_alloc(int n)

Allocates n double precision coscrew quantities on the heap. Must be freed by the user.

void ksl_coscrew_copy(const ksl_coscrew_t *ci, ksl_coscrew_t *co)

Copy double precision ksl_coscrew_t.

$$\mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• ci: [in] screw to copy
• co: [out] input screw is copied to co

void ksl_coscrew_scale(ksl_coscrew_t *self, const double a)

Scale a double precision ksl_coscrew_t.

$$\mathbf{\underline{c}}_{i}^* * a \rightarrow \mathbf{\underline{c}}_i^*$$

Parameters
• self: [in] coscrew to invert
• a: [out] amount to scale the screw

void ksl_coscrew_inverted(const ksl_coscrew_t *ci, ksl_coscrew_t *co)

Returns the inverse of a ksl_coscrew_t.

$$-\mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• ci: [in] coscrew to invert
• co: [out] inverse of ci

void ksl_coscrew_invert(ksl_coscrew_t *self)

Invert (i.e. negate) a ksl_coscrew_t in place.

$$-\mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_i^*$$

Parameters
• self: [in/out] coscrew to invert

void ksl_axpy_cc(const double a, const ksl_coscrew_t *x, ksl_coscrew_t *y)

In-place add a double precision coscrew multiplied with a scalar to an existing coscrew.

$$a * \mathbf{\underline{c}}_{x}^* + \mathbf{\underline{c}}_y^* \rightarrow \mathbf{\underline{c}}_y^*$$

Parameters
• a: [in]
• x: [in]
• y: [in/out] coscrew to add

void ksl_xpy_cc(const ksl_coscrew_t *x, ksl_coscrew_t *y)

In-place add a double precision coscrew to an existing coscrew. This is a variant of axpy where the scalar term a is 1.

$$\mathbf{\underline{c}}_{x}^* + \mathbf{\underline{c}}_y^* \rightarrow \mathbf{\underline{c}}_y^*$$

Parameters
• c: [in/out]
• ci: [in] coscrew to add

void ksl_nxpy_cc(const ksl_coscrew_t *x, ksl_coscrew_t *y)

In-place subtract a double precision coscrew x from an coscrew y. This is a variant of axpy where the scalar term is -1.

$$-\mathbf{\underline{c}}_{x}^* + \mathbf{\underline{c}}_y^* \rightarrow \mathbf{\underline{c}}_y^*$$

Parameters
• self: [in/out]
• ci: [in] first coscrew to subtract

void ksl_product_ac(const double a, const ksl_coscrew_t *ci, ksl_coscrew_t *co)

Scale a double precision coscrew.

$$\mathbf{\underline{c}}_i^* * a \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• co: [in/out] coscrew to scale

void ksl_add_cc(const ksl_coscrew_t *c1i, const ksl_coscrew_t *c2i, ksl_coscrew_t *co)

Compute the sum of two double precision coscrews.

$$\mathbf{\underline{c}}_{1i}^* + \mathbf{\underline{c}}_{2i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• c1i: [in] first coscrew to add
• c1i: [in] second coscrew to add
• co: [out] sum of c1i and c2i

void ksl_subtract_cc(const ksl_coscrew_t *c1i, const ksl_coscrew_t *c2i, ksl_coscrew_t *co)

Compute the difference between two double precision coscrews.

$$\mathbf{\underline{c}}_{1i}^* - \mathbf{\underline{c}}_{2i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• c1i: [in] first coscrew
• c2i: [in] second coscrew
• co: [out] c1i minus c2i

void ksl_cross_sc(const ksl_screw_t *s1i, const ksl_coscrew_t *c2i, ksl_coscrew_t *co)
void ksl_product_CoAdtc(const ksl_vec3_t *ti, const ksl_coscrew_t *ci, ksl_coscrew_t *co)

Performs a double precision spatial translation of a coscrew. Performs a Coadjoint transformation of a coscrew, where CoAdjoint transformation matrix consists of only a translation component.

$$[Ad]^*(\underline{t}_i) \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

$$\ \begin{bmatrix} I & 0\\ \underline{\tilde{t}}_i & I \end{bmatrix} \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• ti: [in] translation vector
• ci: [in] input coscrew
• co: [out] output coscrew

void ksl_product_CoAdtcinv(const ksl_vec3_t *ti, const ksl_coscrew_t *ci, ksl_coscrew_t *co)

Performs a double precision spatial translation of the inverse of a coscrew. Performs a Coadjoint transformation of the inverse of a coscrew, where CoAdjoint transformation matrix consists of only a translation component.

$$[Ad]^*(\underline{t}_i) * -\mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

$$-[Ad]^*(\underline{t}_i) \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

$$\ -\begin{bmatrix} I & 0\\ \underline{\tilde{t}}_i & I \end{bmatrix} \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• ti: [in] translation vector
• ci: [in] input coscrew
• co: [out] output coscrew

void ksl_product_CoAdrc(const ksl_mat3x3_t *Ri, const ksl_coscrew_t *ci, ksl_coscrew_t *co)

Performs a double precision spatial rotation of a coscrew. Performs a Coadjoint transformation of a coscrew, where CoAdjoint transformation matrix consists of only a rotation component.

$$[Ad]^*(R_i) \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

$$\ \begin{bmatrix} R_i & 0\\ 0 & R_i \end{bmatrix} \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• Ri: [in] input rotation matrix
• ci: [in] input coscrew
• co: [out] output coscrew

void ksl_product_CoAdrinvc(const ksl_mat3x3_t *Ri, const ksl_coscrew_t *ci, ksl_coscrew_t *co)

Performs a double precision spatial rotation of a coscrew, using the transpose of the input rotation matrix. Performs a Coadjoint transformation of a coscrew, where CoAdjoint transformation matrix consists of only a rotation component transposed.

$$[Ad]^*(R_i^T) \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

$$\left([Ad]^*(R_i) \right)^{-1} \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

$$\ \begin{bmatrix} R_i^T & 0\\ 0 & R_i^T \end{bmatrix} \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• Ri: [in] input rotation matrix
• ci: [in] input coscrew
• co: [out] output coscrew

void ksl_product_CoAdc(const ksl_SE3_t *Di, const ksl_coscrew_t *ci, ksl_coscrew_t *co)

Performs a double precision spatial transformation of a coscrew. Performs a Coadjoint transformation of a coscrew, where CoAdjoint transformation matrix consists of a rotation and translation component.

$$[Ad]^*(\Phi_{Di}) \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

$$[Ad]^*(R_i, \underline{t}_i) \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

$$\ \begin{bmatrix} R_i & 0\\ \tilde{\underline{t}}_i R_i & R_i \end{bmatrix} \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• Ri: [in] input rotation matrix
• ci: [in] input coscrew
• co: [out] output coscrew

void ksl_product_CoAdinvc(const ksl_SE3_t *Di, const ksl_coscrew_t *ci, ksl_coscrew_t *co)

Performs the inverse single precision spatial transformation of a coscrew. Performs the inverse of a Coadjoint transformation of a coscrew, where the CoAdjoint transformation matrix consists of a rotation and translation component.

$$[Ad]^*(\Phi_{Di}^{-1}) \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

$$\left( [Ad]^*(\Phi_{Di}) \right)^{-1} \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

$$[Ad]^*(R_i^T, -\underline{t}_i) \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

$$\ \begin{bmatrix} R_i^T & 0\\ -\tilde{\underline{t}}_i R_i^T & R_i^T \end{bmatrix} \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• Di: [in] input SE3 matrix
• ci: [in] input coscrew
• co: [out] output coscrew

## Single precision¶

union ksl_coscrewf_t
#include <coscrew.h>

single precision coscrew (i.e. a linear operator on a screw), consisting of a linear and angular vector pair in function space.

Public Members

float at
struct ksl_coscrewf_t::[anonymous] [anonymous]

anonymous union allows accessing coscrew quantities at specified index

ksl_vec3f_t lin

bound linear vector, e.g. force or linear momentum

ksl_vec3f_t ang

free angular vector, e.g. moment/torque or angular momentum

struct ksl_coscrewf_t::[anonymous] [anonymous]

anyonymous union allows accessing coscrew quantities by its linear and angular vector components

float m0
float m1
float m2
float m3
float m4
float m5
struct ksl_coscrewf_t::[anonymous] [anonymous]

anonymous union allows accessing coscrew quantities by field name

ksl_coscrewf_t ksl_coscrewf(const float m0, const float m1, const float m2, const float m3, const float m4, const float m5)

single precision screwf constructor

ksl_coscrewf_t *ksl_coscrewf_alloc(int n)

Allocate n single precision coscrew quantities on the heap. Must be freed by the user.

void ksl_coscrewf_copy(const ksl_coscrewf_t *self, ksl_coscrewf_t *co)

Copy single precision ksl_coscrewf_t ci to co.

$$\mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• self: [in] screw to copy
• co: [out] ci is copied to co

void ksl_coscrewf_scale(ksl_coscrewf_t *self, const float a)

Scale a single precision ksl_coscrew_t.

$$\mathbf{\underline{c}}_{i}^* * a \rightarrow \mathbf{\underline{c}}_i^*$$

Parameters
• self: [in] coscrew to invert
• a: [out] inverse of ci

void ksl_coscrewf_inverted(const ksl_coscrewf_t *self, ksl_coscrewf_t *co)

Returns the inverse of a ksl_coscrewf_t.

$$-\mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• self: [in] coscrew to invert
• co: [out] inverse of ci

void ksl_coscrewf_invert(ksl_coscrewf_t *self)

Invert (i.e. negate) a ksl_coscrewf_t in place.

$$-\mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_i^*$$

Parameters
• self: [in/out] coscrew to invert

void ksl_axpy_ccf(const float a, const ksl_coscrewf_t *x, ksl_coscrewf_t *y)

In-place add a single precision coscrew multiplied with a scalar to an existing coscrew.

$$a * \mathbf{\underline{c}}_{x}^* + \mathbf{\underline{c}}_y^* \rightarrow \mathbf{\underline{c}}_y^*$$

Parameters
• a: [in]
• x: [in]
• y: [in/out]

void ksl_xpy_ccf(const ksl_coscrewf_t *x, ksl_coscrewf_t *y)

In-place add a single precision coscrew to an existing coscrew. This is a variant of axpy where there the scalar term is 1.

$$\mathbf{\underline{c}}_{x}^* + \mathbf{\underline{c}}_y^* \rightarrow \mathbf{\underline{c}}_y^*$$

Parameters
• co: [in/out] sum of c1i and co
• c1i: [in] first coscrew to add

void ksl_nxpy_ccf(const ksl_coscrewf_t *x, ksl_coscrewf_t *y)

In-place subtract a single precision coscrew from an existing coscrew. This is a variant of axpy where the scalar term is -1.

$$-\mathbf{\underline{c}}_{x}^* + \mathbf{\underline{c}}_y^* \rightarrow \mathbf{\underline{c}}_y^*$$

Parameters
• self: [in/out]
• ci: [in] first coscrew to subtract

void ksl_product_acf(const float a, const ksl_coscrewf_t *ci, ksl_coscrewf_t *co)

Scale a single precision coscrew.

$$\mathbf{\underline{c}}_i^* * a \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• co: [in/out] coscrew to scale

void ksl_add_ccf(const ksl_coscrewf_t *c1i, const ksl_coscrewf_t *c2i, ksl_coscrewf_t *co)

Compute the sum of two single precision coscrews.

$$\mathbf{\underline{c}}_{1i}^* + \mathbf{\underline{c}}_{2i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• c1i: [in] first coscrew to add
• c2i: [in] second coscrew to add
• co: [out] sum of c1i and c2i

void ksl_subtract_ccf(const ksl_coscrewf_t *c1i, const ksl_coscrewf_t *c2i, ksl_coscrewf_t *co)

Compute the difference between two double precision coscrews.

$$\mathbf{\underline{c}}_{1i}^* - \mathbf{\underline{c}}_{2i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• c1i: [in] first coscrew
• c2i: [in] second coscrew
• co: [out] result of c1i minus c2i

void ksl_cross_scf(const ksl_screwf_t *s1i, const ksl_coscrewf_t *c2i, ksl_coscrewf_t *co)
void ksl_product_CoAdtcf(const ksl_vec3f_t *ti, const ksl_coscrewf_t *ci, ksl_coscrewf_t *co)

Performs a single precision spatial translation of a coscrew. Performs a Coadjoint transformation of a coscrew, where CoAdjoint transformation matrix consists of only a translation component.

$$[Ad]^*(\underline{t}_i) \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

$$\ \begin{bmatrix} I & 0\\ \underline{\tilde{t}}_i & I \end{bmatrix} \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• ti: [in] translation vector
• ci: [in] input coscrew
• co: [out] output coscrew

void ksl_product_CoAdtcinvf(const ksl_vec3f_t *ti, const ksl_coscrewf_t *ci, ksl_coscrewf_t *co)

Performs a single precision spatial translation of the inverse of a coscrew. Performs a Coadjoint transformation of the inverse of a coscrew, where CoAdjoint transformation matrix consists of only a translation component.

$$[Ad]^*(\underline{t}_i) * -\mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

$$-[Ad]^*(\underline{t}_i) \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

$$\ -\begin{bmatrix} I & 0\\ \underline{\tilde{t}}_i & I \end{bmatrix} \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• ti: [in] translation vector
• ci: [in] input coscrew
• co: [out] output coscrew

void ksl_product_CoAdrcf(const ksl_mat3x3f_t *Ri, const ksl_coscrewf_t *ci, ksl_coscrewf_t *co)

Performs a single precision spatial rotation of a coscrew. Performs a Coadjoint transformation of a coscrew, where CoAdjoint transformation matrix consists of only a rotation component.

$$[Ad]^*(R_i) \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

$$\ \begin{bmatrix} R_i & 0\\ 0 & R_i \end{bmatrix} \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• Ri: [in] input rotation matrix
• ci: [in] input coscrew
• co: [out] output coscrew

void ksl_product_CoAdrinvcf(const ksl_mat3x3f_t *Ri, const ksl_coscrewf_t *ci, ksl_coscrewf_t *co)

Performs a single precision spatial rotation of a coscrew, using the transpose of the input rotation matrix. Performs a Coadjoint transformation of a coscrew, where CoAdjoint transformation matrix consists of only a rotation component transposed.

$$[Ad]^*(R_i^T) \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

$$\left([Ad]^*(R_i) \right)^{-1} \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

$$\ \begin{bmatrix} R_i^T & 0\\ 0 & R_i^T \end{bmatrix} \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• Ri: [in] input rotation matrix
• ci: [in] input coscrew
• co: [out] output coscrew

void ksl_product_CoAdrcf(const ksl_mat3x3f_t *Ri, const ksl_coscrewf_t *ci, ksl_coscrewf_t *co)

Performs a single precision spatial rotation of a coscrew. Performs a Coadjoint transformation of a coscrew, where CoAdjoint transformation matrix consists of only a rotation component.

$$[Ad]^*(R_i) \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

$$\ \begin{bmatrix} R_i & 0\\ 0 & R_i \end{bmatrix} \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• Ri: [in] input rotation matrix
• ci: [in] input coscrew
• co: [out] output coscrew

void ksl_product_CoAdinvcf(const ksl_SE3f_t *Di, const ksl_coscrewf_t *ci, ksl_coscrewf_t *co)

Performs the inverse single precision spatial transformation of a coscrew. Performs the inverse of a Coadjoint transformation of a coscrew, where the CoAdjoint transformation matrix consists of a rotation and translation component.

$$[Ad]^*(\Phi_{Di}^{-1}) \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

$$\left( [Ad]^*(\Phi_{Di}) \right)^{-1} \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

$$[Ad]^*(R_i^T, -\underline{t}_i) \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

$$\ \begin{bmatrix} R_i^T & 0\\ -\tilde{\underline{t}}_i R_i^T & R_i^T \end{bmatrix} \mathbf{\underline{c}}_{i}^* \rightarrow \mathbf{\underline{c}}_o^*$$

Parameters
• Di: [in] input SE3 matrix
• ci: [in] input coscrew
• co: [out] output coscrew