add Lie group operations
parent
9eff71ea8e
commit
7a56473d8f
|
|
@ -12,7 +12,7 @@
|
||||||
/**
|
/**
|
||||||
* @file Similarity2.cpp
|
* @file Similarity2.cpp
|
||||||
* @brief Implementation of Similarity2 transform
|
* @brief Implementation of Similarity2 transform
|
||||||
* @author John Lambert
|
* @author John Lambert, Varun Agrawal
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <gtsam/base/Manifold.h>
|
#include <gtsam/base/Manifold.h>
|
||||||
|
|
@ -198,6 +198,30 @@ Similarity2 Similarity2::Align(const Pose2Pairs& abPosePairs) {
|
||||||
return internal::AlignGivenR(abPointPairs, aRb_estimate);
|
return internal::AlignGivenR(abPointPairs, aRb_estimate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vector4 Similarity2::Logmap(const Similarity2& S, //
|
||||||
|
OptionalJacobian<4, 4> Hm) {
|
||||||
|
const Vector2 u = S.t_;
|
||||||
|
const Vector1 w = Rot2::Logmap(S.R_);
|
||||||
|
const double s = log(S.s_);
|
||||||
|
Vector4 result;
|
||||||
|
result << u, w, s;
|
||||||
|
if (Hm) {
|
||||||
|
throw std::runtime_error("Similarity2::Logmap: derivative not implemented");
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Similarity2 Similarity2::Expmap(const Vector4& v, //
|
||||||
|
OptionalJacobian<4, 4> Hm) {
|
||||||
|
const Vector2 t = v.head<2>();
|
||||||
|
const Rot2 R = Rot2::Expmap(v.segment<1>(2));
|
||||||
|
const double s = v[3];
|
||||||
|
if (Hm) {
|
||||||
|
throw std::runtime_error("Similarity2::Expmap: derivative not implemented");
|
||||||
|
}
|
||||||
|
return Similarity2(R, t, s);
|
||||||
|
}
|
||||||
|
|
||||||
std::ostream& operator<<(std::ostream& os, const Similarity2& p) {
|
std::ostream& operator<<(std::ostream& os, const Similarity2& p) {
|
||||||
os << "[" << p.rotation().theta() << " " << p.translation().transpose() << " "
|
os << "[" << p.rotation().theta() << " " << p.translation().transpose() << " "
|
||||||
<< p.scale() << "]\';";
|
<< p.scale() << "]\';";
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
/**
|
/**
|
||||||
* @file Similarity2.h
|
* @file Similarity2.h
|
||||||
* @brief Implementation of Similarity2 transform
|
* @brief Implementation of Similarity2 transform
|
||||||
* @author John Lambert
|
* @author John Lambert, Varun Agrawal
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
@ -138,6 +138,29 @@ class GTSAM_EXPORT Similarity2 : public LieGroup<Similarity2, 4> {
|
||||||
/// @name Lie Group
|
/// @name Lie Group
|
||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log map at the identity
|
||||||
|
* \f$ [t_x, t_y, \delta, \lambda] \f$
|
||||||
|
*/
|
||||||
|
static Vector4 Logmap(const Similarity2& S, //
|
||||||
|
OptionalJacobian<4, 4> Hm = boost::none);
|
||||||
|
|
||||||
|
/// Exponential map at the identity
|
||||||
|
static Similarity2 Expmap(const Vector4& v, //
|
||||||
|
OptionalJacobian<4, 4> Hm = boost::none);
|
||||||
|
|
||||||
|
/// Chart at the origin
|
||||||
|
struct ChartAtOrigin {
|
||||||
|
static Similarity2 Retract(const Vector4& v,
|
||||||
|
ChartJacobian H = boost::none) {
|
||||||
|
return Similarity2::Expmap(v, H);
|
||||||
|
}
|
||||||
|
static Vector4 Local(const Similarity2& other,
|
||||||
|
ChartJacobian H = boost::none) {
|
||||||
|
return Similarity2::Logmap(other, H);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
using LieGroup<Similarity2, 4>::inverse;
|
using LieGroup<Similarity2, 4>::inverse;
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue