2 GTSAM Copyright 2010-2019, Georgia Tech Research Corporation, 3 Atlanta, Georgia 30332-0415 6 See LICENSE for the license information 8 A script validating and demonstrating the ImuFactor inference. 10 Author: Frank Dellaert, Varun Agrawal 13 from __future__
import print_function
19 import matplotlib.pyplot
as plt
23 from mpl_toolkits.mplot3d
import Axes3D
25 from PreintegrationExample
import POSES_FIG, PreintegrationExample
30 np.set_printoptions(precision=3, suppress=
True)
35 def __init__(self, twist_scenario="sick_twist"):
41 twist_scenarios =
dict(
42 zero_twist=(np.zeros(3), np.zeros(3)),
43 forward_twist=(np.zeros(3), self.
velocity),
44 loop_twist=(np.array([0, -math.radians(30), 0]), self.
velocity),
45 sick_twist=(np.array([math.radians(30), -math.radians(30), 0]),
49 accBias = np.array([-0.3, 0.1, 0.2])
50 gyroBias = np.array([0.1, 0.3, -0.1])
54 super(ImuFactorExample, self).
__init__(twist_scenarios[twist_scenario],
58 state = self.scenario.navState(i)
59 graph.push_back(gtsam.PriorFactorPose3(
61 graph.push_back(gtsam.PriorFactorVector(
64 def run(self, T=12, compute_covariances=False, verbose=True):
73 initial.insert(BIAS_KEY, self.actualBias)
77 initial_state_i = self.scenario.navState(0)
78 initial.insert(
X(i), initial_state_i.pose())
79 initial.insert(
V(i), initial_state_i.velocity())
84 for k, t
in enumerate(np.arange(0, T, self.dt)):
86 measuredOmega = self.runner.measuredAngularVelocity(t)
87 measuredAcc = self.runner.measuredSpecificForce(t)
88 pim.integrateMeasurement(measuredAcc, measuredOmega, self.dt)
92 self.plotImu(t, measuredOmega, measuredAcc)
94 if (k+1) %
int(1 / self.dt) == 0:
96 self.plotGroundTruthPose(t, scale=1)
97 plt.title(
"Ground Truth Trajectory")
103 graph.push_back(factor)
107 print(pim.predict(initial_state_i, self.actualBias))
109 pim.resetIntegration()
113 poseNoise =
gtsam.Pose3(rotationNoise, translationNoise)
115 actual_state_i = self.scenario.navState(t + self.dt)
116 print(
"Actual state at {0}:\n{1}".format(
117 t+self.dt, actual_state_i))
120 actual_state_i.pose().
compose(poseNoise),
121 actual_state_i.velocity() + np.random.randn(3)*0.1)
123 initial.insert(
X(i+1), noisy_state_i.pose())
124 initial.insert(
V(i+1), noisy_state_i.velocity())
130 initial.print_(
"Initial values:")
134 params.setVerbosityLM(
"SUMMARY")
136 result = optimizer.optimize()
138 result.print_(
"Optimized values:")
140 if compute_covariances:
143 print(
"Covariance on bias:\n",
144 marginals.marginalCovariance(BIAS_KEY))
145 for i
in range(num_poses):
146 print(
"Covariance on pose {}:\n{}\n".format(
147 i, marginals.marginalCovariance(
X(i))))
148 print(
"Covariance on vel {}:\n{}\n".format(
149 i, marginals.marginalCovariance(
V(i))))
153 while result.exists(
X(i)):
154 pose_i = result.atPose3(
X(i))
157 plt.title(
"Estimated Trajectory")
161 print(
"Bias Values", result.atConstantBias(BIAS_KEY))
167 if __name__ ==
'__main__':
168 parser = argparse.ArgumentParser(
"ImuFactorExample.py")
169 parser.add_argument(
"--twist_scenario",
170 default=
"sick_twist",
171 choices=(
"zero_twist",
"forward_twist",
"loop_twist",
"sick_twist"))
172 parser.add_argument(
"--time",
"-T", default=12,
173 type=int, help=
"Total time in seconds")
174 parser.add_argument(
"--compute_covariances",
175 default=
False, action=
'store_true')
176 parser.add_argument(
"--verbose", default=
False, action=
'store_true')
177 args = parser.parse_args()
180 args.time, args.compute_covariances, args.verbose)
void print(const Matrix &A, const string &s, ostream &stream)
def run(self, T=12, compute_covariances=False, verbose=True)
def __init__(self, twist_scenario="sick_twist")
def set_axes_equal(fignum)
static Rot3 Expmap(const Vector3 &v, OptionalJacobian< 3, 3 > H=boost::none)
def plot_pose3(fignum, pose, axis_length=0.1, P=None, axis_labels=('X axis', 'Y axis', 'Z axis'))
Expression< T > compose(const Expression< T > &t1, const Expression< T > &t2)
def addPrior(self, i, graph)
void run(Expr &expr, Dev &dev)
static shared_ptr Sigma(size_t dim, double sigma, bool smart=true)