fixed anchor key: only remains to improve computation of noise model and test on some larger dataset
parent
f9172ceb34
commit
a14b88f607
|
@ -168,7 +168,7 @@ void getSymbolicSubgraph(vector<Key>& keysInBinary,
|
|||
|
||||
void getDeltaThetaAndNoise(NonlinearFactor::shared_ptr factor,
|
||||
Vector& deltaTheta, noiseModel::Diagonal::shared_ptr& model_deltaTheta){
|
||||
td::cout << "TODO: improve computation of noise model" << std::endl;
|
||||
std::cout << "TODO: improve computation of noise model" << std::endl;
|
||||
boost::shared_ptr< BetweenFactor<Pose2> > pose2Between = boost::dynamic_pointer_cast< BetweenFactor<Pose2> >(factor);
|
||||
if (!pose2Between) throw std::invalid_argument("buildOrientationGraph: invalid between factor!");
|
||||
deltaTheta = (Vector(1) << pose2Between->measured().theta());
|
||||
|
@ -186,24 +186,25 @@ void getDeltaThetaAndNoise(NonlinearFactor::shared_ptr factor,
|
|||
* Linear factor graph with regularized orientation measurements
|
||||
*/
|
||||
GaussianFactorGraph buildOrientationGraph(const vector<size_t>& spanningTree, const vector<size_t>& chords,
|
||||
const NonlinearFactorGraph& g, map<Key, double> orientationsToRoot){
|
||||
const NonlinearFactorGraph& g, map<Key, double> orientationsToRoot, PredecessorMap<Key>& tree){
|
||||
|
||||
GaussianFactorGraph lagoGraph;
|
||||
Vector deltaTheta;
|
||||
noiseModel::Diagonal::shared_ptr model_deltaTheta;
|
||||
Key key1, key2;
|
||||
|
||||
Matrix I = eye(1);
|
||||
// put original measurements in the spanning tree
|
||||
BOOST_FOREACH(const size_t& factorId, spanningTree){
|
||||
Key key1 = g[factorId]->keys()[0];
|
||||
Key key2 = g[factorId]->keys()[1];
|
||||
key1 = g[factorId]->keys()[0];
|
||||
key2 = g[factorId]->keys()[1];
|
||||
getDeltaThetaAndNoise(g[factorId], deltaTheta, model_deltaTheta);
|
||||
lagoGraph.add(JacobianFactor(key1, -I, key2, I, deltaTheta, model_deltaTheta));
|
||||
}
|
||||
// put regularized measurements in the chords
|
||||
BOOST_FOREACH(const size_t& factorId, chords){
|
||||
Key key1 = g[factorId]->keys()[0];
|
||||
Key key2 = g[factorId]->keys()[1];
|
||||
key1 = g[factorId]->keys()[0];
|
||||
key2 = g[factorId]->keys()[1];
|
||||
getDeltaThetaAndNoise(g[factorId], deltaTheta, model_deltaTheta);
|
||||
double key1_DeltaTheta_key2 = deltaTheta(0);
|
||||
double k2pi_noise = key1_DeltaTheta_key2 + orientationsToRoot[key1] - orientationsToRoot[key2]; // this coincides to summing up measurements along the cycle induced by the chord
|
||||
|
@ -211,10 +212,17 @@ GaussianFactorGraph buildOrientationGraph(const vector<size_t>& spanningTree, co
|
|||
Vector deltaThetaRegularized = (Vector(1) << key1_DeltaTheta_key2 - 2*k*PI);
|
||||
lagoGraph.add(JacobianFactor(key1, -I, key2, I, deltaThetaRegularized, model_deltaTheta));
|
||||
}
|
||||
// prior on first orientation (anchor)
|
||||
// prior on first orientation (anchor), corresponding to the root of the tree
|
||||
noiseModel::Diagonal::shared_ptr model_anchor = noiseModel::Diagonal::Variances((Vector(1) << 1e-8));
|
||||
std::cout << "TODO: fix the right root orientation and key" << std::endl;
|
||||
lagoGraph.add(JacobianFactor(x0, I, (Vector(1) << 0.0), model_anchor));
|
||||
// find the root
|
||||
Key key_root = key1; // one random node
|
||||
while(1){
|
||||
// We check if we reached the root
|
||||
if(tree[key_root]==key_root) // if we reached the root
|
||||
break;
|
||||
key_root = tree[key_root]; // we move upwards in the tree
|
||||
}
|
||||
lagoGraph.add(JacobianFactor(key_root, I, (Vector(1) << 0.0), model_anchor));
|
||||
return lagoGraph;
|
||||
}
|
||||
|
||||
|
@ -235,7 +243,7 @@ VectorValues initializeLago(const NonlinearFactorGraph& graph, vector<Key>& keys
|
|||
map<Key, double> orientationsToRoot = computeThetasToRoot(keysInBinary, deltaThetaMap, tree);
|
||||
|
||||
// regularize measurements and plug everything in a factor graph
|
||||
GaussianFactorGraph lagoGraph = buildOrientationGraph(spanningTree, chords, graph, orientationsToRoot);
|
||||
GaussianFactorGraph lagoGraph = buildOrientationGraph(spanningTree, chords, graph, orientationsToRoot, tree);
|
||||
|
||||
// Solve the LFG
|
||||
VectorValues estimateLago = lagoGraph.optimize();
|
||||
|
@ -364,7 +372,7 @@ TEST( Lago, regularizedMeasurements ) {
|
|||
|
||||
map<Key, double> orientationsToRoot = computeThetasToRoot(keysInBinary, deltaThetaMap, tree);
|
||||
|
||||
GaussianFactorGraph lagoGraph = buildOrientationGraph(spanningTree, chords, g, orientationsToRoot);
|
||||
GaussianFactorGraph lagoGraph = buildOrientationGraph(spanningTree, chords, g, orientationsToRoot, tree);
|
||||
std::pair<Matrix,Vector> actualAb = lagoGraph.jacobian();
|
||||
// jacobian corresponding to the orientation measurements (last entry is the prior on the anchor and is disregarded)
|
||||
Vector actual = (Vector(5) << actualAb.second(0),actualAb.second(1),actualAb.second(2),actualAb.second(3),actualAb.second(4));
|
||||
|
|
Loading…
Reference in New Issue