6 inline Vector4d quatMult(
const Vector4d& q1,
const Vector4d& q2) {
8 q1[0] * q2[0] - q1[1] * q2[1] - q1[2] * q2[2] - q1[3] * q2[3],
9 q1[0] * q2[1] + q1[1] * q2[0] + q1[2] * q2[3] - q1[3] * q2[2],
10 q1[0] * q2[2] + q1[2] * q2[0] + q1[3] * q2[1] - q1[1] * q2[3],
11 q1[0] * q2[3] + q1[3] * q2[0] + q1[1] * q2[2] - q1[2] * q2[1]);
14 inline Vector4d quatExp(
const Vector3d& r) {
16 double normr = r.norm();
19 q(0) = cos(normr / 2);
20 q.bottomRows(3) = (r/normr) * sin(normr/2);
24 Vector4d out(1,0,0,0);
25 out.bottomRows(3) += r;
31 inline Vector3d quatLog(
const Vector4d& q) {
32 if (1-q[0] >= 1e-10) {
33 Vector3d v = q.bottomRows(3);
35 Vector3d out = (acos(s) / v.norm()) * v;
39 return 2*q.bottomRows(3);
43 inline Vector4d quatInv(
const Vector4d& q) {
45 qinv.bottomRows(3) *= -1;
50 inline VectorXd quatRotate(
const Vector4d& q,
const Vector3d& p) {
53 pquat.bottomRows(3) = p;
54 return quatMult(q, quatMult(pquat, quatInv(q)));