gtsam
Loading...
Searching...
No Matches
ScenarioRunner.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
17
18#pragma once
24
25namespace gtsam {
26
27// Convert covariance to diagonal noise model, if possible, otherwise throw
28static noiseModel::Diagonal::shared_ptr Diagonal(const Matrix& covariance) {
29 bool smart = true;
30 auto model = noiseModel::Gaussian::Covariance(covariance, smart);
31 auto diagonal = std::dynamic_pointer_cast<noiseModel::Diagonal>(model);
32 if (!diagonal)
33 throw std::invalid_argument("ScenarioRunner::Diagonal: not a diagonal");
34 return diagonal;
35}
36
37/*
38 * Simple class to test navigation scenarios.
39 * Takes a trajectory scenario as input, and can generate IMU measurements
40 */
41class GTSAM_EXPORT ScenarioRunner {
42 public:
43 typedef imuBias::ConstantBias Bias;
44 typedef std::shared_ptr<PreintegrationParams> SharedParams;
45
46 protected:
47 const Scenario& scenario_;
48 const SharedParams p_;
49 const double imuSampleTime_, sqrt_dt_;
50 const Bias estimatedBias_;
51
52 // Create two samplers for acceleration and omega noise
53 Sampler gyroSampler_, accSampler_;
54
55 public:
56 ScenarioRunner(const Scenario& scenario, const SharedParams& p,
57 double imuSampleTime = 1.0 / 100.0, const Bias& bias = Bias())
58 : scenario_(scenario),
59 p_(p),
60 imuSampleTime_(imuSampleTime),
61 sqrt_dt_(std::sqrt(imuSampleTime)),
62 estimatedBias_(bias),
63 // NOTE(duy): random seeds that work well:
64 gyroSampler_(Diagonal(p->gyroscopeCovariance), 10),
65 accSampler_(Diagonal(p->accelerometerCovariance), 29284) {}
66
67 // NOTE(frank): hardcoded for now with Z up (gravity points in negative Z)
68 // also, uses g=10 for easy debugging
69 const Vector3& gravity_n() const { return p_->n_gravity; }
70
71 const Scenario& scenario() const { return scenario_; }
72
74 Vector3 actualAngularVelocity(double t) const;
75
77 Vector3 actualSpecificForce(double t) const;
78
79 // Angular velocity measured by gyroscope, corrupted by bias and noise
80 Vector3 measuredAngularVelocity(double t) const;
81
83 Vector3 measuredSpecificForce(double t) const;
84
86 double imuSampleTime() const { return imuSampleTime_; }
87
89 PreintegratedImuMeasurements integrate(double T,
90 const Bias& estimatedBias = Bias(),
91 bool corrupted = false) const;
92
94 NavState predict(const PreintegratedImuMeasurements& pim,
95 const Bias& estimatedBias = Bias()) const;
96
98 Matrix9 estimateCovariance(double T, size_t N = 1000,
99 const Bias& estimatedBias = Bias()) const;
100
102 Matrix6 estimateNoiseCovariance(size_t N = 1000) const;
103};
104
105/*
106 * Simple class to test navigation scenarios with CombinedImuMeasurements.
107 * Takes a trajectory scenario as input, and can generate IMU measurements
108 */
109class GTSAM_EXPORT CombinedScenarioRunner : public ScenarioRunner {
110 public:
111 typedef std::shared_ptr<PreintegrationCombinedParams> SharedParams;
112
113 private:
114 const SharedParams p_;
115 const Eigen::Matrix<double, 15, 15> preintMeasCov_;
116
117 public:
118 CombinedScenarioRunner(const Scenario& scenario, const SharedParams& p,
119 double imuSampleTime = 1.0 / 100.0,
120 const Bias& bias = Bias(),
121 const Eigen::Matrix<double, 15, 15>& preintMeasCov =
122 Eigen::Matrix<double, 15, 15>::Zero())
123 : ScenarioRunner(scenario, static_cast<ScenarioRunner::SharedParams>(p),
124 imuSampleTime, bias),
125 p_(p),
126 preintMeasCov_(preintMeasCov) {}
127
129 PreintegratedCombinedMeasurements integrate(
130 double T, const Bias& estimatedBias = Bias(),
131 bool corrupted = false) const;
132
134 NavState predict(const PreintegratedCombinedMeasurements& pim,
135 const Bias& estimatedBias = Bias()) const;
136
138 Eigen::Matrix<double, 15, 15> estimateCovariance(
139 double T, size_t N = 1000, const Bias& estimatedBias = Bias()) const;
140};
141
142/*
143 * Simple class to test navigation scenarios with PreintegratedAhrsMeasurements.
144 * Takes a trajectory scenario as input, and can generate AHRS measurements.
145 */
146class GTSAM_EXPORT AhrsScenarioRunner : public ScenarioRunner {
147 public:
148 AhrsScenarioRunner(const Scenario& scenario, const SharedParams& p,
149 double imuSampleTime = 1.0 / 100.0,
150 const Bias& bias = Bias())
151 : ScenarioRunner(scenario,
152 std::static_pointer_cast<PreintegrationParams>(p),
153 imuSampleTime, bias) {}
154
157 const Bias& estimatedBias = Bias(),
158 bool corrupted = false) const;
159
162 const Bias& estimatedBias = Bias()) const;
163
165 Matrix3 estimateCovariance(double T, size_t N = 1000,
166 const Bias& estimatedBias = Bias()) const;
167};
168
169} // namespace gtsam
sampling from a NoiseModel
Simple class to test navigation scenarios.
Global functions in a separate testing namespace.
Definition chartTesting.h:28
Rot3 is a 3D rotation represented as a rotation matrix if the preprocessor symbol GTSAM_USE_QUATERNIO...
Definition Rot3.h:65
static shared_ptr Covariance(const Matrix &covariance, bool smart=true)
A Gaussian noise model created by specifying a covariance matrix.
Definition NoiseModel.cpp:116
A diagonal noise model implements a diagonal covariance matrix, with the elements of the diagonal spe...
Definition NoiseModel.h:327
Sampling structure that keeps internal random number generators for diagonal distributions specified ...
Definition Sampler.h:32
PreintegratedAHRSMeasurements accumulates (integrates) the gyroscope measurements (rotation rates) an...
Definition AHRSFactor.h:88
Definition ImuBias.h:34
Navigation state: Pose (rotation, translation) + velocity Following Barrau20icra, this class belongs ...
Definition NavState.h:45
Simple trajectory simulator.
Definition Scenario.h:35
Vector3 actualAngularVelocity(double t) const
Ideal gyroscope measurement expressed in the sensor frame.
Definition ScenarioRunner.cpp:31
Vector3 actualSpecificForce(double t) const
Ideal accelerometer measurement expressed in the sensor frame.
Definition ScenarioRunner.cpp:37
Vector3 measuredSpecificForce(double t) const
Specific force measured by accelerometer, corrupted by bias and noise.
Definition ScenarioRunner.cpp:55
double imuSampleTime() const
The IMU sample time (i.e. the time between two IMU measurements).
Definition ScenarioRunner.h:86
Eigen::Matrix< double, 15, 15 > estimateCovariance(double T, size_t N=1000, const Bias &estimatedBias=Bias()) const
Compute a Monte Carlo estimate of the predict covariance using N samples.
Definition ScenarioRunner.cpp:162
PreintegratedCombinedMeasurements integrate(double T, const Bias &estimatedBias=Bias(), bool corrupted=false) const
Integrate measurements for T seconds into a PIM.
Definition ScenarioRunner.cpp:136
NavState predict(const PreintegratedCombinedMeasurements &pim, const Bias &estimatedBias=Bias()) const
Predict predict given a PIM.
Definition ScenarioRunner.cpp:155
PreintegratedAhrsMeasurements integrate(double T, const Bias &estimatedBias=Bias(), bool corrupted=false) const
Integrate measurements for T seconds into a PreintegratedAhrsMeasurements.
Definition ScenarioRunner.cpp:194
Matrix3 estimateCovariance(double T, size_t N=1000, const Bias &estimatedBias=Bias()) const
Compute a Monte Carlo estimate of the predict covariance using N samples.
Definition ScenarioRunner.cpp:213
Rot3 predict(const PreintegratedAhrsMeasurements &pim, const Bias &estimatedBias=Bias()) const
Predict the next rotation given a PreintegratedAhrsMeasurements.
Definition ScenarioRunner.cpp:207