RTAB-Map 0.23.10
Real-Time Appearance-Based Mapping
Loading...
Searching...
No Matches
Optimizer.h
1/*
2Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
3All rights reserved.
4
5Redistribution and use in source and binary forms, with or without
6modification, are permitted provided that the following conditions are met:
7 * Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
9 * Redistributions in binary form must reproduce the above copyright
10 notice, this list of conditions and the following disclaimer in the
11 documentation and/or other materials provided with the distribution.
12 * Neither the name of the Universite de Sherbrooke nor the
13 names of its contributors may be used to endorse or promote products
14 derived from this software without specific prior written permission.
15
16THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
20DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*/
27
28#ifndef OPTIMIZER_H_
29#define OPTIMIZER_H_
30
31#include "rtabmap/core/rtabmap_core_export.h" // DLL export/import defines
32
33#include <map>
34#include <list>
35#include <rtabmap/core/Link.h>
36#include <rtabmap/core/Parameters.h>
37#include <rtabmap/core/Signature.h>
38
39namespace rtabmap {
40
51{
52public:
53 FeatureBA(const cv::KeyPoint & kptIn, const float & depthIn = 0.0f, const cv::Mat & descriptorIn = cv::Mat(), int cameraIndexIn = 0):
54 kpt(kptIn),
55 depth(depthIn),
56 descriptor(descriptorIn),
57 cameraIndex(cameraIndexIn)
58 {
59 //UDEBUG("kpt=(%f,%f) depth=%f, camIndex=%d", kpt.pt.x, kpt.pt.y, depth, cameraIndex);
60 }
61 cv::KeyPoint kpt;
62 float depth;
63 cv::Mat descriptor;
65};
66
87class RTABMAP_CORE_EXPORT Optimizer
88{
89public:
91 enum Type {
92 kTypeUndef = -1,
93 kTypeTORO = 0,
94 kTypeG2O = 1,
95 kTypeGTSAM = 2,
96 kTypeCeres = 3,
97 kTypeCVSBA = 4
98 };
99
106 static bool isAvailable(Optimizer::Type type);
107
114 static Optimizer * create(const ParametersMap & parameters);
115
117 static Optimizer * create(Optimizer::Type type, const ParametersMap & parameters = ParametersMap());
118
128 int fromId,
129 const std::map<int, Transform> & posesIn,
130 const std::multimap<int, Link> & linksIn,
131 std::map<int, Transform> & posesOut,
132 std::multimap<int, Link> & linksOut) const;
133
134public:
135 virtual ~Optimizer() {}
136
138 virtual Type type() const = 0;
139
142 int iterations() const {return iterations_;}
143 bool isSlam2d() const {return slam2d_;}
144 bool isCovarianceIgnored() const {return covarianceIgnored_;}
145 double epsilon() const {return epsilon_;}
146 bool isRobust() const {return robust_;}
147 bool priorsIgnored() const {return priorsIgnored_;}
148 bool landmarksIgnored() const {return landmarksIgnored_;}
149 float gravitySigma() const {return gravitySigma_;}
151
154 void setIterations(int iterations) {iterations_ = iterations;}
155 void setSlam2d(bool enabled) {slam2d_ = enabled;}
156 void setCovarianceIgnored(bool enabled) {covarianceIgnored_ = enabled;}
157 void setEpsilon(double epsilon) {epsilon_ = epsilon;}
158 void setRobust(bool enabled) {robust_ = enabled;}
159 void setPriorsIgnored(bool enabled) {priorsIgnored_ = enabled;}
160 void setLandmarksIgnored(bool enabled) {landmarksIgnored_ = enabled;}
161 void setGravitySigma(float value) {gravitySigma_ = value;}
163
170 virtual void parseParameters(const ParametersMap & parameters);
171
189 std::map<int, Transform> optimizeIncremental(
190 int rootId,
191 const std::map<int, Transform> & poses,
192 const std::multimap<int, Link> & constraints,
193 std::list<std::map<int, Transform> > * intermediateGraphes = 0,
194 double * finalError = 0,
195 int * iterationsDone = 0);
196
203 std::map<int, Transform> optimize(
204 int rootId,
205 const std::map<int, Transform> & poses,
206 const std::multimap<int, Link> & constraints,
207 std::list<std::map<int, Transform> > * intermediateGraphes = 0,
208 double * finalError = 0,
209 int * iterationsDone = 0);
210
227 virtual std::map<int, Transform> optimize(
228 int rootId,
229 const std::map<int, Transform> & poses,
230 const std::multimap<int, Link> & constraints,
231 cv::Mat & outputCovariance,
232 std::list<std::map<int, Transform> > * intermediateGraphes = 0,
233 double * finalError = 0,
234 int * iterationsDone = 0);
235
253 virtual std::map<int, Transform> optimizeBA(
254 int rootId,
255 const std::map<int, Transform> & poses,
256 const std::multimap<int, Link> & links,
257 const std::map<int, std::vector<CameraModel> > & models,
258 std::map<int, cv::Point3f> & points3DMap,
259 const std::map<int, std::map<int, FeatureBA> > & wordReferences,
260 std::set<int> * outliers = 0);
261
274 std::map<int, Transform> optimizeBA(
275 int rootId,
276 const std::map<int, Transform> & poses,
277 const std::multimap<int, Link> & links,
278 const std::map<int, Signature> & signatures,
279 std::map<int, cv::Point3f> & points3DMap,
280 std::map<int, std::map<int, FeatureBA> > & wordReferences,
281 bool rematchFeatures = false,
282 const ParametersMap & registrationParameters = ParametersMap());
283
286 std::map<int, Transform> optimizeBA(
287 int rootId,
288 const std::map<int, Transform> & poses,
289 const std::multimap<int, Link> & links,
290 const std::map<int, Signature> & signatures,
291 bool rematchFeatures = false,
292 const ParametersMap & registrationParameters = ParametersMap());
293
302 const Link & link,
303 const CameraModel & model,
304 std::map<int, cv::Point3f> & points3DMap,
305 const std::map<int, std::map<int, FeatureBA> > & wordReferences,
306 std::set<int> * outliers = 0);
307
324 const std::map<int, Transform> & poses,
325 const std::multimap<int, Link> & links,
326 const std::map<int, Signature> & signatures,
327 std::map<int, cv::Point3f> & points3DMap,
328 std::map<int, std::map<int, FeatureBA > > & wordReferences,
329 bool rematchFeatures = false,
330 bool useLinkTransformAsGuess = false,
331 ParametersMap registrationParameters = ParametersMap());
332
333protected:
334 Optimizer(
335 int iterations = Parameters::defaultOptimizerIterations(),
336 bool slam2d = Parameters::defaultRegForce3DoF(),
337 bool covarianceIgnored = Parameters::defaultOptimizerVarianceIgnored(),
338 double epsilon = Parameters::defaultOptimizerEpsilon(),
339 bool robust = Parameters::defaultOptimizerRobust(),
340 bool priorsIgnored = Parameters::defaultOptimizerPriorsIgnored(),
341 bool landmarksIgnored = Parameters::defaultOptimizerLandmarksIgnored(),
342 float gravitySigma = Parameters::defaultOptimizerGravitySigma());
343 Optimizer(const ParametersMap & parameters);
344
345private:
346 int iterations_;
347 bool slam2d_;
348 bool covarianceIgnored_;
349 double epsilon_;
350 bool robust_;
351 bool priorsIgnored_;
352 bool landmarksIgnored_;
353 float gravitySigma_;
354};
355
356} /* namespace rtabmap */
357#endif /* OPTIMIZER_H_ */
Represents a pinhole camera model containing intrinsic and extrinsic parameters, used for projection,...
Definition CameraModel.h:53
A single bundle adjustment feature observation: one keypoint seen in one frame.
Definition Optimizer.h:51
cv::KeyPoint kpt
2D image keypoint.
Definition Optimizer.h:61
cv::Mat descriptor
Optional descriptor for the keypoint (used when re-matching is enabled).
Definition Optimizer.h:63
int cameraIndex
Index into the frame's camera model list for multi-camera rigs.
Definition Optimizer.h:64
float depth
Depth at kpt in meters, or 0 if unknown (monocular).
Definition Optimizer.h:62
Abstract base for pose-graph and bundle-adjustment optimizers.
Definition Optimizer.h:88
virtual std::map< int, Transform > optimizeBA(int rootId, const std::map< int, Transform > &poses, const std::multimap< int, Link > &links, const std::map< int, std::vector< CameraModel > > &models, std::map< int, cv::Point3f > &points3DMap, const std::map< int, std::map< int, FeatureBA > > &wordReferences, std::set< int > *outliers=0)
Bundle adjustment: jointly refine poses and 3D points (back-end-level entry point).
virtual void parseParameters(const ParametersMap &parameters)
Reads shared knobs from parameters and applies them to this instance.
int iterations() const
Max solver iterations.
Definition Optimizer.h:142
Type
Graph-optimizer back-end identifier.
Definition Optimizer.h:91
std::map< int, Transform > optimizeIncremental(int rootId, const std::map< int, Transform > &poses, const std::multimap< int, Link > &constraints, std::list< std::map< int, Transform > > *intermediateGraphes=0, double *finalError=0, int *iterationsDone=0)
Pose-graph optimization that grows the graph one node at a time.
bool isRobust() const
If true, use a robust kernel / switchable factors against bad loop closures.
Definition Optimizer.h:146
std::map< int, Transform > optimizeBA(int rootId, const std::map< int, Transform > &poses, const std::multimap< int, Link > &links, const std::map< int, Signature > &signatures, std::map< int, cv::Point3f > &points3DMap, std::map< int, std::map< int, FeatureBA > > &wordReferences, bool rematchFeatures=false, const ParametersMap &registrationParameters=ParametersMap())
BA wrapper that derives camera models and correspondences from signatures.
bool landmarksIgnored() const
If true, landmark/marker observations are dropped.
Definition Optimizer.h:148
double epsilon() const
Convergence threshold on cost decrease.
Definition Optimizer.h:145
void getConnectedGraph(int fromId, const std::map< int, Transform > &posesIn, const std::multimap< int, Link > &linksIn, std::map< int, Transform > &posesOut, std::multimap< int, Link > &linksOut) const
Extracts the connected component reachable from fromId.
bool isSlam2d() const
True if optimizing in SE(2) instead of SE(3).
Definition Optimizer.h:143
static Optimizer * create(const ParametersMap &parameters)
Factory: build an optimizer from a ParametersMap.
std::map< int, Transform > optimize(int rootId, const std::map< int, Transform > &poses, const std::multimap< int, Link > &constraints, std::list< std::map< int, Transform > > *intermediateGraphes=0, double *finalError=0, int *iterationsDone=0)
Pose-graph optimization (single shot).
bool isCovarianceIgnored() const
If true, all edges share an identity information matrix.
Definition Optimizer.h:144
void computeBACorrespondences(const std::map< int, Transform > &poses, const std::multimap< int, Link > &links, const std::map< int, Signature > &signatures, std::map< int, cv::Point3f > &points3DMap, std::map< int, std::map< int, FeatureBA > > &wordReferences, bool rematchFeatures=false, bool useLinkTransformAsGuess=false, ParametersMap registrationParameters=ParametersMap())
Build BA correspondences (3D points + per-frame observations) from signatures.
virtual Type type() const =0
Returns the concrete back-end identifier (one of Type).
std::map< int, Transform > optimizeBA(int rootId, const std::map< int, Transform > &poses, const std::multimap< int, Link > &links, const std::map< int, Signature > &signatures, bool rematchFeatures=false, const ParametersMap &registrationParameters=ParametersMap())
BA convenience wrapper: like the overload above but ignores the refined 3D points and observation map...
float gravitySigma() const
Std-dev (rad) of the gravity prior on roll/pitch; 0 disables it.
Definition Optimizer.h:149
Transform optimizeBA(const Link &link, const CameraModel &model, std::map< int, cv::Point3f > &points3DMap, const std::map< int, std::map< int, FeatureBA > > &wordReferences, std::set< int > *outliers=0)
Refine a single two-frame link via BA.
bool priorsIgnored() const
If true, unary priors on poses are dropped.
Definition Optimizer.h:147
static Optimizer * create(Optimizer::Type type, const ParametersMap &parameters=ParametersMap())
Factory: build an optimizer of a specific type. Caller owns the result.
virtual std::map< int, Transform > optimize(int rootId, const std::map< int, Transform > &poses, const std::multimap< int, Link > &constraints, cv::Mat &outputCovariance, std::list< std::map< int, Transform > > *intermediateGraphes=0, double *finalError=0, int *iterationsDone=0)
Pose-graph optimization with marginal covariance of rootId.
static bool isAvailable(Optimizer::Type type)
Returns whether type was compiled in (its third-party dependency was found).
Represents a 3D rigid body transformation (rotation + translation).
Definition Transform.h:53
std::map< std::string, std::string > ParametersMap
Parameter keys mapped to their values, as used by every configurable class (see Parameters).
Definition Parameters.h:44