wedge
parent
c62ebe3ea8
commit
1093317fdc
20
cpp/Lie.h
20
cpp/Lie.h
|
|
@ -8,7 +8,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include "Vector.h"
|
||||
#include "Matrix.h"
|
||||
|
||||
namespace gtsam {
|
||||
|
||||
|
|
@ -119,4 +119,22 @@ namespace gtsam {
|
|||
bracket(X, X_Y));
|
||||
}
|
||||
|
||||
/**
|
||||
* Declaration of wedge (see Murray94book) used to convert
|
||||
* from n exponential coordinates to n*n element of the Lie algebra
|
||||
*/
|
||||
template <class T> Matrix wedge(const Vector& x);
|
||||
|
||||
/**
|
||||
* Exponential map given exponential coordinates
|
||||
* class T needs a wedge<> function and a constructor from Matrix
|
||||
* @param x exponential coordinates, vector of size n
|
||||
* @ return a T
|
||||
*/
|
||||
template <class T>
|
||||
T expm(const Vector& x, int K=7) {
|
||||
Matrix xhat = wedge<T>(x);
|
||||
return expm(xhat,K);
|
||||
}
|
||||
|
||||
} // namespace gtsam
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ namespace gtsam {
|
|||
// Calculate Adjoint map
|
||||
// Ad_pose is 6*6 matrix that when applied to twist xi, returns Ad_pose(xi)
|
||||
// Experimental - unit tests of derivatives based on it do not check out yet
|
||||
static Matrix AdjointMap(const Pose3& p) {
|
||||
Matrix AdjointMap(const Pose3& p) {
|
||||
const Matrix R = p.rotation().matrix();
|
||||
const Vector t = p.translation().vector();
|
||||
Matrix A = skewSymmetric(t)*R;
|
||||
|
|
|
|||
27
cpp/Pose3.h
27
cpp/Pose3.h
|
|
@ -145,4 +145,31 @@ namespace gtsam {
|
|||
Pose3 between(const Pose3& p1, const Pose3& p2,
|
||||
boost::optional<Matrix&> H1, boost::optional<Matrix&> H2);
|
||||
|
||||
/**
|
||||
* wedge for Pose3:
|
||||
* @param xi 6-dim twist (omega,v) where
|
||||
* omega = (wx,wy,wz) 3D angular velocity
|
||||
* v (vx,vy,vz) = 3D velocity
|
||||
* @return xihat, 4*4 element of Lie algebra that can be exponentiated
|
||||
*/
|
||||
inline Matrix wedge(double wx, double wy, double wz, double vx, double vy, double vz) {
|
||||
return Matrix_(4,4,
|
||||
0.,-wz, wy, vx,
|
||||
wz, 0.,-wx, vy,
|
||||
-wy, wx, 0., vz,
|
||||
0., 0., 0., 0.);
|
||||
}
|
||||
|
||||
/**
|
||||
* wedge for Pose3:
|
||||
* @param xi 6-dim twist (omega,v) where
|
||||
* omega = 3D angular velocity
|
||||
* v = 3D velocity
|
||||
* @return xihat, 4*4 element of Lie algebra that can be exponentiated
|
||||
*/
|
||||
template <>
|
||||
inline Matrix wedge<Pose3>(const Vector& xi) {
|
||||
return wedge(xi(0),xi(1),xi(2),xi(3),xi(4),xi(5));
|
||||
}
|
||||
|
||||
} // namespace gtsam
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
* @brief Unit tests for Pose3 class
|
||||
*/
|
||||
|
||||
|
||||
#include <CppUnitLite/TestHarness.h>
|
||||
#include "numericalDerivative.h"
|
||||
#include "Pose3.h"
|
||||
|
|
@ -51,6 +50,31 @@ TEST(Pose3, expmap_b)
|
|||
CHECK(assert_equal(expected, p2));
|
||||
}
|
||||
|
||||
/* ************************************************************************* *
|
||||
// test case for screw motion in the plane
|
||||
namespace screw {
|
||||
double a=0.3, c=cos(a), s=sin(a), w=0.3;
|
||||
Vector xi = Vector_(6, 0.0, 0.0, w, w, 0.0, 0.0);
|
||||
Rot3 expectedR(c, -s, 0, s, c, 0, 0, 0, 1);
|
||||
Point3 expectedT(0.29552, 0.0446635, 0);
|
||||
Pose3 expected(expectedR, expectedT);
|
||||
}
|
||||
|
||||
TEST(Pose3, expmap_c)
|
||||
{
|
||||
CHECK(assert_equal(screw::expected, expm<Pose3>(screw::xi),1e-6));
|
||||
CHECK(assert_equal(screw::expected, expmap<Pose3>(screw::xi),1e-6));
|
||||
}
|
||||
|
||||
TEST(Pose3, Adjoint)
|
||||
{
|
||||
// assert that T*exp(xi)*T^-1
|
||||
Pose3 expected = T * expmap<Pose3>(screw::xi) * inverse(T);
|
||||
// is equal to exp(Ad_T(xi))
|
||||
Vector xiprime = Adjoint(T, screw::xi);
|
||||
CHECK(assert_equal(expected, expmap<Pose3>(xiprime), 1e-6));
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
TEST( Pose3, compose )
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue