00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef OPTIMIZER_H_
00029 #define OPTIMIZER_H_
00030
00031 #include "rtabmap/core/RtabmapExp.h"
00032
00033 #include <map>
00034 #include <list>
00035 #include <rtabmap/core/Link.h>
00036 #include <rtabmap/core/Parameters.h>
00037 #include <rtabmap/core/Signature.h>
00038
00039 namespace rtabmap {
00040
00042
00044 class RTABMAP_EXP Optimizer
00045 {
00046 public:
00047 enum Type {
00048 kTypeUndef = -1,
00049 kTypeTORO = 0,
00050 kTypeG2O = 1,
00051 kTypeGTSAM = 2,
00052 kTypeCVSBA = 3
00053 };
00054 static bool isAvailable(Optimizer::Type type);
00055 static Optimizer * create(const ParametersMap & parameters);
00056 static Optimizer * create(Optimizer::Type type, const ParametersMap & parameters = ParametersMap());
00057
00058
00059 static void getConnectedGraph(
00060 int fromId,
00061 const std::map<int, Transform> & posesIn,
00062 const std::multimap<int, Link> & linksIn,
00063 std::map<int, Transform> & posesOut,
00064 std::multimap<int, Link> & linksOut,
00065 int depth = 0);
00066
00067 public:
00068 virtual ~Optimizer() {}
00069
00070 virtual Type type() const = 0;
00071
00072
00073 int iterations() const {return iterations_;}
00074 bool isSlam2d() const {return slam2d_;}
00075 bool isCovarianceIgnored() const {return covarianceIgnored_;}
00076 double epsilon() const {return epsilon_;}
00077 bool isRobust() const {return robust_;}
00078
00079
00080 void setIterations(int iterations) {iterations_ = iterations;}
00081 void setSlam2d(bool enabled) {slam2d_ = enabled;}
00082 void setCovarianceIgnored(bool enabled) {covarianceIgnored_ = enabled;}
00083 void setEpsilon(double epsilon) {epsilon_ = epsilon;}
00084 void setRobust(bool enabled) {robust_ = enabled;}
00085
00086
00087 virtual std::map<int, Transform> optimize(
00088 int rootId,
00089 const std::map<int, Transform> & poses,
00090 const std::multimap<int, Link> & constraints,
00091 std::list<std::map<int, Transform> > * intermediateGraphes = 0,
00092 double * finalError = 0,
00093 int * iterationsDone = 0);
00094 virtual std::map<int, Transform> optimizeBA(
00095 int rootId,
00096 const std::map<int, Transform> & poses,
00097 const std::multimap<int, Link> & links,
00098 const std::map<int, Signature> & signatures);
00099
00100 virtual void parseParameters(const ParametersMap & parameters);
00101
00102 void computeBACorrespondences(
00103 const std::map<int, Transform> & poses,
00104 const std::multimap<int, Link> & links,
00105 const std::map<int, Signature> & signatures,
00106 std::map<int, cv::Point3f> & points3DMap,
00107 std::map<int, std::map<int, cv::Point2f> > & wordReferences);
00108
00109 protected:
00110 Optimizer(
00111 int iterations = Parameters::defaultOptimizerIterations(),
00112 bool slam2d = Parameters::defaultOptimizerSlam2D(),
00113 bool covarianceIgnored = Parameters::defaultOptimizerVarianceIgnored(),
00114 double epsilon = Parameters::defaultOptimizerEpsilon(),
00115 bool robust = Parameters::defaultOptimizerRobust());
00116 Optimizer(const ParametersMap & parameters);
00117
00118 private:
00119 int iterations_;
00120 bool slam2d_;
00121 bool covarianceIgnored_;
00122 double epsilon_;
00123 bool robust_;
00124 };
00125
00126 }
00127 #endif