This repository is quite abandoned. Don't expect any updates. If you have questions, especially more on the theory side, you ware welcomed to ask (just create an issue)
The basic idea is to create a CCC mechanism, which is a fully actuated mechanism in a 6D Task Space.
This library provides the basic structures to describe the problem and the FK/IK, analytically! Basically, Pluecker lines, Dual Algebra and advanced operations on the Pluecker lines are used.
A CCC mechanism consists of three cylindrical (C) joints. A cylindrical joint has two degree of freedoms as it can translate and rotate around the cylinder's main axis, respectively its joint axis. The joint axis can be mathematically described as a line, hence Line Kinematics, where points are actuated on the surface of a cylinder around the line. Lines can also be transformed by other lines.
Image from "An analysis of the dual-complex unit circle with applications to line geometry" by Bongardt.
The concept of Line Kinematics is based on the product of exponentials:
x = exp(phi_1 * lambda_1) * exp(varphi_2 lambda_2) * exp(varphi_3 lambda_3) * s_zp
Thus, to compute a FK ({phi_1, phi_2, phi_3} -> x) or an IK (x -> {phi_1, phi_2, phi_3}) with phi_1, phi_2, and phi_3 being dual angles containing a translation and rotation information, the parameters of the mechanism have to be specified. The parameters are the joint axes (lines) lambda_1, lambda_2, lambda_3 and the zero posture pose s_zp, which is the initial end-effector pose describing ({0,0,0} -> s_zp).
These parameters are necessary to uniquely define a mechanism.
There are different ways to describe a line and a frame. Right now, a mixture of vectors and matrices including some sort of dual algebra is used, in this library. Future works may reduce or seperate different formalisms a bit better.
Historically motivated, the matrices, which could be described as dual 3x3 matrices, are embedded as 6x6 real matrices. The embedding follows the dual number matrix representation but blown up to 6x6 for embedding the 3x3 matrices.
The lines and screws are described as 6 vectors, where the upper three form the direction and the lower three elements form the moment. Again, this is historically grown. The lines could also be described as a dual 3 vector with the dual part being the moment of the line.
The heart of the library are the operation based on or motivated by Pluecker lines.
Initially developed as one motor product by Richard von Mises in 1924, the motor product gives the transformation from one line to the other via a transformation defined by a screw.
But seperating the screw into a line and the dual angle is not always uniquely possible. Some kind of tricks were developed here to avoid ambiguity.
There are some problems which can be described by the equation:
a cos(phi) + b sin(phi) = c
a, b and c are given parameters and the task would be to find phi. This yields to an equivalent quadratic equation with at most two solutions, which can be retrieved analytically via half-tangens substitutions or geometrically.
This equation can also be formulated as dual number problem according to Kotelnikov's principle of transference. This is also done by Bongardt in 2020.
See DualNumberAlgebra::solve_trigonometric_equation()
The acos3 for lines describes the dual angle between two lines projected to a third reference line as proposed by Bongardt in 2020.
It is used to find phi in:
lambda_b = exp(phi * lambda_ref) * \lambda_a
See UnitLine::acos3()
Another important operation is the Generalized Rodrigues-Formula for lines to actually compute the transformation generated by a line lambda and a dual angle phi:
exp(phi * lambda)
See DualFrame::DualFrame(const DualSkewProduct &argument)