30 typename ExtendedKalmanFilter<VALUE>::T ExtendedKalmanFilter<VALUE>::solve_(
31 const GaussianFactorGraph& linearFactorGraph,
32 const Values& linearizationPoints,
Key lastKey,
38 Ordering lastKeyAsOrdering;
39 lastKeyAsOrdering += lastKey;
41 linearFactorGraph.marginalMultifrontalBayesNet(lastKeyAsOrdering)->front();
44 VectorValues result = marginal->solve(VectorValues());
45 T x = linearizationPoints.at<T>(lastKey).retract(result[lastKey]);
51 assert(marginal->nrFrontals() == 1);
52 assert(marginal->nrParents() == 0);
53 newPrior = boost::make_shared<JacobianFactor>(
54 marginal->keys().front(),
55 marginal->getA(marginal->begin()),
56 marginal->getb() - marginal->getA(marginal->begin()) * result[lastKey],
57 marginal->get_model());
64 ExtendedKalmanFilter<VALUE>::ExtendedKalmanFilter(
Key key_initial, T x_initial,
65 noiseModel::Gaussian::shared_ptr P_initial) {
74 new JacobianFactor(key_initial, P_initial->R(), Vector::Zero(x_initial.dim()),
89 Key x1 = motionFactor.key2();
92 Values linearizationPoints;
93 linearizationPoints.
insert(x0, x_);
94 linearizationPoints.
insert(x1, x_);
100 linearFactorGraph.
push_back(priorFactor_);
104 motionFactor.
linearize(linearizationPoints));
108 x_ = solve_(linearFactorGraph, linearizationPoints, x1, priorFactor_);
114 template<
class VALUE>
123 Key x0 = measurementFactor.key();
126 Values linearizationPoints;
127 linearizationPoints.
insert(x0, x_);
133 linearFactorGraph.
push_back(priorFactor_);
137 measurementFactor.
linearize(linearizationPoints));
141 x_ = solve_(linearFactorGraph, linearizationPoints, x0, priorFactor_);
Non-linear factor base classes.
T predict(const MotionFactor &motionFactor)
TODO: comment.
Definition: ExtendedKalmanFilter-inl.h:80
static shared_ptr Create(size_t dim)
Create a unit covariance noise model.
Definition: NoiseModel.h:585
T update(const MeasurementFactor &measurementFactor)
TODO: comment.
Definition: ExtendedKalmanFilter-inl.h:115
void insert(Key j, const Value &val)
Add a variable with the given j, throws KeyAlreadyExists<J> if j is already present.
Definition: Values.cpp:127
Chordal Bayes Net, the result of eliminating a factor graph.
boost::shared_ptr< GaussianFactor > linearize(const Values &x) const
Linearize a non-linearFactorN to get a GaussianFactor, Hence .
Definition: NonlinearFactor.h:297
boost::enable_if< boost::is_base_of< FactorType, DERIVEDFACTOR > >::type push_back(boost::shared_ptr< DERIVEDFACTOR > factor)
Add a factor directly using a shared_ptr.
Definition: FactorGraph.h:155
A non-templated config holding any types of Manifold-group elements.
Definition: Values.h:75
boost::shared_ptr< This > shared_ptr
shared_ptr to this class
Definition: GaussianConditional.h:42
Key key1() const
methods to retrieve both keys
Definition: NonlinearFactor.h:455
size_t Key
Integer nonlinear key type.
Definition: types.h:59
A convenient base class for creating your own NoiseModelFactor with 1 variable.
Definition: NonlinearFactor.h:354
A Linear Factor Graph is a factor graph where all factors are Gaussian, i.e.
Definition: GaussianFactorGraph.h:65
Class to perform generic Kalman Filtering using nonlinear factor graphs.
boost::shared_ptr< This > shared_ptr
shared_ptr to this class
Definition: JacobianFactor.h:87
Linear Factor Graph where all factors are Gaussians.