ImuFactorExample.py
Go to the documentation of this file.
1 """
2 GTSAM Copyright 2010-2019, Georgia Tech Research Corporation,
3 Atlanta, Georgia 30332-0415
4 All Rights Reserved
5 
6 See LICENSE for the license information
7 
8 A script validating and demonstrating the ImuFactor inference.
9 
10 Author: Frank Dellaert, Varun Agrawal
11 """
12 
13 from __future__ import print_function
14 
15 import argparse
16 import math
17 
18 import gtsam
19 import matplotlib.pyplot as plt
20 import numpy as np
21 from gtsam.symbol_shorthand import B, V, X
22 from gtsam.utils.plot import plot_pose3
23 from mpl_toolkits.mplot3d import Axes3D
24 
25 from PreintegrationExample import POSES_FIG, PreintegrationExample
26 
27 BIAS_KEY = B(0)
28 
29 
30 np.set_printoptions(precision=3, suppress=True)
31 
32 
33 class ImuFactorExample(PreintegrationExample):
34 
35  def __init__(self, twist_scenario="sick_twist"):
36  self.velocity = np.array([2, 0, 0])
39 
40  # Choose one of these twists to change scenario:
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]),
46  self.velocity)
47  )
48 
49  accBias = np.array([-0.3, 0.1, 0.2])
50  gyroBias = np.array([0.1, 0.3, -0.1])
51  bias = gtsam.imuBias.ConstantBias(accBias, gyroBias)
52 
53  dt = 1e-2
54  super(ImuFactorExample, self).__init__(twist_scenarios[twist_scenario],
55  bias, dt)
56 
57  def addPrior(self, i, graph):
58  state = self.scenario.navState(i)
59  graph.push_back(gtsam.PriorFactorPose3(
60  X(i), state.pose(), self.priorNoise))
61  graph.push_back(gtsam.PriorFactorVector(
62  V(i), state.velocity(), self.velNoise))
63 
64  def run(self, T=12, compute_covariances=False, verbose=True):
66 
67  # initialize data structure for pre-integrated IMU measurements
68  pim = gtsam.PreintegratedImuMeasurements(self.params, self.actualBias)
69 
70  T = 12
71  num_poses = T # assumes 1 factor per second
72  initial = gtsam.Values()
73  initial.insert(BIAS_KEY, self.actualBias)
74 
75  # simulate the loop
76  i = 0 # state index
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())
80 
81  # add prior on beginning
82  self.addPrior(0, graph)
83 
84  for k, t in enumerate(np.arange(0, T, self.dt)):
85  # get measurements and add them to PIM
86  measuredOmega = self.runner.measuredAngularVelocity(t)
87  measuredAcc = self.runner.measuredSpecificForce(t)
88  pim.integrateMeasurement(measuredAcc, measuredOmega, self.dt)
89 
90  # Plot IMU many times
91  if k % 10 == 0:
92  self.plotImu(t, measuredOmega, measuredAcc)
93 
94  if (k+1) % int(1 / self.dt) == 0:
95  # Plot every second
96  self.plotGroundTruthPose(t, scale=1)
97  plt.title("Ground Truth Trajectory")
98 
99  # create IMU factor every second
100  factor = gtsam.ImuFactor(X(i), V(i),
101  X(i + 1), V(i + 1),
102  BIAS_KEY, pim)
103  graph.push_back(factor)
104 
105  if verbose:
106  print(factor)
107  print(pim.predict(initial_state_i, self.actualBias))
108 
109  pim.resetIntegration()
110 
111  rotationNoise = gtsam.Rot3.Expmap(np.random.randn(3)*0.1)
112  translationNoise = gtsam.Point3(*np.random.randn(3)*1)
113  poseNoise = gtsam.Pose3(rotationNoise, translationNoise)
114 
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))
118 
119  noisy_state_i = gtsam.NavState(
120  actual_state_i.pose().compose(poseNoise),
121  actual_state_i.velocity() + np.random.randn(3)*0.1)
122 
123  initial.insert(X(i+1), noisy_state_i.pose())
124  initial.insert(V(i+1), noisy_state_i.velocity())
125  i += 1
126 
127  # add priors on end
128  self.addPrior(num_poses - 1, graph)
129 
130  initial.print_("Initial values:")
131 
132  # optimize using Levenberg-Marquardt optimization
134  params.setVerbosityLM("SUMMARY")
135  optimizer = gtsam.LevenbergMarquardtOptimizer(graph, initial, params)
136  result = optimizer.optimize()
137 
138  result.print_("Optimized values:")
139 
140  if compute_covariances:
141  # Calculate and print marginal covariances
142  marginals = gtsam.Marginals(graph, result)
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))))
150 
151  # Plot resulting poses
152  i = 0
153  while result.exists(X(i)):
154  pose_i = result.atPose3(X(i))
155  plot_pose3(POSES_FIG+1, pose_i, 1)
156  i += 1
157  plt.title("Estimated Trajectory")
158 
160 
161  print("Bias Values", result.atConstantBias(BIAS_KEY))
162 
163  plt.ioff()
164  plt.show()
165 
166 
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()
178 
179  ImuFactorExample(args.twist_scenario).run(
180  args.time, args.compute_covariances, args.verbose)
void print(const Matrix &A, const string &s, ostream &stream)
Definition: Matrix.cpp:155
def run(self, T=12, compute_covariances=False, verbose=True)
def __init__(self, twist_scenario="sick_twist")
def set_axes_equal(fignum)
Definition: plot.py:13
static Rot3 Expmap(const Vector3 &v, OptionalJacobian< 3, 3 > H=boost::none)
Definition: Rot3.h:377
def plot_pose3(fignum, pose, axis_length=0.1, P=None, axis_labels=('X axis', 'Y axis', 'Z axis'))
Definition: plot.py:284
Expression< T > compose(const Expression< T > &t1, const Expression< T > &t2)
Definition: pytypes.h:1255
Vector3 Point3
Definition: Point3.h:35
#define X
Definition: icosphere.cpp:20
void run(Expr &expr, Dev &dev)
Definition: TensorSyclRun.h:33
static shared_ptr Sigma(size_t dim, double sigma, bool smart=true)
Definition: NoiseModel.cpp:567


gtsam
Author(s):
autogenerated on Sat May 8 2021 02:42:13