Added global functions to Lie to allow for template access to full expmap/logmap
							parent
							
								
									8398c8a53d
								
							
						
					
					
						commit
						86c0c06689
					
				| 
						 | 
				
			
			@ -183,4 +183,25 @@ namespace gtsam {
 | 
			
		|||
		return expm(xhat,K);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * function wrappers for full versions of expmap/logmap
 | 
			
		||||
	 * these will default simple types to using the existing expmap/logmap,
 | 
			
		||||
	 * but more complex ones can be specialized to use improved versions
 | 
			
		||||
	 *
 | 
			
		||||
	 * TODO: replace this approach with a naming scheme that doesn't call
 | 
			
		||||
	 * non-expmap operations "expmap" - use same approach, but with "update"
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
  /** unary versions */
 | 
			
		||||
	template<class T>
 | 
			
		||||
	T ExpmapFull(const Vector& xi) { return T::Expmap(xi); }
 | 
			
		||||
	template<class T>
 | 
			
		||||
  Vector LogmapFull(const T& p) { return T::Logmap(p); }
 | 
			
		||||
 | 
			
		||||
  /** binary versions */
 | 
			
		||||
	template<class T>
 | 
			
		||||
  T expmapFull(const T& t, const Vector& v) { return t.expmap(v); }
 | 
			
		||||
	template<class T>
 | 
			
		||||
  Vector logmapFull(const T& t, const T& p2) { return t.logmap(p2); }
 | 
			
		||||
 | 
			
		||||
} // namespace gtsam
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -222,5 +222,23 @@ namespace gtsam {
 | 
			
		|||
  typedef std::pair<Point2,Point2> Point2Pair;
 | 
			
		||||
  boost::optional<Pose2> align(const std::vector<Point2Pair>& pairs);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Specializations for access to full expmap/logmap in templated functions
 | 
			
		||||
   *
 | 
			
		||||
   * NOTE: apparently, these *must* be indicated as inline to prevent compile error
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  /** unary versions */
 | 
			
		||||
	template<>
 | 
			
		||||
	inline Pose2 ExpmapFull<Pose2>(const Vector& xi) { return Pose2::ExpmapFull(xi); }
 | 
			
		||||
	template<>
 | 
			
		||||
	inline Vector LogmapFull<Pose2>(const Pose2& p) { return Pose2::LogmapFull(p); }
 | 
			
		||||
 | 
			
		||||
  /** binary versions */
 | 
			
		||||
	template<>
 | 
			
		||||
  inline Pose2 expmapFull<Pose2>(const Pose2& t, const Vector& v) { return t.expmapFull(v); }
 | 
			
		||||
	template<>
 | 
			
		||||
	inline Vector logmapFull<Pose2>(const Pose2& t, const Pose2& p2) { return t.logmapFull(p2); }
 | 
			
		||||
 | 
			
		||||
} // namespace gtsam
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -195,4 +195,22 @@ namespace gtsam {
 | 
			
		|||
  	return Pose3::wedge(xi(0),xi(1),xi(2),xi(3),xi(4),xi(5));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Specializations for access to full expmap/logmap in templated functions
 | 
			
		||||
   *
 | 
			
		||||
   * NOTE: apparently, these *must* be indicated as inline to prevent compile error
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  /** unary versions */
 | 
			
		||||
	template<>
 | 
			
		||||
	inline Pose3 ExpmapFull<Pose3>(const Vector& xi) { return Pose3::ExpmapFull(xi); }
 | 
			
		||||
	template<>
 | 
			
		||||
	inline Vector LogmapFull<Pose3>(const Pose3& p) { return Pose3::LogmapFull(p); }
 | 
			
		||||
 | 
			
		||||
  /** binary versions */
 | 
			
		||||
	template<>
 | 
			
		||||
  inline Pose3 expmapFull<Pose3>(const Pose3& t, const Vector& v) { return t.expmapFull(v); }
 | 
			
		||||
	template<>
 | 
			
		||||
	inline Vector logmapFull<Pose3>(const Pose3& t, const Pose3& p2) { return t.logmapFull(p2); }
 | 
			
		||||
 | 
			
		||||
} // namespace gtsam
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -77,6 +77,14 @@ TEST(Pose2, expmap_full) {
 | 
			
		|||
  EXPECT(assert_equal(expected, actual, 1e-5));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
TEST(Pose2, expmap_full2) {
 | 
			
		||||
  Pose2 pose(M_PI_2, Point2(1, 2));
 | 
			
		||||
  Pose2 expected(1.00811, 2.01528, 2.5608);
 | 
			
		||||
  Pose2 actual = expmapFull<Pose2>(pose, Vector_(3, 0.01, -0.015, 0.99));
 | 
			
		||||
  EXPECT(assert_equal(expected, actual, 1e-5));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
TEST(Pose2, expmap2) {
 | 
			
		||||
  // do an actual series exponential map
 | 
			
		||||
| 
						 | 
				
			
			@ -113,6 +121,14 @@ TEST(Pose2, expmap0_full) {
 | 
			
		|||
  EXPECT(assert_equal(expected, actual, 1e-5));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
TEST(Pose2, expmap0_full2) {
 | 
			
		||||
  Pose2 pose(M_PI_2, Point2(1, 2));
 | 
			
		||||
  Pose2 expected(1.01491, 2.01013, 1.5888);
 | 
			
		||||
  Pose2 actual = pose * ExpmapFull<Pose2>(Vector_(3, 0.01, -0.015, 0.018));
 | 
			
		||||
  EXPECT(assert_equal(expected, actual, 1e-5));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef SLOW_BUT_CORRECT_EXPMAP
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
// test case for screw motion in the plane
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -63,11 +63,23 @@ TEST( Pose3, expmap_a_full)
 | 
			
		|||
  Vector v(6);
 | 
			
		||||
  fill(v.begin(), v.end(), 0);
 | 
			
		||||
  v(0) = 0.3;
 | 
			
		||||
  CHECK(assert_equal(id.expmap(v), Pose3(R, Point3())));
 | 
			
		||||
  CHECK(assert_equal(id.expmapFull(v), Pose3(R, Point3())));
 | 
			
		||||
  v(3)=0.2;v(4)=0.394742;v(5)=-2.08998;
 | 
			
		||||
  CHECK(assert_equal(Pose3(R, P),id.expmapFull(v),1e-5));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
TEST( Pose3, expmap_a_full2)
 | 
			
		||||
{
 | 
			
		||||
  Pose3 id;
 | 
			
		||||
  Vector v(6);
 | 
			
		||||
  fill(v.begin(), v.end(), 0);
 | 
			
		||||
  v(0) = 0.3;
 | 
			
		||||
  CHECK(assert_equal(expmapFull<Pose3>(id,v), Pose3(R, Point3())));
 | 
			
		||||
  v(3)=0.2;v(4)=0.394742;v(5)=-2.08998;
 | 
			
		||||
  CHECK(assert_equal(Pose3(R, P),expmapFull<Pose3>(id,v),1e-5));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
TEST(Pose3, expmap_b)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue