Merge branch 'master' into retraction_name
parent
b3501efdec
commit
e0f2087e03
3
gtsam.h
3
gtsam.h
|
@ -45,10 +45,13 @@ class Pose2 {
|
||||||
|
|
||||||
class SharedGaussian {
|
class SharedGaussian {
|
||||||
SharedGaussian(Matrix covariance);
|
SharedGaussian(Matrix covariance);
|
||||||
|
void print(string s) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
class SharedDiagonal {
|
class SharedDiagonal {
|
||||||
SharedDiagonal(Vector sigmas);
|
SharedDiagonal(Vector sigmas);
|
||||||
|
void print(string s) const;
|
||||||
|
Vector sample() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
class VectorValues {
|
class VectorValues {
|
||||||
|
|
|
@ -535,7 +535,7 @@ void Base::reweight(Matrix &A1, Matrix &A2, Matrix &A3, Vector &error) const {
|
||||||
// Null model
|
// Null model
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
|
||||||
void Null::print(const std::string &s) const
|
void Null::print(const std::string &s="") const
|
||||||
{ cout << s << ": null ()" << endl; }
|
{ cout << s << ": null ()" << endl; }
|
||||||
|
|
||||||
Null::shared_ptr Null::Create()
|
Null::shared_ptr Null::Create()
|
||||||
|
@ -556,7 +556,7 @@ Fair::Fair(const double c, const ReweightScheme reweight)
|
||||||
double Fair::weight(const double &error) const
|
double Fair::weight(const double &error) const
|
||||||
{ return 1.0 / (1.0 + fabs(error)/c_); }
|
{ return 1.0 / (1.0 + fabs(error)/c_); }
|
||||||
|
|
||||||
void Fair::print(const std::string &s) const
|
void Fair::print(const std::string &s="") const
|
||||||
{ cout << s << ": fair (" << c_ << ")" << endl; }
|
{ cout << s << ": fair (" << c_ << ")" << endl; }
|
||||||
|
|
||||||
bool Fair::equals(const Base &expected, const double tol) const {
|
bool Fair::equals(const Base &expected, const double tol) const {
|
||||||
|
@ -584,7 +584,7 @@ double Huber::weight(const double &error) const {
|
||||||
return (error < k_) ? (1.0) : (k_ / fabs(error));
|
return (error < k_) ? (1.0) : (k_ / fabs(error));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Huber::print(const std::string &s) const {
|
void Huber::print(const std::string &s="") const {
|
||||||
cout << s << ": huber (" << k_ << ")" << endl;
|
cout << s << ": huber (" << k_ << ")" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,12 @@ namespace gtsam { // note, deliberately not in noiseModel namespace
|
||||||
noiseModel::Diagonal::shared_ptr(noiseModel::Diagonal::Sigmas(sigmas)) {
|
noiseModel::Diagonal::shared_ptr(noiseModel::Diagonal::Sigmas(sigmas)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Print
|
||||||
|
inline void print(const std::string &s) const { (*this)->print(s); }
|
||||||
|
|
||||||
|
/// Generate a sample
|
||||||
|
inline Vector sample() const { return (*this)->sample(); }
|
||||||
|
|
||||||
/** Serialization function */
|
/** Serialization function */
|
||||||
friend class boost::serialization::access;
|
friend class boost::serialization::access;
|
||||||
template<class ARCHIVE>
|
template<class ARCHIVE>
|
||||||
|
|
|
@ -55,6 +55,9 @@ namespace gtsam { // note, deliberately not in noiseModel namespace
|
||||||
Base(noiseModel::Isotropic::Sigma(GTSAM_DANGEROUS_GAUSSIAN, s)) {}
|
Base(noiseModel::Isotropic::Sigma(GTSAM_DANGEROUS_GAUSSIAN, s)) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/// Print
|
||||||
|
inline void print(const std::string &s) const { (*this)->print(s); }
|
||||||
|
|
||||||
/** Serialization function */
|
/** Serialization function */
|
||||||
friend class boost::serialization::access;
|
friend class boost::serialization::access;
|
||||||
template<class ARCHIVE>
|
template<class ARCHIVE>
|
||||||
|
|
|
@ -134,6 +134,14 @@ TEST(NoiseModel, equals)
|
||||||
EXPECT(assert_inequal(*i1,*i2));
|
EXPECT(assert_inequal(*i1,*i2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
TEST(NoiseModel, sample) {
|
||||||
|
Vector s = Vector_(3,1.0,2.0,3.0);
|
||||||
|
SharedDiagonal model = sharedSigmas(s);
|
||||||
|
Vector v = model->sample();
|
||||||
|
// no check as no way yet to set random seed
|
||||||
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
TEST(NoiseModel, ConstrainedMixed )
|
TEST(NoiseModel, ConstrainedMixed )
|
||||||
{
|
{
|
||||||
|
|
|
@ -44,13 +44,37 @@ static noiseModel::Gaussian::shared_ptr covariance(
|
||||||
//static noiseModel::Gaussian::shared_ptr I3(noiseModel::Unit::Create(3));
|
//static noiseModel::Gaussian::shared_ptr I3(noiseModel::Unit::Create(3));
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
Vector f(const Pose2& pose1, const Pose2& pose2) {
|
// Test constraint, small displacement
|
||||||
|
Vector f1(const Pose2& pose1, const Pose2& pose2) {
|
||||||
|
Pose2 z(2.1130913087, 0.468461064817, 0.436332312999);
|
||||||
|
Pose2Factor constraint(1, 2, z, covariance);
|
||||||
|
return constraint.evaluateError(pose1, pose2);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST( Pose2SLAM, constraint1 )
|
||||||
|
{
|
||||||
|
// create a factor between unknown poses p1 and p2
|
||||||
|
Pose2 pose1, pose2(2.1130913087, 0.468461064817, 0.436332312999);
|
||||||
|
Pose2Factor constraint(1, 2, pose2, covariance);
|
||||||
|
Matrix H1, H2;
|
||||||
|
Vector actual = constraint.evaluateError(pose1, pose2, H1, H2);
|
||||||
|
|
||||||
|
Matrix numericalH1 = numericalDerivative21(&f1 , pose1, pose2);
|
||||||
|
EXPECT(assert_equal(numericalH1,H1,5e-3));
|
||||||
|
|
||||||
|
Matrix numericalH2 = numericalDerivative22(&f1 , pose1, pose2);
|
||||||
|
EXPECT(assert_equal(numericalH2,H2));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
// Test constraint, large displacement
|
||||||
|
Vector f2(const Pose2& pose1, const Pose2& pose2) {
|
||||||
Pose2 z(2,2,M_PI_2);
|
Pose2 z(2,2,M_PI_2);
|
||||||
Pose2Factor constraint(1, 2, z, covariance);
|
Pose2Factor constraint(1, 2, z, covariance);
|
||||||
return constraint.evaluateError(pose1, pose2);
|
return constraint.evaluateError(pose1, pose2);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST( Pose2SLAM, constraint )
|
TEST( Pose2SLAM, constraint2 )
|
||||||
{
|
{
|
||||||
// create a factor between unknown poses p1 and p2
|
// create a factor between unknown poses p1 and p2
|
||||||
Pose2 pose1, pose2(2,2,M_PI_2);
|
Pose2 pose1, pose2(2,2,M_PI_2);
|
||||||
|
@ -58,10 +82,10 @@ TEST( Pose2SLAM, constraint )
|
||||||
Matrix H1, H2;
|
Matrix H1, H2;
|
||||||
Vector actual = constraint.evaluateError(pose1, pose2, H1, H2);
|
Vector actual = constraint.evaluateError(pose1, pose2, H1, H2);
|
||||||
|
|
||||||
Matrix numericalH1 = numericalDerivative21(&f , pose1, pose2);
|
Matrix numericalH1 = numericalDerivative21(&f2 , pose1, pose2);
|
||||||
EXPECT(assert_equal(numericalH1,H1,5e-3));
|
EXPECT(assert_equal(numericalH1,H1,5e-3));
|
||||||
|
|
||||||
Matrix numericalH2 = numericalDerivative22(&f , pose1, pose2);
|
Matrix numericalH2 = numericalDerivative22(&f2 , pose1, pose2);
|
||||||
EXPECT(assert_equal(numericalH2,H2));
|
EXPECT(assert_equal(numericalH2,H2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue