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 bool priorsIgnored() const {return priorsIgnored_;}
00079
00080
00081 void setIterations(int iterations) {iterations_ = iterations;}
00082 void setSlam2d(bool enabled) {slam2d_ = enabled;}
00083 void setCovarianceIgnored(bool enabled) {covarianceIgnored_ = enabled;}
00084 void setEpsilon(double epsilon) {epsilon_ = epsilon;}
00085 void setRobust(bool enabled) {robust_ = enabled;}
00086 void setPriorsIgnored(bool enabled) {priorsIgnored_ = enabled;}
00087
00088 virtual void parseParameters(const ParametersMap & parameters);
00089
00090 std::map<int, Transform> optimizeIncremental(
00091 int rootId,
00092 const std::map<int, Transform> & poses,
00093 const std::multimap<int, Link> & constraints,
00094 std::list<std::map<int, Transform> > * intermediateGraphes = 0,
00095 double * finalError = 0,
00096 int * iterationsDone = 0);
00097
00098 std::map<int, Transform> optimize(
00099 int rootId,
00100 const std::map<int, Transform> & poses,
00101 const std::multimap<int, Link> & constraints,
00102 std::list<std::map<int, Transform> > * intermediateGraphes = 0,
00103 double * finalError = 0,
00104 int * iterationsDone = 0);
00105
00106
00107 virtual std::map<int, Transform> optimize(
00108 int rootId,
00109 const std::map<int, Transform> & poses,
00110 const std::multimap<int, Link> & constraints,
00111 cv::Mat & outputCovariance,
00112 std::list<std::map<int, Transform> > * intermediateGraphes = 0,
00113 double * finalError = 0,
00114 int * iterationsDone = 0);
00115 virtual std::map<int, Transform> optimizeBA(
00116 int rootId,
00117 const std::map<int, Transform> & poses,
00118 const std::multimap<int, Link> & links,
00119 const std::map<int, CameraModel> & models,
00120 std::map<int, cv::Point3f> & points3DMap,
00121 const std::map<int, std::map<int, cv::Point3f> > & wordReferences,
00122 std::set<int> * outliers = 0);
00123
00124 std::map<int, Transform> optimizeBA(
00125 int rootId,
00126 const std::map<int, Transform> & poses,
00127 const std::multimap<int, Link> & links,
00128 const std::map<int, Signature> & signatures);
00129
00130 Transform optimizeBA(
00131 const Link & link,
00132 const CameraModel & model,
00133 std::map<int, cv::Point3f> & points3DMap,
00134 const std::map<int, std::map<int, cv::Point3f> > & wordReferences,
00135 std::set<int> * outliers = 0);
00136
00137 void computeBACorrespondences(
00138 const std::map<int, Transform> & poses,
00139 const std::multimap<int, Link> & links,
00140 const std::map<int, Signature> & signatures,
00141 std::map<int, cv::Point3f> & points3DMap,
00142 std::map<int, std::map<int, cv::Point3f> > & wordReferences);
00143
00144 protected:
00145 Optimizer(
00146 int iterations = Parameters::defaultOptimizerIterations(),
00147 bool slam2d = Parameters::defaultRegForce3DoF(),
00148 bool covarianceIgnored = Parameters::defaultOptimizerVarianceIgnored(),
00149 double epsilon = Parameters::defaultOptimizerEpsilon(),
00150 bool robust = Parameters::defaultOptimizerRobust(),
00151 bool priorsIgnored = Parameters::defaultOptimizerPriorsIgnored());
00152 Optimizer(const ParametersMap & parameters);
00153
00154 private:
00155 int iterations_;
00156 bool slam2d_;
00157 bool covarianceIgnored_;
00158 double epsilon_;
00159 bool robust_;
00160 bool priorsIgnored_;
00161 };
00162
00163 }
00164 #endif