GTSAM  4.0.2
C++ library for smoothing and mapping (SAM)
InitializePose.h
Go to the documentation of this file.
1 /* ----------------------------------------------------------------------------
2 
3  * GTSAM Copyright 2010, Georgia Tech Research Corporation,
4  * Atlanta, Georgia 30332-0415
5  * All Rights Reserved
6  * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
7 
8  * See LICENSE for the license information
9 
10  * -------------------------------------------------------------------------- */
11 
19 #pragma once
20 
21 #include <gtsam/inference/Symbol.h>
24 #include <gtsam/nonlinear/PriorFactor.h>
26 
27 namespace gtsam {
28 namespace initialize {
29 
30 static constexpr Key kAnchorKey = 99999999;
31 
36 template <class Pose>
37 static NonlinearFactorGraph buildPoseGraph(const NonlinearFactorGraph& graph) {
38  NonlinearFactorGraph poseGraph;
39 
40  for (const auto& factor : graph) {
41  // recast to a between on Pose
42  if (auto between =
43  std::dynamic_pointer_cast<BetweenFactor<Pose> >(factor))
44  poseGraph.add(between);
45 
46  // recast PriorFactor<Pose> to BetweenFactor<Pose>
47  if (auto prior = std::dynamic_pointer_cast<PriorFactor<Pose> >(factor))
48  poseGraph.emplace_shared<BetweenFactor<Pose> >(
49  kAnchorKey, prior->keys()[0], prior->prior(), prior->noiseModel());
50  }
51  return poseGraph;
52 }
53 
57 template <class Pose>
58 static Values computePoses(const Values& initialRot,
59  NonlinearFactorGraph* posegraph,
60  bool singleIter = true) {
61  const auto origin = Pose().translation();
62 
63  // Upgrade rotations to full poses
64  Values initialPose;
65  for (const auto& key_rot : initialRot.extract<typename Pose::Rotation>()) {
66  const Key& key = key_rot.first;
67  const auto& rot = key_rot.second;
68  const Pose initializedPose(rot, origin);
69  initialPose.insert(key, initializedPose);
70  }
71 
72  // add prior on dummy node
73  auto priorModel = noiseModel::Unit::Create(Pose::dimension);
74  initialPose.insert(kAnchorKey, Pose());
75  posegraph->emplace_shared<PriorFactor<Pose> >(kAnchorKey, Pose(), priorModel);
76 
77  // Create optimizer
78  GaussNewtonParams params;
79  if (singleIter) {
80  params.maxIterations = 1;
81  } else {
82  params.setVerbosity("TERMINATION");
83  }
84  GaussNewtonOptimizer optimizer(*posegraph, initialPose, params);
85  const Values GNresult = optimizer.optimize();
86 
87  // put into Values structure
88  Values estimate;
89  for (const auto& key_pose : GNresult.extract<Pose>()) {
90  const Key& key = key_pose.first;
91  if (key != kAnchorKey) {
92  const Pose& pose = key_pose.second;
93  estimate.insert(key, pose);
94  }
95  }
96  return estimate;
97 }
98 } // namespace initialize
99 } // namespace gtsam
Factor Graph consisting of non-linear factors.
IsDerived< DERIVEDFACTOR > add(std::shared_ptr< DERIVEDFACTOR > factor)
add is a synonym for push_back.
Definition: FactorGraph.h:214
static shared_ptr Create(size_t dim)
Definition: NoiseModel.h:610
Definition: chartTesting.h:28
GTSAM_EXPORT Values initialize(const NonlinearFactorGraph &graph, bool useOdometricPath=true)
std::uint64_t Key
Integer nonlinear key type.
Definition: types.h:102