My Project 1.0
Holistic Fusion: A Generic Framework for Multimodal Sensor Fusion
Loading...
Searching...
No Matches
OptimizerIsam2.hpp
Go to the documentation of this file.
1/*
2Copyright 2024 by Julian Nubert, Robotic Systems Lab, ETH Zurich.
3All rights reserved.
4This file is released under the "BSD-3-Clause License".
5Please see the LICENSE file that has been included as part of this package.
6 */
7
8#ifndef OPTIMIZER_ISAM2_HPP
9#define OPTIMIZER_ISAM2_HPP
10
11#include <stdexcept>
12
13// GTSAM
14#include <gtsam/nonlinear/ISAM2.h>
15
16// Workspace
18
19namespace holistic_fusion {
20
22 public:
23 explicit OptimizerIsam2(const std::shared_ptr<GraphConfig> graphConfigPtr) : OptimizerBase(graphConfigPtr) {
24 if (graphConfigPtr_->relinearizeSkip_ < 1) {
25 throw std::invalid_argument("OptimizerIsam2: relinearizeSkip must be positive.");
26 }
27 // Standard ISAM2 Parameters
28 isam2Params_.findUnusedFactorSlots = graphConfigPtr_->findUnusedFactorSlotsFlag_;
29 isam2Params_.enableDetailedResults = graphConfigPtr_->enableDetailedResultsFlag_;
30 isam2Params_.relinearizeSkip = graphConfigPtr_->relinearizeSkip_;
31 isam2Params_.enableRelinearization = graphConfigPtr_->enableRelinearizationFlag_;
32 isam2Params_.evaluateNonlinearError = graphConfigPtr_->evaluateNonlinearErrorFlag_;
33 isam2Params_.cacheLinearizedFactors = graphConfigPtr_->cacheLinearizedFactorsFlag_;
34 isam2Params_.enablePartialRelinearizationCheck = graphConfigPtr_->enablePartialRelinearizationCheckFlag_;
35
36 // Set graph re-linearization thresholds - must be lower-case letters,
37 // check:gtsam::symbol_shorthand
38 gtsam::FastMap<char, gtsam::Vector> relinTh;
40 relinTh['x'] =
41 (gtsam::Vector(6) << graphConfigPtr_->rotationReLinTh_, graphConfigPtr_->rotationReLinTh_, graphConfigPtr_->rotationReLinTh_,
42 graphConfigPtr_->positionReLinTh_, graphConfigPtr_->positionReLinTh_, graphConfigPtr_->positionReLinTh_)
43 .finished();
45 relinTh['v'] =
46 (gtsam::Vector(3) << graphConfigPtr_->velocityReLinTh_, graphConfigPtr_->velocityReLinTh_, graphConfigPtr_->velocityReLinTh_)
47 .finished();
49 relinTh['b'] =
50 (gtsam::Vector(6) << graphConfigPtr_->accBiasReLinTh_, graphConfigPtr_->accBiasReLinTh_, graphConfigPtr_->accBiasReLinTh_,
51 graphConfigPtr_->gyroBiasReLinTh_, graphConfigPtr_->gyroBiasReLinTh_, graphConfigPtr_->gyroBiasReLinTh_)
52 .finished();
54 if (graphConfigPtr_->optimizeReferenceFramePosesWrtWorldFlag_) {
55 relinTh['r'] = (gtsam::Vector(6) << graphConfigPtr_->referenceFrameReLinTh_, graphConfigPtr_->referenceFrameReLinTh_,
56 graphConfigPtr_->referenceFrameReLinTh_, graphConfigPtr_->referenceFrameReLinTh_,
57 graphConfigPtr_->referenceFrameReLinTh_, graphConfigPtr_->referenceFrameReLinTh_)
58 .finished();
59 }
61 if (graphConfigPtr_->optimizeExtrinsicSensorToSensorCorrectedOffsetFlag_) {
63 relinTh['c'] = (gtsam::Vector(6) << graphConfigPtr_->calibrationReLinTh_, graphConfigPtr_->calibrationReLinTh_,
64 graphConfigPtr_->calibrationReLinTh_, graphConfigPtr_->calibrationReLinTh_, graphConfigPtr_->calibrationReLinTh_,
65 graphConfigPtr_->calibrationReLinTh_)
66 .finished();
68 relinTh['d'] = (gtsam::Vector(3) << graphConfigPtr_->displacementReLinTh_, graphConfigPtr_->displacementReLinTh_,
69 graphConfigPtr_->displacementReLinTh_)
70 .finished();
71 }
73 relinTh['l'] =
74 (gtsam::Vector(3) << graphConfigPtr_->landmarkReLinTh_, graphConfigPtr_->landmarkReLinTh_, graphConfigPtr_->landmarkReLinTh_)
75 .finished();
77 isam2Params_.relinearizeThreshold = relinTh;
78
79 // Performance parameters
80 // Set graph relinearization skip
81 isam2Params_.relinearizeSkip = graphConfigPtr_->relinearizeSkip_;
82 // Set relinearization
83 isam2Params_.enableRelinearization = graphConfigPtr_->enableRelinearizationFlag_;
84 // Enable Nonlinear Error
85 isam2Params_.evaluateNonlinearError = graphConfigPtr_->evaluateNonlinearErrorFlag_;
86 // Cache linearized factors
87 isam2Params_.cacheLinearizedFactors = graphConfigPtr_->cacheLinearizedFactorsFlag_;
88 // Enable particular relinearization check
89 isam2Params_.enablePartialRelinearizationCheck = graphConfigPtr_->enablePartialRelinearizationCheckFlag_;
90
91 // Wildfire parameters
92 isam2Params_.optimizationParams = gtsam::ISAM2GaussNewtonParams(graphConfigPtr_->gaussNewtonWildfireThreshold_);
93 }
94 ~OptimizerIsam2() = default;
95
96 // Implementation
97 bool updateExistingValues(const gtsam::Values& newGraphValues) override {
98 // Update Values
99 throw std::logic_error("HolisticFusion: OptimizerIsam2: updateExistingValues: Not implemented.");
100 }
101
102 protected:
103 // Parameters
104 gtsam::ISAM2Params isam2Params_;
105 // Flag
107};
108
109} // namespace holistic_fusion
110
111#endif // OPTIMIZER_ISAM2_HPP
std::shared_ptr< GraphConfig > graphConfigPtr_
OptimizerBase(const std::shared_ptr< GraphConfig > graphConfigPtr)
bool updateExistingValues(const gtsam::Values &newGraphValues) override
OptimizerIsam2(const std::shared_ptr< GraphConfig > graphConfigPtr)