Changes to make Pose2Config work with NonlinearOptimizer

release/4.3a0
Richard Roberts 2009-12-16 21:40:41 +00:00
parent 83c95f2343
commit c45f64657f
1 changed files with 54 additions and 4 deletions

View File

@ -1,24 +1,74 @@
#pragma once #pragma once
#include <map> #include <map>
#include <boost/exception.hpp>
#include <boost/foreach.hpp>
#include <boost/tuple/tuple.hpp>
#include <iostream>
#include <string>
#include "Pose2.h" #include "Pose2.h"
#include "Testable.h"
#include "VectorConfig.h"
#include "Vector.h"
// trick from some reading group
#define FOREACH_PAIR( KEY, VAL, COL) BOOST_FOREACH (boost::tie(KEY,VAL),COL)
namespace gtsam { namespace gtsam {
class Pose2Config: public std::map<std::string, Pose2> { class Pose2Config: public Testable<Pose2Config> {
private:
std::map<std::string, Pose2> values;
public: public:
Pose2Config() {} Pose2Config() {}
Pose2Config(const Pose2Config &config) : values(config.values) { }
virtual ~Pose2Config() { }
Pose2 get(std::string key) const { Pose2 get(std::string key) const {
std::map<std::string, Pose2>::const_iterator it = find(key); std::map<std::string, Pose2>::const_iterator it = values.find(key);
if (it == end()) if (it == values.end())
throw std::invalid_argument("invalid key"); throw std::invalid_argument("invalid key");
return it->second; return it->second;
} }
void insert(const std::string& name, const Pose2& val){ void insert(const std::string& name, const Pose2& val){
std::map<std::string, Pose2>::insert(make_pair(name, val)); values.insert(make_pair(name, val));
} }
Pose2Config& operator=(Pose2Config& rhs) {
values = rhs.values;
return (*this);
}
bool equals(const Pose2Config& expected, double tol) const {
std::cerr << "Pose2Config::equals not implemented!" << std::endl;
throw "Pose2Config::equals not implemented!";
}
void print(const std::string &s) const {
std::cout << s << std::endl;
}
/**
* Add a delta config, needed for use in NonlinearOptimizer
*/
Pose2Config exmap(const VectorConfig& delta) const {
Pose2Config newConfig;
std::string j; Pose2 vj;
FOREACH_PAIR(j, vj, values) {
if (delta.contains(j)) {
const Vector& dj = delta[j];
//check_size(j,vj,dj);
newConfig.insert(j, vj.exmap(dj));
} else {
newConfig.insert(j, vj);
}
}
return newConfig;
}
}; };
} // namespace } // namespace