BearingRange type

release/4.3a0
Frank Dellaert 2015-07-12 20:16:06 -07:00
parent 30435da070
commit b6a785e2d9
2 changed files with 158 additions and 0 deletions

View File

@ -0,0 +1,97 @@
/* ----------------------------------------------------------------------------
* GTSAM Copyright 2010, Georgia Tech Research Corporation,
* Atlanta, Georgia 30332-0415
* All Rights Reserved
* Authors: Frank Dellaert, et al. (see THANKS for the full author list)
* See LICENSE for the license information
* -------------------------------------------------------------------------- */
/**
* @file BearingRange.h
* @date July, 2015
* @author Frank Dellaert
* @brief Bearing-Range product
*/
#pragma once
#include <gtsam/base/Manifold.h>
#include <gtsam/base/Testable.h>
#include <boost/concept/assert.hpp>
namespace gtsam {
// forward declaration of Bearing functor, assumed partially specified
template <typename A1, typename A2>
struct Bearing;
// forward declaration of Range functor, assumed partially specified
template <typename A1, typename A2>
struct Range;
/**
* Bearing-Range product for a particular A1,A2 combination
*/
template <typename A1, typename A2>
struct BearingRange
: public ProductManifold<typename Bearing<A1, A2>::result_type,
typename Range<A1, A2>::result_type> {
typedef typename Bearing<A1, A2>::result_type B;
typedef typename Range<A1, A2>::result_type R;
BearingRange() {}
BearingRange(const ProductManifold<B, R>& br) : ProductManifold<B, R>(br) {}
BearingRange(const B& b, const R& r) : ProductManifold<B, R>(b, r) {}
/// Prediction function that stacks measurements
// BearingRange operator()(
// const A1& a1, const A2& a2,
// typename MakeOptionalJacobian<BearingRange, A1>::type H1,
// typename MakeOptionalJacobian<BearingRange, A2>::type H2) {
// typename MakeJacobian<B, A1>::type HB1;
// typename MakeJacobian<B, A2>::type HB2;
// typename MakeJacobian<R, A1>::type HR1;
// typename MakeJacobian<R, A2>::type HR2;
//
// B b = Bearing<A1, A2>()(a1, a2, H1 ? &HB1 : 0, H2 ? &HB2 : 0);
// R r = Range<A1, A2>()(a1, a2, H1 ? &HR1 : 0, H2 ? &HR2 : 0);
//
// if (H1) *H1 << HB1, HR1;
// if (H2) *H2 << HB2, HR2;
// return BearingRange(b, r);
// }
//
private:
/// Serialization function
template <class ARCHIVE>
void serialize(ARCHIVE& ar, const unsigned int /*version*/) {
ar& boost::serialization::make_nvp("bearing", this->first);
ar& boost::serialization::make_nvp("range", this->second);
}
friend class boost::serialization::access;
};
template <typename A1, typename A2>
struct traits<BearingRange<A1, A2> >
// : internal::ManifoldTraits<BearingRange<A1, A2> >
{
typedef typename Bearing<A1, A2>::result_type B;
typedef typename Range<A1, A2>::result_type R;
static void Print(const BearingRange<A1, A2>& m,
const std::string& str = "") {
traits<B>::Print(m.first, str);
traits<R>::Print(m.second, str);
}
static bool Equals(const BearingRange<A1, A2>& m1,
const BearingRange<A1, A2>& m2, double tol = 1e-8) {
return traits<B>::Equals(m1.first, m2.first, tol) &&
traits<R>::Equals(m1.second, m2.second, tol);
}
};
} // namespace gtsam

View File

@ -0,0 +1,61 @@
/* ----------------------------------------------------------------------------
* GTSAM Copyright 2010, Georgia Tech Research Corporation,
* Atlanta, Georgia 30332-0415
* All Rights Reserved
* Authors: Frank Dellaert, et al. (see THANKS for the full author list)
* See LICENSE for the license information
* -------------------------------------------------------------------------- */
/**
* @file testBearingRange.cpp
* @brief Unit tests for BearingRange Class
* @author Frank Dellaert
* @date July 2015
*/
#include <gtsam/geometry/BearingRange.h>
#include <gtsam/geometry/Pose2.h>
#include <gtsam/geometry/Pose3.h>
#include <gtsam/base/serializationTestHelpers.h>
#include <CppUnitLite/TestHarness.h>
using namespace std;
using namespace gtsam;
using namespace serializationTestHelpers;
typedef BearingRange<Pose2, Point2> BearingRange2D;
BearingRange2D br2D(1, 2);
typedef BearingRange<Pose3, Point3> BearingRange3D;
BearingRange3D br3D(Pose3().bearing(Point3(1, 0, 0)), 1);
/* ************************************************************************* */
TEST(BearingRange, Serialization2D) {
EXPECT(equalsObj<BearingRange2D>(br2D));
EXPECT(equalsXML<BearingRange2D>(br2D));
EXPECT(equalsBinary<BearingRange2D>(br2D));
}
/* ************************************************************************* */
TEST(BearingRange, 2D) {}
/* ************************************************************************* */
TEST(BearingRange, Serialization3D) {
EXPECT(equalsObj<BearingRange3D>(br3D));
EXPECT(equalsXML<BearingRange3D>(br3D));
EXPECT(equalsBinary<BearingRange3D>(br3D));
}
/* ************************************************************************* */
TEST(BearingRange, 3D) {}
/* ************************************************************************* */
int main() {
TestResult tr;
return TestRegistry::runAllTests(tr);
}
/* ************************************************************************* */