ExtendedKalmanFilter-inl.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 
25 
26 #include <cassert>
27 
28 namespace gtsam {
29 
30  /* ************************************************************************* */
31  template<class VALUE>
33  const GaussianFactorGraph& linearFactorGraph,
34  const Values& linearizationPoint, Key lastKey,
36  {
37  // Compute the marginal on the last key
38  // Solve the linear factor graph, converting it into a linear Bayes Network
39  // P(x0,x1) = P(x0|x1)*P(x1)
40  const Ordering lastKeyAsOrdering{lastKey};
41  const GaussianConditional::shared_ptr marginal =
42  linearFactorGraph.marginalMultifrontalBayesNet(lastKeyAsOrdering)->front();
43 
44  // Extract the current estimate of x1,P1
45  VectorValues result = marginal->solve(VectorValues());
46  const T& current = linearizationPoint.at<T>(lastKey);
47  T x = traits<T>::Retract(current, result[lastKey]);
48 
49  // Create a Jacobian Factor from the root node of the produced Bayes Net.
50  // This will act as a prior for the next iteration.
51  // The linearization point of this prior must be moved to the new estimate of x,
52  // and the key/index needs to be reset to 0, the first key in the next iteration.
53  assert(marginal->nrFrontals() == 1);
54  assert(marginal->nrParents() == 0);
55  *newPrior = std::make_shared<JacobianFactor>(
56  marginal->keys().front(),
57  marginal->getA(marginal->begin()),
58  marginal->getb() - marginal->getA(marginal->begin()) * result[lastKey],
59  marginal->get_model());
60 
61  return x;
62  }
63 
64  /* ************************************************************************* */
65  template <class VALUE>
67  Key key_initial, T x_initial, noiseModel::Gaussian::shared_ptr P_initial)
68  : x_(x_initial) // Set the initial linearization point
69  {
70  // Create a Jacobian Prior Factor directly P_initial.
71  // Since x0 is set to the provided mean, the b vector in the prior will be zero
72  // TODO(Frank): is there a reason why noiseModel is not simply P_initial?
73  int n = traits<T>::GetDimension(x_initial);
75  new JacobianFactor(key_initial, P_initial->R(), Vector::Zero(n),
77  }
78 
79  /* ************************************************************************* */
80  template<class VALUE>
82  const NoiseModelFactor& motionFactor) {
83  const auto keys = motionFactor.keys();
84 
85  // Create a Gaussian Factor Graph
86  GaussianFactorGraph linearFactorGraph;
87 
88  // Add in previous posterior as prior on the first state
89  linearFactorGraph.push_back(priorFactor_);
90 
91  // Linearize motion model and add it to the Kalman Filter graph
92  Values linearizationPoint;
93  linearizationPoint.insert(keys[0], x_);
94  linearizationPoint.insert(keys[1], x_); // TODO should this really be x_ ?
95  linearFactorGraph.push_back(motionFactor.linearize(linearizationPoint));
96 
97  // Solve the factor graph and update the current state estimate
98  // and the posterior for the next iteration.
99  x_ = solve_(linearFactorGraph, linearizationPoint, keys[1], &priorFactor_);
100 
101  return x_;
102  }
103 
104  /* ************************************************************************* */
105  template<class VALUE>
107  const NoiseModelFactor& measurementFactor) {
108  const auto keys = measurementFactor.keys();
109 
110  // Create a Gaussian Factor Graph
111  GaussianFactorGraph linearFactorGraph;
112 
113  // Add in the prior on the first state
114  linearFactorGraph.push_back(priorFactor_);
115 
116  // Linearize measurement factor and add it to the Kalman Filter graph
117  Values linearizationPoint;
118  linearizationPoint.insert(keys[0], x_);
119  linearFactorGraph.push_back(measurementFactor.linearize(linearizationPoint));
120 
121  // Solve the factor graph and update the current state estimate
122  // and the prior factor for the next iteration
123  x_ = solve_(linearFactorGraph, linearizationPoint, keys[0], &priorFactor_);
124 
125  return x_;
126  }
127 
128 } // namespace gtsam
GaussianFactorGraph.h
Linear Factor Graph where all factors are Gaussians.
gtsam::ExtendedKalmanFilter::ExtendedKalmanFilter
ExtendedKalmanFilter(Key key_initial, T x_initial, noiseModel::Gaussian::shared_ptr P_initial)
Definition: ExtendedKalmanFilter-inl.h:66
keys
const KeyVector keys
Definition: testRegularImplicitSchurFactor.cpp:40
x
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 x
Definition: gnuplot_common_settings.hh:12
gtsam::JacobianFactor
Definition: JacobianFactor.h:91
gtsam::EliminateableFactorGraph::marginalMultifrontalBayesNet
std::shared_ptr< BayesNetType > marginalMultifrontalBayesNet(const Ordering &variables, const Eliminate &function=EliminationTraitsType::DefaultEliminate, OptionalVariableIndex variableIndex={}) const
Definition: EliminateableFactorGraph-inst.h:230
GaussianBayesNet.h
Chordal Bayes Net, the result of eliminating a factor graph.
gtsam::noiseModel::Gaussian::shared_ptr
std::shared_ptr< Gaussian > shared_ptr
Definition: NoiseModel.h:191
result
Values result
Definition: OdometryOptimize.cpp:8
n
int n
Definition: BiCGSTAB_simple.cpp:1
gtsam::NoiseModelFactor::linearize
std::shared_ptr< GaussianFactor > linearize(const Values &x) const override
Definition: NonlinearFactor.cpp:152
gtsam::GaussianFactorGraph
Definition: GaussianFactorGraph.h:73
gtsam::Values::at
const ValueType at(Key j) const
Definition: Values-inl.h:261
gtsam::VectorValues
Definition: VectorValues.h:74
gtsam::ExtendedKalmanFilter::update
T update(const NoiseModelFactor &measurementFactor)
Definition: ExtendedKalmanFilter-inl.h:106
gtsam::ExtendedKalmanFilter::priorFactor_
JacobianFactor::shared_ptr priorFactor_
Definition: ExtendedKalmanFilter.h:56
gtsam::noiseModel::Unit::Create
static shared_ptr Create(size_t dim)
Definition: NoiseModel.h:631
gtsam::ExtendedKalmanFilter::solve_
static T solve_(const GaussianFactorGraph &linearFactorGraph, const Values &linearizationPoints, Key x, JacobianFactor::shared_ptr *newPrior)
Definition: ExtendedKalmanFilter-inl.h:32
gtsam::ExtendedKalmanFilter::predict
T predict(const NoiseModelFactor &motionFactor)
Definition: ExtendedKalmanFilter-inl.h:81
ExtendedKalmanFilter.h
Class to perform generic Kalman Filtering using nonlinear factor graphs.
NonlinearFactor.h
Non-linear factor base classes.
gtsam
traits
Definition: SFMdata.h:40
gtsam::traits
Definition: Group.h:36
gtsam::NoiseModelFactor
Definition: NonlinearFactor.h:198
gtsam::FactorGraph::push_back
IsDerived< DERIVEDFACTOR > push_back(std::shared_ptr< DERIVEDFACTOR > factor)
Add a factor directly using a shared_ptr.
Definition: FactorGraph.h:147
gtsam::Values
Definition: Values.h:65
gtsam::Factor::keys
const KeyVector & keys() const
Access the factor's involved variable keys.
Definition: Factor.h:143
gtsam::Values::insert
void insert(Key j, const Value &val)
Definition: Values.cpp:156
gtsam::GaussianConditional::shared_ptr
std::shared_ptr< This > shared_ptr
shared_ptr to this class
Definition: GaussianConditional.h:46
gtsam::JacobianFactor::shared_ptr
std::shared_ptr< This > shared_ptr
shared_ptr to this class
Definition: JacobianFactor.h:97
gtsam::Key
std::uint64_t Key
Integer nonlinear key type.
Definition: types.h:97
gtsam::Ordering
Definition: inference/Ordering.h:33
gtsam::ExtendedKalmanFilter::T
VALUE T
Definition: ExtendedKalmanFilter.h:52


gtsam
Author(s):
autogenerated on Sun Dec 22 2024 04:11:32