added cameraConstraint and corresponding unit test based on same 2 camera/4 landmark example, but now there are constraints on the two cameras and none of the landmarks.
parent
0115b58bad
commit
4f7d31986c
|
@ -102,6 +102,23 @@ void VSLAMGraph::addLandmarkConstraint(int j, const gtsam::Point3& p) {
|
|||
push_back(factor);
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
bool compareCamera(const std::string& key,
|
||||
const VSLAMConfig& feasible,
|
||||
const VSLAMConfig& input) {
|
||||
int j = atoi(key.substr(1, key.size() - 1).c_str());
|
||||
return feasible.cameraPose(j).equals(input.cameraPose(j));
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
void VSLAMGraph::addCameraConstraint(int j, const gtsam::Pose3& p) {
|
||||
typedef NonlinearEquality<VSLAMConfig> NLE;
|
||||
VSLAMConfig feasible;
|
||||
feasible.addCameraPose(j,p);
|
||||
boost::shared_ptr<NLE> factor(new NLE(symbol('x',j), feasible, 6, compareCamera));
|
||||
push_back(factor);
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
|
||||
} // namespace gtsam
|
||||
|
|
|
@ -64,6 +64,13 @@ public:
|
|||
*/
|
||||
void addLandmarkConstraint(int j, const Point3& p = Point3());
|
||||
|
||||
/**
|
||||
* Add a constraint on a camera (for now, *must* be satisfied in any Config)
|
||||
* @param j index of camera
|
||||
* @param p to which pose to constrain it to
|
||||
*/
|
||||
void addCameraConstraint(int j, const Pose3& p = Pose3());
|
||||
|
||||
private:
|
||||
/** Serialization function */
|
||||
friend class boost::serialization::access;
|
||||
|
|
|
@ -59,12 +59,6 @@ VSLAMGraph testGraph() {
|
|||
g.push_back(VSLAMFactor::shared_ptr(new VSLAMFactor(z22, sigma, 2, 2, sK)));
|
||||
g.push_back(VSLAMFactor::shared_ptr(new VSLAMFactor(z23, sigma, 2, 3, sK)));
|
||||
g.push_back(VSLAMFactor::shared_ptr(new VSLAMFactor(z24, sigma, 2, 4, sK)));
|
||||
|
||||
// add 3 landmark constraints
|
||||
g.addLandmarkConstraint(1, landmark1);
|
||||
g.addLandmarkConstraint(2, landmark2);
|
||||
g.addLandmarkConstraint(3, landmark3);
|
||||
|
||||
return g;
|
||||
}
|
||||
|
||||
|
@ -73,6 +67,10 @@ TEST( VSLAMGraph, optimizeLM)
|
|||
{
|
||||
// build a graph
|
||||
VSLAMGraph graph = testGraph();
|
||||
// add 3 landmark constraints
|
||||
graph.addLandmarkConstraint(1, landmark1);
|
||||
graph.addLandmarkConstraint(2, landmark2);
|
||||
graph.addLandmarkConstraint(3, landmark3);
|
||||
|
||||
// Create an initial configuration corresponding to the ground truth
|
||||
boost::shared_ptr<VSLAMConfig> initialEstimate(new VSLAMConfig);
|
||||
|
@ -107,6 +105,50 @@ TEST( VSLAMGraph, optimizeLM)
|
|||
CHECK(assert_equal(*initialEstimate,*(afterOneIteration.config())));
|
||||
}
|
||||
|
||||
|
||||
/* ************************************************************************* */
|
||||
TEST( VSLAMGraph, optimizeLM2)
|
||||
{
|
||||
// build a graph
|
||||
VSLAMGraph graph = testGraph();
|
||||
// add 2 camera constraints
|
||||
graph.addCameraConstraint(1, camera1);
|
||||
graph.addCameraConstraint(2, camera2);
|
||||
|
||||
// Create an initial configuration corresponding to the ground truth
|
||||
boost::shared_ptr<VSLAMConfig> initialEstimate(new VSLAMConfig);
|
||||
initialEstimate->addCameraPose(1, camera1);
|
||||
initialEstimate->addCameraPose(2, camera2);
|
||||
initialEstimate->addLandmarkPoint(1, landmark1);
|
||||
initialEstimate->addLandmarkPoint(2, landmark2);
|
||||
initialEstimate->addLandmarkPoint(3, landmark3);
|
||||
initialEstimate->addLandmarkPoint(4, landmark4);
|
||||
|
||||
// Create an ordering of the variables
|
||||
list<string> keys;
|
||||
|
||||
keys.push_back("l1");
|
||||
keys.push_back("l2");
|
||||
keys.push_back("l3");
|
||||
keys.push_back("l4");
|
||||
keys.push_back("x1");
|
||||
keys.push_back("x2");
|
||||
Ordering ordering(keys);
|
||||
|
||||
// Create an optimizer and check its error
|
||||
// We expect the initial to be zero because config is the ground truth
|
||||
Optimizer optimizer(graph, ordering, initialEstimate, 1e-5);
|
||||
DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9);
|
||||
|
||||
// Iterate once, and the config should not have changed because we started
|
||||
// with the ground truth
|
||||
Optimizer afterOneIteration = optimizer.iterate();
|
||||
DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9);
|
||||
|
||||
// check if correct
|
||||
CHECK(assert_equal(*initialEstimate,*(afterOneIteration.config())));
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
int main() { TestResult tr; TestRegistry::runAllTests(tr); return 0;}
|
||||
/* ************************************************************************* */
|
||||
|
|
Loading…
Reference in New Issue