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 <set>
36#include <rtabmap/core/Link.h>
37#include <rtabmap/core/Parameters.h>
38#include <rtabmap/core/Signature.h>
39
40namespace rtabmap {
41
52{
53public:
54 FeatureBA(const cv::KeyPoint & kptIn, const float & depthIn = 0.0f, const cv::Mat & descriptorIn = cv::Mat(), int cameraIndexIn = 0):
55 kpt(kptIn),
56 depth(depthIn),
57 descriptor(descriptorIn),
58 cameraIndex(cameraIndexIn)
59 {
60 //UDEBUG("kpt=(%f,%f) depth=%f, camIndex=%d", kpt.pt.x, kpt.pt.y, depth, cameraIndex);
61 }
62 cv::KeyPoint kpt;
63 float depth;
64 cv::Mat descriptor;
66};
67
68typedef std::map<int, std::set<int> > BAOutliers; // <word ID, rejected pose IDs>, matching wordReferences
69
90class RTABMAP_CORE_EXPORT Optimizer
91{
92public:
94 enum Type {
95 kTypeUndef = -1,
96 kTypeTORO = 0,
97 kTypeG2O = 1,
98 kTypeGTSAM = 2,
99 kTypeCeres = 3,
100 kTypeCVSBA = 4
101 };
102
109 static bool isAvailable(Optimizer::Type type);
110
117 static Optimizer * create(const ParametersMap & parameters);
118
120 static Optimizer * create(Optimizer::Type type, const ParametersMap & parameters = ParametersMap());
121
131 int fromId,
132 const std::map<int, Transform> & posesIn,
133 const std::multimap<int, Link> & linksIn,
134 std::map<int, Transform> & posesOut,
135 std::multimap<int, Link> & linksOut) const;
136
137public:
138 virtual ~Optimizer() {}
139
141 virtual Type type() const = 0;
142
145 int iterations() const {return iterations_;}
146 bool isSlam2d() const {return slam2d_;}
147 bool isCovarianceIgnored() const {return covarianceIgnored_;}
148 double epsilon() const {return epsilon_;}
149 bool isRobust() const {return robust_;}
150 bool priorsIgnored() const {return priorsIgnored_;}
151 bool landmarksIgnored() const {return landmarksIgnored_;}
152 float gravitySigma() const {return gravitySigma_;}
154
157 void setIterations(int iterations) {iterations_ = iterations;}
158 void setSlam2d(bool enabled) {slam2d_ = enabled;}
159 void setCovarianceIgnored(bool enabled) {covarianceIgnored_ = enabled;}
160 void setEpsilon(double epsilon) {epsilon_ = epsilon;}
161 void setRobust(bool enabled) {robust_ = enabled;}
162 void setPriorsIgnored(bool enabled) {priorsIgnored_ = enabled;}
163 void setLandmarksIgnored(bool enabled) {landmarksIgnored_ = enabled;}
164 void setGravitySigma(float value) {gravitySigma_ = value;}
166
173 virtual void parseParameters(const ParametersMap & parameters);
174
192 std::map<int, Transform> optimizeIncremental(
193 int rootId,
194 const std::map<int, Transform> & poses,
195 const std::multimap<int, Link> & constraints,
196 std::list<std::map<int, Transform> > * intermediateGraphes = 0,
197 double * finalError = 0,
198 int * iterationsDone = 0);
199
206 std::map<int, Transform> optimize(
207 int rootId,
208 const std::map<int, Transform> & poses,
209 const std::multimap<int, Link> & constraints,
210 std::list<std::map<int, Transform> > * intermediateGraphes = 0,
211 double * finalError = 0,
212 int * iterationsDone = 0);
213
230 virtual std::map<int, Transform> optimize(
231 int rootId,
232 const std::map<int, Transform> & poses,
233 const std::multimap<int, Link> & constraints,
234 cv::Mat & outputCovariance,
235 std::list<std::map<int, Transform> > * intermediateGraphes = 0,
236 double * finalError = 0,
237 int * iterationsDone = 0);
238
256 virtual std::map<int, Transform> optimizeBA(
257 int rootId,
258 const std::map<int, Transform> & poses,
259 const std::multimap<int, Link> & links,
260 const std::map<int, std::vector<CameraModel> > & models,
261 std::map<int, cv::Point3f> & points3DMap,
262 const std::map<int, std::map<int, FeatureBA> > & wordReferences,
263 BAOutliers * outliers = 0);
264
277 std::map<int, Transform> optimizeBA(
278 int rootId,
279 const std::map<int, Transform> & poses,
280 const std::multimap<int, Link> & links,
281 const std::map<int, Signature> & signatures,
282 std::map<int, cv::Point3f> & points3DMap,
283 std::map<int, std::map<int, FeatureBA> > & wordReferences,
284 bool rematchFeatures = false,
285 const ParametersMap & registrationParameters = ParametersMap());
286
289 std::map<int, Transform> optimizeBA(
290 int rootId,
291 const std::map<int, Transform> & poses,
292 const std::multimap<int, Link> & links,
293 const std::map<int, Signature> & signatures,
294 bool rematchFeatures = false,
295 const ParametersMap & registrationParameters = ParametersMap());
296
305 const Link & link,
306 const CameraModel & model,
307 std::map<int, cv::Point3f> & points3DMap,
308 const std::map<int, std::map<int, FeatureBA> > & wordReferences,
309 BAOutliers * outliers = 0);
310
327 const std::map<int, Transform> & poses,
328 const std::multimap<int, Link> & links,
329 const std::map<int, Signature> & signatures,
330 std::map<int, cv::Point3f> & points3DMap,
331 std::map<int, std::map<int, FeatureBA > > & wordReferences,
332 bool rematchFeatures = false,
333 bool useLinkTransformAsGuess = false,
334 ParametersMap registrationParameters = ParametersMap());
335
336protected:
337 Optimizer(
338 int iterations = Parameters::defaultOptimizerIterations(),
339 bool slam2d = Parameters::defaultRegForce3DoF(),
340 bool covarianceIgnored = Parameters::defaultOptimizerVarianceIgnored(),
341 double epsilon = Parameters::defaultOptimizerEpsilon(),
342 bool robust = Parameters::defaultOptimizerRobust(),
343 bool priorsIgnored = Parameters::defaultOptimizerPriorsIgnored(),
344 bool landmarksIgnored = Parameters::defaultOptimizerLandmarksIgnored(),
345 float gravitySigma = Parameters::defaultOptimizerGravitySigma());
346 Optimizer(const ParametersMap & parameters);
347
348private:
349 int iterations_;
350 bool slam2d_;
351 bool covarianceIgnored_;
352 double epsilon_;
353 bool robust_;
354 bool priorsIgnored_;
355 bool landmarksIgnored_;
356 float gravitySigma_;
357};
358
359} /* namespace rtabmap */
360#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:52
cv::KeyPoint kpt
2D image keypoint.
Definition Optimizer.h:62
cv::Mat descriptor
Optional descriptor for the keypoint (used when re-matching is enabled).
Definition Optimizer.h:64
int cameraIndex
Index into the frame's camera model list for multi-camera rigs.
Definition Optimizer.h:65
float depth
Depth at kpt in meters, or 0 if unknown (monocular).
Definition Optimizer.h:63
Abstract base for pose-graph and bundle-adjustment optimizers.
Definition Optimizer.h:91
virtual void parseParameters(const ParametersMap &parameters)
Reads shared knobs from parameters and applies them to this instance.
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, BAOutliers *outliers=0)
Bundle adjustment: jointly refine poses and 3D points (back-end-level entry point).
int iterations() const
Max solver iterations.
Definition Optimizer.h:145
Type
Graph-optimizer back-end identifier.
Definition Optimizer.h:94
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:149
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:151
double epsilon() const
Convergence threshold on cost decrease.
Definition Optimizer.h:148
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:146
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:147
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:152
Transform optimizeBA(const Link &link, const CameraModel &model, std::map< int, cv::Point3f > &points3DMap, const std::map< int, std::map< int, FeatureBA > > &wordReferences, BAOutliers *outliers=0)
Refine a single two-frame link via BA.
bool priorsIgnored() const
If true, unary priors on poses are dropped.
Definition Optimizer.h:150
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