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>
26 
27 namespace gtsam {
28 namespace initialize {
29 
30 static constexpr Key kAnchorKey = 99999999;
31 
36 template <class Pose>
38  NonlinearFactorGraph poseGraph;
39 
40  for (const auto& factor : graph) {
41  // recast to a between on Pose
42  if (auto between =
43  boost::dynamic_pointer_cast<BetweenFactor<Pose> >(factor))
44  poseGraph.add(between);
45 
46  // recast PriorFactor<Pose> to BetweenFactor<Pose>
47  if (auto prior = boost::dynamic_pointer_cast<PriorFactor<Pose> >(factor))
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_value : initialRot) {
66  Key key = key_value.key;
67  const auto& rot = initialRot.at<typename Pose::Rotation>(key);
68  Pose initializedPose = Pose(rot, origin);
69  initialPose.insert(key, initializedPose);
70  }
71 
72  // add prior on dummy node
74  initialPose.insert(kAnchorKey, Pose());
76 
77  // Create optimizer
79  if (singleIter) {
80  params.maxIterations = 1;
81  } else {
82  params.setVerbosity("TERMINATION");
83  }
84  GaussNewtonOptimizer optimizer(*posegraph, initialPose, params);
85  Values GNresult = optimizer.optimize();
86 
87  // put into Values structure
88  Values estimate;
89  for (const auto key_value : GNresult) {
90  Key key = key_value.key;
91  if (key != kAnchorKey) {
92  const Pose& pose = GNresult.at<Pose>(key);
93  estimate.insert(key, pose);
94  }
95  }
96  return estimate;
97 }
98 } // namespace initialize
99 } // namespace gtsam
int EIGEN_BLAS_FUNC() rot(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *pc, RealScalar *ps)
virtual const Values & optimize()
Factor Graph consisting of non-linear factors.
Pose2 Pose
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy y set format x g set format y g set format x2 g set format y2 g set format z g set angles radians set nogrid set key title set key left top Right noreverse box linetype linewidth samplen spacing width set nolabel set noarrow set nologscale set logscale x set set pointsize set encoding default set nopolar set noparametric set set set set surface set nocontour set clabel set mapping cartesian set nohidden3d set cntrparam order set cntrparam linear set cntrparam levels auto set cntrparam points set size set origin
Point2 prior(const Point2 &x)
Prior on a single pose.
Definition: simulated2D.h:87
void insert(Key j, const Value &val)
Definition: Values.cpp:140
IsDerived< DERIVEDFACTOR > add(boost::shared_ptr< DERIVEDFACTOR > factor)
add is a synonym for push_back.
Definition: FactorGraph.h:190
NonlinearFactorGraph graph
static Values computePoses(const Values &initialRot, NonlinearFactorGraph *posegraph, bool singleIter=true)
static shared_ptr Create(size_t dim)
Definition: NoiseModel.h:608
IsDerived< DERIVEDFACTOR > emplace_shared(Args &&...args)
Emplace a shared pointer to factor of given type.
Definition: FactorGraph.h:172
static const Pose3 pose(Rot3(Vector3(1,-1,-1).asDiagonal()), Point3(0, 0, 0.5))
static SmartStereoProjectionParams params
traits
Definition: chartTesting.h:28
static constexpr Key kAnchorKey
static NonlinearFactorGraph buildPoseGraph(const NonlinearFactorGraph &graph)
Values initialize(const NonlinearFactorGraph &graph, bool useOdometricPath)
Definition: lago.cpp:338
Expression< T > between(const Expression< T > &t1, const Expression< T > &t2)
std::uint64_t Key
Integer nonlinear key type.
Definition: types.h:61


gtsam
Author(s):
autogenerated on Sat May 8 2021 02:42:14