explicit retract versions for calling in MATLAB
parent
c792a73e9f
commit
c75f7ead65
2
gtsam.h
2
gtsam.h
|
@ -139,6 +139,7 @@ class Rot3 {
|
|||
bool equals(const Rot3& rot, double tol) const;
|
||||
Vector localCoordinates(const Rot3& p);
|
||||
Rot3 retract(Vector v);
|
||||
Rot3 retractCayley(Vector v);
|
||||
Rot3 compose(const Rot3& p2);
|
||||
Rot3 between(const Rot3& p2);
|
||||
};
|
||||
|
@ -185,6 +186,7 @@ class Pose3 {
|
|||
Pose3 compose(const Pose3& p2);
|
||||
Pose3 between(const Pose3& p2);
|
||||
Pose3 retract(Vector v);
|
||||
Pose3 retractFirstOrder(Vector v);
|
||||
Point3 translation() const;
|
||||
Rot3 rotation() const;
|
||||
};
|
||||
|
|
|
@ -102,31 +102,27 @@ namespace gtsam {
|
|||
}
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
Pose3 Pose3::retractFirstOrder(const Vector& xi) const {
|
||||
Vector omega(sub(xi, 0, 3));
|
||||
Point3 v(sub(xi, 3, 6));
|
||||
Rot3 R = R_.retract(omega); // R is done exactly
|
||||
Point3 t = t_ + R_ * v; // First order t approximation
|
||||
return Pose3(R, t);
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
// Different versions of retract
|
||||
Pose3 Pose3::retract(const Vector& xi, Pose3::CoordinatesMode mode) const {
|
||||
if(mode == Pose3::EXPMAP) {
|
||||
// Lie group exponential map, traces out geodesic
|
||||
// Lie group exponential map, traces out geodesic
|
||||
return compose(Expmap(xi));
|
||||
} else if(mode == Pose3::FIRST_ORDER) {
|
||||
Vector omega(sub(xi, 0, 3));
|
||||
Point3 v(sub(xi, 3, 6));
|
||||
|
||||
// R is always done exactly in all three retract versions below
|
||||
Rot3 R = R_.retract(omega);
|
||||
|
||||
// Incorrect version
|
||||
// Retracts R and t independently
|
||||
// Point3 t = t_.retract(v.vector());
|
||||
|
||||
// First order t approximation
|
||||
Point3 t = t_ + R_ * v;
|
||||
|
||||
// Second order t approximation
|
||||
// Point3 t = t_ + R_ * (v+Point3(omega).cross(v)/2);
|
||||
|
||||
return Pose3(R, t);
|
||||
// First order
|
||||
return retractFirstOrder(xi);
|
||||
} else {
|
||||
// Point3 t = t_.retract(v.vector()); // Incorrect version retracts t independently
|
||||
// Point3 t = t_ + R_ * (v+Point3(omega).cross(v)/2); // Second order t approximation
|
||||
assert(false);
|
||||
exit(1);
|
||||
}
|
||||
|
|
|
@ -121,6 +121,8 @@ namespace gtsam {
|
|||
/// Dimensionality of the tangent space = 6 DOF
|
||||
size_t dim() const { return dimension; }
|
||||
|
||||
/// Retraction with fast first-order approximation to the exponential map
|
||||
Pose3 retractFirstOrder(const Vector& d) const;
|
||||
|
||||
/// Retraction from R^6 to Pose3 manifold neighborhood around current pose
|
||||
Pose3 retract(const Vector& d, Pose3::CoordinatesMode mode = POSE3_DEFAULT_COORDINATES_MODE) const;
|
||||
|
|
|
@ -251,6 +251,11 @@ namespace gtsam {
|
|||
#endif
|
||||
};
|
||||
|
||||
#ifndef GTSAM_DEFAULT_QUATERNIONS
|
||||
/// Retraction from R^3 to Rot3 manifold using the Cayley transform
|
||||
Rot3 retractCayley(const Vector& omega) const;
|
||||
#endif
|
||||
|
||||
/// Retraction from R^3 to Rot3 manifold neighborhood around current rotation
|
||||
Rot3 retract(const Vector& omega, Rot3::CoordinatesMode mode = ROT3_DEFAULT_COORDINATES_MODE) const;
|
||||
|
||||
|
|
|
@ -245,20 +245,24 @@ Vector Rot3::Logmap(const Rot3& R) {
|
|||
}
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
Rot3 Rot3::retractCayley(const Vector& omega) const {
|
||||
const double x = omega(0), y = omega(1), z = omega(2);
|
||||
const double x2 = x * x, y2 = y * y, z2 = z * z;
|
||||
const double xy = x * y, xz = x * z, yz = y * z;
|
||||
const double f = 1.0 / (4.0 + x2 + y2 + z2), _2f = 2.0 * f;
|
||||
return (*this)
|
||||
* Rot3((4 + x2 - y2 - z2) * f, (xy - 2 * z) * _2f, (xz + 2 * y) * _2f,
|
||||
(xy + 2 * z) * _2f, (4 - x2 + y2 - z2) * f, (yz - 2 * x) * _2f,
|
||||
(xz - 2 * y) * _2f, (yz + 2 * x) * _2f, (4 - x2 - y2 + z2) * f);
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
Rot3 Rot3::retract(const Vector& omega, Rot3::CoordinatesMode mode) const {
|
||||
if(mode == Rot3::EXPMAP) {
|
||||
return (*this)*Expmap(omega);
|
||||
} else if(mode == Rot3::CAYLEY) {
|
||||
const double x = omega(0), y = omega(1), z = omega(2);
|
||||
const double x2 = x*x, y2 = y*y, z2 = z*z;
|
||||
const double xy = x*y, xz = x*z, yz = y*z;
|
||||
const double f = 1.0 / (4.0 + x2 + y2 + z2), _2f = 2.0*f;
|
||||
return (*this)* Rot3(
|
||||
(4+x2-y2-z2)*f, (xy - 2*z)*_2f, (xz + 2*y)*_2f,
|
||||
(xy + 2*z)*_2f, (4-x2+y2-z2)*f, (yz - 2*x)*_2f,
|
||||
(xz - 2*y)*_2f, (yz + 2*x)*_2f, (4-x2-y2+z2)*f
|
||||
);
|
||||
return retractCayley(omega);
|
||||
} else if(mode == Rot3::SLOW_CAYLEY) {
|
||||
Matrix Omega = skewSymmetric(omega);
|
||||
return (*this)*Cayley<3>(-Omega/2);
|
||||
|
|
Loading…
Reference in New Issue