26 #include <gtsam/inference/Symbol.h> 29 #include <gtsam/nonlinear/PriorFactor.h> 38 using symbol_shorthand::C;
39 using symbol_shorthand::M;
40 using symbol_shorthand::X;
52 size_t n, std::function<
Key(
int)> keyFunc = X,
53 std::function<
Key(
int)> dKeyFunc = M) {
59 for (
size_t t = 1; t < n; t++) {
61 {keyFunc(t), keyFunc(t + 1)}, {{dKeyFunc(t), 2}},
62 {std::make_shared<JacobianFactor>(keyFunc(t), I_3x3, keyFunc(t + 1),
64 std::make_shared<JacobianFactor>(keyFunc(t), I_3x3, keyFunc(t + 1),
65 I_3x3, Vector3::Ones())}));
73 return std::make_shared<HybridGaussianFactorGraph>(std::move(hfg));
86 std::vector<Key> &input) {
89 std::vector<int> levels(input.size());
90 std::function<void(std::vector<Key>::iterator, std::vector<Key>::iterator,
92 bsg = [&bsg, &new_order, &levels, &input](
93 std::vector<Key>::iterator begin,
94 std::vector<Key>::iterator end,
int lvl) {
95 if (std::distance(begin, end) > 1) {
96 std::vector<Key>::iterator pivot =
97 begin + std::distance(begin, end) / 2;
99 new_order.push_back(*pivot);
100 levels[std::distance(input.begin(), pivot)] = lvl;
101 bsg(begin, pivot, lvl + 1);
102 bsg(pivot + 1, end, lvl + 1);
103 }
else if (std::distance(begin, end) == 1) {
104 new_order.push_back(*begin);
105 levels[std::distance(input.begin(), begin)] = lvl;
109 bsg(input.begin(), input.end(), 0);
110 std::reverse(new_order.begin(), new_order.end());
112 return {new_order, levels};
125 Values linearizationPoint;
135 Switching(
size_t K,
double between_sigma = 1.0,
double prior_sigma = 0.1,
136 std::vector<double> measurements = {},
137 std::string discrete_transition_prob =
"1/2 3/2")
142 for (
size_t k = 0; k < K; k++) {
143 modes.emplace_back(M(k), 2);
147 if (measurements.size() == 0) {
148 for (
size_t k = 0; k < K; k++) {
149 measurements.push_back(k);
156 X(0), measurements.at(0), Isotropic::Sigma(1, prior_sigma));
159 for (
size_t k = 0; k < K - 1; k++) {
161 auto motion_models = motionModels(k, between_sigma);
162 std::vector<NonlinearFactor::shared_ptr> components;
163 for (
auto &&f : motion_models) {
164 components.push_back(std::dynamic_pointer_cast<NonlinearFactor>(f));
171 auto measurement_noise = Isotropic::Sigma(1, prior_sigma);
172 for (
size_t k = 1; k < K; k++) {
174 X(k), measurements.at(k), measurement_noise);
178 addModeChain(&nonlinearFactorGraph, discrete_transition_prob);
181 for (
size_t k = 0; k < K; k++) {
182 linearizationPoint.
insert<
double>(X(k),
static_cast<double>(k + 1));
187 linearizedFactorGraph = *nonlinearFactorGraph.
linearize(linearizationPoint);
191 static std::vector<MotionModel::shared_ptr> motionModels(
size_t k,
192 double sigma = 1.0) {
195 std::make_shared<MotionModel>(X(k), X(k + 1), 0.0, noise_model),
197 std::make_shared<MotionModel>(X(k), X(k + 1), 1.0, noise_model);
198 return {still, moving};
208 std::string discrete_transition_prob =
"1/2 3/2") {
210 for (
size_t k = 0; k < K - 2; k++) {
211 auto parents = {modes[k]};
213 discrete_transition_prob);
224 std::string discrete_transition_prob =
"1/2 3/2") {
226 for (
size_t k = 0; k < K - 2; k++) {
227 auto parents = {modes[k]};
229 discrete_transition_prob);
void addModeChain(HybridGaussianFactorGraph *fg, std::string discrete_transition_prob="1/2 3/2")
Add "mode chain" to HybridGaussianFactorGraph from M(0) to M(K-2). E.g. if K=4, we want M0...
Definition: Switching.h:223
Definition: Switching.h:120
HybridGaussianFactorGraph::shared_ptr makeSwitchingChain(size_t n, std::function< Key(int)> keyFunc=X, std::function< Key(int)> dKeyFunc=M)
Create a switching system chain. A switching system is a continuous system which depends on a discret...
Definition: Switching.h:51
A set of GaussianFactors, indexed by a set of discrete keys.
std::pair< KeyVector, std::vector< int > > makeBinaryOrdering(std::vector< Key > &input)
Return the ordering as a binary tree such that all parent nodes are above their children.
Definition: Switching.h:85
Definition: HybridNonlinearFactorGraph.h:33
Nonlinear hybrid factor graph that uses type erasure.
IsDerived< DERIVEDFACTOR > emplace_shared(Args &&... args)
Emplace a shared pointer to factor of given type.
Definition: FactorGraph.h:196
Switching(size_t K, double between_sigma=1.0, double prior_sigma=0.1, std::vector< double > measurements={}, std::string discrete_transition_prob="1/2 3/2")
Create with given number of time steps.
Definition: Switching.h:135
void insert(Key j, const Value &val)
Implementation of a discrete conditional mixture factor. Implements a joint discrete-continuous facto...
Definition: GaussianMixtureFactor.h:47
Definition: DecisionTreeFactor.h:44
Nonlinear Mixture factor of continuous and discrete.
std::shared_ptr< HybridGaussianFactorGraph > linearize(const Values &continuousValues) const
Linearize all the continuous factors in the HybridNonlinearFactorGraph.
Definition: HybridGaussianFactorGraph.h:103
IsDerived< DERIVEDFACTOR > add(std::shared_ptr< DERIVEDFACTOR > factor)
add is a synonym for push_back.
Definition: FactorGraph.h:214
void addModeChain(HybridNonlinearFactorGraph *fg, std::string discrete_transition_prob="1/2 3/2")
Add "mode chain" to HybridNonlinearFactorGraph from M(0) to M(K-2). E.g. if K=4, we want M0...
Definition: Switching.h:207
Definition: PriorFactor.h:30
Definition: DiscreteDistribution.h:33
std::shared_ptr< This > shared_ptr
shared_ptr to This
Definition: HybridGaussianFactorGraph.h:117
typedef and functions to augment Eigen's MatrixXd
Linearized Hybrid factor graph that uses type erasure.
Definition: JacobianFactor.h:91
Definition: BetweenFactor.h:40
Definition: chartTesting.h:28
FastVector< Key > KeyVector
Define collection type once and for all - also used in wrappers.
Definition: Key.h:86
Implementation of a discrete conditional mixture factor.
Definition: MixtureFactor.h:47
Definition: NoiseModel.h:527
std::uint64_t Key
Integer nonlinear key type.
Definition: types.h:102
static shared_ptr Sigma(size_t dim, double sigma, bool smart=true)
DiscreteKeys is a set of keys that can be assembled using the & operator.
Definition: DiscreteKey.h:41
Definition: DiscreteConditional.h:37