NonlinearFactors handle constrained noise models properly now, as before they would try to whiten and fail
parent
06a062c931
commit
eb88a149a1
|
@ -164,6 +164,11 @@ virtual SharedDiagonal QR(Matrix& Ab) const;
|
||||||
*/
|
*/
|
||||||
virtual Matrix R() const { return thisR();}
|
virtual Matrix R() const { return thisR();}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple check for constrained-ness
|
||||||
|
*/
|
||||||
|
virtual bool isConstrained() const {return false;}
|
||||||
|
|
||||||
}; // Gaussian
|
}; // Gaussian
|
||||||
|
|
||||||
|
|
||||||
|
@ -232,12 +237,6 @@ public:
|
||||||
virtual Matrix R() const {
|
virtual Matrix R() const {
|
||||||
return diag(invsigmas_);
|
return diag(invsigmas_);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Simple check for constrained-ness
|
|
||||||
*/
|
|
||||||
virtual bool isConstrained() {return false;}
|
|
||||||
|
|
||||||
}; // Diagonal
|
}; // Diagonal
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -308,9 +307,9 @@ public:
|
||||||
virtual SharedDiagonal QR(Matrix& Ab) const;
|
virtual SharedDiagonal QR(Matrix& Ab) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Not constrained
|
* Check constrained is always true
|
||||||
*/
|
*/
|
||||||
virtual bool isConstrained() {return true;}
|
virtual bool isConstrained() const {return true;}
|
||||||
|
|
||||||
}; // Constrained
|
}; // Constrained
|
||||||
|
|
||||||
|
|
|
@ -190,6 +190,11 @@ namespace gtsam {
|
||||||
Matrix A;
|
Matrix A;
|
||||||
Vector b = - evaluateError(xj, A);
|
Vector b = - evaluateError(xj, A);
|
||||||
// TODO pass unwhitened + noise model to Gaussian factor
|
// TODO pass unwhitened + noise model to Gaussian factor
|
||||||
|
SharedDiagonal constrained =
|
||||||
|
boost::shared_dynamic_cast<noiseModel::Constrained>(this->noiseModel_);
|
||||||
|
if (constrained.get() != NULL) {
|
||||||
|
return GaussianFactor::shared_ptr(new GaussianFactor(key_, A, b, constrained));
|
||||||
|
}
|
||||||
this->noiseModel_->WhitenInPlace(A);
|
this->noiseModel_->WhitenInPlace(A);
|
||||||
this->noiseModel_->whitenInPlace(b);
|
this->noiseModel_->whitenInPlace(b);
|
||||||
return GaussianFactor::shared_ptr(new GaussianFactor(key_, A, b,
|
return GaussianFactor::shared_ptr(new GaussianFactor(key_, A, b,
|
||||||
|
@ -288,6 +293,12 @@ namespace gtsam {
|
||||||
Matrix A1, A2;
|
Matrix A1, A2;
|
||||||
Vector b = -evaluateError(x1, x2, A1, A2);
|
Vector b = -evaluateError(x1, x2, A1, A2);
|
||||||
// TODO pass unwhitened + noise model to Gaussian factor
|
// TODO pass unwhitened + noise model to Gaussian factor
|
||||||
|
SharedDiagonal constrained =
|
||||||
|
boost::shared_dynamic_cast<noiseModel::Constrained>(this->noiseModel_);
|
||||||
|
if (constrained.get() != NULL) {
|
||||||
|
return GaussianFactor::shared_ptr(new GaussianFactor(key1_, A1, key2_,
|
||||||
|
A2, b, constrained));
|
||||||
|
}
|
||||||
this->noiseModel_->WhitenInPlace(A1);
|
this->noiseModel_->WhitenInPlace(A1);
|
||||||
this->noiseModel_->WhitenInPlace(A2);
|
this->noiseModel_->WhitenInPlace(A2);
|
||||||
this->noiseModel_->whitenInPlace(b);
|
this->noiseModel_->whitenInPlace(b);
|
||||||
|
|
|
@ -175,6 +175,45 @@ TEST( NonlinearFactor, size )
|
||||||
CHECK(factor3->size() == 2);
|
CHECK(factor3->size() == 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
TEST( NonlinearFactor, linearize_constraint1 )
|
||||||
|
{
|
||||||
|
Vector sigmas = Vector_(2, 0.2, 0.0);
|
||||||
|
SharedDiagonal constraint = noiseModel::Constrained::MixedSigmas(sigmas);
|
||||||
|
|
||||||
|
Point2 mu(1., -1.);
|
||||||
|
Graph::sharedFactor f0(new simulated2D::Prior(mu, constraint, 1));
|
||||||
|
|
||||||
|
Config config;
|
||||||
|
config.insert(simulated2D::PoseKey(1), Point2(1.0, 2.0));
|
||||||
|
GaussianFactor::shared_ptr actual = f0->linearize(config);
|
||||||
|
|
||||||
|
// create expected
|
||||||
|
Vector b = Vector_(2, 0., -3.);
|
||||||
|
GaussianFactor expected("x1", eye(2), b, constraint);
|
||||||
|
CHECK(assert_equal(expected, *actual));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
TEST( NonlinearFactor, linearize_constraint2 )
|
||||||
|
{
|
||||||
|
Vector sigmas = Vector_(2, 0.2, 0.0);
|
||||||
|
SharedDiagonal constraint = noiseModel::Constrained::MixedSigmas(sigmas);
|
||||||
|
|
||||||
|
Point2 z3(1.,-1.);
|
||||||
|
simulated2D::Measurement f0(z3, constraint, 1,1);
|
||||||
|
|
||||||
|
Config config;
|
||||||
|
config.insert(simulated2D::PoseKey(1), Point2(1.0, 2.0));
|
||||||
|
config.insert(simulated2D::PointKey(1), Point2(5.0, 4.0));
|
||||||
|
GaussianFactor::shared_ptr actual = f0.linearize(config);
|
||||||
|
|
||||||
|
// create expected
|
||||||
|
Vector b = Vector_(2, -3., -3.);
|
||||||
|
GaussianFactor expected("x1", -1*eye(2), "l1", eye(2), b, constraint);
|
||||||
|
CHECK(assert_equal(expected, *actual));
|
||||||
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
int main() { TestResult tr; return TestRegistry::runAllTests(tr);}
|
int main() { TestResult tr; return TestRegistry::runAllTests(tr);}
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
|
Loading…
Reference in New Issue