diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..92dd33a1 --- /dev/null +++ b/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/_build/doctrees/_autosummary/navlie.batch.doctree b/_build/doctrees/_autosummary/navlie.batch.doctree new file mode 100644 index 00000000..5e4ccc53 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.batch.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.batch.estimator.BatchEstimator.doctree b/_build/doctrees/_autosummary/navlie.batch.estimator.BatchEstimator.doctree new file mode 100644 index 00000000..57b0ae02 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.batch.estimator.BatchEstimator.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.batch.estimator.doctree b/_build/doctrees/_autosummary/navlie.batch.estimator.doctree new file mode 100644 index 00000000..8b4fc919 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.batch.estimator.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.batch.gaussian_mixtures.GaussianMixtureResidual.doctree b/_build/doctrees/_autosummary/navlie.batch.gaussian_mixtures.GaussianMixtureResidual.doctree new file mode 100644 index 00000000..593688a2 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.batch.gaussian_mixtures.GaussianMixtureResidual.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.doctree b/_build/doctrees/_autosummary/navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.doctree new file mode 100644 index 00000000..bc0fd49e Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.batch.gaussian_mixtures.MaxMixtureResidual.doctree b/_build/doctrees/_autosummary/navlie.batch.gaussian_mixtures.MaxMixtureResidual.doctree new file mode 100644 index 00000000..c06702e2 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.batch.gaussian_mixtures.MaxMixtureResidual.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.batch.gaussian_mixtures.MaxSumMixtureResidual.doctree b/_build/doctrees/_autosummary/navlie.batch.gaussian_mixtures.MaxSumMixtureResidual.doctree new file mode 100644 index 00000000..473bfee2 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.batch.gaussian_mixtures.MaxSumMixtureResidual.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.batch.gaussian_mixtures.SumMixtureResidual.doctree b/_build/doctrees/_autosummary/navlie.batch.gaussian_mixtures.SumMixtureResidual.doctree new file mode 100644 index 00000000..fdbea8d8 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.batch.gaussian_mixtures.SumMixtureResidual.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.batch.gaussian_mixtures.doctree b/_build/doctrees/_autosummary/navlie.batch.gaussian_mixtures.doctree new file mode 100644 index 00000000..b7a1836c Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.batch.gaussian_mixtures.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.batch.losses.CauchyLoss.doctree b/_build/doctrees/_autosummary/navlie.batch.losses.CauchyLoss.doctree new file mode 100644 index 00000000..1ddb384a Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.batch.losses.CauchyLoss.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.batch.losses.L2Loss.doctree b/_build/doctrees/_autosummary/navlie.batch.losses.L2Loss.doctree new file mode 100644 index 00000000..3ff462b5 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.batch.losses.L2Loss.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.batch.losses.LossFunction.doctree b/_build/doctrees/_autosummary/navlie.batch.losses.LossFunction.doctree new file mode 100644 index 00000000..855a9747 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.batch.losses.LossFunction.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.batch.losses.doctree b/_build/doctrees/_autosummary/navlie.batch.losses.doctree new file mode 100644 index 00000000..cc558640 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.batch.losses.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.batch.problem.OptimizationSummary.doctree b/_build/doctrees/_autosummary/navlie.batch.problem.OptimizationSummary.doctree new file mode 100644 index 00000000..ff0f7672 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.batch.problem.OptimizationSummary.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.batch.problem.Problem.doctree b/_build/doctrees/_autosummary/navlie.batch.problem.Problem.doctree new file mode 100644 index 00000000..0e9c7ce9 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.batch.problem.Problem.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.batch.problem.doctree b/_build/doctrees/_autosummary/navlie.batch.problem.doctree new file mode 100644 index 00000000..d9f68757 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.batch.problem.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.batch.residuals.MeasurementResidual.doctree b/_build/doctrees/_autosummary/navlie.batch.residuals.MeasurementResidual.doctree new file mode 100644 index 00000000..5e12a08b Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.batch.residuals.MeasurementResidual.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.batch.residuals.PriorResidual.doctree b/_build/doctrees/_autosummary/navlie.batch.residuals.PriorResidual.doctree new file mode 100644 index 00000000..e99111da Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.batch.residuals.PriorResidual.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.batch.residuals.ProcessResidual.doctree b/_build/doctrees/_autosummary/navlie.batch.residuals.ProcessResidual.doctree new file mode 100644 index 00000000..f3eb5b8a Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.batch.residuals.ProcessResidual.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.batch.residuals.Residual.doctree b/_build/doctrees/_autosummary/navlie.batch.residuals.Residual.doctree new file mode 100644 index 00000000..9b9fa74d Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.batch.residuals.Residual.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.batch.residuals.doctree b/_build/doctrees/_autosummary/navlie.batch.residuals.doctree new file mode 100644 index 00000000..344ffad0 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.batch.residuals.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.composite.CompositeInput.doctree b/_build/doctrees/_autosummary/navlie.composite.CompositeInput.doctree new file mode 100644 index 00000000..c06bf9bf Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.composite.CompositeInput.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.composite.CompositeMeasurement.doctree b/_build/doctrees/_autosummary/navlie.composite.CompositeMeasurement.doctree new file mode 100644 index 00000000..3a725f3c Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.composite.CompositeMeasurement.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.composite.CompositeMeasurementModel.doctree b/_build/doctrees/_autosummary/navlie.composite.CompositeMeasurementModel.doctree new file mode 100644 index 00000000..9f26b632 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.composite.CompositeMeasurementModel.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.composite.CompositeProcessModel.doctree b/_build/doctrees/_autosummary/navlie.composite.CompositeProcessModel.doctree new file mode 100644 index 00000000..44dc3245 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.composite.CompositeProcessModel.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.composite.CompositeState.doctree b/_build/doctrees/_autosummary/navlie.composite.CompositeState.doctree new file mode 100644 index 00000000..506f5f98 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.composite.CompositeState.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.composite.doctree b/_build/doctrees/_autosummary/navlie.composite.doctree new file mode 100644 index 00000000..e09d3a03 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.composite.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.datagen.DataGenerator.doctree b/_build/doctrees/_autosummary/navlie.datagen.DataGenerator.doctree new file mode 100644 index 00000000..9272255a Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.datagen.DataGenerator.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.datagen.doctree b/_build/doctrees/_autosummary/navlie.datagen.doctree new file mode 100644 index 00000000..9f39482c Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.datagen.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.datagen.generate_measurement.doctree b/_build/doctrees/_autosummary/navlie.datagen.generate_measurement.doctree new file mode 100644 index 00000000..3adcf74e Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.datagen.generate_measurement.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.filters.CubatureKalmanFilter.doctree b/_build/doctrees/_autosummary/navlie.filters.CubatureKalmanFilter.doctree new file mode 100644 index 00000000..3753a52b Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.filters.CubatureKalmanFilter.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.filters.ExtendedKalmanFilter.doctree b/_build/doctrees/_autosummary/navlie.filters.ExtendedKalmanFilter.doctree new file mode 100644 index 00000000..187e4859 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.filters.ExtendedKalmanFilter.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.filters.GaussHermiteKalmanFilter.doctree b/_build/doctrees/_autosummary/navlie.filters.GaussHermiteKalmanFilter.doctree new file mode 100644 index 00000000..57195d46 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.filters.GaussHermiteKalmanFilter.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.filters.IteratedKalmanFilter.doctree b/_build/doctrees/_autosummary/navlie.filters.IteratedKalmanFilter.doctree new file mode 100644 index 00000000..2d840b5e Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.filters.IteratedKalmanFilter.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.filters.SigmaPointKalmanFilter.doctree b/_build/doctrees/_autosummary/navlie.filters.SigmaPointKalmanFilter.doctree new file mode 100644 index 00000000..7664f5be Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.filters.SigmaPointKalmanFilter.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.filters.UnscentedKalmanFilter.doctree b/_build/doctrees/_autosummary/navlie.filters.UnscentedKalmanFilter.doctree new file mode 100644 index 00000000..97ab4da1 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.filters.UnscentedKalmanFilter.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.filters.check_outlier.doctree b/_build/doctrees/_autosummary/navlie.filters.check_outlier.doctree new file mode 100644 index 00000000..eb78c525 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.filters.check_outlier.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.filters.doctree b/_build/doctrees/_autosummary/navlie.filters.doctree new file mode 100644 index 00000000..b0c9a967 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.filters.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.filters.generate_sigmapoints.doctree b/_build/doctrees/_autosummary/navlie.filters.generate_sigmapoints.doctree new file mode 100644 index 00000000..a9356d2c Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.filters.generate_sigmapoints.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.filters.mean_state.doctree b/_build/doctrees/_autosummary/navlie.filters.mean_state.doctree new file mode 100644 index 00000000..7b5f9c9f Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.filters.mean_state.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.filters.run_filter.doctree b/_build/doctrees/_autosummary/navlie.filters.run_filter.doctree new file mode 100644 index 00000000..5979f88d Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.filters.run_filter.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.imm.IMMResult.doctree b/_build/doctrees/_autosummary/navlie.imm.IMMResult.doctree new file mode 100644 index 00000000..86856fd2 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.imm.IMMResult.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.imm.IMMResultList.doctree b/_build/doctrees/_autosummary/navlie.imm.IMMResultList.doctree new file mode 100644 index 00000000..aa69ab9f Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.imm.IMMResultList.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.imm.IMMState.doctree b/_build/doctrees/_autosummary/navlie.imm.IMMState.doctree new file mode 100644 index 00000000..7370acb1 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.imm.IMMState.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.imm.InteractingModelFilter.doctree b/_build/doctrees/_autosummary/navlie.imm.InteractingModelFilter.doctree new file mode 100644 index 00000000..ae293e08 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.imm.InteractingModelFilter.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.imm.doctree b/_build/doctrees/_autosummary/navlie.imm.doctree new file mode 100644 index 00000000..be4054cb Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.imm.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.imm.gaussian_mixing.doctree b/_build/doctrees/_autosummary/navlie.imm.gaussian_mixing.doctree new file mode 100644 index 00000000..2308d54a Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.imm.gaussian_mixing.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.imm.gaussian_mixing_vectorspace.doctree b/_build/doctrees/_autosummary/navlie.imm.gaussian_mixing_vectorspace.doctree new file mode 100644 index 00000000..1361c0c8 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.imm.gaussian_mixing_vectorspace.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.imm.reparametrize_gaussians_about_X_par.doctree b/_build/doctrees/_autosummary/navlie.imm.reparametrize_gaussians_about_X_par.doctree new file mode 100644 index 00000000..6ca2b105 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.imm.reparametrize_gaussians_about_X_par.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.imm.run_imm_filter.doctree b/_build/doctrees/_autosummary/navlie.imm.run_imm_filter.doctree new file mode 100644 index 00000000..b30397fc Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.imm.run_imm_filter.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.imm.update_X.doctree b/_build/doctrees/_autosummary/navlie.imm.update_X.doctree new file mode 100644 index 00000000..3eec1376 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.imm.update_X.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.camera.PinholeCamera.doctree b/_build/doctrees/_autosummary/navlie.lib.camera.PinholeCamera.doctree new file mode 100644 index 00000000..f86ecfee Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.camera.PinholeCamera.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.camera.PoseMatrix.doctree b/_build/doctrees/_autosummary/navlie.lib.camera.PoseMatrix.doctree new file mode 100644 index 00000000..074bfd2d Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.camera.PoseMatrix.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.camera.doctree b/_build/doctrees/_autosummary/navlie.lib.camera.doctree new file mode 100644 index 00000000..51f59c13 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.camera.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.datasets.SimulatedInertialGPSDataset.doctree b/_build/doctrees/_autosummary/navlie.lib.datasets.SimulatedInertialGPSDataset.doctree new file mode 100644 index 00000000..dacdfe5b Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.datasets.SimulatedInertialGPSDataset.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.datasets.SimulatedInertialLandmarkDataset.doctree b/_build/doctrees/_autosummary/navlie.lib.datasets.SimulatedInertialLandmarkDataset.doctree new file mode 100644 index 00000000..40aa15bf Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.datasets.SimulatedInertialLandmarkDataset.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.datasets.SimulatedPoseRangingDataset.doctree b/_build/doctrees/_autosummary/navlie.lib.datasets.SimulatedPoseRangingDataset.doctree new file mode 100644 index 00000000..18d551be Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.datasets.SimulatedPoseRangingDataset.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.datasets.doctree b/_build/doctrees/_autosummary/navlie.lib.datasets.doctree new file mode 100644 index 00000000..52b394e5 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.datasets.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.datasets.generate_landmark_positions.doctree b/_build/doctrees/_autosummary/navlie.lib.datasets.generate_landmark_positions.doctree new file mode 100644 index 00000000..53b3630d Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.datasets.generate_landmark_positions.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.doctree b/_build/doctrees/_autosummary/navlie.lib.doctree new file mode 100644 index 00000000..21f35ac3 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.imu.G_matrix.doctree b/_build/doctrees/_autosummary/navlie.lib.imu.G_matrix.doctree new file mode 100644 index 00000000..e853bcd4 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.imu.G_matrix.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.imu.G_matrix_inv.doctree b/_build/doctrees/_autosummary/navlie.lib.imu.G_matrix_inv.doctree new file mode 100644 index 00000000..56c52de7 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.imu.G_matrix_inv.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.imu.IMU.doctree b/_build/doctrees/_autosummary/navlie.lib.imu.IMU.doctree new file mode 100644 index 00000000..5e3cce75 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.imu.IMU.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.imu.IMUKinematics.doctree b/_build/doctrees/_autosummary/navlie.lib.imu.IMUKinematics.doctree new file mode 100644 index 00000000..edb774a2 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.imu.IMUKinematics.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.imu.IMUState.doctree b/_build/doctrees/_autosummary/navlie.lib.imu.IMUState.doctree new file mode 100644 index 00000000..36208ba6 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.imu.IMUState.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.imu.L_matrix.doctree b/_build/doctrees/_autosummary/navlie.lib.imu.L_matrix.doctree new file mode 100644 index 00000000..4c43e472 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.imu.L_matrix.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.imu.M_matrix.doctree b/_build/doctrees/_autosummary/navlie.lib.imu.M_matrix.doctree new file mode 100644 index 00000000..f0ab7a8f Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.imu.M_matrix.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.imu.N_matrix.doctree b/_build/doctrees/_autosummary/navlie.lib.imu.N_matrix.doctree new file mode 100644 index 00000000..a2218fc4 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.imu.N_matrix.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.imu.U_matrix.doctree b/_build/doctrees/_autosummary/navlie.lib.imu.U_matrix.doctree new file mode 100644 index 00000000..2155e91b Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.imu.U_matrix.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.imu.U_matrix_inv.doctree b/_build/doctrees/_autosummary/navlie.lib.imu.U_matrix_inv.doctree new file mode 100644 index 00000000..1f3b5da7 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.imu.U_matrix_inv.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.imu.U_tilde_matrix.doctree b/_build/doctrees/_autosummary/navlie.lib.imu.U_tilde_matrix.doctree new file mode 100644 index 00000000..b80e9b7d Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.imu.U_tilde_matrix.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.imu.adjoint_IE3.doctree b/_build/doctrees/_autosummary/navlie.lib.imu.adjoint_IE3.doctree new file mode 100644 index 00000000..95688f94 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.imu.adjoint_IE3.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.imu.delta_matrix.doctree b/_build/doctrees/_autosummary/navlie.lib.imu.delta_matrix.doctree new file mode 100644 index 00000000..f404beb5 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.imu.delta_matrix.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.imu.doctree b/_build/doctrees/_autosummary/navlie.lib.imu.doctree new file mode 100644 index 00000000..fdc8919f Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.imu.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.imu.get_unbiased_imu.doctree b/_build/doctrees/_autosummary/navlie.lib.imu.get_unbiased_imu.doctree new file mode 100644 index 00000000..13c95394 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.imu.get_unbiased_imu.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.imu.inverse_IE3.doctree b/_build/doctrees/_autosummary/navlie.lib.imu.inverse_IE3.doctree new file mode 100644 index 00000000..69b1252e Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.imu.inverse_IE3.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.AbsolutePosition.doctree b/_build/doctrees/_autosummary/navlie.lib.models.AbsolutePosition.doctree new file mode 100644 index 00000000..5dc8dab2 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.AbsolutePosition.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.AbsoluteVelocity.doctree b/_build/doctrees/_autosummary/navlie.lib.models.AbsoluteVelocity.doctree new file mode 100644 index 00000000..69343e10 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.AbsoluteVelocity.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.Altitude.doctree b/_build/doctrees/_autosummary/navlie.lib.models.Altitude.doctree new file mode 100644 index 00000000..48ac0171 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.Altitude.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.BodyFrameVelocity.doctree b/_build/doctrees/_autosummary/navlie.lib.models.BodyFrameVelocity.doctree new file mode 100644 index 00000000..1a86db4e Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.BodyFrameVelocity.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.CameraProjection.doctree b/_build/doctrees/_autosummary/navlie.lib.models.CameraProjection.doctree new file mode 100644 index 00000000..eb971d3c Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.CameraProjection.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.DoubleIntegrator.doctree b/_build/doctrees/_autosummary/navlie.lib.models.DoubleIntegrator.doctree new file mode 100644 index 00000000..6ed7505d Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.DoubleIntegrator.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.DoubleIntegratorWithBias.doctree b/_build/doctrees/_autosummary/navlie.lib.models.DoubleIntegratorWithBias.doctree new file mode 100644 index 00000000..7b636c45 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.DoubleIntegratorWithBias.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.GlobalPosition.doctree b/_build/doctrees/_autosummary/navlie.lib.models.GlobalPosition.doctree new file mode 100644 index 00000000..240589ba Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.GlobalPosition.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.Gravitometer.doctree b/_build/doctrees/_autosummary/navlie.lib.models.Gravitometer.doctree new file mode 100644 index 00000000..4ce17906 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.Gravitometer.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.InvariantMeasurement.doctree b/_build/doctrees/_autosummary/navlie.lib.models.InvariantMeasurement.doctree new file mode 100644 index 00000000..05c7637f Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.InvariantMeasurement.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.InvariantPointRelativePosition.doctree b/_build/doctrees/_autosummary/navlie.lib.models.InvariantPointRelativePosition.doctree new file mode 100644 index 00000000..001436c9 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.InvariantPointRelativePosition.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.LinearMeasurement.doctree b/_build/doctrees/_autosummary/navlie.lib.models.LinearMeasurement.doctree new file mode 100644 index 00000000..8baf5e38 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.LinearMeasurement.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.Magnetometer.doctree b/_build/doctrees/_autosummary/navlie.lib.models.Magnetometer.doctree new file mode 100644 index 00000000..d52c9cb4 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.Magnetometer.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.OneDimensionalPositionVelocityRange.doctree b/_build/doctrees/_autosummary/navlie.lib.models.OneDimensionalPositionVelocityRange.doctree new file mode 100644 index 00000000..0a14c52e Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.OneDimensionalPositionVelocityRange.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.PointRelativePosition.doctree b/_build/doctrees/_autosummary/navlie.lib.models.PointRelativePosition.doctree new file mode 100644 index 00000000..82c9158f Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.PointRelativePosition.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.PointRelativePositionSLAM.doctree b/_build/doctrees/_autosummary/navlie.lib.models.PointRelativePositionSLAM.doctree new file mode 100644 index 00000000..8b7dbe5a Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.PointRelativePositionSLAM.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.RangePointToAnchor.doctree b/_build/doctrees/_autosummary/navlie.lib.models.RangePointToAnchor.doctree new file mode 100644 index 00000000..e14b6fdf Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.RangePointToAnchor.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.RangePoseToAnchor.doctree b/_build/doctrees/_autosummary/navlie.lib.models.RangePoseToAnchor.doctree new file mode 100644 index 00000000..a43b911b Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.RangePoseToAnchor.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.RangePoseToPose.doctree b/_build/doctrees/_autosummary/navlie.lib.models.RangePoseToPose.doctree new file mode 100644 index 00000000..f2cd0cc2 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.RangePoseToPose.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.RangeRelativePose.doctree b/_build/doctrees/_autosummary/navlie.lib.models.RangeRelativePose.doctree new file mode 100644 index 00000000..a3d06012 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.RangeRelativePose.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.RelativeBodyFrameVelocity.doctree b/_build/doctrees/_autosummary/navlie.lib.models.RelativeBodyFrameVelocity.doctree new file mode 100644 index 00000000..95862a6c Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.RelativeBodyFrameVelocity.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.SingleIntegrator.doctree b/_build/doctrees/_autosummary/navlie.lib.models.SingleIntegrator.doctree new file mode 100644 index 00000000..99129d94 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.SingleIntegrator.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.models.doctree b/_build/doctrees/_autosummary/navlie.lib.models.doctree new file mode 100644 index 00000000..f8a12dc8 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.models.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.preintegration.AngularVelocityIncrement.doctree b/_build/doctrees/_autosummary/navlie.lib.preintegration.AngularVelocityIncrement.doctree new file mode 100644 index 00000000..ef861459 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.preintegration.AngularVelocityIncrement.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.preintegration.BodyVelocityIncrement.doctree b/_build/doctrees/_autosummary/navlie.lib.preintegration.BodyVelocityIncrement.doctree new file mode 100644 index 00000000..c83bd872 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.preintegration.BodyVelocityIncrement.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.preintegration.IMUIncrement.doctree b/_build/doctrees/_autosummary/navlie.lib.preintegration.IMUIncrement.doctree new file mode 100644 index 00000000..f762f4d1 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.preintegration.IMUIncrement.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.preintegration.LinearIncrement.doctree b/_build/doctrees/_autosummary/navlie.lib.preintegration.LinearIncrement.doctree new file mode 100644 index 00000000..7fb8e9e0 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.preintegration.LinearIncrement.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.preintegration.PreintegratedAngularVelocity.doctree b/_build/doctrees/_autosummary/navlie.lib.preintegration.PreintegratedAngularVelocity.doctree new file mode 100644 index 00000000..25df1557 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.preintegration.PreintegratedAngularVelocity.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.preintegration.PreintegratedBodyVelocity.doctree b/_build/doctrees/_autosummary/navlie.lib.preintegration.PreintegratedBodyVelocity.doctree new file mode 100644 index 00000000..05037862 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.preintegration.PreintegratedBodyVelocity.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.preintegration.PreintegratedIMUKinematics.doctree b/_build/doctrees/_autosummary/navlie.lib.preintegration.PreintegratedIMUKinematics.doctree new file mode 100644 index 00000000..99b9fe80 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.preintegration.PreintegratedIMUKinematics.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.preintegration.PreintegratedLinearModel.doctree b/_build/doctrees/_autosummary/navlie.lib.preintegration.PreintegratedLinearModel.doctree new file mode 100644 index 00000000..657af71e Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.preintegration.PreintegratedLinearModel.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.preintegration.PreintegratedWheelOdometry.doctree b/_build/doctrees/_autosummary/navlie.lib.preintegration.PreintegratedWheelOdometry.doctree new file mode 100644 index 00000000..151cefee Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.preintegration.PreintegratedWheelOdometry.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.preintegration.RelativeMotionIncrement.doctree b/_build/doctrees/_autosummary/navlie.lib.preintegration.RelativeMotionIncrement.doctree new file mode 100644 index 00000000..8aae3bda Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.preintegration.RelativeMotionIncrement.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.preintegration.WheelOdometryIncrement.doctree b/_build/doctrees/_autosummary/navlie.lib.preintegration.WheelOdometryIncrement.doctree new file mode 100644 index 00000000..5eedc7f2 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.preintegration.WheelOdometryIncrement.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.preintegration.doctree b/_build/doctrees/_autosummary/navlie.lib.preintegration.doctree new file mode 100644 index 00000000..43b682dc Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.preintegration.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.states.MatrixLieGroupState.doctree b/_build/doctrees/_autosummary/navlie.lib.states.MatrixLieGroupState.doctree new file mode 100644 index 00000000..a46ae91e Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.states.MatrixLieGroupState.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.states.SE23State.doctree b/_build/doctrees/_autosummary/navlie.lib.states.SE23State.doctree new file mode 100644 index 00000000..9400d006 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.states.SE23State.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.states.SE2State.doctree b/_build/doctrees/_autosummary/navlie.lib.states.SE2State.doctree new file mode 100644 index 00000000..b298e9a2 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.states.SE2State.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.states.SE3State.doctree b/_build/doctrees/_autosummary/navlie.lib.states.SE3State.doctree new file mode 100644 index 00000000..d01b2ed2 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.states.SE3State.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.states.SL3State.doctree b/_build/doctrees/_autosummary/navlie.lib.states.SL3State.doctree new file mode 100644 index 00000000..cea54ecb Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.states.SL3State.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.states.SO2State.doctree b/_build/doctrees/_autosummary/navlie.lib.states.SO2State.doctree new file mode 100644 index 00000000..9ad7348c Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.states.SO2State.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.states.SO3State.doctree b/_build/doctrees/_autosummary/navlie.lib.states.SO3State.doctree new file mode 100644 index 00000000..2cb3ade4 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.states.SO3State.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.states.StampedValue.doctree b/_build/doctrees/_autosummary/navlie.lib.states.StampedValue.doctree new file mode 100644 index 00000000..c913cf9b Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.states.StampedValue.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.states.VectorInput.doctree b/_build/doctrees/_autosummary/navlie.lib.states.VectorInput.doctree new file mode 100644 index 00000000..474126ee Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.states.VectorInput.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.states.VectorState.doctree b/_build/doctrees/_autosummary/navlie.lib.states.VectorState.doctree new file mode 100644 index 00000000..aad35e4f Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.states.VectorState.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.lib.states.doctree b/_build/doctrees/_autosummary/navlie.lib.states.doctree new file mode 100644 index 00000000..1e7d240d Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.lib.states.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.types.Dataset.doctree b/_build/doctrees/_autosummary/navlie.types.Dataset.doctree new file mode 100644 index 00000000..427cc882 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.types.Dataset.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.types.Input.doctree b/_build/doctrees/_autosummary/navlie.types.Input.doctree new file mode 100644 index 00000000..b18535ae Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.types.Input.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.types.Measurement.doctree b/_build/doctrees/_autosummary/navlie.types.Measurement.doctree new file mode 100644 index 00000000..1d276190 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.types.Measurement.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.types.MeasurementModel.doctree b/_build/doctrees/_autosummary/navlie.types.MeasurementModel.doctree new file mode 100644 index 00000000..d9de1f39 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.types.MeasurementModel.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.types.ProcessModel.doctree b/_build/doctrees/_autosummary/navlie.types.ProcessModel.doctree new file mode 100644 index 00000000..ad601016 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.types.ProcessModel.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.types.State.doctree b/_build/doctrees/_autosummary/navlie.types.State.doctree new file mode 100644 index 00000000..fd8fc6e0 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.types.State.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.types.StateWithCovariance.doctree b/_build/doctrees/_autosummary/navlie.types.StateWithCovariance.doctree new file mode 100644 index 00000000..63574a1d Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.types.StateWithCovariance.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.types.doctree b/_build/doctrees/_autosummary/navlie.types.doctree new file mode 100644 index 00000000..5f9dc499 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.types.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.utils.GaussianResult.doctree b/_build/doctrees/_autosummary/navlie.utils.GaussianResult.doctree new file mode 100644 index 00000000..32a6c0e1 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.utils.GaussianResult.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.utils.GaussianResultList.doctree b/_build/doctrees/_autosummary/navlie.utils.GaussianResultList.doctree new file mode 100644 index 00000000..4960f249 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.utils.GaussianResultList.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.utils.MonteCarloResult.doctree b/_build/doctrees/_autosummary/navlie.utils.MonteCarloResult.doctree new file mode 100644 index 00000000..58dc0231 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.utils.MonteCarloResult.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.utils.associate_stamps.doctree b/_build/doctrees/_autosummary/navlie.utils.associate_stamps.doctree new file mode 100644 index 00000000..0a51e7bd Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.utils.associate_stamps.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.utils.doctree b/_build/doctrees/_autosummary/navlie.utils.doctree new file mode 100644 index 00000000..ad24e76c Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.utils.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.utils.find_nearest_stamp_idx.doctree b/_build/doctrees/_autosummary/navlie.utils.find_nearest_stamp_idx.doctree new file mode 100644 index 00000000..a76c4604 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.utils.find_nearest_stamp_idx.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.utils.jacobian.doctree b/_build/doctrees/_autosummary/navlie.utils.jacobian.doctree new file mode 100644 index 00000000..79caf60e Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.utils.jacobian.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.utils.monte_carlo.doctree b/_build/doctrees/_autosummary/navlie.utils.monte_carlo.doctree new file mode 100644 index 00000000..beaf0c17 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.utils.monte_carlo.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.utils.plot_error.doctree b/_build/doctrees/_autosummary/navlie.utils.plot_error.doctree new file mode 100644 index 00000000..c8f55482 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.utils.plot_error.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.utils.plot_meas.doctree b/_build/doctrees/_autosummary/navlie.utils.plot_meas.doctree new file mode 100644 index 00000000..6be949c8 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.utils.plot_meas.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.utils.plot_meas_by_model.doctree b/_build/doctrees/_autosummary/navlie.utils.plot_meas_by_model.doctree new file mode 100644 index 00000000..501d8bd2 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.utils.plot_meas_by_model.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.utils.plot_nees.doctree b/_build/doctrees/_autosummary/navlie.utils.plot_nees.doctree new file mode 100644 index 00000000..29f85866 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.utils.plot_nees.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.utils.plot_poses.doctree b/_build/doctrees/_autosummary/navlie.utils.plot_poses.doctree new file mode 100644 index 00000000..1e9e2f6f Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.utils.plot_poses.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.utils.randvec.doctree b/_build/doctrees/_autosummary/navlie.utils.randvec.doctree new file mode 100644 index 00000000..0e1c6dda Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.utils.randvec.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.utils.schedule_sequential_measurements.doctree b/_build/doctrees/_autosummary/navlie.utils.schedule_sequential_measurements.doctree new file mode 100644 index 00000000..2ea33361 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.utils.schedule_sequential_measurements.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.utils.set_axes_equal.doctree b/_build/doctrees/_autosummary/navlie.utils.set_axes_equal.doctree new file mode 100644 index 00000000..561c6e78 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.utils.set_axes_equal.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.utils.state_interp.doctree b/_build/doctrees/_autosummary/navlie.utils.state_interp.doctree new file mode 100644 index 00000000..302deafc Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.utils.state_interp.doctree differ diff --git a/_build/doctrees/_autosummary/navlie.utils.van_loans.doctree b/_build/doctrees/_autosummary/navlie.utils.van_loans.doctree new file mode 100644 index 00000000..a641c497 Binary files /dev/null and b/_build/doctrees/_autosummary/navlie.utils.van_loans.doctree differ diff --git a/_build/doctrees/api.doctree b/_build/doctrees/api.doctree new file mode 100644 index 00000000..d544bf41 Binary files /dev/null and b/_build/doctrees/api.doctree differ diff --git a/_build/doctrees/environment.pickle b/_build/doctrees/environment.pickle new file mode 100644 index 00000000..dea92b70 Binary files /dev/null and b/_build/doctrees/environment.pickle differ diff --git a/_build/doctrees/index.doctree b/_build/doctrees/index.doctree new file mode 100644 index 00000000..e44388cd Binary files /dev/null and b/_build/doctrees/index.doctree differ diff --git a/_build/doctrees/nbsphinx/tutorial/composite.ipynb b/_build/doctrees/nbsphinx/tutorial/composite.ipynb new file mode 100644 index 00000000..8a00bfdb --- /dev/null +++ b/_build/doctrees/nbsphinx/tutorial/composite.ipynb @@ -0,0 +1,406 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Composite States\n", + "\n", + "The [CompositeState](../_autosummary/navlie.composite.CompositeState.rst) is a class that allows you to arbitarily combine multiple states, potentially of different types, into a new state that can be used with the navlie framework.\n", + "\n", + "Let's consider the previous example where we used the following $SE(2)$ pose transformation matrix to represent the state:\n", + "\n", + "$$ \n", + "\\mathbf{T} = \\begin{bmatrix} \\mathbf{C}_{ab} & \\mathbf{r}_a \\\\ \\mathbf{0} & 1 \\end{bmatrix} \\in SE(2).\n", + "$$\n", + "\n", + "Suppose we now also want to estimate a wheel odometry bias $\\mathbf{b} \\in \\mathbb{R}^2$ in addition to the robot's pose. Our state is now \n", + "\n", + "$$\n", + "\\mathbf{x} = (\\mathbf{T}, \\mathbf{b}) \\in SE(2) \\times \\mathbb{R}^2.\n", + "$$\n", + "\n", + "This can be implemented easily using the [CompositeState](../_autosummary/navlie.composite.CompositeState.rst) class in one of two ways: either directly or by inheritance. We'll show the former approach first." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CompositeState(stamp=0.0, state_id=None) with substates:\n", + " SE2State(stamp=0.0, state_id=pose, direction=right)\n", + " [[ 0.99500417 -0.09983342 1.84679329]\n", + " [ 0.09983342 0.99500417 3.09491919]\n", + " [ 0. 0. 1. ]]\n", + " VectorState(stamp=0.0, dof=2, state_id=bias)\n", + " [0.1 2. ]\n" + ] + } + ], + "source": [ + "import navlie as nav \n", + "import numpy as np\n", + "\n", + "# Define the pose and bias as their own states\n", + "T = nav.lib.SE2State(value = [0.1, 2.0, 3.0], stamp = 0.0, state_id=\"pose\")\n", + "b = nav.lib.VectorState(value = [0.1, 2.0], stamp = 0.0, state_id=\"bias\")\n", + "\n", + "# Combine into a composite state, and its ready to use!\n", + "x = nav.CompositeState([T, b], stamp=0.0)\n", + "\n", + "print(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The ``CompositeState`` class is a subclass of the ``State`` class, but who's ``value`` is a list of states, referred to as the *substates*. A convenience of this class is that the composite state's ``plus``, ``minus``, and ``copy`` methods have already been implemented for you based on the implementations in the substates. Note that the order in which the states are listed is important, and will correspond to the order of the components in the vectors involved in the ``plus`` and ``minus`` operations. This can be demonstrated with the following example." + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Result after plus():\n", + "CompositeState(stamp=0.0, state_id=None) with substates:\n", + " SE2State(stamp=0.0, state_id=pose, direction=right)\n", + " [[ 0.45359612 -0.89120736 1.80531705]\n", + " [ 0.89120736 0.45359612 6.55185711]\n", + " [ 0. 0. 1. ]]\n", + " VectorState(stamp=0.0, dof=2, state_id=bias)\n", + " [4.1 7. ]\n", + "\n", + "Result after minus():\n", + "[[1.]\n", + " [2.]\n", + " [3.]\n", + " [4.]\n", + " [5.]]\n" + ] + } + ], + "source": [ + "# plus() and minus() have been defined for you. Here, the first three elements\n", + "# of the vector to be added correspond to the pose (since it has 3 DOF), and the\n", + "# last two to the bias.\n", + "x_temp = x.plus(np.array([1,2,3,4,5]))\n", + "print(\"\\nResult after plus():\")\n", + "print(x_temp)\n", + "\n", + "dx = x_temp.minus(x)\n", + "print(\"\\nResult after minus():\")\n", + "print(dx)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we must write a process model that works with this state. We'll use the same process model as before, but now we'll also include the wheel odometry bias in the state. The bias process model will be modelled as a random walk of the form \n", + "\n", + "$$\n", + "\\mathbf{b}_{k+1} = \\mathbf{b}_k + \\Delta t \\mathbf{w}^\\mathrm{bias}_k,\n", + "$$\n", + "\n", + "where $\\mathbf{w}^{\\mathrm{bias}}_k \\sim \\mathcal{N}(0, \\mathbf{Q}^{\\mathrm{bias}})$ represents random error associated with this otherwise constant process model, which allows the bias to slowly vary. The process model for the composite state is then" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [], + "source": [ + "from scipy.linalg import expm\n", + "\n", + "def wedge_se2(x):\n", + " return np.array([[ 0, -x[0], x[1]],\n", + " [x[0], 0, x[2]], \n", + " [ 0, 0, 0]])\n", + "\n", + "class WheeledRobotWithBias(nav.ProcessModel):\n", + " def __init__(self, input_covariance_matrix):\n", + " self.Q = input_covariance_matrix\n", + "\n", + " def evaluate(self, x: nav.CompositeState, u: nav.lib.VectorInput, dt:float):\n", + " pose = x.value[0]\n", + " bias = x.value[1]\n", + " vel = np.array([u.value[0] - bias.value[0], u.value[1] - bias.value[1], 0])\n", + " x_next = x.copy()\n", + " x_next.value[0].value = pose.value @ expm(wedge_se2(vel * dt))\n", + "\n", + " # Largely data generation and jacobian purposes, we also update the bias\n", + " # state with an input, even if the input here is always zero in the\n", + " # nominal case.\n", + " x_next.value[1].value = bias.value + u.value[2:4]*dt\n", + " return x_next\n", + " \n", + " def input_covariance(self, x: nav.CompositeState, u: nav.lib.VectorInput, dt:float):\n", + " return self.Q\n", + "\n", + "Q = np.eye(4) * 0.1**2\n", + "process_model = WheeledRobotWithBias(Q)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'd like to use the same measurement model as before, which was just a series of range measurements to known landmarks:" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [], + "source": [ + "class RangeToLandmarkSE2(nav.MeasurementModel):\n", + " def __init__(\n", + " self,\n", + " landmark_position: np.ndarray,\n", + " measurement_covariance: float,\n", + " ):\n", + " self.landmark_position = landmark_position\n", + " self.R = measurement_covariance\n", + "\n", + " def evaluate(self, x: nav.lib.SE2State):\n", + " pos = x.value[0:2, 2]\n", + " return np.linalg.norm(pos - self.landmark_position)\n", + "\n", + " def covariance(self, x: nav.lib.SE2State):\n", + " return self.R\n", + " \n", + "R = 0.1**2\n", + "landmarks = np.array([[1, 1], [1, 2], [2, 2], [2, 1]])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The problem is that this was made for an ``SE2State`` instead of our new composite state, and specifically the line `pos = x.value[0:2, 2]` is going to throw an error when we feed in a composite state. This is easy to change, but then that means we have to make a similar change for all sorts of different state definitions. An alternative is to use the [CompositeMeasurementModel](../_autosummary/navlie.composite.CompositeMeasurementModel.rst), which is just a lightweight wrapper around one measurement model that \"assigns\" the model to a specific substate, referenced to by its `state_id` field. It is used as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "RangeToLandmarkSE2(of substate pose)\n", + "Jacobian:\n", + "[[0. 0.46544123 0.88507893 0. 0. ]]\n" + ] + } + ], + "source": [ + "meas_models = []\n", + "for lm in landmarks:\n", + " meas_models.append(\n", + " nav.CompositeMeasurementModel(RangeToLandmarkSE2(lm, R), \"pose\")\n", + " )\n", + "\n", + "print(meas_models[0])\n", + "print(\"Jacobian:\")\n", + "print(meas_models[0].jacobian(x))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This does mean that the `state_id` of each substate must be unique, but this is a good practice anyway. The `CompositeMeasurementModel` will then automatically handle the extraction of the relevant substate from the composite state and pass it to the measurement model, as well as handle the corresponding Jacobian accordingly. This is a good way to avoid having to write a lot of boilerplate code for different state definitions. Notice in the above example that the Jacobian has two extra zeros at the end, which correspond to the bias state that has no effect on the measurement. This is automatically handled by the `CompositeMeasurementModel`.\n", + "\n", + "With our problem now set up, we can run a filter on it with the same snippet as usual!" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "dg = nav.DataGenerator(\n", + " process_model=process_model, \n", + " input_func=lambda t, x: np.array([0.5, 0.3, 0.0, 0.0]), \n", + " input_covariance= Q, \n", + " input_freq=50, \n", + " meas_model_list=meas_models, \n", + " meas_freq_list=[10, 10, 10, 10] \n", + ")\n", + "\n", + "state_data, input_data, meas_data = dg.generate(x, start=0, stop=30, noise=True)\n", + "\n", + "# First, define the filter\n", + "kalman_filter = nav.ExtendedKalmanFilter(process_model)\n", + "P0 = np.diag([0.1**2, 1**2, 1**2, 0.1**2, 0.1**2]) # Initial covariance\n", + "x = nav.StateWithCovariance(x, P0) # Estimate and covariance in one container\n", + "\n", + "meas_idx = 0\n", + "y = meas_data[meas_idx]\n", + "estimates = []\n", + "for k in range(len(input_data) - 1):\n", + " u = input_data[k]\n", + "\n", + " # Fuse any measurements that have occurred.\n", + " while y.stamp < input_data[k + 1].stamp and meas_idx < len(meas_data):\n", + " x = kalman_filter.correct(x, y, u)\n", + "\n", + " # Load the next measurement\n", + " meas_idx += 1\n", + " if meas_idx < len(meas_data):\n", + " y = meas_data[meas_idx]\n", + "\n", + " # Predict until the next input is available\n", + " dt = input_data[k + 1].stamp - x.state.stamp\n", + " x = kalman_filter.predict(x, u, dt)\n", + "\n", + " estimates.append(x.copy())\n", + "\n", + "\n", + "results = nav.GaussianResultList.from_estimates(estimates, state_data)\n", + "\n", + "import matplotlib.pyplot as plt\n", + "fig, axs = nav.plot_error(results)\n", + "axs[0,0].set_title(\"Pose Estimation Errors\")\n", + "axs[0,0].set_ylabel(\"theta (rad)\")\n", + "axs[1,0].set_ylabel(\"x (m)\")\n", + "axs[2,0].set_ylabel(\"y (m)\")\n", + "axs[2,0].set_xlabel(\"Time (s)\")\n", + "axs[0, 1].set_title(\"Bias Estimation Errors\")\n", + "axs[0, 1].set_ylabel(\"ang. vel. (rad/s)\")\n", + "axs[1, 1].set_ylabel(\"forward vel. (m/s)\")\n", + "axs[1, 1].set_xlabel(\"Time (s)\")\n", + "\n", + "fig, ax = nav.plot_nees(results)\n", + "ax.set_title(\"NEES\")\n", + "ax.set_xlabel(\"Time (s)\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inheriting from `CompositeState`\n", + "\n", + "The previous example showed how to use the `CompositeState` class directly, but it's also possible to inherit from it. This is useful if you want to add some extra methods or attributes to the composite state, or if you are going to frequently be using the same composite state. Here's an example of how you would do it:" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WheeledRobotState(stamp=0.1, state_id=None) with substates:\n", + " SE2State(stamp=0.1, state_id=pose, direction=right)\n", + " [[ 0.99500417 -0.09983342 1.84679329]\n", + " [ 0.09983342 0.99500417 3.09491919]\n", + " [ 0. 0. 1. ]]\n", + " VectorState(stamp=0.1, dof=2, state_id=bias)\n", + " [0.1 2. ]\n", + "SE2State(stamp=0.1, state_id=pose, direction=right)\n", + " [[ 0.99500417 -0.09983342 1.84679329]\n", + " [ 0.09983342 0.99500417 3.09491919]\n", + " [ 0. 0. 1. ]]\n" + ] + } + ], + "source": [ + "class WheeledRobotState(nav.CompositeState):\n", + " def __init__(self, pose_values: np.ndarray, bias_values: np.ndarray, stamp: float):\n", + " pose = nav.lib.SE2State(pose_values, stamp=stamp, state_id=\"pose\")\n", + " bias = nav.lib.VectorState(bias_values, stamp=stamp, state_id=\"bias\")\n", + " super().__init__([pose, bias], stamp=stamp)\n", + "\n", + " # Define any getter that you want for convenience! \n", + " @property\n", + " def pose(self):\n", + " return self.value[0]\n", + "\n", + " @property\n", + " def bias(self):\n", + " return self.value[1]\n", + "\n", + " def copy(self):\n", + " return WheeledRobotState(self.pose.copy(), self.bias.copy())\n", + " \n", + "x = WheeledRobotState([0.1, 2.0, 3.0], [0.1, 2.0], stamp = 0.1)\n", + "print(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This can end up looking a lot cleaner, and is potentially more flexible to work with since you can add methods and attributes to the composite state. For example, because of the getters we defined above, we can access the pose and bias more ergonomically with `x.pose` and `x.bias`." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.16" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_build/doctrees/nbsphinx/tutorial/jacobians.ipynb b/_build/doctrees/nbsphinx/tutorial/jacobians.ipynb new file mode 100644 index 00000000..49b93bd8 --- /dev/null +++ b/_build/doctrees/nbsphinx/tutorial/jacobians.ipynb @@ -0,0 +1,340 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Jacobians in navlie\n", + "\n", + "As you may know, many state estimation algorithm require access to process model and measurement model Jacobians, with respect to the state and sometimes other inputs. For states belonging to Lie groups, algorithms will require _Lie Jacobians_, which differ from traditional derivatives as they conform to the constraints of the group. The abstraction provided by the $\\oplus$ and $\\ominus$ operators (implemented with `State.plus` and `State.minus` respectively) allow for a generic definition of a derivative:\n", + "\n", + "$$\n", + "\\left.\\frac{D f(\\mathcal{X})}{D \\mathcal{X}}\\right|_{\\bar{\\mathcal{X}} }\\triangleq \\left.\\frac{\\partial f(\\bar{\\mathcal{X}} \\oplus \\delta \\mathbf{x}) \\ominus f(\\bar{\\mathcal{X}})}{\\partial \\delta \\mathbf{x}}\\right|_{\\delta \\mathbf{x} = \\mathbf{0}},\n", + "$$\n", + "\n", + "which can be shown to fall back to a traditional derivatives when $\\oplus$ and $\\ominus$ are defined to be regular addition/subtraction. This derivative definition is used universally throughout navlie, and roughly follows what is done in the [Micro Lie Theory paper](https://arxiv.org/pdf/1812.01537.pdf). In that reference, seperate definitions are given for \"left\" and \"right\" derivatives, whereas we have aggregated them into a single definition, with left and right derivatives naturally arising from the choice of $\\oplus$ and $\\ominus$ operators.\n", + "\n", + "If you dont want to worry about this, the good news is that navlie computes Lie Jacobians for you by default using finite difference. However, finite difference can have some drawbacks, such as being computationally expensive and less accurate than analytic derivatives. In this notebook, we will show you how to use analytic derivatives in navlie, which offer the maximum accuracy and speed.\n", + "\n", + "## Jacobians - Traditional Approach\n", + "Recall the traditional approach to the previous example. We had defined the state to be $\\mathbf{x} = [\\theta, x, y]^T$ and the process model to be\n", + "\n", + "$$ \n", + "\\begin{aligned}\n", + "\\theta_{k+1} &= \\theta_k + \\omega_k \\Delta t \\\\\n", + "x_{k+1} &= x_k + v_k \\cos(\\theta_k) \\Delta t \\\\\n", + "y_{k+1} &= y_k + v_k \\sin(\\theta_k) \\Delta t\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "where $\\omega_k$ is the angular velocity and $v_k$ is the linear velocity. Since the state is just a regular vector, Lie Jacobians fall back to regular Jacobians, and standard derivative techniques lead to the following expressions for the process model Jacobian with respect to the state\n", + "\n", + "$$\n", + "\\mathbf{F} := \\frac{\\partial f(\\mathbf{x}_k, \\mathbf{u}_k)}{\\partial \\mathbf{x}_k} = \\begin{bmatrix} 1 & 0 & 0 \\\\ -v_k \\sin(\\theta_k) \\Delta t & 1 & 0 \\\\ v_k \\cos(\\theta_k) \\Delta t & 0 & 1 \\end{bmatrix}\n", + "$$\n", + "\n", + "To implement this Jacobian in navlie, all we need to do is override the `jacobian()` method in our process model, and it will get used automatically by the estimation algorithms. Adding this to our process model from before:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import navlie as nav\n", + "import numpy as np\n", + "\n", + "from navlie.lib import VectorInput, VectorState\n", + "\n", + "Q = np.eye(2) * 0.1**2 # Input noise covariance with 0.1 m/s of standard deviation\n", + "\n", + "class WheeledRobot(nav.ProcessModel):\n", + " def __init__(self, input_covariance):\n", + " self.Q = input_covariance\n", + "\n", + " def evaluate(self, x: VectorState, u: VectorInput, dt: float) -> VectorState:\n", + " x_next = x.copy()\n", + " x_next.value[0] += u.value[0] * dt\n", + " x_next.value[1] += u.value[1] * dt * np.cos(x.value[0])\n", + " x_next.value[2] += u.value[1] * dt * np.sin(x.value[0])\n", + " return x_next\n", + "\n", + " def input_covariance(self, x: VectorState, u: VectorInput, dt: float) -> np.ndarray:\n", + " return self.Q\n", + " \n", + " def jacobian(self, x:VectorState, u: VectorInput, dt: float) -> np.ndarray:\n", + " F = np.eye(3)\n", + " F[1, 0] = -u.value[1] * dt * np.sin(x.value[0])\n", + " F[2, 0] = u.value[1] * dt * np.cos(x.value[0])\n", + " return F\n", + "\n", + "process_model = WheeledRobot(Q) # instantiate it" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, lets just double check that we did everything correctly by comparing with finite difference. All process models inherit the `jacobian_fd()` method, which computes the Jacobian using finite difference. We can use this to compare with our analytic Jacobian." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Analyical:\n", + "[[ 1. 0. 0. ]\n", + " [-0.01682942 1. 0. ]\n", + " [ 0.01080605 0. 1. ]]\n", + "\n", + "Finite difference:\n", + "[[ 1. 0. 0. ]\n", + " [-0.01682943 1. 0. ]\n", + " [ 0.01080604 0. 1. ]]\n" + ] + } + ], + "source": [ + "x = VectorState([1,2,3]) \n", + "u = VectorInput([0.1, 0.2]) \n", + "dt = 0.1 \n", + "\n", + "print(\"Analyical:\")\n", + "print(process_model.jacobian(x, u, dt))\n", + "\n", + "print(\"\\nFinite difference:\")\n", + "print(process_model.jacobian_fd(x, u, dt))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The Jacobians match almost perfectly, but differ slightly due to errors in finite difference. This is expected, as finite difference is only an approximation. Nevertheless, finite difference is generally sufficiently accurate for most applications.\n", + "\n", + "
\n", + "Note: The `jacobian` methods must *always* return a 2D array.\n", + "
\n", + "\n", + "\n", + "\n", + "Moving on to the measurement model, which was previously defined to be \n", + "\n", + "$$\n", + "\\mathbf{y}_k = || \\mathbf{r}_k - \\boldsymbol{\\ell}^{(i)} || \n", + "$$ \n", + "\n", + "where $\\mathbf{r}_k$ is the robot's position and $\\boldsymbol{\\ell}^{(i)}$ is the $i$th landmark. The measurement model Jacobian with respect to the state is\n", + "\n", + "$$ \n", + "\\mathbf{G} := \\frac{\\partial g(\\mathbf{x}_k)}{\\partial \\mathbf{x}_k} = \\begin{bmatrix} 0 & \\frac{(\\mathbf{r}_k - \\boldsymbol{\\ell}^{(i)})^T}{||(\\mathbf{r}_k - \\boldsymbol{\\ell}^{(i)})||} \\end{bmatrix},\n", + "$$\n", + "\n", + "and we can implement this in navlie by again overriding the `jacobian()` method in our measurement model. Adding this to our measurement model from before:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Analyical:\n", + "[[0. 0.70710678 0.70710678]]\n", + "\n", + "Finite difference:\n", + "[[0. 0.70710696 0.70710696]]\n" + ] + } + ], + "source": [ + "class RangeToLandmark(nav.MeasurementModel):\n", + " def __init__(self, landmark_position: np.ndarray):\n", + " self.landmark_position = landmark_position\n", + "\n", + " def evaluate(self, x: VectorState) -> np.ndarray:\n", + " return np.linalg.norm(x.value[1:] - self.landmark_position)\n", + " \n", + " def covariance(self, x: VectorState) -> np.ndarray:\n", + " return 0.1**2\n", + " \n", + " def jacobian(self, x: VectorState) -> np.ndarray:\n", + " G = np.zeros((1, 3))\n", + " r = x.value[1:]\n", + " G[0,1:] = (r - self.landmark_position) / np.linalg.norm(r - self.landmark_position)\n", + " return G\n", + " \n", + "meas_model = RangeToLandmark(np.array([1, 2]))\n", + "\n", + "print(\"\\nAnalyical:\")\n", + "print(meas_model.jacobian(x))\n", + "\n", + "print(\"\\nFinite difference:\")\n", + "print(meas_model.jacobian_fd(x))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can again see that the results match nicely." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Jacobians - Lie Group Approach \n", + "\n", + "Now, lets see how to implement analytical Jacobians when states belong to Lie groups. In the previous example the state was $\\mathbf{T} \\in SE(2)$ and the process model was\n", + "\n", + "$$\n", + "\\mathbf{T}_{k+1} = \\mathbf{T}_k \\exp(\\boldsymbol{\\varpi}^\\wedge_k \\Delta t).\n", + "$$\n", + "\n", + "To derive the Jacobian, we can \"perturb\" both sides of the equation and manipulate. This is a common technique for deriving Lie Jacobians, and for computing matrix-vector derivatives in general. For more details, we recommend reading [State Estimation for Robotics by Tim Barfoot](http://asrl.utias.utoronto.ca/~tdb/bib/barfoot_ser17.pdf).\n", + "\n", + "$$ \n", + "\\begin{aligned}\n", + "\\mathbf{T}_{k+1} &= \\mathbf{T}_k \\exp(\\boldsymbol{\\varpi}^\\wedge_k \\Delta t) \\\\\n", + "\\bar{\\mathbf{T}}_{k+1} \\exp(\\delta \\boldsymbol{\\xi}_{k+1}^\\wedge) &= \\bar{\\mathbf{T}}_{k} \\exp(\\delta \\boldsymbol{\\xi}_{k}^\\wedge) \\exp(\\boldsymbol{\\varpi}^\\wedge_k \\Delta t) \\\\\n", + " \\exp(\\delta \\boldsymbol{\\xi}_{k+1}^\\wedge) &= \\underbrace{\\bar{\\mathbf{T}}_{k+1}^{-1} \\bar{\\mathbf{T}}_{k}}_{\\exp(\\boldsymbol{\\varpi}^\\wedge \\Delta t)^{-1}} \\exp(\\delta \\boldsymbol{\\xi}_{k}^\\wedge) \\exp(\\boldsymbol{\\varpi}^\\wedge_k \\Delta t) \\\\\n", + " \\exp(\\delta \\boldsymbol{\\xi}_{k+1}^\\wedge) &= \\exp((\\mathbf{Ad}(\\exp(\\boldsymbol{\\varpi}^\\wedge \\Delta t)^{-1}) \\delta \\boldsymbol{\\xi}_{k})^\\wedge) \\\\\n", + " \\delta \\boldsymbol{\\xi}_{k+1} &= \\underbrace{\\mathbf{Ad}(\\exp(\\boldsymbol{\\varpi}^\\wedge \\Delta t)^{-1})}_{\\mathbf{F}} \\delta \\boldsymbol{\\xi}_{k}\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "There, we used the _adjoint matrix_ $\\mathbf{Ad}(\\cdot)$, to invoke the identity $\\mathbf{X}^{-1} \\exp(\\boldsymbol{\\xi}^\\wedge) \\mathbf{X} = \\exp(\\mathbf{Ad}(\\mathbf{X}) \\boldsymbol{\\xi}^\\wedge)$, which is true for any $\\mathbf{X} \\in SE(2)$. The adjoint matrix for $SE(2)$ is given by \n", + "\n", + "$$ \n", + "\\mathbf{Ad}(\\mathbf{T}) = \\begin{bmatrix} 1 & \\mathbf{0} \\\\ - \\boldsymbol{\\Omega} \\mathbf{r} & \\mathbf{C} \\end{bmatrix}\n", + "$$\n", + "\n", + "where $\\boldsymbol{\\Omega} = \\begin{bmatrix} 0 & -1 \\\\ 1 \n", + "&0 \\end{bmatrix}$.\n", + "\n", + "
\n", + "Note: in this Jacobian derivation, we perturbed the state $\\mathbf{T} = \\bar{\\mathbf{T}} \\exp(\\delta \\boldsymbol{\\xi}^\\wedge)$ \"on the right\" because that corresponds to what was implemented in the `plus()` method of our `SE2State` class. It is important to be consistent here for everything to work.\n", + "
\n", + "\n", + "Now, we can implement this Jacobian in navlie by overriding the `jacobian()` method in our process model. Adding this to our process model from before:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Analyical:\n", + "[[ 1. 0. 0. ]\n", + " [ 0.0394695 0.92106099 0.38941834]\n", + " [ 0.19470917 -0.38941834 0.92106099]]\n", + "\n", + "Finite difference:\n", + "[[ 1.00000000e+00 -1.10747782e-11 -1.10747782e-11]\n", + " [ 3.94695038e-02 9.21060995e-01 3.89418343e-01]\n", + " [ 1.94709171e-01 -3.89418342e-01 9.21060994e-01]]\n" + ] + } + ], + "source": [ + "from navlie.lib import SE2State, VectorInput\n", + "from scipy.linalg import expm\n", + "\n", + "\n", + "def wedge_se2(x:np):\n", + " return np.array([[ 0, -x[0], x[1]],\n", + " [x[0], 0, x[2]], \n", + " [ 0, 0, 0]])\n", + "\n", + "def adjoint_se2(T:np.ndarray):\n", + " C = T[:2, :2]\n", + " r = T[:2, 2]\n", + " Omega = np.array([[0, -1], [1, 0]])\n", + " Ad = np.zeros((3,3))\n", + " Ad[0,0] = 1\n", + " Ad[1:,1:] = C\n", + " Ad[1:,0] = - Omega @ r\n", + " return Ad\n", + "\n", + "\n", + "class WheeledRobotSE2(nav.ProcessModel):\n", + " def __init__(self, input_covariance_matrix):\n", + " self.Q = input_covariance_matrix\n", + "\n", + " def evaluate(self, x:SE2State, u:VectorInput, dt:float):\n", + " u = np.array([u.value[0], u.value[1], 0])\n", + " x_next = x.copy()\n", + " x_next.value = x.value @ expm(wedge_se2(u * dt))\n", + " return x_next\n", + " def input_covariance(self, x:SE2State, u:VectorInput, dt:float):\n", + " return self.Q\n", + "\n", + " def jacobian(self, x:SE2State, u:VectorInput, dt:float):\n", + " u = np.array([u.value[0], u.value[1], 0])\n", + " return adjoint_se2(expm(-wedge_se2(u * dt)))\n", + "\n", + "Q = np.eye(2) * 0.1**2\n", + "process_model = WheeledRobotSE2(Q)\n", + "x = SE2State(expm(wedge_se2(np.array([1,2,3]))))\n", + "u = VectorInput([4, 2])\n", + "dt = 0.1\n", + "\n", + "print(\"\\nAnalyical:\")\n", + "print(process_model.jacobian(x, u, dt))\n", + "\n", + "print(\"\\nFinite difference:\")\n", + "print(process_model.jacobian_fd(x, u, dt))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that when using Lie groups, our Jacobian no longer has dependence on the state itself. This can be a tangible advantage when the state estimate has high uncertainty, where using a traditional approach can result in excessive linearization errors when the state estimate is far from the true value." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.16" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_build/doctrees/nbsphinx/tutorial/lie_groups.ipynb b/_build/doctrees/nbsphinx/tutorial/lie_groups.ipynb new file mode 100644 index 00000000..75ce7373 --- /dev/null +++ b/_build/doctrees/nbsphinx/tutorial/lie_groups.ipynb @@ -0,0 +1,424 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Toy Problem - Lie group approach\n", + "\n", + "![Toy Problem](../toy_problem.png)\n", + "\n", + "Another way we could approach the same state estimation task is to instead use Lie group theory, which is becoming increasingly common practice in state estimation. Lie group theory can be very abstract, and the main references that navlie refer to are the following:\n", + "\n", + "1. [A micro Lie theory for state estimation in robotics](https://arxiv.org/abs/1812.01537)\n", + "2. [T.Barfoot, State Estimation for Robotics](http://asrl.utias.utoronto.ca/~tdb/bib/barfoot_ser17.pdf)\n", + "\n", + "\n", + "## Define the State\n", + "Instead of representing the state using a vector, we will represent the state using an element of the *special Euclidean group* $SE(2)$, sometimes called *pose transformation matrices*. Elements of this group are 3x3 matrices of the form \n", + "\n", + "$$ \n", + "\\mathbf{T} = \\begin{bmatrix} \\mathbf{C}_{ab}(\\theta) & \\mathbf{r}_a \\\\ \\mathbf{0} & 1 \\end{bmatrix} \\in SE(2)\n", + "$$\n", + "\n", + "where $\\mathbf{r}_a = [x,y]^T$ again denotes the position of the robot and $\\mathbf{C}_{ab}(\\theta) \\in SO(2)$ is a rotation matrix (sometimes called a direction cosine matrix) with the form \n", + "\n", + "$$ \n", + "\\mathbf{C}_{ab}(\\theta) = \\begin{bmatrix} \\cos \\theta & - \\sin \\theta \\\\ \\sin \\theta & \\cos \\theta \\end{bmatrix}.\n", + "$$\n", + "\n", + "The rotation matrix transforms vectors resolved in one frame to another frame, i.e. $\\mathbf{r}_a = \\mathbf{C}_{ab} \\mathbf{r}_b$. Unlike vectors, elements of $SO(2)$ or $SE(2)$ cannot be added together to produce another valid element of $SE(2)$, but they can be multiplied together with the result still having the same form.\n", + "\n", + "$$\n", + "\\mathbf{T}_1 \\mathbf{T}_2 \\in SE(2)\n", + "$$\n", + "\n", + " To proceed further with our mathematical setup, we need to define a few very common operators seen in Lie group theory. The first two are the \"wedge\" $(\\cdot)^\\wedge$ and \"vee\" $(\\cdot)^\\vee$ operators, which for this specific group has the form\n", + "\n", + "$$ \n", + "\\begin{bmatrix} \\theta \\\\ x \\\\ y \\end{bmatrix}^\\wedge = \\begin{bmatrix} 0 & -\\theta & x \\\\ \\theta & 0 & y \\\\ 0 & 0 & 0 \\end{bmatrix}\n", + "$$\n", + "\n", + "and the $(\\cdot)^\\vee$ operator simply does the exact inverse of $(\\cdot)^\\wedge$. We can implement them as follows.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "%reset -f\n", + "import numpy as np\n", + "\n", + "# Helper functions for SE(2)\n", + "def wedge_se2(x):\n", + " return np.array([[ 0, -x[0], x[1]],\n", + " [x[0], 0, x[2]], \n", + " [ 0, 0, 0]])\n", + "\n", + "def vee_se2(X):\n", + " return np.array([X[1, 0], X[0, 2], X[1, 2]])\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Two other fundamental relationships appearing in Lie group theory are the exponential (denoted $\\exp$) and logarithmic (denoted $\\log$) maps. While these have a deeper definition, for our case it suffices to think of them as simply the [matrix exponential](https://en.wikipedia.org/wiki/Matrix_exponential) and [matrix logarithm](https://en.wikipedia.org/wiki/Logarithm_of_a_matrix). Using the wedge and vee operators for $SE(2)$ defined above, we can convert a 3x1 vector to an $SE(2)$ element and back as follows" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "An element of SE2:\n", + "[[ 0.99500417 -0.09983342 0.18467933]\n", + " [ 0.09983342 0.99500417 0.30949192]\n", + " [ 0. 0. 1. ]]\n", + "\n", + "The original vector 'representing' it:\n", + "[0.1 0.2 0.3]\n" + ] + } + ], + "source": [ + "from scipy.linalg import expm, logm\n", + "\n", + "T = expm(wedge_se2(np.array([0.1, 0.2, 0.3])))\n", + "print(\"An element of SE2:\")\n", + "print(T)\n", + "\n", + "x = vee_se2(logm(T))\n", + "print(\"\\nThe original vector 'representing' it:\")\n", + "print(x)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now have the tools we need to abstract-ify our problem a little bit. As commonly seen in the literature, we can define the so-called \"oplus\" and \"ominus\" operators as follows (sometimes called \"boxplus\" $\\boxplus$ and \"boxminus\" $\\boxminus$):\n", + "\n", + "$$\n", + "\\begin{aligned}\n", + "\\mathbf{T}_2 &= \\mathbf{T}_1 \\oplus \\boldsymbol{\\xi} := \\mathbf{T}_1 \\exp(\\boldsymbol{\\xi}^\\wedge) \\\\\n", + "\\boldsymbol{\\varepsilon} &= \\mathbf{T}_2 \\ominus \\mathbf{T}_1 := \\log(\\mathbf{T}_2^{-1} \\mathbf{T}_1)^\\vee\n", + "\\end{aligned}\n", + "$$ \n", + "\n", + "Here, both $\\boldsymbol{\\varepsilon}, \\boldsymbol{\\xi} \\in \\mathbb{R}^3$ are 3x1 vectors. The $\\oplus: SE(2) \\times \\mathbb{R}^3 \\to SE(2)$ operator \"adds\" a vector to an $SE(2)$ element to produce another $SE(2)$ element, and the $\\ominus:SE(2) \\times SE(2) \\to \\mathbb{R}^3$ operator \"subtracts\" two $SE(2)$ elements to produce a vector that represents the \"difference\" between them. \n", + "\n", + "\n", + "With this context, lets implement an $SE(2)$ state inside navlie's framework. To define a custom state, you must subclass the `nav.State` abstract class and you *must* implement the `plus`, `minus`, and `copy` methods. These methods play exactly the role of $\\oplus$ and $\\ominus$ described above, while the `copy` method is used to create a deep copy of that state object. In addition, state objects must hold an integer property named `dof` that specifies the *degrees of freedom* associated with that state. For $SE(2)$, this is 3." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "SE2State(stamp=0.0, dof=3, state_id=None)\n", + " [[1. 0. 0.]\n", + " [0. 1. 0.]\n", + " [0. 0. 1.]]\n" + ] + } + ], + "source": [ + "import navlie as nav\n", + "\n", + "class SE2State(nav.State):\n", + " def __init__(self, value :np.ndarray, stamp: float):\n", + " super().__init__(value=value, dof=3, stamp=stamp)\n", + "\n", + " def plus(self, dx: np.ndarray):\n", + " new_value = self.value @ expm(wedge_se2(dx))\n", + " return SE2State(new_value, self.stamp)\n", + "\n", + " def minus(self, other: \"SE2State\"):\n", + " other_inv = np.linalg.inv(other.value)\n", + " return vee_se2(logm(other_inv @ self.value))\n", + " \n", + " def copy(self):\n", + " return SE2State(self.value.copy(), self.stamp)\n", + "\n", + "x = SE2State(np.eye(3), 0.0)\n", + "print(x)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Define the Process Model\n", + "\n", + "Now, we must adapt the process model to work with our new `SE2State`. It is well known that the rotational kinematics can be written directly in terms of rotation matrices using \n", + "\n", + "$$ \n", + "\\dot{\\mathbf{C}}_{ab} = \\mathbf{C}_{ab}\\begin{bmatrix}0 & -\\omega \\\\ \\omega & 0 \\end{bmatrix} \n", + "$$\n", + "\n", + "and that the translational kinematics can be written in vector form using \n", + "\n", + "$$ \n", + "\\dot{\\mathbf{r}}_a = \\mathbf{C}_{ab} \\begin{bmatrix} v \\\\ 0 \\end{bmatrix} .\n", + "$$\n", + "\n", + "By stacking these into matrices it follows that \n", + "$$ \n", + "\\dot{\\mathbf{T}} = \\mathbf{T} \\boldsymbol{\\varpi}^\\wedge\n", + "$$\n", + "\n", + "where $\\boldsymbol{\\varpi} = [\\omega, v, 0]^T$. This equation is now a linear, matrix-valued ODE, and can be integrated exactly over a short duration $\\Delta t = t_{k+1} - t_k$ using the matrix exponential. This gives us the following discrete-time process model:\n", + "\n", + "$$\n", + "\\mathbf{T}_{k+1} = \\mathbf{T}_k \\exp(\\boldsymbol{\\varpi}_k^\\wedge \\Delta t)\n", + "$$\n", + "\n", + "which we can implement as follows" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "class WheeledRobotSE2(nav.ProcessModel):\n", + " def __init__(self, input_covariance_matrix):\n", + " self.Q = input_covariance_matrix\n", + "\n", + " def evaluate(self, x:SE2State, u:nav.lib.VectorInput, dt:float):\n", + " vel = np.array([u.value[0], u.value[1], 0])\n", + " x_next = x.copy()\n", + " x_next.value = x.value @ expm(wedge_se2(vel * dt))\n", + " return x_next\n", + " \n", + " def input_covariance(self, x:SE2State, u:nav.lib.VectorInput, dt:float):\n", + " return self.Q\n", + "\n", + "Q = np.eye(2) * 0.1**2\n", + "process_model = WheeledRobotSE2(Q)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Define the Measurement Model\n", + "\n", + "Finally, our measurement model remains largely unchanged. We just need to extract the position from an `SE2State` object now, as done below." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "class RangeToLandmarkSE2(nav.MeasurementModel):\n", + " def __init__(\n", + " self,\n", + " landmark_position: np.ndarray,\n", + " measurement_covariance: float,\n", + " ):\n", + " self.landmark_position = landmark_position\n", + " self.R = measurement_covariance\n", + "\n", + " def evaluate(self, x: SE2State):\n", + " pos = x.value[0:2, 2]\n", + " return np.linalg.norm(pos - self.landmark_position)\n", + "\n", + " def covariance(self, x: SE2State):\n", + " return self.R\n", + " \n", + "\n", + "landmarks = np.array([[1, 1], [1, 2], [2, 2], [2, 1]])\n", + "meas_models = [RangeToLandmarkSE2(landmark, 0.1**2) for landmark in landmarks]" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run the Filter!\n", + "\n", + "And that's it! All remaining snippets are now _literally_ copy-pasted from our previous approach with zero modifications. Using the abstraction framework in navlie, we can easily switch between different state representations and process/measurement models without having to change any of data generation or filtering code. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "SE2State(stamp=0.02, dof=3, state_id=None)\n", + " [[ 9.99950000e-01 -9.99983333e-03 5.99990000e-03]\n", + " [ 9.99983333e-03 9.99950000e-01 2.99997500e-05]\n", + " [ 0.00000000e+00 0.00000000e+00 1.00000000e+00]]\n", + "VectorInput(stamp=0.04, state_id=None)\n", + " [0.52438924 0.40056502]\n", + "Measurement(stamp=0.0, state_id=None) of PoseRangeToLandMark\n", + " 2.299276237837416\n" + ] + } + ], + "source": [ + "dg = nav.DataGenerator(\n", + " process_model=process_model, # process model to use\n", + " input_func=lambda t, x: np.array([0.5, 0.3]), # a callable that specifies the input values over time\n", + " input_covariance= Q, # numpy array or callable that specifies the input covariance over time\n", + " input_freq=50, # the frequency (Hz) at which the input is sampled (and the process model integrated)\n", + " meas_model_list=meas_models, # a list of measurement models to use\n", + " meas_freq_list=[10, 10, 10, 10] # corresponding measurement frequencies (Hz)\n", + ")\n", + "\n", + "state_data, input_data, meas_data = dg.generate(x, start=0, stop=30, noise=True)\n", + "\n", + "print(state_data[1])\n", + "print(input_data[2])\n", + "print(meas_data[3])" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# First, define the filter\n", + "kalman_filter = nav.ExtendedKalmanFilter(process_model)\n", + "P0 = np.diag([0.1**2, 1**2, 1**2]) # Initial covariance\n", + "x = nav.StateWithCovariance(x, P0) # Estimate and covariance in one container\n", + "\n", + "meas_idx = 0\n", + "y = meas_data[meas_idx]\n", + "estimates = []\n", + "for k in range(len(input_data) - 1):\n", + " u = input_data[k]\n", + "\n", + " # Fuse any measurements that have occurred.\n", + " while y.stamp < input_data[k + 1].stamp and meas_idx < len(meas_data):\n", + " x = kalman_filter.correct(x, y, u)\n", + "\n", + " # Load the next measurement\n", + " meas_idx += 1\n", + " if meas_idx < len(meas_data):\n", + " y = meas_data[meas_idx]\n", + "\n", + " # Predict until the next input is available\n", + " dt = input_data[k + 1].stamp - x.state.stamp\n", + " x = kalman_filter.predict(x, u, dt)\n", + "\n", + " estimates.append(x.copy())\n", + "\n", + "\n", + "results = nav.GaussianResultList.from_estimates(estimates, state_data)\n", + "\n", + "import matplotlib.pyplot as plt\n", + "fig, axs = nav.plot_error(results)\n", + "axs[0].set_title(\"Estimation Errors\")\n", + "axs[0].set_ylabel(\"theta (rad)\")\n", + "axs[1].set_ylabel(\"x (m)\")\n", + "axs[2].set_ylabel(\"y (m)\")\n", + "axs[2].set_xlabel(\"Time (s)\")\n", + "\n", + "fig, ax = nav.plot_nees(results)\n", + "ax.set_title(\"NEES\")\n", + "ax.set_xlabel(\"Time (s)\")\n", + "plt.show()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Built-in Lie group states \n", + "While we implemented our own `SE2State` from scratch here for pedagogical purposes, navlie comes with many built-in Lie group states that you can use out of the box. Some of the built-in Lie group states include:\n", + "\n", + "- `nav.lib.SO2State`: representing 2D rotations using, beloning to the group $SO(2)$\n", + "- `nav.lib.SO3State`: representing 3D rotations using, beloning to the group $SO(3)$\n", + "- `nav.lib.SE2State`: representing 2D poses using, beloning to the group $SE(2)$\n", + "- `nav.lib.SE3State`: representing 3D poses using, beloning to the group $SE(3)$\n", + "- `nav.lib.SE23State`: representing \"extended\" poses that also contain velocity information, belonging to the group $SE_2(3)$\n", + "- `nav.lib.SL3State`: representing 3D homographies, belonging to the group $SL(3)$\n", + "\n", + "Each of these classes stores the value as a square numpy array in the `x.value` property. Moreover, closed-form formulas for the exponential and logarithmic maps have been implemented for each of these states, which is faster than using `scipy.linalg.expm` and `scipy.linalg.logm`. These underlying operations have even been implemented in C++ for maximum speed. " + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.16" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_build/doctrees/nbsphinx/tutorial/traditional.ipynb b/_build/doctrees/nbsphinx/tutorial/traditional.ipynb new file mode 100644 index 00000000..4db74a60 --- /dev/null +++ b/_build/doctrees/nbsphinx/tutorial/traditional.ipynb @@ -0,0 +1,392 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Toy Problem - Traditional Approach\n", + "\n", + "In this tutorial, we'll simulate a simple 2D localization problem as per the figure below. We'll assume that we have a robot following a simple body-frame-velocity model, which has access to noisy measurements of its forward velocity $v$ and angular velocity $\\omega$. In addition, this robot will have a time-of-flight sensor that gives it range measurements to a few known landmarks in the environment. \n", + "\n", + "![Toy Problem](../toy_problem.png)\n", + "\n", + "\n", + "## Define the State\n", + "The first step is to define the state of the robot. We'll start with a more traditional approach and define the state of the robot to be a vector of the form $\\mathbf{x} = [\\theta, x, y ]^T$, where $x$ and $y$ are the robot's position in the world and $\\theta$ is its orientation. We'll also define the control inputs to be $\\mathbf{u} = [\\omega, v]^T$, the robot's forward and angular velocity. The process (motion) model of the robot is then given by:\n", + "\n", + "$$\n", + "\\begin{aligned}\n", + " \\dot{\\theta} &= \\omega,\\\\\n", + " \\dot{x} &= v \\cos(\\theta), \\\\\n", + " \\dot{y} &= v \\sin(\\theta). \n", + "\\end{aligned}\n", + "$$\n", + "\n", + "However, this is in continuous time, and we need to discretize it to use it in a filter. For now, we'll use the simple Euler discretization method, which gives us the following discrete-time process model:\n", + "\n", + "$$\n", + "\\begin{aligned}\n", + " \\theta_{k+1} &= \\theta_k + \\omega_k \\Delta t, \\\\\n", + " x_{k+1} &= x_k + v_k \\cos(\\theta_k) \\Delta t, \\\\\n", + " y_{k+1} &= y_k + v_k \\sin(\\theta_k) \\Delta t.\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "Lets now code up our state and process model using navlie's framework. Since our state is just a regular 3x1 vector, we can use a standard type from the built-in library: [navlie.lib.VectorState](../_autosummary/navlie.lib.states.VectorState.rst)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "VectorState(stamp=0.0, dof=3, state_id=None)\n", + " [0. 0. 0.]\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "np.random.seed(0)\n", + "import navlie as nav\n", + "from navlie.lib import VectorState\n", + "\n", + "x = VectorState([0, 0, 0], stamp=0.0)\n", + "print(x)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `VectorState` is a subclass of the abstract [State](../_autosummary/navlie.types.State.rst) class in navlie, which is one of the core primitive types. The value of the state is stored as a numpy array, and can be accessed directly through `x.value`. \n", + "\n", + "\n", + "## Define the Process Model\n", + "For the process model, we'll choose to define our own from scratch here. Process models in navlie *must* inherit from the abstract [navlie.ProcessModel](../_autosummary/navlie.types.ProcessModel.rst) class and implement the `evaluate` and either the `input_covariance` or `covariance` methods." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from navlie.lib import VectorInput\n", + "\n", + "Q = np.eye(2) * 0.1**2 # Input noise covariance with 0.1 m/s of standard deviation\n", + "\n", + "class WheeledRobot(nav.ProcessModel):\n", + " def __init__(self, input_covariance):\n", + " self.Q = input_covariance\n", + "\n", + " def evaluate(self, x: VectorState, u: VectorInput, dt: float) -> VectorState:\n", + " x_next = x.copy()\n", + " x_next.value[0] += u.value[0] * dt\n", + " x_next.value[1] += u.value[1] * dt * np.cos(x.value[0])\n", + " x_next.value[2] += u.value[1] * dt * np.sin(x.value[0])\n", + " return x_next\n", + "\n", + " def input_covariance(self, x: VectorState, u: VectorInput, dt: float) -> np.ndarray:\n", + " return self.Q\n", + " \n", + "process_model = WheeledRobot(Q) # instantiate it" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The methods in navlie process models must always accept the arguments shown above: a `State` object, an `Input` object, and a float `dt`. The `evaluate` method must always return a valid (i.e. subclass of a) `State` object, and the `input_covariance` method must always return a square numpy array. There are more optional methods that can be implemented for performance reasons, but we will cover those later.\n", + "\n", + "## Define the Measurement Model(s)\n", + "Moving on to the measurement model, if $\\mathbf{r}_a = [x,y]^T$ denotes the position vector of the robot resolved in the world frame, and $\\mathbf{\\ell}^{(i)}_{a} \\in \\mathbb{R}^2$ is the 2 x 1 position vector of landmark $i$, then the measurement model for each landmark is simply \n", + "\n", + "$$ \n", + "y_i = ||\\mathbf{r}_a - \\mathbf{\\ell}^{(i)}_{a}||\n", + "$$\n", + "\n", + "In navlie, measurement models must be implemented in a similar way to process models: inherit from the [navlie.MeasurementModel](../_autosummary/navlie.types.MeasurementModel.rst) abstract class, and then implement the `evaluate` and `covariance` methods. Here's an example for this problem:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "class RangeToLandmark(nav.MeasurementModel):\n", + " def __init__(self, landmark_position: np.ndarray):\n", + " self.landmark_position = landmark_position\n", + "\n", + " def evaluate(self, x: VectorState) -> np.ndarray:\n", + " return np.linalg.norm(x.value[1:] - self.landmark_position)\n", + " \n", + " def covariance(self, x: VectorState) -> np.ndarray:\n", + " return 0.1**2\n", + " \n", + "landmarks = np.array([[1, 1], [1, 2], [2, 2], [2, 1]])\n", + "meas_models = [RangeToLandmark(landmark) for landmark in landmarks]" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## (Simulation only) Generate fake data\n", + "\n", + "The next step is to generate some fake data for our simulation (although navlie is also compatible with real data). To do this, we will use the [DataGenerator](../_autosummary/navlie.datagen.DataGenerator.rst) class which is used as follows" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "VectorState(stamp=0.0, dof=3, state_id=None)\n", + " [0. 0. 0.]\n", + "VectorInput(stamp=0.0, state_id=None)\n", + " [0.4867558 0.40227221]\n", + "Measurement(stamp=0.0, state_id=None) of RangeToLandmark\n", + " 1.5906187969698615\n" + ] + } + ], + "source": [ + "dg = nav.DataGenerator(\n", + " process_model=process_model, # process model to use\n", + " input_func=lambda t, x: np.array([0.3, 0.5]), # a callable that specifies the input values over time\n", + " input_covariance= Q, # numpy array or callable that specifies the input covariance over time\n", + " input_freq=50, # the frequency (Hz) at which the input is sampled (and the process model integrated)\n", + " meas_model_list=meas_models, # a list of measurement models to use\n", + " meas_freq_list=[10, 10, 10, 10] # corresponding measurement frequencies (Hz)\n", + ")\n", + "\n", + "state_data, input_data, meas_data = dg.generate(x, start=0, stop=30, noise=True)\n", + "\n", + "print(state_data[0])\n", + "print(input_data[0])\n", + "print(meas_data[0])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The output of the `DataGenerator.generate` method is three lists: a list of ground-truth `State` objects, a list of `Input` objects, and a list of [Measurement](../_autosummary/navlie.types.Measurement.rst) objects, with the input/measurement lists possibly being corrupted by random noise if the `noise=True` flag is set. Each item in these lists correspond to different points in time. We can plot the trajectory as follows" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "# Plot the state trajectory\n", + "pos = np.array([state.value[1:] for state in state_data])\n", + "plt.plot(pos[:, 0], pos[:, 1])\n", + "plt.scatter(landmarks[:, 0], landmarks[:, 1])\n", + "# add labels\n", + "for i, landmark in enumerate(landmarks):\n", + " plt.annotate(f\"Landmark {i}\", landmark)\n", + "plt.xlabel(\"x\")\n", + "plt.ylabel(\"y\")\n", + "plt.title(\"Simulated Trajectory\")\n", + "plt.axis(\"equal\")\n", + "\n", + "\n", + "# Plot the input data\n", + "plt.figure()\n", + "u_array = np.array([u.value for u in input_data])\n", + "u_stamps = np.array([u.stamp for u in input_data])\n", + "plt.plot(u_stamps, u_array[:, 0], label=\"omega\")\n", + "plt.plot(u_stamps, u_array[:, 1], label=\"v\")\n", + "plt.xlabel(\"Time (s)\")\n", + "plt.ylabel(\"Input\")\n", + "plt.title(\"Input Data\")\n", + "plt.legend()\n", + "plt.show()\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run a filter!\n", + "\n", + "Finally, lets run an extended Kalman filter on this data to get a state estimate that uses only the noisy measurements. In the below filter, we instantiate the [ExtendedKalmanFilter](../_autosummary/navlie.filters.ExtendedKalmanFilter.rst) to use on our data, and looping over the input measurements while also calling the correction step whenever a measurement occurs." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "# First, define the filter\n", + "kalman_filter = nav.ExtendedKalmanFilter(process_model)\n", + "\n", + "# You can try other filters too!\n", + "# kalman_filter = nav.UnscentedKalmanFilter(process_model)\n", + "# kalman_filter = nav.IteratedKalmanFIlter(process_model)\n", + "\n", + "P0 = np.diag([0.1**2, 1**2, 1**2]) # Initial covariance\n", + "x = nav.StateWithCovariance(x, P0) # Estimate and covariance in one container\n", + "\n", + "meas_idx = 0\n", + "y = meas_data[meas_idx]\n", + "estimates = []\n", + "for k in range(len(input_data) - 1):\n", + " u = input_data[k]\n", + "\n", + " # Fuse any measurements that have occurred.\n", + " while y.stamp < input_data[k + 1].stamp and meas_idx < len(meas_data):\n", + " x = kalman_filter.correct(x, y, u)\n", + "\n", + " # Load the next measurement\n", + " meas_idx += 1\n", + " if meas_idx < len(meas_data):\n", + " y = meas_data[meas_idx]\n", + "\n", + " # Predict until the next input is available\n", + " dt = input_data[k + 1].stamp - x.state.stamp\n", + " x = kalman_filter.predict(x, u, dt)\n", + "\n", + " estimates.append(x.copy())" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The filters in navlie are all designed to be *stateless*: this means that the actual state estimate is stored externally to the filter objects, in this case in a container called [StateWithCovariance](../_autosummary/navlie.types.StateWithCovariance.rst). Although this adds a slight burden on the user, it has the advantage of being more transparent, and also providing the ability to combine different filters in the same loop! For example, you could use an EKF for the prediction, but a UKF for the correction, or even to use different filters for different measurement models!\n", + "\n", + "\n", + "Once estimates have been obtained, we will often be interested in evaluating the performance. The [GaussianResultList](../_autosummary/navlie.utils.GaussianResultList.rst) object is a useful container for evaluating the quality of the state estimates when ground truth data is available. It calculates useful metrics such as raw error, Mahalanobis distance, and normalized estimation error squared (NEES). " + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZAAAAEWCAYAAABIVsEJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABUfUlEQVR4nO3dd5wkd3ng/89T1Xl6ctzZ3dmsrNVKWiQkIcACbGFjCWNMsI3BhtPxs3E439mG4342x9lnbN/Ph+OdMXCAyYYDhI0schBKuyutslYbtDlMTj0dq57fH1Xd0zM7Mzs7YSc979drXtNdVV31rQ711DeLqmKMMcZcLGepE2CMMWZlsgBijDFmTiyAGGOMmRMLIMYYY+bEAogxxpg5sQBijDFmTiyAmDVPRG4XkQOX8HjPiMgrL9XxjFksYv1AzEolIkeBdsCrWvwJVX3PBV6nwA5VPbSIySsf6xPASVX9L5fgWN8HXgqUqhZ/T1V/drGPbdamyFInwJh5+llV/fZSJ2IZeY+qfvRCG4lIRFVLF1p2sfswa4sVYZlVSUS2i8gPRGRIRHpF5Avh8h+GmzwhIqMi8mYReaWInKx67VER+T0ReVJEMiLyMRFpF5H7RGRERL4tIo1V2/+ziJwNj/VDEbk6XH4P8EvA74fH+nrV/l8dPo6LyIdF5HT492ERiYfrXikiJ0XkP4pIt4icEZFfneP7Ud7XH4jIWeD/iMgHRORLIvJpERkG3iEinSJyr4j0i8ghEfl3VfuYavubRGSviAyLyDkR+cu5pM+sTBZAzGr134BvAo3ABuBvAFT15eH661Q1rapfmOb1Pw+8BrgM+FngPuA/A60Ev5vfqtr2PmAH0AY8BnwmPNZHwsd/Hh5rqqKk9xMUO+0CrgNuAqqLuzqAemA98E7g76qD10XqAJqATcA94bK7gS8BDWFaPw+cBDqBNwL/XUTuqNrH5O3/CvgrVa0DtgFfnGPazApkAcSsdF8VkcGqv/Idc5HgQtmpqjlVfeAi9/s3qnpOVU8BPwIeUdXHVTUHfAW4vryhqn5cVUdUNQ98ALhOROpneZxfAj6oqt2q2gP8V+BtVeuL4fqiqn4DGAUun2F/fz3p/fhvVet84I9UNa+q2XDZQ6r6VVX1gRbgNuAPwvdsP/BR4Feq9lHZPtxHEdguIi2qOqqqD8/yvM0qYAHErHSvV9WGqr9/DJf/PiDAo2Grp1+7yP2eq3qcneJ5GkBEXBH5kIgcDot1jobbtMzyOJ3Asarnx8JlZX2T6hnGyseexm9Nej/+36p1PWEArHZiUlr6VXVkUnrWT7M9BLmiy4DnRWSPiLxuhrSZVcYq0c2qpKpngX8HICIvA74tIj9chJZXv0hQrPNqguBRDwwQBC+ACzVzPE2QU3omfN4VLlsMU6WletlpoElEaquCSBdwarp9qOpB4K0i4gBvAL4kIs2qmlnAdJtlynIgZlUSkV8QkQ3h0wGCC58fPj8HbF2gQ9UCeaAPSAH/fdL6Cx3rc8B/EZFWEWkB/hD49AKl7aKo6gngQeBPRSQhIjsJchjTpkdEfllEWsMisMFwsT/d9mZ1sQBiVrqvhy2cyn9fCZe/BHhEREaBe4HfVtUj4boPAJ8M6wjeNM/jf4qgmOcU8CwwuQ7gY8BV4bG+OsXr/xjYCzwJPEVQCf/H80jP3056P/Zd5OvfCmwmyI18haDOZKZm0ncCz4Tv818Bb6mqXzGrnHUkNMYYMyeWAzHGGDMnFkCMMcbMiQUQY4wxc2IBxBhjzJysqX4gLS0tunnz5qVOhjHGrCj79u3rVdXWycvXVADZvHkze/fuXepkGGPMiiIix6ZabkVYxhhj5mRN5UDm42v7T+GrEnNd6pNR1jUk2NJcg+PIhV9sjDGrkAWQWTrRP0bRm9jp0hFh54Z6bt/RQsS1zJwxZm1Z0queiNwpIgfCiWveO8X63xWRZ8OJfb4jIpuq1nkisj/8u/fSpjzgq7L/xCD/8MMjnBrMYr36jTFryZIFEBFxgb8DXgtcRTCi51WTNnsc2K2qOwkmsfnzqnVZVd0V/t11SRI9jULJ54t7TvDEySE834KIMWZtuKgAIiI14YV/IdwEHFLVI6paIJgJ7e7qDVT1e6o6Fj59mGBmuWXre89388ODPRRKNhipMWb1mzGAiIgjIr8oIv8qIt3A88CZsFjpL0Rk+zyOvZ6Jk9OcZOLENZO9k2Dq0LJEOBfzwyLy+hnO4Z5wu709PT3zSO7s7D8+yP3PnCVX9Bb9WMYYs5QulAP5HsE8x+8DOlR1o6q2AS8jyBH8mYj88iKnkfAYu4G/qFq8SVV3E0zo82ER2TbVa1X1I6q6W1V3t7ae1w9mURzqHuVr+08xmi9deGNjjFmhLtQK69WqWpy8UFX7gS8DXxaR6ByPfQrYWPV8AxNnPgNARF4NvB94RTjndDkNp8L/R0Tk+wRzVB+eY1oW3OnBHJ95+Bh371pPW23cmvsaY1adC+VAakWkabo/gKkCzCztAXaIyBYRiQFvIZj4p0JErgf+AbhLVburljeKSDx83ALcRjCZz7IyVvD43KPH2X9y0OpFjDGrzoVyIPsIpgIVgrmRy3M9NwDHgS1zPbCqlkTkPcD9gAt8XFWfEZEPAntV9V6CIqs08M8iAnA8bHF1JfAPIuITBMEPqeqyCyBlPzjQw+nBLC+/rJW6xFwzbMYYs7zMGEBUdQuAiPwj8BVV/Ub4/LXA6+d78HB/35i07A+rHr96mtc9CFw73+NfSgfPjXJ6MMut21rY0Z4mHlmoxmzGGLM0ZtuM96Xl4AGgqvcBty5OklavTN7jW8+e4+tPnOHMUNb6jBhjVrTZBpDTIvJfRGRz+Pd+4PRiJmw1O9E/xucfPcH9z5ylbzRvPdiNMSvSbMfCeivwR8BXwuc/DJeZeThwdoQXzo2wvS3N7k1NtNbGca21ljFmhZhVAAmb7f72IqdlTVIN6kcOnhtlfWOSazrr2dySIhWzcS6NMcvbrK5SItIK/D5wNZAoL1fVOxYpXWvSqYEspway1MRduppquLyjlnX1CRJRq3A3xiw/s73N/QzwBeB1wLuBtwOLPy7IGpXJezx3ZpjnzgxTm4iwoTHF1tYaOhuSpOOWMzHGLA+zvRo1q+rHROS3VfUHwA9EZM9iJswERnKlSjCJukJLOs7GphTrG5K01yVIxix3YoxZGrMNIOXe5mdE5GcIWmA1LU6SzHSKnnJmKMeZoRwAsYhDU02MDY1JNjSmaK+LW92JMeaSme3V5o9FpB74j8DfAHXAf1i0VJlZKZR8zg7lODuUY+/RAaKu0FQTp7Mhwbr6JO11ceqTUcJe/MYYs6AuGEDC+T92qOq/AEPATyx6qsycFD3l3HCOc8M5HmcQgHjUoaUmTlNNjMaaKPXJGA2pKOl4xCrnjTHzcsEAoqqeiLwV+J+XID1mgeWLPqcGs5wazE5YLgKJqEttIkJtIhr8jweP04kI6XiEmpi7IHO9qyqq4KlS8pSi7+OV//vBspKveL5PKXzua7DM9xXPV7zyPvxgnSoT/4fHCY4XDOA24XzDcwZBJJjP3hFwHMERwa167obLHKHqseA44Iog5W3D5SJU7TNYJ1LeD5Xty/sSITxe+bWWQ5yP6o645c++8l2YsN3E1031tktlnVS+Mz862MO7PrmP6zbWU5eI8vZbN/PkyUG2tqZ57TUdS/r5qSq+Qsn3g9+Rp8FjXyl6fuW31ZqOU59a+HH4ZluE9WMR+VuClliZqsQ/tuApMpeEKmQLHtmCR/dwftrtoq6QiLpEHCHiOhMuiuP7Cr7EvlZf8KkEBC/8EpuJHBFcJwxaMh64XEeqloXBKAxg40Hq/HVSDkqMB7QwZiJh4AzWBZ9d+XnZ+Ec63QVxPECXn6mGNwiMB/TgIj4xuFP+flQCv+L55WXhn094ozDx++RPvlkI/5dvKnxfx9MSHney4WyRx44PkMl73LSlie8d6Gas4HH9xgYeebGf+mSUO65owxHYc2yA9rBT73C2xL7jAwDsORr8/87z3RP23VwTY2NTktdd20lNIhJ+tlQ+S9cRoq4T/oaqPuPwDS+nt/q9KHnB76gU/p6KXnhz5Sslzx9/Hm53Ia+6so2dqYYLbnexZhtAdoX/P1i1TAHrB7LKFT2l6NnEWIvBV8X3AM+C62Laf2KQH7ww3uvgUM9o5fH3w+XZosdnHz1eWX7g7EjlcdQV1jck2dFey8n+MZ47O8Lm5hSnBrMUPaUvU6AvU+D0YI5r1tdz4OwIt2xrprM+MWXuRFU52jdG72ie3Zsaz9umdzTPvmMDHO8fo6MuQcHzaa2Nc+u2ZiLO1CUCA5kCqbjLQKZIS21s2u0WmqylcZh2796te/fundNr//a7BynaD92YZel4/xh7XuwHgZfvaKW1Nk6+5PG1/acrrRZ/+toOYq7DV/efZmtLDaP5EjXxCNdtqOepU0Mc7gkKVxIRh7t3rafg+ZR8n466xITWjZ6vuI7QM5Ln4SN97GhLc6Q3w8Hu0fPStXNDPa3pOB31CRqSUbpH8jxwqLeSprJUzGWscOFpsH/tts3UhlNC5IoeI7kS/ZkC//bM2co2O9rSANQmIuze3ITnKX2ZPP/jF66bc5G0iOwLZ4CduHymABJOJftZVZ1yNqRwGtl1qvrAnFJ1iVkAMWblUVUKnn/eFAiFks+TpwZxRfjhwd5pX7+1pYbXXtMx48VTVTk5kOVIb4bdmxqpucgOu32jeR483Me21jQ1cZev7p95rNntbWkGxwr0jRbOq6/b0lLDDV0N1MQjnBnKsaWlhi/vO0lfpkB7XZx19Un2nxg8b5+1iQgjualLCyKO8H9//VZ2bmi4qPMqmy6AXOhdagYeF5F9BJNL9RAMZbIdeAXQC7x3TikKEnUn8FcEE0p9VFU/NGl9HPgUcCPQB7xZVY+G694HvBPwgN9S1fvnmo7VKF/yONGfJR5x2NiUom80T1NN7Ly6i2zRCwZwVDgznKOjLkE84jBW8Ch6Ppm8R3t9vFJ5bMxMhnNFzg7l2NCY5NRglk1NNcQicy9OefrUUKXOwRHY0VbL1tYa8kWf7x6YWBfxhuvX0zOaZ2CswNOnhmmqifGqK9robEhe8DgiwsamFBubUnNKZ3M6zs9e11l5/lt3bKfoKY++2I+nypMnBylXVbz1JRtpqwtGhCrfwD/yYj8d9Qk2N9dM2G9jKgbAL790E0+fHuI7z3VzrqrO8vL2WiKucOu2ZlKxCCO5Is+dHaGzPsHx/jEGxoqM5Irc8/Ktcw4eM7lgEVbYjPcOgmlj1wFZ4DngPlU9PtNrZ7HfF4DXACcJprh9a/XMgiLy68BOVX23iLwF+DlVfbOIXAV8DrgJ6AS+DVymqjPmAVd7DuRoX4b9xwe544o2PrfnOLlikHGsT0YZyha5oqOWn7yqHRHhyZODPHykn2xx4ltWm4iQirkTvqRll7fXcuOmRo71ZdjelqYh/HJ7vtI7midX9OioT9hkWbOUK3pk8iWa0/FLfuzBsQIHu0dpq41zsHuUVMzllq3Nc75JmFzPMNl1G+q5Yl0dHXWJabeZ7ET/GP/38VNB4GivnVAvUZaIOqRiEX5257rK93G5Gs4WyRY92i/iPZjs4LkRRIRE1KGjPjHruo5XXdk2rwAy1xwI4UX5W+HfQroJOKSqR8IEfh64m4lzm98NfCB8/CXgbyX4ht8NfF5V88CLInIo3N9DC5xGAIbGgg/+UlVMzcWjR/t56HAfAP/nwaMA3LSliaLnc7x/DIDnz45wdjjHz+1az/cOjP/YhfHmjiO50oRs8LbW4I7ocE+GA+dGOHAu+BH/ODzWVF55WSvXbqivtDJZDQolnwcO9dLZkOCKjrp5729wrMCnHzmO5yvJqMuv3raZ6AI0mZ6NvUf7p/z8GpIxruocP7fyzWV1UMkVPY71jdGYivL06WHSiQjH+8bOaybuCPgatFDqyxR44uQQT5wc4lVXtnFNZz0Q1Ft85fFT3NDVwM1bmolFHFSVx44P8sChoEiqKRXjTS/ZQDzicsflbew7PkAq6tLZkGQwW2B7a3rF5IzrklHqkvNrSrujvXaBUrMwlnLci/XAiarnJ4Gbp9smnEN9iKBYbT3w8KTXrp/qICJyD3APQFdX10UnUlX5jc8+VvlCX9NZx66NDZW7xqLnX7If/nTGCqVK8ChrSce4sauxUnwwkCnwqYePMThWrASYyztq+ckr23HCOUhGckX2HB1gU3OKjroE/ZlCJUvfO5rnkSP9lRYs5VxNWdCUMcX+E4N8/4UefnSol5u3NDEwVmB9Q5Krw4vGclEo+Tx3dphD50bpHyvw6ivb6R3N0zdaoOAF/VPKgbetNk73SJAje+rUEKcGsty6vYWY6zCSK1ITj1D0fHwf0okL/6RyRY/P7TlRaX6ZLXp85pHjvPWmjYuee+sZyU8IHttb07x0axP/+tQZvnugm75MHkeE0XyJ58+OkIq5XLmuji0tNUQd4UuPnZwyJ95UE+PNuzdOWVyVK3r0jRb40aEevvNcNw8c7CUVcxkYC74/jx0f5LHjg7xu5zr2HO2v5H6v6Kjllm3NlfckFnG4ZWtzZb+ttZc+52YmWrJWWCLyRuBOVX1X+PxtwM2q+p6qbZ4OtzkZPj9MEGQ+ADysqp8Ol3+MoEjtSzMdc65FWHuO9vOmf3hoQvvyX7q5iyM9GR46EvwY3/3yrcSXqGd372iezzxynJ+6up2ipyQizpR3Kr2jef7lyTMMZYvsXF/PT1zRNq/jjhVKJKPuhDvAfMnjq4+f5uzwxFYm122oZ9fGBhJRd0l6wBc9nz1H+zneP0Y6Hqm0uLkY21vT9GXylQtfdc6t/HxjU4pXXNaKI/DM6WGO9mVwHaE2EeXWbc30jOT55jPn8FR5/a5OuppS7Dk6wENH+oi6wi/cuHFBLowHzo7wzWfPkoy51MQiXLuhnkeO9DOaL5GIOPzySzdNqCh+8uTghFzpTOoSETrqE+xc30BfJk8y6rKlteaCOfSzQzm+sHf8njHmOrztlk08eXKw0scCgmazb7xhQ6WewMzfYhVhLWUAuQX4gKr+VPj8fQCq+qdV29wfbvOQiESAs0ArYcV9edvq7WY65nzqQP7ymwc43j9WaV3RmIoSiziVu6Xmmhi+Krs2NixKZdVUSr7Pl/adrKThl27uouUC5em5okf3SJ6NjclFy/pn8iWO9GTY1Jzi7HCO+54+O2F9XSLCpuagpUnRCzqOTXex8FURYChb5FD3KF1NKX58OLjYHu8f44auRm7c1MjR3gwt6TiNNTFKns9DR/qoTUTpbEjw9SfOMJo/v3VKYyrKW17Sxf6Tg5Uc3KamFFesqyUdj9BRlyBX8nn2zDBXtNdSl4ziq/Lg4T5OD2YZzZfwVckXfWIRB1+1Uu90Ideur+eOMICrKt967hzPnQmKB5tSMW7b3sz6xiTPnh7GdYRr1l+4SDDonKd8+7nuSlFjIuKQK01M06uvbJsyR5jJlzhwdoTmdIzOhiRR1yGTL/H4iUH2HRtgY1OSmzcH6Zqrku8TcRyGs0HOrTwD59G+DD8+1Mum5hpeurVpWRcXr0RLHkDCUXgnTyj1welfccH9RQgq0V8FnCKoRP9FVX2mapvfAK6tqkR/g6q+SUSuBj7LeCX6dwjG61r0SvTTg1n+ed/JyvK22jgRVzg9GNxxt9fFectLxovKPF/pzxRoScemvGAPZ4t4vtJYc/EVgNVpuaGrgdt3tF70Pi4FVeWBQ708dnxw2m3e/YqtlaKKyXeqF8N1ZNqeua3pOD91dTuZgkfMdWivi1c+E1VdkIDaPZLjiRNDHOkd5bK2oNFBNOLwoxd66B0tUJeM8Kor20lOyoWpKnuPDfDgNHVL7XVxfm7Xeh47Pki26JGIOuSKPuvqE1zRUcvx/jG+/Vx3JVA2pqK8ftd66pJRzg7l6M8USMWCuoP5tIoyK9OSBhAR+d9AimAgxY8CbwQeVdV3zjlFwX5/GvgwQTPej6vqn4jIB4G9qnqviCSAfwKuB/qBt1RVur8f+DWgBPyOqt53oeMtVCusQ92j/OtTZ0hEHH5m5zoakjH2HR/g+bPD+D7ctauT+54+g+9TaeXUkAzG0CkrlHy+9ey5Sp3Cb/7E9kpdxGwUSj7/6weHAXjXy7ZcdLv1peSHbe73Hu3n1GC20rzxxq5G2uri5+VYYq5DLOJw5bpaDndnaE7HeNWVbQyMFXnh3AiPTxGYbuxqrAxB8Zor2ydUDi9nRc/n354+y9G+DOvqk2xpqeGx4wOz6mRW1tWU4vW7OldM5bJZfEsdQJ5U1Z1V/9MEdQ63zzlFS2Cxm/F+69lzPHtmeNr1b3nJRo73j017l/lbd2y/4I9+YCy4kxzNlfj0I8fZ3Jzi7l1Tth9YEVSVh4/08+jR/gnLb9/ewg2bGme9j9F8qZL7KPfUhaCeZqXPkVLyfD7+46Nkix6NqSi1iSit6Tg7N9Tz3ee7OdY/RnM6xl07O0nG3CVv1GGWnyVrxhsqt9EbE5FOgk596+acmlXqio7a8wJI1BWu72rk0Rf7+fyeicUyG5uSvObKdj7+46MA/MMPj3B1Zx0nBrLsaEsznCty4OwIbbUJtrTUUBN3uf+Zc8QiDoWwXPvGWV5klysR4aVbm9jckuJIT4Znzwxz13WdF9VWXkQmBI1qKz14AERch3e+bAtH+zJsbq6p1BsAvP76lXvzYFa+2f66/kVEGoC/AB4jaHzy0cVK1Eq1sSnFT13Vzv3Pnqssi7kOV6+rI1vw6MvkaUsn2NySoiUdrxQ7/fLNXXz6kePkS36lnqBnZLwj3+Th2AtVlaIL3ZRRJBiXJx2PUhN3iUdc4lGHWDiaqOuMD2de5uv4iLzl4dY9v3o0UZ+iN/WoouXhpruaUnQ2JLlte8uCns9Cqx7l1nFk4nOZeqj4ysi5hKPsOuMjtQbvqTNhWTC67vhw8NWjt5aHla8eOr56mPjKEPGEn9EUI/FK1blAsD58MGH5ZJXCispovFoZPn18JN6JI+OWvxvlUXrHR5wdf+z5WrWO8Pn5j8vbV29bHtk3WDb10P6V9J83aEjVuU8678lD9pe/++VRkssjUk94X6veRqn6LIPReIPRrCv7qXrt5PfL98+f3mB8FN7wd1QZvt2nWPVbqiwvLwtfv1hmG0D+POy092UR+ReCivTcBV6zJl2xro7LOmp54FAvjx8fpOQrdeFQ0dNpTsd598u38sODvTSkopQ8rRTp3NDVwE1bmrjvqbOM5EvctLmJkVyRoq/ctLlpwt3obEQcCTs0RahLBBNL1SXD/+FcIBe7z4VSbkXkVQWg8hDf5cBUuXD4et5Fyi+PG870cz+UL6CTL8auMz5PR/lCUZknpOqCLZx/oTFmOVvMlrazDSAPATeEickDeRF5rLzMTOSIVMawuWaWHejiUZfXXNUOBHddI7kitYkot2wLOk5dbFFF1BUaa2K0puO01MZpronRkIpRG49cVGX9pSQSzJew8gudjFk+FvMmZ8bfqoh0EPTwTorI9YzPNFNH0CrLTOPqzjqu6KidU4Wm6wg/eXXHRb0mGXNpr4uzoTEoCmquidmUtcaYRXWhm72fAt4BbAD+smr5MPCfFylNq4IjguMuXuRPxVw66hOsb0iyoTFFU03M2vcbYy6pGQOIqn4S+KSI/LyqfvkSpclMIR516KhLsKk5VQkY1lzTGLOULmZO9I8Bnar62nA49VtU9WOLmLY1Lx2P0NWcYntbms76JMmYFUkZY5aP2QaQ/xP+vT98/gLwBcACyAKLRx02N9dweUct6xuSVo9hjFm2ZhtAWlT1i1UDHpZEZPZjK5gLaknHuKqznsva09N2ijPGmOVktgEkIyLNhI3sReSlwNCipWoNWVef4PquRjY1pyy3YYxZUWYbQH4XuBfYJiI/JhhS/Y2Llqo1oKU2zk2bgyE8bApYY8xKNKsAoqqPicgrgMsJ+oIcUNXiBV5mppCIurxkcyNXd9ZbpbgxZkW7mE6/NwGbw9fcICKo6qcWJVWr1OUdtdy2vYX6ec6LbIwxy8GsAoiI/BOwDdgPlCvPFbAAMguuI9xxRRuXz7FnujHGLEezzYHsBq7SBRqVS0SaCJoBbwaOAm9S1YFJ2+wC/hfBsCke8Ceq+oVw3SeAVzBekf8OVd2/EGlbaG11cX7m2nU0pC5+xkFjjFnOZns7/DRwcYMzzey9wHdUdQfBdLTvnWKbMeBXVPVq4E7gw+GQ8mW/p6q7wr/9C5i2BXPlulrecP0GCx7GmFXpQoMpfp2gqKoWeFZEHgUqE1Wo6l1zPO7dwCvDx58Evg/8QfUGqvpC1ePTItJN0PprcI7HvKRu2dbMDV2NNj6VMWbVulAR1v9YpOO2q+qZ8PFZoH2mjUXkJiAGHK5a/Cci8oeEOZhwmPll4TVXtXPlurolm1fDGGMuhQsNpvgDABH5M1WdkEMQkT8DfjDda0Xk20xd7PX+6ieqqiIybd2KiKwD/gl4u6qWp+J7H0HgiQEfIci9fHCa198D3APQ1dU13WEWzBtv3MCGxqRNNGSMWfVmW77ymimWvXamF6jqq1X1min+vgacCwNDOUB0T7UPEakD/hV4v6o+XLXvMxrIE4zRddMM6fiIqu5W1d2tra0XPNG5qktGueflWy14GGPWjBkDiIj8PyLyFHC5iDxZ9fci8OQ8jnsv8Pbw8duBr01x7BjwFeBTqvqlSevKwUeA1xNU8i+Zyztq+ZVbNlETj1jwMMasGReqA/kscB/wp0xsKTWiqv3zOO6HgC+KyDuBY8CbAERkN/BuVX1XuOzlQLOIvCN8Xbm57mdEpJWgV/x+4N3zSMucuI6wrTXNzg31luswxqxJspgTri83u3fv1r17987ptU+fCrqcxCIO9ckobbVxCxrGmDVBRPap6u7Jyy9mKJM17Zr19UudBGOMWVask4Ixxpg5WVNFWCLSQ1DnMhctQO8CJmcprZZzWS3nAXYuy5WdS2CTqp7XjHVNBZD5EJG9U5UBrkSr5VxWy3mAnctyZecyMyvCMsYYMycWQIwxxsyJBZDZ+8hSJ2ABrZZzWS3nAXYuy5WdywysDsQYY8ycWA7EGGPMnFgAMcYYMycWQIwxxsyJBRBjjDFzYgHEGGPMnFgAMcYYMycWQIwxxszJmhrOvaWlRTdv3rzUyTDGmBVl3759vVMNprimAsjmzZuZ64RSxhizVonIlKOYWxGWMcaYObEAMkuffniu04gYY8zqZAFklkqev9RJMMaYZcUCyCx5NuakMcZMYAFkljzfciDGGFPNAsgsWQmWMcZMZAFklnxVbO4UY4wZZwFkllQV3+KHMcZUWAC5CPmSt9RJMMaYZcMCyEWwviDGGDNuSQOIiNwpIgdE5JCIvHeK9b8rIs+KyJMi8h0R2VS1zhOR/eHfvYuZzm8+c5ZnTg8zmi9ZPYgxxoSWLICIiAv8HfBa4CrgrSJy1aTNHgd2q+pO4EvAn1ety6rqrvDvrsVM66ceOsZ9T5/lgYO9lKwixBhjgKXNgdwEHFLVI6paAD4P3F29gap+T1XHwqcPAxsucRoB+OjbdwOQLXp8/tHjS5EEY4xZdpYygKwHTlQ9Pxkum847gfuqnidEZK+IPCwir5/uRSJyT7jd3p6enjklNBF1aUhF8X3oHS3YsCbGGMMKqUQXkV8GdgN/UbV4k6ruBn4R+LCIbJvqtar6EVXdraq7W1vPG85+1hwRvLD+4wt7T1hdiDFmzVvKAHIK2Fj1fEO4bAIReTXwfuAuVc2Xl6vqqfD/EeD7wPWLmVhXwA/rP7qH85wZyi3m4YwxZtlbygCyB9ghIltEJAa8BZjQmkpErgf+gSB4dFctbxSRePi4BbgNeHYxE+s44zkQgC/sOUGhZEVZxpi1a8kCiKqWgPcA9wPPAV9U1WdE5IMiUm5V9RdAGvjnSc11rwT2isgTwPeAD6nqogYQVwR/UrHV33//EAOZwmIe1hhjlq0lndJWVb8BfGPSsj+sevzqaV73IHDt4qZuIscRJg/IqwqfePAor722g8vbaxGRS5kkY4xZUrMKICKyG7gd6ASywNPAt1R1YBHTtqy4IhSmGdL9vqfOcuDsCLfvaKUxFbVAYoxZE2YswhKRXxWRx4D3AUngANANvAz4toh8UkS6Fj+ZS89x4MxQjufPDk+5/khPhk8+eJRvPHWWU4PZSoW7McasVhfKgaSA21Q1O9VKEdkF7ABWfe+69Q1JXuwd4+C5Ua7oqJt2uxfOjfDCuRGa0zF2tNWyrbWG5nQc17FciTFmdZkxgKjq311g/f4FTc0y9tKtzRzqzsx6KJO+0QJ9o308fKSPdDxCZ0OSzoYEnQ1JGlMxYpEV0QXHGGOmNds6kC3AbwKbq1+z2GNQLTfxiMOx/jFOD2bpbEjO+nWj+VIlZwIQdYX6VIyWmhjN6ThNNVEaUzFqE1GirlgdygzKHThVoTqUl98xEez9M+YSmW0rrK8CHwO+DqzZzg/t9QmO9Y/x48O9/MKNGy/8gmkUPaV3JE/vSB4YqSyPukJNPEJjKkZDKkpdMkpdIkpjKkpNPEI84lQujkXPJ+qujFyMqpIv+eSLPrmSN+X/fMmjUPIpeH7lf8lTSr7i+8F/z/fxfFCUqQYCEAFBcARcV3BFiLgOUVeIOMH/WMQh5jpEXSd4HHGIRxziEZdE1CERdcM/h0TExbGiR7OMqSpFT8mXPMYKwV+uWP4b/11d0VFHV3NqwY8/2wCSU9W/XvCjrzC3bG3mwNkRYot04c6XfLLFILCMFTw8VRpTMQBcRzg5MMaJ/jFeODdKX6bAL97Uxet2riMedYm5Dq4jRFzBdYKLJxAWuQUX3JKv+KqUPEUk2KdqcOGNOA6uA67j4EgwdEuk6iLsCHjhhbwYXuTLX9xycCh/WbNVX958KdjWuwSNCoJcSTBz5HhR4/wmAYtFgqCSjLqkYkFwScamfx5znRUddMozb3rhd6Xg+XieUvSDz7DkBZ+/VwnqOuFxyfPHH1et9zS4ESjv1686TvmY5f/l/lZ+Zfn4MtUZbh5EcCS8gXCEiCO4rkPUkaqbBZdYxCEZdYlHnMpnV/4c4xEHV2TeOdnqGUyn+zqISGW7ynvqBe95yS//pvzKb2qsUKoEhiBYBM+L3oV/Wx31CbpYugDyVyLyR8A3gerhRB5b8BQtc7XxCIUFHkxRVXnoSB+PHx88r47l529YT1ttgh8f6uXJU0MT1n320eMc7x/jhq4GK7aZgqpyvH+M5nScTL7E4FiRLS01qCqxqtxc9fYFz+fccB5VpbMhGVxESz7nhnMc6RmlqylFOh6Z9v12REhEgwtTJTcTcYiH/2OR8dxPxAlzRpHxoB9xHMShciEUpBIUIbywV1+wfR/fJ/ivVJ6XL/6lMMiXwouT5weB3/O1Kpfnj1+4vCCXN7nT7MqwMGl2HSFaybmWb6CCx8FRtFKEWvIVzwveU18VhUrQLN+clQPIVN8Z1eCzXJFvN7MPINcCbwPuYLwIS8PncyYidwJ/BbjAR1X1Q5PWx4FPATcCfcCbVfVouO59BCP0esBvqer980nLbEUjDi/2Zrjv6TPcuq2F+mR0XvvrHc3z0OE+jvRmiEcc6lNRSp7SWhvnUPcoX35sfHiw1nScyzrSrG9Iki14fP3JMzxwqJfhbJENjUm2t6VnDCRFz+eRF/vpG81zQ1cjG5su7o6k6PmcGsjSWhtHgULJxxFIhnfe0x3bV+WFsyPUp6Ksq5+67qg/UyBX9OhsSHJ2KEfvaJ6rO+vO26fvK/1jBR4/PkhXU4od7WnyRZ8jvaMUSj5bWmoYzpU4N5zjmdPDDGWLUx4v5jo01kRJRl3ODQf3RKpKbhbD0zQko1y7oZ622jiOCG21cYq+0j9aoD4VZXBMOTOUw1fl5EAW1xGaa2JsbErRVBPkKD1fee7MMOeGc2SLHjHXoS4Z5SWbm6zF3hILAoBHbuqvzsXR6jzwCo0SM5DZjCorIoeAq8J5OxbmwMGEUi8AryEYyn0P8NbqIUlE5NeBnar6bhF5C/BzqvrmcOKpzxHMKdIJfBu4TFVnLK/YvXu37t27d07p/dvvHqToKY+82MfDR/oB2NSc4q7rOnFmefefL3k8c2qYg92j9I7mqU1EGBgLvqWxiMM9t2+dcPF49sww33r2HB11CW7b3syGxokX/DNDWb6492Tl+U9f24HnKWNFj5pYhO1t6Ur9wxMnB9lzdGK/z+2taX7q6nYiYZHcULbI3qP9jORKZAolkjGX7a1puppSnBnK8Z3nu6ctihKgLhklky9R8pVExKGxJkZNPMKh7tHKduvqE7giOI7QVBOj5Pkc6c0wVgg+Okeo3G03pqK8dGszl7XXAkET6fuePjur97qssz5Be32CppoYx/vGGBwrUpeMcLgnUzleY00MLwzayaiLr8pQtkj3SJ58VUC5ZWszBc/nRP8Y3SOVjDjCzJeGeMSp7KctPMapwSwlX4k4Qb1X+X0TYEtLDa+9pqPyuSy2sUKJgUyR9rr4JTsmQLbgEYs4yyZgnhrM8vzZYa5eV09HfWKpk7OgXnVlGzs3NMz59SKyLxz9fOLyWQaQrwL3VA9oOF8icgvwAVX9qfD5+wBU9U+rtrk/3OYhEYkAZ4FW4L3V21ZvN9MxFyKAQPCD++Lekwxli1y1ro7XXNU+7es8XxnOFfnBgR6O9QdzY7mO4PlBPcTl7bW01cbZ0lJDQ1jfUS1b8EjG3Gn3n8mXGMmV+MLeE+etq75wlb1kcyOdDUnufeJ0Jdu8viFJa22c/ScGL/Q20FGXYChbpDkd46p1dRQ9n5FcieFckbNDOYZzJdLxCDVxl0zeYzRfAqA5HSPmOgyOFckWvcrYYhq+H9dvbODZM8OMFTziEYftbWmO9Y0xmi/Rko6RyXtki0GQ2b2pkSs6anmxL8ORniDn1lQTo6MuwcBYkZLvc+W6OhqS048KMDhWYChbpKspNWOurZzLcp3x1nGqysBYkeP9YxQ9n9FciaLv01mfpD9ToOD5rKtPVBpDJKMu/ZkCD4Y5zUTEYX1jkoZUjNu2NVfKwl84N8oTJwc5M5Qj5jpc0VFLczpGW21iQS9oo7kSPzjYw9mhHJ6vlfe1MRXlug0NdNQnqIlF6BnNM1YokS/6tNcnGM4WaUnHgeB7PZoPPuuekTxHekeJukGDBARu29ZCPOLQM5onEXHJl3z2HR/g2s56YhGHQ92jPHq0n6grdNQl2NRcQ0s6xqbmGo72Zth3fICOugTXrK+nLhFhrODxzJlhOuoSNKSifPf5biKO0D2SJxVzaUzFUODWrc3UzaJUYCBT4IVzI5W6uufOjjdmEeCGrkaa0jE66xPUJaIrul4Llj6AfB/YSZBLqK4DmXMzXhF5I3Cnqr4rfP424GZVfU/VNk+H25wMnx8GbgY+ADysqp8Ol38MuE9VvzTFce4B7gHo6uq68dixY3NKb3UAAegezvG5PSdIxVz+3e1bz9u+5Pk8dWqIBw/3TajX2NZaw89cu27B6yyePzvMN589hwBvuH4DB86NMJQt4odl+RFHuKazvhKMSp7P4Z4MR/sy9I7mGQxzQjs31HNDVyMDYwUaUzH6MgVODWQ50jvKSzY3VXIDs6FhEU4i6tJaG68sG86VqCmnIyzPT8eD0lRfg7twEaHk+fz4cB/dIzmGsyWaamK86oq2WV0glquS5+M4Mm2u1feV77/Qw1OT6rtqExF+5tp1leLCRHT6mwoIAl+5NU4i6lKbiNCfKXByMMuDh/solHxEghuCDY1JjvaN0VOVq5qvZNjwoH9s+kKLeMRhY1OKIz2jTJOxnVLUlWkrjmOuw4bGJOl4hKFskZFciUQ0qHNShUyhxGiuNKGosry/VMzlxk2NHDg7MiGHWRN3uW5DA1d21JFOLOnwgXO2WAFktu/GH835yEtMVT8CfASCHMhC7betLsFl7WlODmQruYRyi4r+TIFHXuyrFJOsb0jS1ZRi54b6C/7w5+qKjjoub69FCSpg1zfO3E8l4jpc3lHL5R1TB4Sa8IJeE4/Q1ZTilm3NF50mETmvnkVEJtQbRSa9HdUX1ojr8IrL5j4J2HJ0oSIixxHuuKKNa9bXkS14NKZiPH16iD1HB/j8niCX6Qhcua6uUu8VcRyGskWGs0UyhRKHukcr373KfquKBmtiLjfvaOHa9fWVpuAv3apk8iWGskUGxooMjRXZ2JQkHnHJlzxODGTRsFVgwfMrLaSyBY/trWk6GxL0jgbBYihb5OEjfURc4erOOg52j7K5OcWujQ0c7xvDcYSuphRttXFEhOFskSO9GTL5EmeHc6jCHVe0cawvw8BYkadODVGXiLClpYae0Tz1iSg3bWkKKrE9JRENKrlPDmTZc6yfM0M58iVvxqAkwI2bGrmqs47GVIyS7yMEjRlu6GpEVTk1mKU/U+CZ08M8eLiPR17sZ9fGBlC4cl1tUATrK1HXQVXpzxRIxSIkokFOOxV3iYdf8J6RPEf7MjTXxNjamr7o781yNWMOREREL5BFmc0207xuxRZhlb3Ym+FfnzxDbSLC3bs6ebE3ww8P9lbWx1yHX71t86IFDbN29GcKHO3LcGYwx6Ge0QnrklG3UgwFQcufppoYW5priLoOJweDotPGZIwtrTVsukCx3WqQK3r0ZwqVotPhXImD50bY1paesWhzKr6vPHFykP0nBhnOlc5bP1VRcVkqFtSp5Yrj61vTcWIRh5qYSyrs39WYilH0fFpr45XAupCWpAgrLLr6MvA1VT1etTxGMKDi24Hvqeon5pCgCEEl+qsIZiLcA/yiqj5Ttc1vANdWVaK/QVXfJCJXA59lvBL9O8COS1GJPtkPD/bw+PHBCcs2Nae4bkMDm5tX/w/VTM0RIR51SETGOyfGIw7xaNCMN+I4xCKC64TNecMmo44Ed8FO2BcBqNRVqYKnSrbgMZgt8NTJIY70ZhjIBPU5uzc3saU5RUMqRjTiUPJ8il7Ql6AUNt0t9+coVvfnCJugmvOJUGn04Ygwmi9SLClPnRqiZyRPz2i+Uh/UWZ9ge1ua4VzQP6OpJsbgWJHBsQKZgsf1XQ08eWKIbNEjEXXwFYazxfMaYKRiLtta01zf1UBtIkLEubiGDeXm6/c/c45s0aMuEaEuGeX+33l5pWTh4t+HuRVh3Qn8GvC5cDiTQYJReR2CPiEfVtXH55IgVS2JSHlCKRf4eHlCKWCvqt5L0Pv9n8JWYP0EsxYSbvdFglkIS8BvXCh4LJZbtzYTc4NKwfpklMvapy8Wmi8RKp2gyp2fyj2rI27Qdt11pPIHVNqj+2FHLl+hGA5LX27XXs66l//KPxq36sImIpX+B+W+BQVvvKNTrhh0IsxXlb3PpoPTSlHuUJia1PGs+nn5cfISdSi8dVvLvPdR7pjn6XgnNi/sLFoKOwaW+42MdyAcD0gTOw2OdyIselX9VSZ1IvT88Q6Dvj+x8+BCkqoOsbGwgr/cmTARLffNCT+3WPA4ER3vp1P+PV2oH0d1/5tKR9bwvRIZ/y2W01PN85UnTw7SPZwn6gqnh3L84EAPDx3p46lTQ6TjEa7urOPRF/vpak4xkitRKPlc3VnH7k2NHOsfYzhszIPAD17o4XB3ZkJfteFciVjE4eRAdsGvTbOqRA9OXqJAC5BV1cEFTcUlshg5kIVWbtbZkAqGMalLBkOZ1CejpBMR4hF32TR7nEn5h1WpzC15ZAthr/WSHz4ef54vepVhTMo93Reqg5UI4V2/nDeEScwNcgWVi0pkPLdQ6QwYcS5p89a1pnp8s3LLPD8MbNXLtPK//EIqg6CVL84ClZugSDiqwkosBfjK4yf50Qu9DGWLfOf5oPFrKuZyRUctT54cmnFQ18ZUcCN71bo6rlhXS7Hkc8OmRq7qrJ9zeuZbiY6qFoEzc06BmSAWcahPRmlJx2hMxWhOx2hIxahNRGbslLdSiAhu2MlwpmbIM1Edv7v1dXxcrPIdLAR3fEI49ARhD+4wJxWp+r/S38/VrPzZiICDfU4AP3f9Bn7u+g0APHFikHzJ5yWbGxERzg3n+Owjxyl6PkPZIjva0jx6tJ980efW7S287aWbLtlo3yuzTdoK1FIbZ31Dgo66JO11ceqS0RUzGOJSkbD4YXJLLWPWkus2Nkx43l6X4D+85rIJy95x25ZLmKJxFkAWScQRtrWl2dpaw6amGhLRlZ+rMMaYarOdD+Sq6iFGwmWvVNXvL0qqVrDW2ji7NjZwWXutTRpljFnVZpsD+aKI/BPw50Ai/L8buGWxErbSNNXEuG17M1tb0it+2ANjjJmN2QaQm4E/Ax4EaoHPALctVqJWmpu3NHHz1uYV0TrKGGMWymwDSBHIEvQBSQAvquqanZmw2l27OtnaUmP1G8aYNWe2hfR7CALIS4DbgbeKyD8vWqpWiF+6uYttrTPPwWGMMavVbAPIO1X1D1W1qKpnVPVu4N65HlREmkTkWyJyMPzfOMU2u0TkIRF5RkSeFJE3V637hIi8KCL7w79dc03LXP3k1e201a2uOQOMMeZizCqAqOp53bdV9Z/mcdz3At9R1R0E41i9d4ptxoBfUdWrCYZU+bCINFSt/z1V3RX+7Z9HWi5aLOIEQwcYY8watlTtTO8GPhk+/iTw+skbqOoLqnowfHwa6CYYiXfJ/bvbt1qxlTFmzVuqANKuquVhUc4C00/pB4jITUAMOFy1+E/Coq3/Gc6dPt1r7xGRvSKyt6enZ94JL4+jZIwxa92iXQlF5Nsi8vQUf3dXbxfOJTLtyGAisg74J+BXq1p+vQ+4gqBSvwn4g+ler6ofUdXdqrq7tXX+GZh3vmxphgwwxpjlZtGGMlHVV0+3TkTOicg6VT0TBogp51oXkTrgX4H3q+rDVfsu517yIvJ/gP+0gEmfliMSzPlsjDFmyYqw7iWYjIrw/9cmbxBOWvUV4FOT5zoPgw4SVES8Hnh6MRNbFrfxrIwxpmKpAsiHgNeIyEHg1eFzRGS3iHw03OZNwMuBd0zRXPczIvIU8BTBHCV/fCkSffeuzktxGGOMWRGWZDReVe0jmMp28vK9wLvCx58GPj3N6+9Y1AROo63W+n0YY0yZFejPksj41JbGGGMsgMyaIzarnTHGVLMAMks2eaAxxkxkl8VZciz3YYwxE1gAmSWb68MYYyayADJLEQsgxhgzgQWQWbr7+vVLnQRjjFlWLIDMUl0iutRJMMaYZcUCiDHGmDmRYDDctUFEeoBjc3x5C9C7gMlZSqvlXFbLeYCdy3Jl5xLYpKrnDWe+pgLIfIjIXlXdvdTpWAir5VxWy3mAnctyZecyMyvCMsYYMycWQIwxxsyJBZDZ+8hSJ2ABrZZzWS3nAXYuy5WdywysDsQYY8ycWA7EGGPMnFgAMcYYMycWQIwxxsyJBRBjjDFzsmwDiIjcKSIHROSQiLx3ivXvEJEeEdkf/r1rKdJpjDFrVWSpEzAVEXGBvwNeA5wE9ojIvar67KRNv6Cq77nkCTTGGLNscyA3AYdU9YiqFoDPA3cvcZqMMcZUWZY5EGA9cKLq+Ung5im2+3kReTnwAvAfVPXEFNtUtLS06ObNmxcskcYYsxbs27evd6rBFJdrAJmNrwOfU9W8iPx74JPAHZM3EpF7gHsAurq62Lt376VNpTHGrHAiMuUo5su1COsUsLHq+YZwWYWq9qlqPnz6UeDGqXakqh9R1d2quru19bwAOmvdw7k5v9YYY1aj5RpA9gA7RGSLiMSAtwD3Vm8gIuuqnt4FPLeYCfq3Z84u5u6NMWbFWZZFWKpaEpH3APcDLvBxVX1GRD4I7FXVe4HfEpG7gBLQD7xjMdNU8mzMMGOMqbYsAwiAqn4D+MakZX9Y9fh9wPsuVXp8G3TSGGMmWK5FWMtOybcAYowx1SyAzJLnKzb0vTHGjLMAMkuqimVCjDFmnAWQizA4VljqJBhjzLJhAeQifPmxk0udBGOMWTYsgFyEojXlNcaYCgsgF6FQ8q0i3RhjQhZALlKm4C11EowxZlmwAHKRPvXQ0aVOgjHGLAsWQC5SvujjW3teY4yxADIXT50aWuokGGPMkrMAMgffO9BtuRBjzJpnAWQOVOHp05YLMcasbRZA5ug7z3VTKPlLnQxjjFkyFkDm4R9/dISiZ0HEGLM2zWs+EBHZDdwOdAJZ4GngW6o6sABpW/YKJZ9P/Pgob7tlE4mou9TJMcaYS2pOORAR+VUReYxgQqckcADoBl4GfFtEPikiXQuXzOVrNF/iH394hON9Y1axboxZU+aaA0kBt6lqdqqVIrIL2AEcn+P+V5SSr3z5sZNcua6Wl25tpi4RxXFkqZNllpiqohrMZqlQeQznz3ApCCIgAo5I+Aci9j0yy9ecAoiq/t0F1u+fU2pWmFODWZ4/O0xjMsa2tjQ/fKGXJ08Osb0tzRUddWxpqSEecSyYrBCqSslXckWPXNEnV/TIlzwKJSVX8sLnPoWSj+crRS94XPKD1xXD5Z4qJc/H8+c3FXI5iLiuEHEE13FwBH58qJf+TIFc0Sdf8rh713oub68lGXVJxFwirhBzHWIRZ/x/xCHqOsTD/659J80CmG8dyBbgN4HN1ftS1bvml6yV4alTQxw4OwLAjw71ArClpYa7ruvkWN8YriN01CfY0JCkoz5Be12CRNS1H+8S8H1lrOgxkisylC2SyZfI5D1G8yVG8yWyheBx0fNZLuNl+qqM5Eo8d2aYp04NMZwrTVhfl4gwnCvxl996AQDXERqSUe68poOWdHzGfUccqQSW6kATjzjEI25lebxqfTzqhv/D5xHHckhr3LwCCPBV4GPA14E10RzpaG+GF86NcOW6OnIFj/a6OK++sp3nzgzz2PFBTg9m8XzFdQTPV04NZDk1EJT0OSI0pKI0p2PUJaLUJ6M01cSoT0VJRFyirtgPco5Kns9wrsRorsRwrshILggMQ9kiw9kio/kS3jKvo8rkS8QiDpl8ib5MgT1H+zk3nJ+wTXtdnF0bG7i8vRaA4VyJhw73cWYoi4jQlynwgwM93HlNB1HXYSRX5PRgjoZUlPa6BCXfJxWLBLmmgsfYPAYHFaGSq4lXAo57XkCKVa+rCkDlXFHEKRff2Xd/pZlvAMmp6l8vSEpWgP0nBvnBCz0APBfmPDY1p2hJx7l9RytR1+GRF/v52AMvcnlHLV1NKba01FRe76vSnynQnzl/ZsN41CEVdakNA0s6EQmKJKIuqdj4j9J1BTcsI6/+vYkE5ehOWIa+mn6QhZJPtuAxnCtWgsNwtshYeAHMhLmIyYqeT99ogbba+KzeD1VFJAj8Jd8nHjm/ZV2u6NE7msd1BF9BCD7Xkq/sOzZASzpO70ieou/j+1DyfRpSMc4O5WiqiXHN+joub69FRFBV8iWfHx7s4bkzI9Om6zVXtXPVurrKjUm1+jDHUfb0qSG+83w3H33gxWn398rLW7luQ8OM78VsqAafTaHkM33qL8wRIeIKUVeIVgWWqCvE3ODGajw4BcvKQShaFawSUYdIWMy3Wr77y918A8hficgfAd8EKrdKqvrYPPe7LB3tywCQjkcqF6ybNjdV1r9kcxOnBrOcHMiy/8QgL5wbYef6es4M59jemuaa9fXT7jtf9MkXfQbGivNKY7kS1nWCv0j5L/xBuo6D61ApT3dEmPxTG//tjQckx5m4Xzf80buOE5bPB8dxnIkBrrr+p9xKzQvrDCr1CJ5fqV/IF4OgMJovkQ/rIUoXyDkc68vQlykQizgMjhVJRoN6gAcP9VGo6qdTn4zS2ZDAFWE0X+LqznoaU1H2HhvgRP8YYwWP1to4Q9ki+ZJPXSLCdRsbgkYRAs+eGeZwT2bGtJwMc5u1iQhjBQ/P18pnemowy6nBLPc/c466RARfmRD4uppStNbGK3POrG9IsrU1XVk/m6LPa9bXU5uIcLx/jEhY19GajnNuOFf5bn7/QA9HezO01SbYtbGBZGxpm6D7qhRKSqEEML/pEiYHo4jrEHXKj2VCAwWA8jfLV8XX4Dta8hXfV3wN6rMgCJRPnhwkGY2wpSVFPOqy92g/XU0pLu+oC38bMJQtUij5dNQnK2nSsBFFmTD1byriOJXfkesE51Gu+3Krtq/cIDLxHEq+4nnBzY/nKwXPp+gFv7GuphTtdYl5vbdTkflMkCQifwq8DTjMeBGWquod806YyJ3AXwEu8FFV/dCk9XHgU8CNQB/wZlU9OtM+d+/erXv37p1Tev72uwf59MPHiUUcXrdzHd3DeZrTsfP6f5R8n+fPjPDM6WHODucmrLu+q4F0PEJTTYzWdDz44WrwBbB6kYBqEFgibtDCPF/0ePLUEKO5EqmYS2+mwGiuxNWddURc4cDZEY72jU25L1eEruYUjakoJweydI8E9zjJqEu2OPFC1ZSKgcBorjQh6ExWl4iwvS1NQzJGTdyl5Af1FJ6vXLO+jkzeQ1Vpq/qxZgseRc8n4grffPYcfaMFfFUaUzHS8QgicOu2ZmoT0fm+fRc0nC3yjafPTCgau35jAxAE9uZ0jO1t6TAHMPtW/tmCx8nBMfozBdLxCFd01JEteJXiq0tFVSmUfGIRJ8ghSpATPd43xvGBMfJFn5p4hFzRY2tLDdvb0uRKPoe6R9nUlKIuGZ2Q0yt6Pv2ZAg8e7uN4/9Tfs/pklG2tNaRiER4I60IbU1He8pIuXEcYGCvw+PFBHIGNTamgGLsmzkiuiGpQ+pCMuouaa3rVlW3snEeuU0T2qeru85bPM4AcAq5S1fPLZOZBRFzgBeA1wElgD/BWVX22aptfB3aq6rtF5C3Az6nqm2fa73wCyH/64n6+9NgpdrSl+elr111w+2fPDPOtZ8/hCLzy8ja++3z3tNtGHOEdt26mJj7fDOHUVJWip3OuYxkrlOgeztNUE+PcSI6OukR44ZvdvoazRVxHqIlHKJR8MvkSNfEIsYiDqnK4J8OLvRmGc0V6R/Pkij4x1wkqtMN9CDDdN7UlHePyjlpSsQhbWmo4PZitBA+nKo2lcH9R1+HscI7+0QKuI9SnorTVxivblltjjRU8BscKSHjHWpuIko5HVnyw9/2gVdl3n++u5KhirjMhcLqO8BOXt1L0lLFCic76JLmihxcWuzUkg/ditFBi79EBzgzlpjsc7XXxSjPlhmSU2y9rxRVZ0MDyYm+GR1/sZyhbJFv0iLqCahAUq783rkglV1E+T2BC/ZgjkIoFRcg9o+OBdntrmmzR49RglnjEYVtrmmfPDJ+XlogjlVxzuS50tlpr46TjERqSUfIln8ZUlNNDOeIRh5dubaZQ8ukbzVObCHLTs/0NLlYAme8V62mggaAT4UK6CTikqkcAROTzwN3As1Xb3A18IHz8JeBvRUR0keac3Xd8EAjuIGbjyo5amlIxUjGXumSUrS01RF2H0XyJTL7E4Z5RTg1mUaBvtMBHH3iRu67rpLMhwZHwR33lujoyYUVwyVfWNyR54dwIQ9kiqZjLueF8pSIzW/BQlA2NKa7oqOXrT57mzGCOWMSZUFH6up3r2NaaxveVg92jlSKb04NZPFXS8QiXt9dWgln3SI5vPHWWoezEorWOugTXbahne1u6kluA8XqETL7EkZ4Mjx0fYDB8bV0iQiYs1gForolR8HxGwtZFbbVxtrWmqUtEyRRK5IoeDakYGxuTrG9IVprI5os+Y0WPwbDYaktLzYQf0raqYp9q1ensqEvQMU2WXiQoAqlPOtQnFz9XcKk5jpCKRbjzmg66h/O01caJhBXuT58a5txIju7hPN9+rvpnfeHBJX7m2nW0pGPsOzbAcK5E1A0+k5If9Ic5PZjlzFCuUn/YXBOjoz7BxsYUG5uSpGJTX46O9I6SL/pEXYeGVJS6RJTBbIGTA1nyRZ8X+zL0jORJxVza6+K01yXIl4KcQ9QV2usSOCJ0NiRor00gEhQdfm3/afoyBba3pmlOx3jy5BAikC16FEo+vioNqSiuI1y/sYGrO4Mi6KLn44bFSDvag+9aUBcGm5tTqMKLfRkO94wGRUmloB5sU3Oq0qBDEBJRh6KnHOvP4PtwdjhHz0ienpH8lO/D82cn1jTVJ6PsXF9PtujRnylQl4xyqHuUeMRhXUOCmliEzoYkGxqSU+5vIcw3B/J9YCdBDqG6DmRezXhF5I3Anar6rvD524CbVfU9Vds8HW5zMnx+ONymd9K+7gHuAejq6rrx2LFjc0rT7X/2XTxf+YXdG+f0+umoKj8+3Me+Yws/+osrQirusq4+wUiuVLlLvHZ9PQNjhUp5/Xmvc4QdbWlOD2YZzpVIRl12b25kYKxAbSLKiz2ZSvFcQyrKttY0rggvdI8wOFakJuZWpv5NxVw2NCbJ5IPA0V4XJxWPcLQ3gxNWWDenY+ze1EhDKrbg74GZm6FskeP9Y6RiLvXJKKcHsxQ9ZXtbGkegP1MgH15k65NRWmvjRJyZcxS5osePDvaiBEVEZwZz9FU1KLluQz0bm1J4vnKsbwxH4MRA9rybl6lc1p7mjivapmz4MB3VoJ7gYl6z2Eq+z6mBLPXJKEPZIvXJoFHNIy/2ky/5uI7QlIoxlC3y6NH+We/3Z69bxx+//to53xAtVhHWK6Zarqo/mPNOWdgAUm0+RVi3/ul3cF3hDddvmNPrL2SsUOLRF/sZzZfY0lLD06eCOpSmmhi7NjRwcnCMdDxCKhbhms46njo9xNBYkdt3tDKSK5IpeGxoTPLAwV6yRY919Qmu6qyb8KN+4sQg3w9bkUFQSSsCO9rS7GivBYXHjg9wsHu08qNtSce48+oOmif1KxjKFtl/YpBnTw9XcgYQZMEbklEaa2Ksb0jSWZ+YcOdvTLV80eNQzygPHOolV5xY9+Q6QjLqsrExyeUdtSSiLqfCZvINySiJqEtbbZyRfOmC/V5Wo3IfJlWlvTaBp0rvaJ7WdBzXEQazRfYeHSBf8jjRn+W+37l92tz5hSxoAJlNUdF8ipNE5BbgA6r6U+Hz9wGo6p9WbXN/uM1DIhIBzgKtMx1zPgHkpj/5NjXxCHdd1zmn1y8XJc9nMBu0VJqpzmU4VyRX9GirvXDLjfKdnCNBPUe5lUt1c+Lyx1Ju7bIQPbXN6jIwViBb8Ii6QQvByTcta025ZVe5ZaPrBHWY7qRmyuXflhf+rsotHKvrXm7oauAVl7fNOS0LXQfyPRH5MvA1Va2MdyUiMYIBFd8OfA/4xBz3vwfYEfZ0PwW8BfjFSdvcGx7nIeCNwHcXq/4Dgg8mcokrT8v1G9HK0BRupamsI+PNbcfHUQqWR8pNAl0hGjYNjLpBU95yE0HXGR9rSSrHm3h+5eaG5ea45aaEkbBZYdCMN2y+W9UvZbYVe+XK6qIXNGEOhgvxGSsEvcTLTXuzRY+xfKnSOdCsTo2pGI2zqGIUIfz+lXvJC/FI0Dck6k7sHxIpN+cNm8UGdRfnN+PV8MbGq7r4lm92IKjDGf+Njf8W3Mrvomr8Mib20SpflRSdsO6831RVE97yfufan6vcmrEUNueNLVIpwFwDyJ3ArwGfCy/ygwSj8joEfUI+rKqPzzVRqloSkfcA9xM04/24qj4jIh8E9qrqvQQ94P8pbAnWTxBkFsUnfvwi/WPFBW9H7YiQTkSojUeoDysH65IR6hJRahORyrAnEWd19lAvV1ZHXYfZVn+UPJ/RfInhbIlMoVTpSDgcDlEymivNq3e1WRwiVcOnhDdD8Uj5Qh/c8MQiwQU/Xumhfv4wK9HI+A3VavxNLBQJb/AiLos61cRcB1PMAX8P/L2IRIEWIKuqgwuVMFX9BvCNScv+cFIafmGhjjeT/ScGSUYd1tXPvTVDTdyltTZoIdJWGw+DRJRYxAa2uxgR16EhFZuxwr0cZEZy40OZDOdKjIS92EdyJSs6uwgiTBgPKz5pmJLpx85yiLvj66yH+Ooz744HqloEzixAWpatD7/lev72uwcperO/6MQiDhubUmxqSrGhMUldMrpqcxLLTXWQmarNnBeOuJvJlxgJm1WXczLZsCd8vuhVmnOWm6GuNI5MHjCxnAMYv6hHwzv+8rKJY1eNBwP73pqpLE7PtTWssyHB1Z1B/wgbrXR5KndqrIlHuFC1YrlsPB/WzwTDu/uVuptSOFREeTj3UmU49+py9GAf1Q0JVJkQlM6fCySsQJ00ZEz1sDTl3uLVj8sX/HKdlzGLyQLIAqlLRvmJy1vZ1FxjRVKrSLnVSyoWmXU9jTFrxXznA/lN4NNrZQ706VzWXstPXt1+UWMHGWPMSjffK147sEdEvigid8oaLK/Z1dXAa8O5F4wxZi2Z11VPVf8LwdznHwPeARwUkf8uItsWIG3L3pXr6njlZa02Za0xZk2a921z2HnvbPhXAhqBL4nIn89338uZI8JPXtVuleTGmDVrvnUgvw38CtALfBT4PVUtiogDHAR+f/5JXJ7ueflWy3kYY9a0+bbCagLeoKoThrhVVV9EXjfPfS9bUTcYitkYY9ayeQUQVf2jGdY9N599L2fvuG2LFV0ZY9Y8u42+SI4INUs8h7QxxiwHFkAu0va2tOU+jDEGCyAX7Sevbl/qJBhjzLJgAeQiOCKXfE4QY4xZriyAXIRoxEbTNcaYMgsgF2Fd/cJOKGWMMSuZBZCL8LqdK3s+dGOMWUgWQC6Ca8VXxhhTYQFklhxHbOgSY4ypYgFkliz3YYwxE1kAmSWbZdAYYyayADJL1v/DGGMmWnYBRESaRORbInIw/N84zXaeiOwP/+5d7HTVJqKLfQhjjFlRll0AAd4LfEdVdwDfCZ9PJauqu8K/uxY7UT9/44bFPoQxxqwoyzGA3A18Mnz8SeD1S5cUY4wx01mOAaRdVc+Ej88C041emBCRvSLysIi8frqdicg94XZ7e3p6FjqtxhizZkkwpfklPqjIt4GOKVa9H/ikqjZUbTugqufVg4jIelU9JSJbge8Cr1LVwxc4bg9wbKZtZtBCMHXvarBazmW1nAfYuSxXdi6BTaraOnnhfKe0nRNVffV060TknIisU9UzIrIO6J5mH6fC/0dE5PvA9cCMAWSqN2C2RGSvqu6e6+uXk9VyLqvlPMDOZbmyc5nZcizCuhd4e/j47cDXJm8gIo0iEg8ftwC3Ac9eshQaY4xZlgHkQ8BrROQg8OrwOSKyW0Q+Gm5zJbBXRJ4Avgd8SFUtgBhjzCW0JEVYM1HVPuBVUyzfC7wrfPwgcO0lTtpHLvHxFtNqOZfVch5g57Jc2bnMYEkq0Y0xxqx8y7EIyxhjzApgAcQYY8ycWAC5ABG5U0QOiMghEZluWJUVQUSOishT4fhhe5c6PRdDRD4uIt0i8nTVslmNm7bcTHMuHxCRU1Xju/30UqZxtkRko4h8T0SeFZFnROS3w+Ur6rOZ4TxW3OciIgkReVREngjP5b+Gy7eIyCPhtewLIhKb97GsDmR6IuICLwCvAU4Ce4C3rtQWXyJyFNitqiuuY5SIvBwYBT6lqteEy/4c6FfVD4XBvVFV/2Ap0zkb05zLB4BRVf0fS5m2ixX21Vqnqo+JSC2wj2D4oXewgj6bGc7jTaywz0VEBKhR1VERiQIPAL8N/C7wf1X18yLyv4EnVPV/zedYlgOZ2U3AIVU9oqoF4PMEY3WZS0xVfwj0T1q8IsdNm+ZcViRVPaOqj4WPR4DngPWssM9mhvNYcTQwGj6Nhn8K3AF8KVy+IJ+JBZCZrQdOVD0/yQr9UoUU+KaI7BORe5Y6MQtgtuOmrRTvEZEnwyKuZV3kMxUR2UwwIsQjrODPZtJ5wAr8XETEFZH9BCN5fItglI5BVS2FmyzItcwCyNryMlW9AXgt8BthUcqqoEFZ7Eouj/1fwDZgF3AG+P+WNDUXSUTSwJeB31HV4ep1K+mzmeI8VuTnoqqequ4CNhCUpFyxGMexADKzU8DGqucbwmUrUtX4Yd3AVwi+WCvZubDsulyGPeW4aSuBqp4Lf/Q+8I+soM8mLGf/MvAZVf2/4eIV99lMdR4r+XMBUNVBgtE6bgEaRKTceXxBrmUWQGa2B9gRtl6IAW8hGKtrxRGRmrByEBGpAX4SeHrmVy17Fxw3baUoX2xDP8cK+WzCCtuPAc+p6l9WrVpRn81057ESPxcRaRWRhvBxkqAR0HMEgeSN4WYL8plYK6wLCJvtfRhwgY+r6p8sbYrmRoJh778SPo0An11J5yIinwNeSTAk9Tngj4CvAl8EugiG6X+Tqi77yulpzuWVBMUkChwF/n1VHcKyJSIvA34EPAX44eL/TFB/sGI+mxnO462ssM9FRHYSVJK7BJmEL6rqB8NrwOeBJuBx4JdVNT+vY1kAMcYYMxdWhGWMMWZOLIAYY4yZEwsgxhhj5sQCiDHGmDmxAGKMMWZOLIAYMwci0lw1QuvZqhFbR0Xk7xfpmL8jIr8yw/rXicgHF+PYxkzFmvEaM0+XYiTdsAfxY8ANVeMZTd5Gwm1uU9WxxUqLMWWWAzFmAYnIK0XkX8LHHxCRT4rIj0TkmIi8QUT+XII5Wf4tHDoDEblRRH4QDnJ5/6Tez2V3AI+Vg4eI/FY4d8WTIvJ5qIw59X3gdZfkZM2aZwHEmMW1jeDifxfwaeB7qnotkAV+JgwifwO8UVVvBD4OTDVCwG0Ec1SUvRe4XlV3Au+uWr4XuH3Bz8KYKUQuvIkxZh7uU9WiiDxFMLTEv4XLnwI2A5cD1wDfCkqgcAlGfZ1sHcF4RmVPAp8Rka8SDOlS1g10LlzyjZmeBRBjFlceQFV9ESnqeKWjT/D7E+AZVb3lAvvJAomq5z8DvBz4WeD9InJtWLyVCLc1ZtFZEZYxS+sA0Coit0AwpLiIXD3Fds8B28NtHGCjqn4P+AOgHkiH213GChgx1qwOFkCMWULhVMlvBP5MRJ4A9gO3TrHpfQQ5DgiKuT4dFos9Dvx1OO8DwE8A/7qYaTamzJrxGrNCiMhXgN9X1YPTrG8nGKb/VZc2ZWatsgBizAohIpcTzDX+w2nWvwQoqur+S5ows2ZZADHGGDMnVgdijDFmTiyAGGOMmRMLIMYYY+bEAogxxpg5sQBijDFmTv5/CdB01M/Sv4gAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "results = nav.GaussianResultList.from_estimates(estimates, state_data)\n", + "# results.nees \n", + "# results.three_sigma\n", + "# results.error\n", + "# results.md # mahalanobis distance\n", + "# # and more...\n", + "\n", + "# Some plotting functions that work directly with GaussianResultList\n", + "fig, axs = nav.plot_error(results)\n", + "axs[0].set_title(\"Estimation Errors\")\n", + "axs[0].set_ylabel(\"theta (rad)\")\n", + "axs[1].set_ylabel(\"x (m)\")\n", + "axs[2].set_ylabel(\"y (m)\")\n", + "axs[2].set_xlabel(\"Time (s)\")\n", + "\n", + "fig, ax = nav.plot_nees(results)\n", + "ax.set_title(\"NEES\")\n", + "ax.set_xlabel(\"Time (s)\")\n", + "plt.show()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As a final note, `GaussianResultList` will invoke the `State.minus` method of the state objects to calculate the error. As we will see next, this allows us to implement a custom measure of error, when it might not make sense to directly subtract two of our state objects." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.16" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_build/doctrees/nbsphinx/tutorial_composite_11_0.png b/_build/doctrees/nbsphinx/tutorial_composite_11_0.png new file mode 100644 index 00000000..5975d2dc Binary files /dev/null and b/_build/doctrees/nbsphinx/tutorial_composite_11_0.png differ diff --git a/_build/doctrees/nbsphinx/tutorial_composite_11_1.png b/_build/doctrees/nbsphinx/tutorial_composite_11_1.png new file mode 100644 index 00000000..9138fd24 Binary files /dev/null and b/_build/doctrees/nbsphinx/tutorial_composite_11_1.png differ diff --git a/_build/doctrees/nbsphinx/tutorial_lie_groups_12_0.png b/_build/doctrees/nbsphinx/tutorial_lie_groups_12_0.png new file mode 100644 index 00000000..7028588e Binary files /dev/null and b/_build/doctrees/nbsphinx/tutorial_lie_groups_12_0.png differ diff --git a/_build/doctrees/nbsphinx/tutorial_lie_groups_12_1.png b/_build/doctrees/nbsphinx/tutorial_lie_groups_12_1.png new file mode 100644 index 00000000..0dc7ed62 Binary files /dev/null and b/_build/doctrees/nbsphinx/tutorial_lie_groups_12_1.png differ diff --git a/_build/doctrees/nbsphinx/tutorial_traditional_13_0.png b/_build/doctrees/nbsphinx/tutorial_traditional_13_0.png new file mode 100644 index 00000000..3dbc3f21 Binary files /dev/null and b/_build/doctrees/nbsphinx/tutorial_traditional_13_0.png differ diff --git a/_build/doctrees/nbsphinx/tutorial_traditional_13_1.png b/_build/doctrees/nbsphinx/tutorial_traditional_13_1.png new file mode 100644 index 00000000..5b75a622 Binary files /dev/null and b/_build/doctrees/nbsphinx/tutorial_traditional_13_1.png differ diff --git a/_build/doctrees/nbsphinx/tutorial_traditional_9_0.png b/_build/doctrees/nbsphinx/tutorial_traditional_9_0.png new file mode 100644 index 00000000..f3d0d162 Binary files /dev/null and b/_build/doctrees/nbsphinx/tutorial_traditional_9_0.png differ diff --git a/_build/doctrees/nbsphinx/tutorial_traditional_9_1.png b/_build/doctrees/nbsphinx/tutorial_traditional_9_1.png new file mode 100644 index 00000000..53322f71 Binary files /dev/null and b/_build/doctrees/nbsphinx/tutorial_traditional_9_1.png differ diff --git a/_build/doctrees/tutorial.doctree b/_build/doctrees/tutorial.doctree new file mode 100644 index 00000000..57db71cb Binary files /dev/null and b/_build/doctrees/tutorial.doctree differ diff --git a/_build/doctrees/tutorial/composite.doctree b/_build/doctrees/tutorial/composite.doctree new file mode 100644 index 00000000..b34c4f10 Binary files /dev/null and b/_build/doctrees/tutorial/composite.doctree differ diff --git a/_build/doctrees/tutorial/jacobians.doctree b/_build/doctrees/tutorial/jacobians.doctree new file mode 100644 index 00000000..9962eb15 Binary files /dev/null and b/_build/doctrees/tutorial/jacobians.doctree differ diff --git a/_build/doctrees/tutorial/lie_groups.doctree b/_build/doctrees/tutorial/lie_groups.doctree new file mode 100644 index 00000000..3303024d Binary files /dev/null and b/_build/doctrees/tutorial/lie_groups.doctree differ diff --git a/_build/doctrees/tutorial/traditional.doctree b/_build/doctrees/tutorial/traditional.doctree new file mode 100644 index 00000000..20d627fc Binary files /dev/null and b/_build/doctrees/tutorial/traditional.doctree differ diff --git a/_build/html/.buildinfo b/_build/html/.buildinfo new file mode 100644 index 00000000..fc813a60 --- /dev/null +++ b/_build/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 9da935fe32409bd4f0f918e17a1e765b +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/_build/html/.nojekyll b/_build/html/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/_build/html/_autosummary/navlie.batch.estimator.BatchEstimator.html b/_build/html/_autosummary/navlie.batch.estimator.BatchEstimator.html new file mode 100644 index 00000000..8715e26e --- /dev/null +++ b/_build/html/_autosummary/navlie.batch.estimator.BatchEstimator.html @@ -0,0 +1,1175 @@ + + + + + + + + navlie.batch.estimator.BatchEstimator — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.batch.estimator.html b/_build/html/_autosummary/navlie.batch.estimator.html new file mode 100644 index 00000000..134b20f5 --- /dev/null +++ b/_build/html/_autosummary/navlie.batch.estimator.html @@ -0,0 +1,1094 @@ + + + + + + + + navlie.batch.estimator — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

navlie.batch.estimator

+

Batch estimator to construct batch problems composed of prior residuals, process residuals, and +measurement residuals.

+

The BatchEstimator.solve() method constructs and solves a batch problem over a sequence +of input and measurement data. Process and measurement residuals are automatically created +and added to the problem, using the generic definitions of process and measurement residuals +defined in the module navlie.batch.residuals.

+

Classes

+ + + + + + +

BatchEstimator([solver_type, max_iters, ...])

Main class for the batch estimator.

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.batch.gaussian_mixtures.GaussianMixtureResidual.html b/_build/html/_autosummary/navlie.batch.gaussian_mixtures.GaussianMixtureResidual.html new file mode 100644 index 00000000..562c2497 --- /dev/null +++ b/_build/html/_autosummary/navlie.batch.gaussian_mixtures.GaussianMixtureResidual.html @@ -0,0 +1,1263 @@ + + + + + + + + navlie.batch.gaussian_mixtures.GaussianMixtureResidual — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.html b/_build/html/_autosummary/navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.html new file mode 100644 index 00000000..b708a79c --- /dev/null +++ b/_build/html/_autosummary/navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.html @@ -0,0 +1,1296 @@ + + + + + + + + navlie.batch.gaussian_mixtures.HessianSumMixtureResidual — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.batch.gaussian_mixtures.MaxMixtureResidual.html b/_build/html/_autosummary/navlie.batch.gaussian_mixtures.MaxMixtureResidual.html new file mode 100644 index 00000000..1dc66026 --- /dev/null +++ b/_build/html/_autosummary/navlie.batch.gaussian_mixtures.MaxMixtureResidual.html @@ -0,0 +1,1255 @@ + + + + + + + + navlie.batch.gaussian_mixtures.MaxMixtureResidual — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.batch.gaussian_mixtures.MaxSumMixtureResidual.html b/_build/html/_autosummary/navlie.batch.gaussian_mixtures.MaxSumMixtureResidual.html new file mode 100644 index 00000000..4d4a5478 --- /dev/null +++ b/_build/html/_autosummary/navlie.batch.gaussian_mixtures.MaxSumMixtureResidual.html @@ -0,0 +1,1282 @@ + + + + + + + + navlie.batch.gaussian_mixtures.MaxSumMixtureResidual — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.batch.gaussian_mixtures.SumMixtureResidual.html b/_build/html/_autosummary/navlie.batch.gaussian_mixtures.SumMixtureResidual.html new file mode 100644 index 00000000..a81599c5 --- /dev/null +++ b/_build/html/_autosummary/navlie.batch.gaussian_mixtures.SumMixtureResidual.html @@ -0,0 +1,1254 @@ + + + + + + + + navlie.batch.gaussian_mixtures.SumMixtureResidual — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.batch.gaussian_mixtures.html b/_build/html/_autosummary/navlie.batch.gaussian_mixtures.html new file mode 100644 index 00000000..7925b761 --- /dev/null +++ b/_build/html/_autosummary/navlie.batch.gaussian_mixtures.html @@ -0,0 +1,1100 @@ + + + + + + + + navlie.batch.gaussian_mixtures — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

navlie.batch.gaussian_mixtures

+

Classes

+ + + + + + + + + + + + + + + + + + +

GaussianMixtureResidual(errors, weights)

A Gaussian mixture residual.

HessianSumMixtureResidual(errors, weights[, ...])

The Hessian-Sum-Mixture method patched for compatibility with nonlinear least squares solvers.

MaxMixtureResidual(errors, weights)

Based on the following reference, @article{olson2013inference, title={Inference on networks of mixtures for robust robot mapping}, author={Olson, Edwin and Agarwal, Pratik}, journal={The International Journal of Robotics Research}, volume={32}, number={7}, pages={826--840}, year={2013}, publisher={SAGE Publications Sage UK: London, England} }

MaxSumMixtureResidual(errors, weights[, ...])

Based on the following reference: @ARTICLE{9381625, author={Pfeifer, Tim and Lange, Sven and Protzel, Peter}, journal={IEEE Robotics and Automation Letters}, title={Advancing Mixture Models for Least Squares Optimization}, year={2021}, volume={6}, number={2}, pages={3941-3948}, doi={10.1109/LRA.2021.3067307}}

SumMixtureResidual(errors, weights)

For details see the reference @ARTICLE{9381625, author={Pfeifer, Tim and Lange, Sven and Protzel, Peter}, journal={IEEE Robotics and Automation Letters}, title={Advancing Mixture Models for Least Squares Optimization}, year={2021}, volume={6}, number={2}, pages={3941-3948}, doi={10.1109/LRA.2021.3067307}}

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.batch.html b/_build/html/_autosummary/navlie.batch.html new file mode 100644 index 00000000..f82627af --- /dev/null +++ b/_build/html/_autosummary/navlie.batch.html @@ -0,0 +1,1101 @@ + + + + + + + + navlie.batch — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

navlie.batch

+

A subpackage for batch least-squares estimation.

+

Modules

+ + + + + + + + + + + + + + + + + + +

navlie.batch.estimator

Batch estimator to construct batch problems composed of prior residuals, process residuals, and measurement residuals.

navlie.batch.gaussian_mixtures

navlie.batch.losses

Robust loss functions to be used in nonlinear least squares problems.

navlie.batch.problem

Main interface for nonlinear least squares problems.

navlie.batch.residuals

A set of commonly-used residuals in batch estimation.

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.batch.losses.CauchyLoss.html b/_build/html/_autosummary/navlie.batch.losses.CauchyLoss.html new file mode 100644 index 00000000..36de81b9 --- /dev/null +++ b/_build/html/_autosummary/navlie.batch.losses.CauchyLoss.html @@ -0,0 +1,1155 @@ + + + + + + + + navlie.batch.losses.CauchyLoss — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + + + +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.batch.losses.L2Loss.html b/_build/html/_autosummary/navlie.batch.losses.L2Loss.html new file mode 100644 index 00000000..a70a4c3c --- /dev/null +++ b/_build/html/_autosummary/navlie.batch.losses.L2Loss.html @@ -0,0 +1,1138 @@ + + + + + + + + navlie.batch.losses.L2Loss — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.batch.losses.LossFunction.html b/_build/html/_autosummary/navlie.batch.losses.LossFunction.html new file mode 100644 index 00000000..b9f09a66 --- /dev/null +++ b/_build/html/_autosummary/navlie.batch.losses.LossFunction.html @@ -0,0 +1,1137 @@ + + + + + + + + navlie.batch.losses.LossFunction — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + + + +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.batch.losses.html b/_build/html/_autosummary/navlie.batch.losses.html new file mode 100644 index 00000000..619551e3 --- /dev/null +++ b/_build/html/_autosummary/navlie.batch.losses.html @@ -0,0 +1,1097 @@ + + + + + + + + navlie.batch.losses — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

navlie.batch.losses

+

Robust loss functions to be used in nonlinear least squares problems.

+

Robust loss functions here must inherit from the LossFunction interface, +which defines a loss and a weight.

+

Classes

+ + + + + + + + + + + + +

CauchyLoss([c])

L2Loss()

Standard L2 loss.

LossFunction()

Abstract base class for any loss function.

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.batch.problem.OptimizationSummary.html b/_build/html/_autosummary/navlie.batch.problem.OptimizationSummary.html new file mode 100644 index 00000000..f553b582 --- /dev/null +++ b/_build/html/_autosummary/navlie.batch.problem.OptimizationSummary.html @@ -0,0 +1,1101 @@ + + + + + + + + navlie.batch.problem.OptimizationSummary — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.batch.problem.Problem.html b/_build/html/_autosummary/navlie.batch.problem.Problem.html new file mode 100644 index 00000000..7fbd8726 --- /dev/null +++ b/_build/html/_autosummary/navlie.batch.problem.Problem.html @@ -0,0 +1,1262 @@ + + + + + + + + navlie.batch.problem.Problem — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.batch.problem.html b/_build/html/_autosummary/navlie.batch.problem.html new file mode 100644 index 00000000..d0fc21f8 --- /dev/null +++ b/_build/html/_autosummary/navlie.batch.problem.html @@ -0,0 +1,1097 @@ + + + + + + + + navlie.batch.problem — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

navlie.batch.problem

+

Main interface for nonlinear least squares problems.

+

Allows for the construction of nonlinear least squares problem by adding +arbitrary residual terms, and allows for solving these using either Gauss-Newton +or Levenberg Marquardt.

+

This code is inspired by utiasSTARTS pySLAM repo (https://github.com/utiasSTARS/pyslam), +as well as Ceres.

+

Classes

+ + + + + + + + + +

OptimizationSummary(size_state, size_error, ...)

Class to store a summary of the optimization problem.

Problem([solver, max_iters, step_tol, ftol, ...])

Main class for building nonlinear least squares problems.

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.batch.residuals.MeasurementResidual.html b/_build/html/_autosummary/navlie.batch.residuals.MeasurementResidual.html new file mode 100644 index 00000000..f8309973 --- /dev/null +++ b/_build/html/_autosummary/navlie.batch.residuals.MeasurementResidual.html @@ -0,0 +1,1170 @@ + + + + + + + + navlie.batch.residuals.MeasurementResidual — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.batch.residuals.PriorResidual.html b/_build/html/_autosummary/navlie.batch.residuals.PriorResidual.html new file mode 100644 index 00000000..eca0662c --- /dev/null +++ b/_build/html/_autosummary/navlie.batch.residuals.PriorResidual.html @@ -0,0 +1,1169 @@ + + + + + + + + navlie.batch.residuals.PriorResidual — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.batch.residuals.ProcessResidual.html b/_build/html/_autosummary/navlie.batch.residuals.ProcessResidual.html new file mode 100644 index 00000000..edf153a2 --- /dev/null +++ b/_build/html/_autosummary/navlie.batch.residuals.ProcessResidual.html @@ -0,0 +1,1175 @@ + + + + + + + + navlie.batch.residuals.ProcessResidual — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.batch.residuals.Residual.html b/_build/html/_autosummary/navlie.batch.residuals.Residual.html new file mode 100644 index 00000000..dc2c3e9c --- /dev/null +++ b/_build/html/_autosummary/navlie.batch.residuals.Residual.html @@ -0,0 +1,1181 @@ + + + + + + + + navlie.batch.residuals.Residual — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.batch.residuals.html b/_build/html/_autosummary/navlie.batch.residuals.html new file mode 100644 index 00000000..06a7ecd3 --- /dev/null +++ b/_build/html/_autosummary/navlie.batch.residuals.html @@ -0,0 +1,1108 @@ + + + + + + + + navlie.batch.residuals — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

navlie.batch.residuals

+

A set of commonly-used residuals in batch estimation.

+
+
These residuals are
    +
  • the PriorResidual, to assign a prior estimate on the state,

  • +
  • the ProcessResidual, which uses a navlie ProcessModel to compute an error between +a predicted state and the actual state,

  • +
  • a MeasurementResidual, which uses a navlie Measurement to compare +a true measurement to the measurement predicted by the MeasurementModel.

  • +
+
+
+

Classes

+ + + + + + + + + + + + + + + +

MeasurementResidual(keys, measurement)

A generic measurement residual.

PriorResidual(keys, prior_state, ...)

A generic prior error.

ProcessResidual(keys, process_model, u)

A generic process residual.

Residual(keys)

Abstract class for a residual to be used in batch estimation.

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.composite.CompositeInput.html b/_build/html/_autosummary/navlie.composite.CompositeInput.html new file mode 100644 index 00000000..9eaf45ab --- /dev/null +++ b/_build/html/_autosummary/navlie.composite.CompositeInput.html @@ -0,0 +1,1364 @@ + + + + + + + + navlie.composite.CompositeInput — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.composite.CompositeMeasurement.html b/_build/html/_autosummary/navlie.composite.CompositeMeasurement.html new file mode 100644 index 00000000..07fc8503 --- /dev/null +++ b/_build/html/_autosummary/navlie.composite.CompositeMeasurement.html @@ -0,0 +1,1211 @@ + + + + + + + + navlie.composite.CompositeMeasurement — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.composite.CompositeMeasurementModel.html b/_build/html/_autosummary/navlie.composite.CompositeMeasurementModel.html new file mode 100644 index 00000000..37ee10b6 --- /dev/null +++ b/_build/html/_autosummary/navlie.composite.CompositeMeasurementModel.html @@ -0,0 +1,1215 @@ + + + + + + + + navlie.composite.CompositeMeasurementModel — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.composite.CompositeProcessModel.html b/_build/html/_autosummary/navlie.composite.CompositeProcessModel.html new file mode 100644 index 00000000..08438a3b --- /dev/null +++ b/_build/html/_autosummary/navlie.composite.CompositeProcessModel.html @@ -0,0 +1,1297 @@ + + + + + + + + navlie.composite.CompositeProcessModel — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.composite.CompositeState.html b/_build/html/_autosummary/navlie.composite.CompositeState.html new file mode 100644 index 00000000..99fc261e --- /dev/null +++ b/_build/html/_autosummary/navlie.composite.CompositeState.html @@ -0,0 +1,1622 @@ + + + + + + + + navlie.composite.CompositeState — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.composite.html b/_build/html/_autosummary/navlie.composite.html new file mode 100644 index 00000000..2d820806 --- /dev/null +++ b/_build/html/_autosummary/navlie.composite.html @@ -0,0 +1,1100 @@ + + + + + + + + navlie.composite — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

navlie.composite

+

Classes

+ + + + + + + + + + + + + + + + + + +

CompositeInput(input_list)

<under development>

CompositeMeasurement(y, state_id)

Converts a standard Measurement into a CompositeMeasurement, which simply replaces the model with a CompositeMeasurementModel.

CompositeMeasurementModel(model, state_id)

Wrapper for a standard measurement model that assigns the model to a specific substate (referenced by state_id) inside a CompositeState.

CompositeProcessModel(model_list[, shared_input])

<under development> Should this be called a StackedProcessModel? # TODO: Add documentation and tests

CompositeState(state_list[, stamp, state_id])

A "composite" state object intended to hold a list of State objects as a single conceptual "state".

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.datagen.DataGenerator.html b/_build/html/_autosummary/navlie.datagen.DataGenerator.html new file mode 100644 index 00000000..48f9b1ad --- /dev/null +++ b/_build/html/_autosummary/navlie.datagen.DataGenerator.html @@ -0,0 +1,1182 @@ + + + + + + + + navlie.datagen.DataGenerator — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.datagen.generate_measurement.html b/_build/html/_autosummary/navlie.datagen.generate_measurement.html new file mode 100644 index 00000000..2eaabe24 --- /dev/null +++ b/_build/html/_autosummary/navlie.datagen.generate_measurement.html @@ -0,0 +1,1118 @@ + + + + + + + + navlie.datagen.generate_measurement — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.datagen.html b/_build/html/_autosummary/navlie.datagen.html new file mode 100644 index 00000000..ff32d9db --- /dev/null +++ b/_build/html/_autosummary/navlie.datagen.html @@ -0,0 +1,1097 @@ + + + + + + + + navlie.datagen — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

navlie.datagen

+

Tools for data generation.

+

Functions

+ + + + + + +

generate_measurement(state, model[, noise, ...])

Generates a Measurement object given a measurement model and corresponding ground truth State objects.

+

Classes

+ + + + + + +

DataGenerator(process_model, input_func, ...)

A class used for data generation given a process model, and as many measurement models as you want.

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.filters.CubatureKalmanFilter.html b/_build/html/_autosummary/navlie.filters.CubatureKalmanFilter.html new file mode 100644 index 00000000..659c92fc --- /dev/null +++ b/_build/html/_autosummary/navlie.filters.CubatureKalmanFilter.html @@ -0,0 +1,1247 @@ + + + + + + + + navlie.filters.CubatureKalmanFilter — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.filters.ExtendedKalmanFilter.html b/_build/html/_autosummary/navlie.filters.ExtendedKalmanFilter.html new file mode 100644 index 00000000..39cbb63e --- /dev/null +++ b/_build/html/_autosummary/navlie.filters.ExtendedKalmanFilter.html @@ -0,0 +1,1219 @@ + + + + + + + + navlie.filters.ExtendedKalmanFilter — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.filters.GaussHermiteKalmanFilter.html b/_build/html/_autosummary/navlie.filters.GaussHermiteKalmanFilter.html new file mode 100644 index 00000000..8a064361 --- /dev/null +++ b/_build/html/_autosummary/navlie.filters.GaussHermiteKalmanFilter.html @@ -0,0 +1,1247 @@ + + + + + + + + navlie.filters.GaussHermiteKalmanFilter — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.filters.IteratedKalmanFilter.html b/_build/html/_autosummary/navlie.filters.IteratedKalmanFilter.html new file mode 100644 index 00000000..5bc552ef --- /dev/null +++ b/_build/html/_autosummary/navlie.filters.IteratedKalmanFilter.html @@ -0,0 +1,1255 @@ + + + + + + + + navlie.filters.IteratedKalmanFilter — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.filters.SigmaPointKalmanFilter.html b/_build/html/_autosummary/navlie.filters.SigmaPointKalmanFilter.html new file mode 100644 index 00000000..e301eb1c --- /dev/null +++ b/_build/html/_autosummary/navlie.filters.SigmaPointKalmanFilter.html @@ -0,0 +1,1248 @@ + + + + + + + + navlie.filters.SigmaPointKalmanFilter — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.filters.UnscentedKalmanFilter.html b/_build/html/_autosummary/navlie.filters.UnscentedKalmanFilter.html new file mode 100644 index 00000000..d4841a34 --- /dev/null +++ b/_build/html/_autosummary/navlie.filters.UnscentedKalmanFilter.html @@ -0,0 +1,1247 @@ + + + + + + + + navlie.filters.UnscentedKalmanFilter — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.filters.check_outlier.html b/_build/html/_autosummary/navlie.filters.check_outlier.html new file mode 100644 index 00000000..e50c2695 --- /dev/null +++ b/_build/html/_autosummary/navlie.filters.check_outlier.html @@ -0,0 +1,1101 @@ + + + + + + + + navlie.filters.check_outlier — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.filters.generate_sigmapoints.html b/_build/html/_autosummary/navlie.filters.generate_sigmapoints.html new file mode 100644 index 00000000..fcdac9ce --- /dev/null +++ b/_build/html/_autosummary/navlie.filters.generate_sigmapoints.html @@ -0,0 +1,1118 @@ + + + + + + + + navlie.filters.generate_sigmapoints — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.filters.html b/_build/html/_autosummary/navlie.filters.html new file mode 100644 index 00000000..2b83ad07 --- /dev/null +++ b/_build/html/_autosummary/navlie.filters.html @@ -0,0 +1,1136 @@ + + + + + + + + navlie.filters — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

navlie.filters

+

Module containing many predict-correct style filters.

+

Functions

+ + + + + + + + + + + + + + + +

check_outlier(error, covariance)

Performs the Normalized-Innovation-Squared (NIS) test to identify an outlier.

generate_sigmapoints(dof, method)

Generates unit sigma points from three available methods.

mean_state(x_array, weights)

Computes a weighted mean of a list of State instances in an iterated manner, until reaching a maximun number of iterations or a small update.

run_filter(filter, x0, P0, input_data, meas_data)

Executes a predict-correct-style filter given lists of input and measurement data.

+

Classes

+ + + + + + + + + + + + + + + + + + + + + +

CubatureKalmanFilter(process_model[, ...])

+
param process_model:
+

process model to be used in the prediction step

+
+
+

ExtendedKalmanFilter(process_model[, ...])

On-manifold nonlinear Kalman filter.

GaussHermiteKalmanFilter(process_model[, ...])

+
param process_model:
+

process model to be used in the prediction step

+
+
+

IteratedKalmanFilter(process_model[, ...])

On-manifold iterated extended Kalman filter.

SigmaPointKalmanFilter(process_model[, ...])

On-manifold nonlinear Sigma Point Kalman filter.

UnscentedKalmanFilter(process_model[, ...])

+
param process_model:
+

process model to be used in the prediction step

+
+
+

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.filters.mean_state.html b/_build/html/_autosummary/navlie.filters.mean_state.html new file mode 100644 index 00000000..cee80cc5 --- /dev/null +++ b/_build/html/_autosummary/navlie.filters.mean_state.html @@ -0,0 +1,1116 @@ + + + + + + + + navlie.filters.mean_state — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.filters.run_filter.html b/_build/html/_autosummary/navlie.filters.run_filter.html new file mode 100644 index 00000000..4f151adb --- /dev/null +++ b/_build/html/_autosummary/navlie.filters.run_filter.html @@ -0,0 +1,1112 @@ + + + + + + + + navlie.filters.run_filter — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.imm.IMMResult.html b/_build/html/_autosummary/navlie.imm.IMMResult.html new file mode 100644 index 00000000..22867f95 --- /dev/null +++ b/_build/html/_autosummary/navlie.imm.IMMResult.html @@ -0,0 +1,1324 @@ + + + + + + + + navlie.imm.IMMResult — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.imm.IMMResultList.html b/_build/html/_autosummary/navlie.imm.IMMResultList.html new file mode 100644 index 00000000..9da0b85e --- /dev/null +++ b/_build/html/_autosummary/navlie.imm.IMMResultList.html @@ -0,0 +1,1482 @@ + + + + + + + + navlie.imm.IMMResultList — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.imm.IMMState.html b/_build/html/_autosummary/navlie.imm.IMMState.html new file mode 100644 index 00000000..e5c9b311 --- /dev/null +++ b/_build/html/_autosummary/navlie.imm.IMMState.html @@ -0,0 +1,1158 @@ + + + + + + + + navlie.imm.IMMState — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.imm.InteractingModelFilter.html b/_build/html/_autosummary/navlie.imm.InteractingModelFilter.html new file mode 100644 index 00000000..57ac288c --- /dev/null +++ b/_build/html/_autosummary/navlie.imm.InteractingModelFilter.html @@ -0,0 +1,1205 @@ + + + + + + + + navlie.imm.InteractingModelFilter — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.imm.gaussian_mixing.html b/_build/html/_autosummary/navlie.imm.gaussian_mixing.html new file mode 100644 index 00000000..6f1425db --- /dev/null +++ b/_build/html/_autosummary/navlie.imm.gaussian_mixing.html @@ -0,0 +1,1117 @@ + + + + + + + + navlie.imm.gaussian_mixing — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.imm.gaussian_mixing_vectorspace.html b/_build/html/_autosummary/navlie.imm.gaussian_mixing_vectorspace.html new file mode 100644 index 00000000..66f9d89e --- /dev/null +++ b/_build/html/_autosummary/navlie.imm.gaussian_mixing_vectorspace.html @@ -0,0 +1,1116 @@ + + + + + + + + navlie.imm.gaussian_mixing_vectorspace — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.imm.html b/_build/html/_autosummary/navlie.imm.html new file mode 100644 index 00000000..5729a063 --- /dev/null +++ b/_build/html/_autosummary/navlie.imm.html @@ -0,0 +1,1128 @@ + + + + + + + + navlie.imm — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

navlie.imm

+

Module for the Interacting Multiple Model (IMM) filter.

+

Functions

+ + + + + + + + + + + + + + + + + + +

gaussian_mixing(weights, x_list)

A Gaussian mixing method that handles both vectorspace Gaussians

gaussian_mixing_vectorspace(weights, means, ...)

Calculate the mean and covariance of a Gaussian mixture on a vectorspace.

reparametrize_gaussians_about_X_par(X_par, ...)

Reparametrize each Lie group Gaussian in X_list about X_par.

run_imm_filter(filter, x0, P0, input_data, ...)

Executes an InteractingMultipleModel filter

update_X(X, mu, P)

Given a Lie group Gaussian with mean mu and covariance P, expressed in the tangent space of X, compute Lie group StateAndCovariance X_hat such that the Lie algebra Gaussian around X_hat has zero mean.

+

Classes

+ + + + + + + + + + + + + + + +

IMMResult(imm_estimate, state_true)

+
param estimate:
+

Estimated state and corresponding covariance.

+
+
+

IMMResultList(result_list)

+
param result_list:
+

A list of GaussianResult, intended such that each element corresponds

+
+
+

IMMState(model_states, model_probabilities)

InteractingModelFilter(kf_list, ...)

On-manifold Interacting Multiple Model Filter (IMM).

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.imm.reparametrize_gaussians_about_X_par.html b/_build/html/_autosummary/navlie.imm.reparametrize_gaussians_about_X_par.html new file mode 100644 index 00000000..9cd7b27b --- /dev/null +++ b/_build/html/_autosummary/navlie.imm.reparametrize_gaussians_about_X_par.html @@ -0,0 +1,1123 @@ + + + + + + + + navlie.imm.reparametrize_gaussians_about_X_par — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.imm.run_imm_filter.html b/_build/html/_autosummary/navlie.imm.run_imm_filter.html new file mode 100644 index 00000000..3c08eb75 --- /dev/null +++ b/_build/html/_autosummary/navlie.imm.run_imm_filter.html @@ -0,0 +1,1113 @@ + + + + + + + + navlie.imm.run_imm_filter — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.imm.update_X.html b/_build/html/_autosummary/navlie.imm.update_X.html new file mode 100644 index 00000000..3c2f784d --- /dev/null +++ b/_build/html/_autosummary/navlie.imm.update_X.html @@ -0,0 +1,1117 @@ + + + + + + + + navlie.imm.update_X — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.camera.PinholeCamera.html b/_build/html/_autosummary/navlie.lib.camera.PinholeCamera.html new file mode 100644 index 00000000..ff30ab81 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.camera.PinholeCamera.html @@ -0,0 +1,1354 @@ + + + + + + + + navlie.lib.camera.PinholeCamera — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.camera.PoseMatrix.html b/_build/html/_autosummary/navlie.lib.camera.PoseMatrix.html new file mode 100644 index 00000000..afeffb30 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.camera.PoseMatrix.html @@ -0,0 +1,1145 @@ + + + + + + + + navlie.lib.camera.PoseMatrix — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.camera.html b/_build/html/_autosummary/navlie.lib.camera.html new file mode 100644 index 00000000..4f4123d7 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.camera.html @@ -0,0 +1,1094 @@ + + + + + + + + navlie.lib.camera — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

navlie.lib.camera

+

Module containing a basic pinhole camera model.

+

See the CameraProjection measurement model for an example of how this can be +used with navlie’s MeasurementModel class.

+

Classes

+ + + + + + + + + +

PinholeCamera(fu, fv, cu, cv, image_width, ...)

Class for a pinhole camera model.

PoseMatrix(T)

A convenient class to store SE(3) poses.

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.datasets.SimulatedInertialGPSDataset.html b/_build/html/_autosummary/navlie.lib.datasets.SimulatedInertialGPSDataset.html new file mode 100644 index 00000000..50071ff4 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.datasets.SimulatedInertialGPSDataset.html @@ -0,0 +1,1147 @@ + + + + + + + + navlie.lib.datasets.SimulatedInertialGPSDataset — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.datasets.SimulatedInertialLandmarkDataset.html b/_build/html/_autosummary/navlie.lib.datasets.SimulatedInertialLandmarkDataset.html new file mode 100644 index 00000000..12d09b3a --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.datasets.SimulatedInertialLandmarkDataset.html @@ -0,0 +1,1161 @@ + + + + + + + + navlie.lib.datasets.SimulatedInertialLandmarkDataset — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.datasets.SimulatedPoseRangingDataset.html b/_build/html/_autosummary/navlie.lib.datasets.SimulatedPoseRangingDataset.html new file mode 100644 index 00000000..3a315b67 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.datasets.SimulatedPoseRangingDataset.html @@ -0,0 +1,1165 @@ + + + + + + + + navlie.lib.datasets.SimulatedPoseRangingDataset — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.datasets.generate_landmark_positions.html b/_build/html/_autosummary/navlie.lib.datasets.generate_landmark_positions.html new file mode 100644 index 00000000..8ab09b4d --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.datasets.generate_landmark_positions.html @@ -0,0 +1,1116 @@ + + + + + + + + navlie.lib.datasets.generate_landmark_positions — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.datasets.html b/_build/html/_autosummary/navlie.lib.datasets.html new file mode 100644 index 00000000..99d874a2 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.datasets.html @@ -0,0 +1,1103 @@ + + + + + + + + navlie.lib.datasets — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

navlie.lib.datasets

+

A collection of simulated dataset examples.

+

Functions

+ + + + + + +

generate_landmark_positions(cylinder_radius, ...)

Generates landmarks arranged in a cylinder.

+

Classes

+ + + + + + + + + + + + +

SimulatedInertialGPSDataset([x0, Q, R, ...])

SimulatedInertialLandmarkDataset([x0, Q, R, ...])

SimulatedPoseRangingDataset([x0, Q, R, ...])

Simulated dataset of a simple rigid robot moving in 3D space with range measurements to anchors.

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.html b/_build/html/_autosummary/navlie.lib.html new file mode 100644 index 00000000..dd8deca1 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.html @@ -0,0 +1,1104 @@ + + + + + + + + navlie.lib — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

navlie.lib

+

The built-in library of common state, process model, and measurement model implementations.

+

Modules

+ + + + + + + + + + + + + + + + + + + + + +

navlie.lib.camera

Module containing a basic pinhole camera model.

navlie.lib.datasets

A collection of simulated dataset examples.

navlie.lib.imu

A module for IMU data and kinematics.

navlie.lib.models

navlie.lib.preintegration

navlie.lib.states

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.imu.G_matrix.html b/_build/html/_autosummary/navlie.lib.imu.G_matrix.html new file mode 100644 index 00000000..1b80cb3b --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.imu.G_matrix.html @@ -0,0 +1,1099 @@ + + + + + + + + navlie.lib.imu.G_matrix — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.imu.G_matrix_inv.html b/_build/html/_autosummary/navlie.lib.imu.G_matrix_inv.html new file mode 100644 index 00000000..4c9f1f56 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.imu.G_matrix_inv.html @@ -0,0 +1,1099 @@ + + + + + + + + navlie.lib.imu.G_matrix_inv — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.imu.IMU.html b/_build/html/_autosummary/navlie.lib.imu.IMU.html new file mode 100644 index 00000000..10ca6d73 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.imu.IMU.html @@ -0,0 +1,1328 @@ + + + + + + + + navlie.lib.imu.IMU — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.imu.IMUKinematics.html b/_build/html/_autosummary/navlie.lib.imu.IMUKinematics.html new file mode 100644 index 00000000..62bc4384 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.imu.IMUKinematics.html @@ -0,0 +1,1301 @@ + + + + + + + + navlie.lib.imu.IMUKinematics — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.imu.IMUState.html b/_build/html/_autosummary/navlie.lib.imu.IMUState.html new file mode 100644 index 00000000..75283700 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.imu.IMUState.html @@ -0,0 +1,1744 @@ + + + + + + + + navlie.lib.imu.IMUState — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.imu.L_matrix.html b/_build/html/_autosummary/navlie.lib.imu.L_matrix.html new file mode 100644 index 00000000..469f179d --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.imu.L_matrix.html @@ -0,0 +1,1102 @@ + + + + + + + + navlie.lib.imu.L_matrix — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.imu.M_matrix.html b/_build/html/_autosummary/navlie.lib.imu.M_matrix.html new file mode 100644 index 00000000..f91ee27f --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.imu.M_matrix.html @@ -0,0 +1,1100 @@ + + + + + + + + navlie.lib.imu.M_matrix — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.imu.N_matrix.html b/_build/html/_autosummary/navlie.lib.imu.N_matrix.html new file mode 100644 index 00000000..3c900830 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.imu.N_matrix.html @@ -0,0 +1,1100 @@ + + + + + + + + navlie.lib.imu.N_matrix — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.imu.U_matrix.html b/_build/html/_autosummary/navlie.lib.imu.U_matrix.html new file mode 100644 index 00000000..3cf3b9f2 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.imu.U_matrix.html @@ -0,0 +1,1099 @@ + + + + + + + + navlie.lib.imu.U_matrix — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.imu.U_matrix_inv.html b/_build/html/_autosummary/navlie.lib.imu.U_matrix_inv.html new file mode 100644 index 00000000..2cbba027 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.imu.U_matrix_inv.html @@ -0,0 +1,1099 @@ + + + + + + + + navlie.lib.imu.U_matrix_inv — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.imu.U_tilde_matrix.html b/_build/html/_autosummary/navlie.lib.imu.U_tilde_matrix.html new file mode 100644 index 00000000..9fded896 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.imu.U_tilde_matrix.html @@ -0,0 +1,1099 @@ + + + + + + + + navlie.lib.imu.U_tilde_matrix — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.imu.adjoint_IE3.html b/_build/html/_autosummary/navlie.lib.imu.adjoint_IE3.html new file mode 100644 index 00000000..d0fb3df5 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.imu.adjoint_IE3.html @@ -0,0 +1,1100 @@ + + + + + + + + navlie.lib.imu.adjoint_IE3 — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.imu.delta_matrix.html b/_build/html/_autosummary/navlie.lib.imu.delta_matrix.html new file mode 100644 index 00000000..98b0cc51 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.imu.delta_matrix.html @@ -0,0 +1,1099 @@ + + + + + + + + navlie.lib.imu.delta_matrix — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.imu.get_unbiased_imu.html b/_build/html/_autosummary/navlie.lib.imu.get_unbiased_imu.html new file mode 100644 index 00000000..2fe2e907 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.imu.get_unbiased_imu.html @@ -0,0 +1,1114 @@ + + + + + + + + navlie.lib.imu.get_unbiased_imu — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.imu.html b/_build/html/_autosummary/navlie.lib.imu.html new file mode 100644 index 00000000..361e2222 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.imu.html @@ -0,0 +1,1142 @@ + + + + + + + + navlie.lib.imu — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

navlie.lib.imu

+

A module for IMU data and kinematics.

+

Note that the treatment of IMU kinematics in this module is different from +typical treatments in the sense that it is done directly on \(SE_2(3)\). A +PDF describing the detailed derivations can be found at the +following link.

+

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_matrix(gravity, dt)

G_matrix_inv(gravity, dt)

L_matrix(unbiased_gyro, unbiased_accel, dt)

Computes the jacobian of the nav state with respect to the input.

M_matrix(phi_vec)

The M matrix from the derivation document.

N_matrix(phi_vec)

The N matrix from Barfoot 2nd edition, equation 9.211

U_matrix(omega, accel, dt)

U_matrix_inv(omega, accel, dt)

U_tilde_matrix(omega, accel, dt)

adjoint_IE3(X)

Adjoint matrix of the "Incremental Euclidean Group".

delta_matrix(dt)

get_unbiased_imu(x, u)

Removes bias from the measurement.

inverse_IE3(X)

Inverse matrix on the "Incremental Euclidean Group".

+

Classes

+ + + + + + + + + + + + +

IMU(gyro, accel, stamp[, bias_gyro_walk, ...])

Data container for an IMU reading.

IMUKinematics(Q[, gravity])

The IMU Kinematics refer to the following continuous time model:

IMUState(nav_state, bias_gyro, bias_accel[, ...])

The IMU state is a composite state that contains the navigation state (attitude, velocity, position), and the gyro and accelerometer biases.

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.imu.inverse_IE3.html b/_build/html/_autosummary/navlie.lib.imu.inverse_IE3.html new file mode 100644 index 00000000..0c2c50fe --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.imu.inverse_IE3.html @@ -0,0 +1,1100 @@ + + + + + + + + navlie.lib.imu.inverse_IE3 — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.AbsolutePosition.html b/_build/html/_autosummary/navlie.lib.models.AbsolutePosition.html new file mode 100644 index 00000000..af90f027 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.AbsolutePosition.html @@ -0,0 +1,1204 @@ + + + + + + + + navlie.lib.models.AbsolutePosition — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.AbsoluteVelocity.html b/_build/html/_autosummary/navlie.lib.models.AbsoluteVelocity.html new file mode 100644 index 00000000..4b3795a0 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.AbsoluteVelocity.html @@ -0,0 +1,1204 @@ + + + + + + + + navlie.lib.models.AbsoluteVelocity — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.Altitude.html b/_build/html/_autosummary/navlie.lib.models.Altitude.html new file mode 100644 index 00000000..41e948af --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.Altitude.html @@ -0,0 +1,1215 @@ + + + + + + + + navlie.lib.models.Altitude — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.BodyFrameVelocity.html b/_build/html/_autosummary/navlie.lib.models.BodyFrameVelocity.html new file mode 100644 index 00000000..5c73d9bb --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.BodyFrameVelocity.html @@ -0,0 +1,1301 @@ + + + + + + + + navlie.lib.models.BodyFrameVelocity — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.CameraProjection.html b/_build/html/_autosummary/navlie.lib.models.CameraProjection.html new file mode 100644 index 00000000..f7b7de77 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.CameraProjection.html @@ -0,0 +1,1227 @@ + + + + + + + + navlie.lib.models.CameraProjection — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.DoubleIntegrator.html b/_build/html/_autosummary/navlie.lib.models.DoubleIntegrator.html new file mode 100644 index 00000000..2e246037 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.DoubleIntegrator.html @@ -0,0 +1,1318 @@ + + + + + + + + navlie.lib.models.DoubleIntegrator — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.DoubleIntegratorWithBias.html b/_build/html/_autosummary/navlie.lib.models.DoubleIntegratorWithBias.html new file mode 100644 index 00000000..88aed78e --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.DoubleIntegratorWithBias.html @@ -0,0 +1,1321 @@ + + + + + + + + navlie.lib.models.DoubleIntegratorWithBias — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.GlobalPosition.html b/_build/html/_autosummary/navlie.lib.models.GlobalPosition.html new file mode 100644 index 00000000..ebe37700 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.GlobalPosition.html @@ -0,0 +1,1200 @@ + + + + + + + + navlie.lib.models.GlobalPosition — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.Gravitometer.html b/_build/html/_autosummary/navlie.lib.models.Gravitometer.html new file mode 100644 index 00000000..e57e2513 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.Gravitometer.html @@ -0,0 +1,1212 @@ + + + + + + + + navlie.lib.models.Gravitometer — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.InvariantMeasurement.html b/_build/html/_autosummary/navlie.lib.models.InvariantMeasurement.html new file mode 100644 index 00000000..6e94d373 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.InvariantMeasurement.html @@ -0,0 +1,1235 @@ + + + + + + + + navlie.lib.models.InvariantMeasurement — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.InvariantPointRelativePosition.html b/_build/html/_autosummary/navlie.lib.models.InvariantPointRelativePosition.html new file mode 100644 index 00000000..d3ce5715 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.InvariantPointRelativePosition.html @@ -0,0 +1,1219 @@ + + + + + + + + navlie.lib.models.InvariantPointRelativePosition — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.LinearMeasurement.html b/_build/html/_autosummary/navlie.lib.models.LinearMeasurement.html new file mode 100644 index 00000000..9d29a429 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.LinearMeasurement.html @@ -0,0 +1,1213 @@ + + + + + + + + navlie.lib.models.LinearMeasurement — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.Magnetometer.html b/_build/html/_autosummary/navlie.lib.models.Magnetometer.html new file mode 100644 index 00000000..3a8ce48a --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.Magnetometer.html @@ -0,0 +1,1212 @@ + + + + + + + + navlie.lib.models.Magnetometer — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.OneDimensionalPositionVelocityRange.html b/_build/html/_autosummary/navlie.lib.models.OneDimensionalPositionVelocityRange.html new file mode 100644 index 00000000..27159e54 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.OneDimensionalPositionVelocityRange.html @@ -0,0 +1,1199 @@ + + + + + + + + navlie.lib.models.OneDimensionalPositionVelocityRange — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.PointRelativePosition.html b/_build/html/_autosummary/navlie.lib.models.PointRelativePosition.html new file mode 100644 index 00000000..b86c50a8 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.PointRelativePosition.html @@ -0,0 +1,1218 @@ + + + + + + + + navlie.lib.models.PointRelativePosition — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.PointRelativePositionSLAM.html b/_build/html/_autosummary/navlie.lib.models.PointRelativePositionSLAM.html new file mode 100644 index 00000000..32aa4609 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.PointRelativePositionSLAM.html @@ -0,0 +1,1209 @@ + + + + + + + + navlie.lib.models.PointRelativePositionSLAM — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.RangePointToAnchor.html b/_build/html/_autosummary/navlie.lib.models.RangePointToAnchor.html new file mode 100644 index 00000000..cb0f9de8 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.RangePointToAnchor.html @@ -0,0 +1,1214 @@ + + + + + + + + navlie.lib.models.RangePointToAnchor — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.RangePoseToAnchor.html b/_build/html/_autosummary/navlie.lib.models.RangePoseToAnchor.html new file mode 100644 index 00000000..02922f31 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.RangePoseToAnchor.html @@ -0,0 +1,1207 @@ + + + + + + + + navlie.lib.models.RangePoseToAnchor — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.RangePoseToPose.html b/_build/html/_autosummary/navlie.lib.models.RangePoseToPose.html new file mode 100644 index 00000000..58dc2a3c --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.RangePoseToPose.html @@ -0,0 +1,1213 @@ + + + + + + + + navlie.lib.models.RangePoseToPose — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.RangeRelativePose.html b/_build/html/_autosummary/navlie.lib.models.RangeRelativePose.html new file mode 100644 index 00000000..34145aaf --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.RangeRelativePose.html @@ -0,0 +1,1213 @@ + + + + + + + + navlie.lib.models.RangeRelativePose — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.RelativeBodyFrameVelocity.html b/_build/html/_autosummary/navlie.lib.models.RelativeBodyFrameVelocity.html new file mode 100644 index 00000000..605fb442 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.RelativeBodyFrameVelocity.html @@ -0,0 +1,1311 @@ + + + + + + + + navlie.lib.models.RelativeBodyFrameVelocity — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.SingleIntegrator.html b/_build/html/_autosummary/navlie.lib.models.SingleIntegrator.html new file mode 100644 index 00000000..d571970a --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.SingleIntegrator.html @@ -0,0 +1,1310 @@ + + + + + + + + navlie.lib.models.SingleIntegrator — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.models.html b/_build/html/_autosummary/navlie.lib.models.html new file mode 100644 index 00000000..f49f6411 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.models.html @@ -0,0 +1,1151 @@ + + + + + + + + navlie.lib.models — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

navlie.lib.models

+

Classes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

AbsolutePosition(R)

World-frame, or "absolute" position measurement.

AbsoluteVelocity(R)

World-frame, or "absolute" velocity measurement.

Altitude(R[, minimum, bias])

A model that returns the z component of a position vector.

BodyFrameVelocity(Q)

The body-frame velocity process model assumes that the input contains both translational and angular velocity measurements, both relative to a local reference frame, but resolved in the robot body frame.

CameraProjection(pose_state_id, ...)

Measurement model describing the projection of a landmark into a camera.

DoubleIntegrator(Q)

The double-integrator process model is a second-order point kinematic model given in continuous time by

DoubleIntegratorWithBias(Q)

The double-integrator process model, but with an additional bias on the input.

GlobalPosition(R)

This class is deprecated.

Gravitometer(R[, gravity_vector])

Gravitometer model of the form

InvariantMeasurement(meas[, direction, model])

Given a Measurement object, the class will construct a left- or right-invariant innovation ready to be fused into a state estimator.

InvariantPointRelativePosition(y, model)

LinearMeasurement(C, R)

A generic linear measurement model of the form

Magnetometer(R[, magnetic_vector])

Magnetometer model of the form

OneDimensionalPositionVelocityRange(R)

PointRelativePosition(landmark_position, R)

Measurement model describing the position of a known landmark relative to the robot, resolved in the body frame.

PointRelativePositionSLAM(pose_state_id, ...)

Measurement model describing the position of an unknown landmark relative to the robot, resolved in the body frame.

RangePointToAnchor(anchor_position, R)

Range measurement from a point state to an anchor (which is also another point).

RangePoseToAnchor(anchor_position, ...)

Range measurement from a pose state to an anchor.

RangePoseToPose(tag_body_position1, ...)

Range model given two absolute poses of rigid bodies, each containing a ranging tag.

RangeRelativePose(tag_body_position, ...)

Range model given a pose of another body relative to current pose.

RelativeBodyFrameVelocity(Q1, Q2)

The relative body-frame velocity process model is of the form

SingleIntegrator(Q)

The single-integrator process model is a process model of the form

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.preintegration.AngularVelocityIncrement.html b/_build/html/_autosummary/navlie.lib.preintegration.AngularVelocityIncrement.html new file mode 100644 index 00000000..892f6515 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.preintegration.AngularVelocityIncrement.html @@ -0,0 +1,1345 @@ + + + + + + + + navlie.lib.preintegration.AngularVelocityIncrement — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.preintegration.BodyVelocityIncrement.html b/_build/html/_autosummary/navlie.lib.preintegration.BodyVelocityIncrement.html new file mode 100644 index 00000000..5af2f45b --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.preintegration.BodyVelocityIncrement.html @@ -0,0 +1,1345 @@ + + + + + + + + navlie.lib.preintegration.BodyVelocityIncrement — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.preintegration.IMUIncrement.html b/_build/html/_autosummary/navlie.lib.preintegration.IMUIncrement.html new file mode 100644 index 00000000..bfbb2181 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.preintegration.IMUIncrement.html @@ -0,0 +1,1464 @@ + + + + + + + + navlie.lib.preintegration.IMUIncrement — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.preintegration.LinearIncrement.html b/_build/html/_autosummary/navlie.lib.preintegration.LinearIncrement.html new file mode 100644 index 00000000..c2f58c67 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.preintegration.LinearIncrement.html @@ -0,0 +1,1450 @@ + + + + + + + + navlie.lib.preintegration.LinearIncrement — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.preintegration.PreintegratedAngularVelocity.html b/_build/html/_autosummary/navlie.lib.preintegration.PreintegratedAngularVelocity.html new file mode 100644 index 00000000..af25409b --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.preintegration.PreintegratedAngularVelocity.html @@ -0,0 +1,1294 @@ + + + + + + + + navlie.lib.preintegration.PreintegratedAngularVelocity — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.preintegration.PreintegratedBodyVelocity.html b/_build/html/_autosummary/navlie.lib.preintegration.PreintegratedBodyVelocity.html new file mode 100644 index 00000000..e8a874f6 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.preintegration.PreintegratedBodyVelocity.html @@ -0,0 +1,1299 @@ + + + + + + + + navlie.lib.preintegration.PreintegratedBodyVelocity — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.preintegration.PreintegratedIMUKinematics.html b/_build/html/_autosummary/navlie.lib.preintegration.PreintegratedIMUKinematics.html new file mode 100644 index 00000000..4b668969 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.preintegration.PreintegratedIMUKinematics.html @@ -0,0 +1,1294 @@ + + + + + + + + navlie.lib.preintegration.PreintegratedIMUKinematics — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.preintegration.PreintegratedLinearModel.html b/_build/html/_autosummary/navlie.lib.preintegration.PreintegratedLinearModel.html new file mode 100644 index 00000000..c1267fd9 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.preintegration.PreintegratedLinearModel.html @@ -0,0 +1,1298 @@ + + + + + + + + navlie.lib.preintegration.PreintegratedLinearModel — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.preintegration.PreintegratedWheelOdometry.html b/_build/html/_autosummary/navlie.lib.preintegration.PreintegratedWheelOdometry.html new file mode 100644 index 00000000..b1d4f764 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.preintegration.PreintegratedWheelOdometry.html @@ -0,0 +1,1294 @@ + + + + + + + + navlie.lib.preintegration.PreintegratedWheelOdometry — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.preintegration.RelativeMotionIncrement.html b/_build/html/_autosummary/navlie.lib.preintegration.RelativeMotionIncrement.html new file mode 100644 index 00000000..acd01426 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.preintegration.RelativeMotionIncrement.html @@ -0,0 +1,1291 @@ + + + + + + + + navlie.lib.preintegration.RelativeMotionIncrement — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.preintegration.WheelOdometryIncrement.html b/_build/html/_autosummary/navlie.lib.preintegration.WheelOdometryIncrement.html new file mode 100644 index 00000000..47b21d6f --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.preintegration.WheelOdometryIncrement.html @@ -0,0 +1,1360 @@ + + + + + + + + navlie.lib.preintegration.WheelOdometryIncrement — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.preintegration.html b/_build/html/_autosummary/navlie.lib.preintegration.html new file mode 100644 index 00000000..70026f57 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.preintegration.html @@ -0,0 +1,1120 @@ + + + + + + + + navlie.lib.preintegration — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

navlie.lib.preintegration

+

Classes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

AngularVelocityIncrement(Q[, bias, state_id])

This is a preintegration class for angular velocity measurements, on only attitude.

BodyVelocityIncrement(group, Q[, bias, state_id])

This is a general preintegration class for any process model of the form

IMUIncrement(input_covariance, gyro_bias, ...)

Initializes an "identity" IMU RMI.

LinearIncrement(input_covariance, ...[, ...])

This class preintegrates any process model of the form

PreintegratedAngularVelocity()

PreintegratedBodyVelocity()

Process model that performs prediction of the state given an RMI \(\Delta \mathbf{U}_{ij}\) according to the equation

PreintegratedIMUKinematics([gravity])

PreintegratedLinearModel()

Process model that applies a preintegrated LinearIncrement to predict a state forward in time using the equation

PreintegratedWheelOdometry()

RelativeMotionIncrement(dof)

WheelOdometryIncrement(Q[, bias, state_id])

This is a preintegration class for wheel odometry measurements on SE(n).

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.states.MatrixLieGroupState.html b/_build/html/_autosummary/navlie.lib.states.MatrixLieGroupState.html new file mode 100644 index 00000000..7192d37f --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.states.MatrixLieGroupState.html @@ -0,0 +1,1412 @@ + + + + + + + + navlie.lib.states.MatrixLieGroupState — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.states.SE23State.html b/_build/html/_autosummary/navlie.lib.states.SE23State.html new file mode 100644 index 00000000..d258a0aa --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.states.SE23State.html @@ -0,0 +1,1447 @@ + + + + + + + + navlie.lib.states.SE23State — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.states.SE2State.html b/_build/html/_autosummary/navlie.lib.states.SE2State.html new file mode 100644 index 00000000..4c0cfc55 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.states.SE2State.html @@ -0,0 +1,1445 @@ + + + + + + + + navlie.lib.states.SE2State — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.states.SE3State.html b/_build/html/_autosummary/navlie.lib.states.SE3State.html new file mode 100644 index 00000000..133e35fe --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.states.SE3State.html @@ -0,0 +1,1487 @@ + + + + + + + + navlie.lib.states.SE3State — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.states.SL3State.html b/_build/html/_autosummary/navlie.lib.states.SL3State.html new file mode 100644 index 00000000..bdfa7fe9 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.states.SL3State.html @@ -0,0 +1,1415 @@ + + + + + + + + navlie.lib.states.SL3State — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.states.SO2State.html b/_build/html/_autosummary/navlie.lib.states.SO2State.html new file mode 100644 index 00000000..a04301e2 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.states.SO2State.html @@ -0,0 +1,1428 @@ + + + + + + + + navlie.lib.states.SO2State — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.states.SO3State.html b/_build/html/_autosummary/navlie.lib.states.SO3State.html new file mode 100644 index 00000000..bd0ffac1 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.states.SO3State.html @@ -0,0 +1,1481 @@ + + + + + + + + navlie.lib.states.SO3State — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.states.StampedValue.html b/_build/html/_autosummary/navlie.lib.states.StampedValue.html new file mode 100644 index 00000000..3d840f92 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.states.StampedValue.html @@ -0,0 +1,1251 @@ + + + + + + + + navlie.lib.states.StampedValue — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.states.VectorInput.html b/_build/html/_autosummary/navlie.lib.states.VectorInput.html new file mode 100644 index 00000000..96937cfe --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.states.VectorInput.html @@ -0,0 +1,1252 @@ + + + + + + + + navlie.lib.states.VectorInput — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.states.VectorState.html b/_build/html/_autosummary/navlie.lib.states.VectorState.html new file mode 100644 index 00000000..2c12fba3 --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.states.VectorState.html @@ -0,0 +1,1286 @@ + + + + + + + + navlie.lib.states.VectorState — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.lib.states.html b/_build/html/_autosummary/navlie.lib.states.html new file mode 100644 index 00000000..35b5da7a --- /dev/null +++ b/_build/html/_autosummary/navlie.lib.states.html @@ -0,0 +1,1120 @@ + + + + + + + + navlie.lib.states — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

navlie.lib.states

+

Classes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

MatrixLieGroupState(value, group[, stamp, ...])

The MatrixLieGroupState class.

SE23State(value[, stamp, state_id, direction])

A state object for 2D rigid body transformations with velocity.

SE2State(value[, stamp, state_id, direction])

A state object for 2D rigid body transformations.

SE3State(value[, stamp, state_id, direction])

A state object for 3D rigid body transformations.

SL3State(value[, stamp, state_id, direction])

A state object representing the special linear group in 3D.

SO2State(value[, stamp, state_id, direction])

A state object for rotations in 2D.

SO3State(value[, stamp, state_id, direction])

A state object for rotations in 3D.

StampedValue(value[, stamp, state_id, ...])

+
param value:
+

Value of of the input.

+
+
+

VectorInput(value[, stamp, state_id, covariance])

A standard vector-based input, with value represented by a 1D numpy array.

VectorState(value[, stamp, state_id])

A standard vector-based state, with value represented by a 1D numpy array.

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.types.Dataset.html b/_build/html/_autosummary/navlie.types.Dataset.html new file mode 100644 index 00000000..4ebe5a3c --- /dev/null +++ b/_build/html/_autosummary/navlie.types.Dataset.html @@ -0,0 +1,1150 @@ + + + + + + + + navlie.types.Dataset — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.types.Input.html b/_build/html/_autosummary/navlie.types.Input.html new file mode 100644 index 00000000..18fb8012 --- /dev/null +++ b/_build/html/_autosummary/navlie.types.Input.html @@ -0,0 +1,1213 @@ + + + + + + + + navlie.types.Input — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.types.Measurement.html b/_build/html/_autosummary/navlie.types.Measurement.html new file mode 100644 index 00000000..7aa64960 --- /dev/null +++ b/_build/html/_autosummary/navlie.types.Measurement.html @@ -0,0 +1,1213 @@ + + + + + + + + navlie.types.Measurement — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.types.MeasurementModel.html b/_build/html/_autosummary/navlie.types.MeasurementModel.html new file mode 100644 index 00000000..058f806d --- /dev/null +++ b/_build/html/_autosummary/navlie.types.MeasurementModel.html @@ -0,0 +1,1208 @@ + + + + + + + + navlie.types.MeasurementModel — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.types.ProcessModel.html b/_build/html/_autosummary/navlie.types.ProcessModel.html new file mode 100644 index 00000000..192b670a --- /dev/null +++ b/_build/html/_autosummary/navlie.types.ProcessModel.html @@ -0,0 +1,1323 @@ + + + + + + + + navlie.types.ProcessModel — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.types.State.html b/_build/html/_autosummary/navlie.types.State.html new file mode 100644 index 00000000..c803e080 --- /dev/null +++ b/_build/html/_autosummary/navlie.types.State.html @@ -0,0 +1,1319 @@ + + + + + + + + navlie.types.State — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.types.StateWithCovariance.html b/_build/html/_autosummary/navlie.types.StateWithCovariance.html new file mode 100644 index 00000000..94ac6f66 --- /dev/null +++ b/_build/html/_autosummary/navlie.types.StateWithCovariance.html @@ -0,0 +1,1202 @@ + + + + + + + + navlie.types.StateWithCovariance — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.types.html b/_build/html/_autosummary/navlie.types.html new file mode 100644 index 00000000..45f9695f --- /dev/null +++ b/_build/html/_autosummary/navlie.types.html @@ -0,0 +1,1109 @@ + + + + + + + + navlie.types — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

navlie.types

+

This module contains the core primitive types used throughout navlie.

+

Classes

+ + + + + + + + + + + + + + + + + + + + + + + + +

Dataset()

A container to store a dataset.

Input(dof[, stamp, state_id, covariance])

Measurement(value[, stamp, model, state_id])

A simple data container containing a generic measurement's value, timestamp, and corresponding model stored as a MeasurementModel object.

MeasurementModel()

Abstract measurement model base class, used to implement measurement models of the form

ProcessModel()

Abstract process model base class for process models of the form

State(value, dof[, stamp, state_id])

An abstract state \(\mathcal{X}\) is an object containing the following attributes:

StateWithCovariance(state, covariance)

A data container containing a State object and a covariance array.

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.utils.GaussianResult.html b/_build/html/_autosummary/navlie.utils.GaussianResult.html new file mode 100644 index 00000000..73e19d3f --- /dev/null +++ b/_build/html/_autosummary/navlie.utils.GaussianResult.html @@ -0,0 +1,1313 @@ + + + + + + + + navlie.utils.GaussianResult — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.utils.GaussianResultList.html b/_build/html/_autosummary/navlie.utils.GaussianResultList.html new file mode 100644 index 00000000..863f2cfb --- /dev/null +++ b/_build/html/_autosummary/navlie.utils.GaussianResultList.html @@ -0,0 +1,1491 @@ + + + + + + + + navlie.utils.GaussianResultList — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.utils.MonteCarloResult.html b/_build/html/_autosummary/navlie.utils.MonteCarloResult.html new file mode 100644 index 00000000..22ba1e46 --- /dev/null +++ b/_build/html/_autosummary/navlie.utils.MonteCarloResult.html @@ -0,0 +1,1350 @@ + + + + + + + + navlie.utils.MonteCarloResult — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.utils.associate_stamps.html b/_build/html/_autosummary/navlie.utils.associate_stamps.html new file mode 100644 index 00000000..708358fc --- /dev/null +++ b/_build/html/_autosummary/navlie.utils.associate_stamps.html @@ -0,0 +1,1120 @@ + + + + + + + + navlie.utils.associate_stamps — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.utils.find_nearest_stamp_idx.html b/_build/html/_autosummary/navlie.utils.find_nearest_stamp_idx.html new file mode 100644 index 00000000..d38106ae --- /dev/null +++ b/_build/html/_autosummary/navlie.utils.find_nearest_stamp_idx.html @@ -0,0 +1,1115 @@ + + + + + + + + navlie.utils.find_nearest_stamp_idx — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.utils.html b/_build/html/_autosummary/navlie.utils.html new file mode 100644 index 00000000..238ef450 --- /dev/null +++ b/_build/html/_autosummary/navlie.utils.html @@ -0,0 +1,1142 @@ + + + + + + + + navlie.utils — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

navlie.utils

+

Collection of miscellaneous utility functions and classes.

+

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

associate_stamps(first_stamps, second_stamps)

Associate timestamps.

find_nearest_stamp_idx(stamps_list, stamp)

Find the index of the nearest stamp in stamps_list to stamp.

jacobian(fun, x[, step_size, method])

Compute the Jacobian of a function.

monte_carlo(trial, num_trials[, num_jobs, ...])

Monte-Carlo experiment executor.

plot_error(results[, axs, label, sharey, ...])

A generic three-sigma bound plotter.

plot_meas(meas_list, state_list[, axs, sharey])

Given measurement data, make time-domain plots of the measurement values and their ground-truth model-based values.

plot_meas_by_model(meas_list, state_list[, ...])

Given measurement data, make time-domain plots of the measurement values and their ground-truth model-based values.

plot_nees(results[, ax, label, color, ...])

Makes a plot of the NEES, showing the actual NEES values, the expected NEES, and the bounds of the specified confidence interval.

plot_poses(poses[, ax, line_color, ...])

Plots a pose trajectory, representing the attitudes by triads plotted along the trajectory.

randvec(cov[, num_samples])

Produces a random zero-mean column vector with covariance given by cov

schedule_sequential_measurements(model_list, ...)

Schedules sequential measurements from a list of MeasurementModels that cannot generate measurements at the same time.

set_axes_equal(ax)

Sets the axes of a 3D plot to have equal scale.

state_interp(query_stamps, state_list[, method])

Performs "linear" (geodesic) interpolation between State objects.

van_loans(A_c, L_c, Q_c, dt)

Van Loan's method for computing the discrete-time A and Q matrices.

+

Classes

+ + + + + + + + + + + + +

GaussianResult(estimate, state_true)

A data container that simultaneously computes various interesting metrics about a Gaussian filter's state estimate, given the ground-truth value of the state.

GaussianResultList(result_list)

A data container that accepts a list of GaussianResult objects and stacks the attributes in numpy arrays.

MonteCarloResult(trial_results)

A data container which computes various interesting metrics associated with Monte Carlo experiments, such as the average estimation error squared (EES) and the average normalized EES.

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.utils.jacobian.html b/_build/html/_autosummary/navlie.utils.jacobian.html new file mode 100644 index 00000000..5280000e --- /dev/null +++ b/_build/html/_autosummary/navlie.utils.jacobian.html @@ -0,0 +1,1148 @@ + + + + + + + + navlie.utils.jacobian — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.utils.monte_carlo.html b/_build/html/_autosummary/navlie.utils.monte_carlo.html new file mode 100644 index 00000000..d48815eb --- /dev/null +++ b/_build/html/_autosummary/navlie.utils.monte_carlo.html @@ -0,0 +1,1127 @@ + + + + + + + + navlie.utils.monte_carlo — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.utils.plot_error.html b/_build/html/_autosummary/navlie.utils.plot_error.html new file mode 100644 index 00000000..2b8bbffc --- /dev/null +++ b/_build/html/_autosummary/navlie.utils.plot_error.html @@ -0,0 +1,1118 @@ + + + + + + + + navlie.utils.plot_error — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.utils.plot_meas.html b/_build/html/_autosummary/navlie.utils.plot_meas.html new file mode 100644 index 00000000..4c95d317 --- /dev/null +++ b/_build/html/_autosummary/navlie.utils.plot_meas.html @@ -0,0 +1,1119 @@ + + + + + + + + navlie.utils.plot_meas — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.utils.plot_meas_by_model.html b/_build/html/_autosummary/navlie.utils.plot_meas_by_model.html new file mode 100644 index 00000000..4cf2c1d1 --- /dev/null +++ b/_build/html/_autosummary/navlie.utils.plot_meas_by_model.html @@ -0,0 +1,1119 @@ + + + + + + + + navlie.utils.plot_meas_by_model — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.utils.plot_nees.html b/_build/html/_autosummary/navlie.utils.plot_nees.html new file mode 100644 index 00000000..f73617d7 --- /dev/null +++ b/_build/html/_autosummary/navlie.utils.plot_nees.html @@ -0,0 +1,1122 @@ + + + + + + + + navlie.utils.plot_nees — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.utils.plot_poses.html b/_build/html/_autosummary/navlie.utils.plot_poses.html new file mode 100644 index 00000000..0fd8ca5c --- /dev/null +++ b/_build/html/_autosummary/navlie.utils.plot_poses.html @@ -0,0 +1,1119 @@ + + + + + + + + navlie.utils.plot_poses — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.utils.randvec.html b/_build/html/_autosummary/navlie.utils.randvec.html new file mode 100644 index 00000000..48541d11 --- /dev/null +++ b/_build/html/_autosummary/navlie.utils.randvec.html @@ -0,0 +1,1117 @@ + + + + + + + + navlie.utils.randvec — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.utils.schedule_sequential_measurements.html b/_build/html/_autosummary/navlie.utils.schedule_sequential_measurements.html new file mode 100644 index 00000000..f05bd7e9 --- /dev/null +++ b/_build/html/_autosummary/navlie.utils.schedule_sequential_measurements.html @@ -0,0 +1,1118 @@ + + + + + + + + navlie.utils.schedule_sequential_measurements — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.utils.set_axes_equal.html b/_build/html/_autosummary/navlie.utils.set_axes_equal.html new file mode 100644 index 00000000..590107ec --- /dev/null +++ b/_build/html/_autosummary/navlie.utils.set_axes_equal.html @@ -0,0 +1,1105 @@ + + + + + + + + navlie.utils.set_axes_equal — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.utils.state_interp.html b/_build/html/_autosummary/navlie.utils.state_interp.html new file mode 100644 index 00000000..57f0796f --- /dev/null +++ b/_build/html/_autosummary/navlie.utils.state_interp.html @@ -0,0 +1,1127 @@ + + + + + + + + navlie.utils.state_interp — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_autosummary/navlie.utils.van_loans.html b/_build/html/_autosummary/navlie.utils.van_loans.html new file mode 100644 index 00000000..13f05c31 --- /dev/null +++ b/_build/html/_autosummary/navlie.utils.van_loans.html @@ -0,0 +1,1128 @@ + + + + + + + + navlie.utils.van_loans — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ + + + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_downloads/ae24f0925112922e980920319bba9f6d/imu.pdf b/_build/html/_downloads/ae24f0925112922e980920319bba9f6d/imu.pdf new file mode 100644 index 00000000..ed99dc63 Binary files /dev/null and b/_build/html/_downloads/ae24f0925112922e980920319bba9f6d/imu.pdf differ diff --git a/_build/html/_images/fun_figs.png b/_build/html/_images/fun_figs.png new file mode 100644 index 00000000..b351c5aa Binary files /dev/null and b/_build/html/_images/fun_figs.png differ diff --git a/_build/html/_images/system_diagram.png b/_build/html/_images/system_diagram.png new file mode 100644 index 00000000..022d65dd Binary files /dev/null and b/_build/html/_images/system_diagram.png differ diff --git a/_build/html/_images/toy_problem.png b/_build/html/_images/toy_problem.png new file mode 100644 index 00000000..3fec2618 Binary files /dev/null and b/_build/html/_images/toy_problem.png differ diff --git a/_build/html/_images/tutorial_composite_11_0.png b/_build/html/_images/tutorial_composite_11_0.png new file mode 100644 index 00000000..5975d2dc Binary files /dev/null and b/_build/html/_images/tutorial_composite_11_0.png differ diff --git a/_build/html/_images/tutorial_composite_11_1.png b/_build/html/_images/tutorial_composite_11_1.png new file mode 100644 index 00000000..9138fd24 Binary files /dev/null and b/_build/html/_images/tutorial_composite_11_1.png differ diff --git a/_build/html/_images/tutorial_lie_groups_12_0.png b/_build/html/_images/tutorial_lie_groups_12_0.png new file mode 100644 index 00000000..7028588e Binary files /dev/null and b/_build/html/_images/tutorial_lie_groups_12_0.png differ diff --git a/_build/html/_images/tutorial_lie_groups_12_1.png b/_build/html/_images/tutorial_lie_groups_12_1.png new file mode 100644 index 00000000..0dc7ed62 Binary files /dev/null and b/_build/html/_images/tutorial_lie_groups_12_1.png differ diff --git a/_build/html/_images/tutorial_traditional_13_0.png b/_build/html/_images/tutorial_traditional_13_0.png new file mode 100644 index 00000000..3dbc3f21 Binary files /dev/null and b/_build/html/_images/tutorial_traditional_13_0.png differ diff --git a/_build/html/_images/tutorial_traditional_13_1.png b/_build/html/_images/tutorial_traditional_13_1.png new file mode 100644 index 00000000..5b75a622 Binary files /dev/null and b/_build/html/_images/tutorial_traditional_13_1.png differ diff --git a/_build/html/_images/tutorial_traditional_9_0.png b/_build/html/_images/tutorial_traditional_9_0.png new file mode 100644 index 00000000..f3d0d162 Binary files /dev/null and b/_build/html/_images/tutorial_traditional_9_0.png differ diff --git a/_build/html/_images/tutorial_traditional_9_1.png b/_build/html/_images/tutorial_traditional_9_1.png new file mode 100644 index 00000000..53322f71 Binary files /dev/null and b/_build/html/_images/tutorial_traditional_9_1.png differ diff --git a/_build/html/_sources/_autosummary/navlie.batch.estimator.BatchEstimator.rst.txt b/_build/html/_sources/_autosummary/navlie.batch.estimator.BatchEstimator.rst.txt new file mode 100644 index 00000000..b4222adc --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.batch.estimator.BatchEstimator.rst.txt @@ -0,0 +1,10 @@ +navlie.batch.estimator.BatchEstimator +===================================== + +.. currentmodule:: navlie.batch.estimator + +.. autoclass:: BatchEstimator + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.batch.estimator.rst.txt b/_build/html/_sources/_autosummary/navlie.batch.estimator.rst.txt new file mode 100644 index 00000000..29b2582d --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.batch.estimator.rst.txt @@ -0,0 +1,31 @@ +navlie.batch.estimator +====================== + +.. automodule:: navlie.batch.estimator + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + BatchEstimator + + + + + + + + + diff --git a/_build/html/_sources/_autosummary/navlie.batch.gaussian_mixtures.GaussianMixtureResidual.rst.txt b/_build/html/_sources/_autosummary/navlie.batch.gaussian_mixtures.GaussianMixtureResidual.rst.txt new file mode 100644 index 00000000..4cf8538f --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.batch.gaussian_mixtures.GaussianMixtureResidual.rst.txt @@ -0,0 +1,10 @@ +navlie.batch.gaussian\_mixtures.GaussianMixtureResidual +======================================================= + +.. currentmodule:: navlie.batch.gaussian_mixtures + +.. autoclass:: GaussianMixtureResidual + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.rst.txt b/_build/html/_sources/_autosummary/navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.rst.txt new file mode 100644 index 00000000..dacea608 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.rst.txt @@ -0,0 +1,10 @@ +navlie.batch.gaussian\_mixtures.HessianSumMixtureResidual +========================================================= + +.. currentmodule:: navlie.batch.gaussian_mixtures + +.. autoclass:: HessianSumMixtureResidual + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.batch.gaussian_mixtures.MaxMixtureResidual.rst.txt b/_build/html/_sources/_autosummary/navlie.batch.gaussian_mixtures.MaxMixtureResidual.rst.txt new file mode 100644 index 00000000..feb7ccc0 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.batch.gaussian_mixtures.MaxMixtureResidual.rst.txt @@ -0,0 +1,10 @@ +navlie.batch.gaussian\_mixtures.MaxMixtureResidual +================================================== + +.. currentmodule:: navlie.batch.gaussian_mixtures + +.. autoclass:: MaxMixtureResidual + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.batch.gaussian_mixtures.MaxSumMixtureResidual.rst.txt b/_build/html/_sources/_autosummary/navlie.batch.gaussian_mixtures.MaxSumMixtureResidual.rst.txt new file mode 100644 index 00000000..49b7a8d7 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.batch.gaussian_mixtures.MaxSumMixtureResidual.rst.txt @@ -0,0 +1,10 @@ +navlie.batch.gaussian\_mixtures.MaxSumMixtureResidual +===================================================== + +.. currentmodule:: navlie.batch.gaussian_mixtures + +.. autoclass:: MaxSumMixtureResidual + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.batch.gaussian_mixtures.SumMixtureResidual.rst.txt b/_build/html/_sources/_autosummary/navlie.batch.gaussian_mixtures.SumMixtureResidual.rst.txt new file mode 100644 index 00000000..be782443 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.batch.gaussian_mixtures.SumMixtureResidual.rst.txt @@ -0,0 +1,10 @@ +navlie.batch.gaussian\_mixtures.SumMixtureResidual +================================================== + +.. currentmodule:: navlie.batch.gaussian_mixtures + +.. autoclass:: SumMixtureResidual + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.batch.gaussian_mixtures.rst.txt b/_build/html/_sources/_autosummary/navlie.batch.gaussian_mixtures.rst.txt new file mode 100644 index 00000000..91df23dd --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.batch.gaussian_mixtures.rst.txt @@ -0,0 +1,35 @@ +navlie.batch.gaussian\_mixtures +=============================== + +.. automodule:: navlie.batch.gaussian_mixtures + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + GaussianMixtureResidual + HessianSumMixtureResidual + MaxMixtureResidual + MaxSumMixtureResidual + SumMixtureResidual + + + + + + + + + diff --git a/_build/html/_sources/_autosummary/navlie.batch.losses.CauchyLoss.rst.txt b/_build/html/_sources/_autosummary/navlie.batch.losses.CauchyLoss.rst.txt new file mode 100644 index 00000000..8a2b1e42 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.batch.losses.CauchyLoss.rst.txt @@ -0,0 +1,10 @@ +navlie.batch.losses.CauchyLoss +============================== + +.. currentmodule:: navlie.batch.losses + +.. autoclass:: CauchyLoss + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.batch.losses.L2Loss.rst.txt b/_build/html/_sources/_autosummary/navlie.batch.losses.L2Loss.rst.txt new file mode 100644 index 00000000..dbe005c2 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.batch.losses.L2Loss.rst.txt @@ -0,0 +1,10 @@ +navlie.batch.losses.L2Loss +========================== + +.. currentmodule:: navlie.batch.losses + +.. autoclass:: L2Loss + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.batch.losses.LossFunction.rst.txt b/_build/html/_sources/_autosummary/navlie.batch.losses.LossFunction.rst.txt new file mode 100644 index 00000000..b275f496 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.batch.losses.LossFunction.rst.txt @@ -0,0 +1,10 @@ +navlie.batch.losses.LossFunction +================================ + +.. currentmodule:: navlie.batch.losses + +.. autoclass:: LossFunction + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.batch.losses.rst.txt b/_build/html/_sources/_autosummary/navlie.batch.losses.rst.txt new file mode 100644 index 00000000..fc889ee2 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.batch.losses.rst.txt @@ -0,0 +1,33 @@ +navlie.batch.losses +=================== + +.. automodule:: navlie.batch.losses + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + CauchyLoss + L2Loss + LossFunction + + + + + + + + + diff --git a/_build/html/_sources/_autosummary/navlie.batch.problem.OptimizationSummary.rst.txt b/_build/html/_sources/_autosummary/navlie.batch.problem.OptimizationSummary.rst.txt new file mode 100644 index 00000000..bcb8ee19 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.batch.problem.OptimizationSummary.rst.txt @@ -0,0 +1,10 @@ +navlie.batch.problem.OptimizationSummary +======================================== + +.. currentmodule:: navlie.batch.problem + +.. autoclass:: OptimizationSummary + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.batch.problem.Problem.rst.txt b/_build/html/_sources/_autosummary/navlie.batch.problem.Problem.rst.txt new file mode 100644 index 00000000..40846284 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.batch.problem.Problem.rst.txt @@ -0,0 +1,10 @@ +navlie.batch.problem.Problem +============================ + +.. currentmodule:: navlie.batch.problem + +.. autoclass:: Problem + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.batch.problem.rst.txt b/_build/html/_sources/_autosummary/navlie.batch.problem.rst.txt new file mode 100644 index 00000000..c85847bb --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.batch.problem.rst.txt @@ -0,0 +1,32 @@ +navlie.batch.problem +==================== + +.. automodule:: navlie.batch.problem + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + OptimizationSummary + Problem + + + + + + + + + diff --git a/_build/html/_sources/_autosummary/navlie.batch.residuals.MeasurementResidual.rst.txt b/_build/html/_sources/_autosummary/navlie.batch.residuals.MeasurementResidual.rst.txt new file mode 100644 index 00000000..b288b24c --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.batch.residuals.MeasurementResidual.rst.txt @@ -0,0 +1,10 @@ +navlie.batch.residuals.MeasurementResidual +========================================== + +.. currentmodule:: navlie.batch.residuals + +.. autoclass:: MeasurementResidual + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.batch.residuals.PriorResidual.rst.txt b/_build/html/_sources/_autosummary/navlie.batch.residuals.PriorResidual.rst.txt new file mode 100644 index 00000000..4976a042 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.batch.residuals.PriorResidual.rst.txt @@ -0,0 +1,10 @@ +navlie.batch.residuals.PriorResidual +==================================== + +.. currentmodule:: navlie.batch.residuals + +.. autoclass:: PriorResidual + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.batch.residuals.ProcessResidual.rst.txt b/_build/html/_sources/_autosummary/navlie.batch.residuals.ProcessResidual.rst.txt new file mode 100644 index 00000000..33b29685 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.batch.residuals.ProcessResidual.rst.txt @@ -0,0 +1,10 @@ +navlie.batch.residuals.ProcessResidual +====================================== + +.. currentmodule:: navlie.batch.residuals + +.. autoclass:: ProcessResidual + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.batch.residuals.Residual.rst.txt b/_build/html/_sources/_autosummary/navlie.batch.residuals.Residual.rst.txt new file mode 100644 index 00000000..2752872c --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.batch.residuals.Residual.rst.txt @@ -0,0 +1,10 @@ +navlie.batch.residuals.Residual +=============================== + +.. currentmodule:: navlie.batch.residuals + +.. autoclass:: Residual + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.batch.residuals.rst.txt b/_build/html/_sources/_autosummary/navlie.batch.residuals.rst.txt new file mode 100644 index 00000000..d9198a9f --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.batch.residuals.rst.txt @@ -0,0 +1,34 @@ +navlie.batch.residuals +====================== + +.. automodule:: navlie.batch.residuals + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + MeasurementResidual + PriorResidual + ProcessResidual + Residual + + + + + + + + + diff --git a/_build/html/_sources/_autosummary/navlie.batch.rst.txt b/_build/html/_sources/_autosummary/navlie.batch.rst.txt new file mode 100644 index 00000000..d327bc0e --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.batch.rst.txt @@ -0,0 +1,36 @@ +navlie.batch +============ + +.. automodule:: navlie.batch + + + + + + + + + + + + + + + + + + + +.. rubric:: Modules + +.. autosummary:: + :toctree: + :template: custom-module-template.rst + :recursive: + + navlie.batch.estimator + navlie.batch.gaussian_mixtures + navlie.batch.losses + navlie.batch.problem + navlie.batch.residuals + diff --git a/_build/html/_sources/_autosummary/navlie.composite.CompositeInput.rst.txt b/_build/html/_sources/_autosummary/navlie.composite.CompositeInput.rst.txt new file mode 100644 index 00000000..49444858 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.composite.CompositeInput.rst.txt @@ -0,0 +1,10 @@ +navlie.composite.CompositeInput +=============================== + +.. currentmodule:: navlie.composite + +.. autoclass:: CompositeInput + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.composite.CompositeMeasurement.rst.txt b/_build/html/_sources/_autosummary/navlie.composite.CompositeMeasurement.rst.txt new file mode 100644 index 00000000..3aa7b2c7 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.composite.CompositeMeasurement.rst.txt @@ -0,0 +1,10 @@ +navlie.composite.CompositeMeasurement +===================================== + +.. currentmodule:: navlie.composite + +.. autoclass:: CompositeMeasurement + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.composite.CompositeMeasurementModel.rst.txt b/_build/html/_sources/_autosummary/navlie.composite.CompositeMeasurementModel.rst.txt new file mode 100644 index 00000000..3d086bbb --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.composite.CompositeMeasurementModel.rst.txt @@ -0,0 +1,10 @@ +navlie.composite.CompositeMeasurementModel +========================================== + +.. currentmodule:: navlie.composite + +.. autoclass:: CompositeMeasurementModel + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.composite.CompositeProcessModel.rst.txt b/_build/html/_sources/_autosummary/navlie.composite.CompositeProcessModel.rst.txt new file mode 100644 index 00000000..8ba205b7 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.composite.CompositeProcessModel.rst.txt @@ -0,0 +1,10 @@ +navlie.composite.CompositeProcessModel +====================================== + +.. currentmodule:: navlie.composite + +.. autoclass:: CompositeProcessModel + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.composite.CompositeState.rst.txt b/_build/html/_sources/_autosummary/navlie.composite.CompositeState.rst.txt new file mode 100644 index 00000000..a2124b82 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.composite.CompositeState.rst.txt @@ -0,0 +1,10 @@ +navlie.composite.CompositeState +=============================== + +.. currentmodule:: navlie.composite + +.. autoclass:: CompositeState + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.composite.rst.txt b/_build/html/_sources/_autosummary/navlie.composite.rst.txt new file mode 100644 index 00000000..6d49c4aa --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.composite.rst.txt @@ -0,0 +1,35 @@ +navlie.composite +================ + +.. automodule:: navlie.composite + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + CompositeInput + CompositeMeasurement + CompositeMeasurementModel + CompositeProcessModel + CompositeState + + + + + + + + + diff --git a/_build/html/_sources/_autosummary/navlie.datagen.DataGenerator.rst.txt b/_build/html/_sources/_autosummary/navlie.datagen.DataGenerator.rst.txt new file mode 100644 index 00000000..0d12bc00 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.datagen.DataGenerator.rst.txt @@ -0,0 +1,10 @@ +navlie.datagen.DataGenerator +============================ + +.. currentmodule:: navlie.datagen + +.. autoclass:: DataGenerator + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.datagen.generate_measurement.rst.txt b/_build/html/_sources/_autosummary/navlie.datagen.generate_measurement.rst.txt new file mode 100644 index 00000000..ed9151b3 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.datagen.generate_measurement.rst.txt @@ -0,0 +1,6 @@ +navlie.datagen.generate\_measurement +==================================== + +.. currentmodule:: navlie.datagen + +.. autofunction:: generate_measurement \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.datagen.rst.txt b/_build/html/_sources/_autosummary/navlie.datagen.rst.txt new file mode 100644 index 00000000..0fadd626 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.datagen.rst.txt @@ -0,0 +1,38 @@ +navlie.datagen +============== + +.. automodule:: navlie.datagen + + + + + + + + .. rubric:: Functions + + .. autosummary:: + :toctree: + + generate_measurement + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + DataGenerator + + + + + + + + + diff --git a/_build/html/_sources/_autosummary/navlie.filters.CubatureKalmanFilter.rst.txt b/_build/html/_sources/_autosummary/navlie.filters.CubatureKalmanFilter.rst.txt new file mode 100644 index 00000000..0e4deac2 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.filters.CubatureKalmanFilter.rst.txt @@ -0,0 +1,10 @@ +navlie.filters.CubatureKalmanFilter +=================================== + +.. currentmodule:: navlie.filters + +.. autoclass:: CubatureKalmanFilter + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.filters.ExtendedKalmanFilter.rst.txt b/_build/html/_sources/_autosummary/navlie.filters.ExtendedKalmanFilter.rst.txt new file mode 100644 index 00000000..04abc897 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.filters.ExtendedKalmanFilter.rst.txt @@ -0,0 +1,10 @@ +navlie.filters.ExtendedKalmanFilter +=================================== + +.. currentmodule:: navlie.filters + +.. autoclass:: ExtendedKalmanFilter + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.filters.GaussHermiteKalmanFilter.rst.txt b/_build/html/_sources/_autosummary/navlie.filters.GaussHermiteKalmanFilter.rst.txt new file mode 100644 index 00000000..5a7fbbb5 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.filters.GaussHermiteKalmanFilter.rst.txt @@ -0,0 +1,10 @@ +navlie.filters.GaussHermiteKalmanFilter +======================================= + +.. currentmodule:: navlie.filters + +.. autoclass:: GaussHermiteKalmanFilter + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.filters.IteratedKalmanFilter.rst.txt b/_build/html/_sources/_autosummary/navlie.filters.IteratedKalmanFilter.rst.txt new file mode 100644 index 00000000..7f5c0fae --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.filters.IteratedKalmanFilter.rst.txt @@ -0,0 +1,10 @@ +navlie.filters.IteratedKalmanFilter +=================================== + +.. currentmodule:: navlie.filters + +.. autoclass:: IteratedKalmanFilter + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.filters.SigmaPointKalmanFilter.rst.txt b/_build/html/_sources/_autosummary/navlie.filters.SigmaPointKalmanFilter.rst.txt new file mode 100644 index 00000000..b5561363 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.filters.SigmaPointKalmanFilter.rst.txt @@ -0,0 +1,10 @@ +navlie.filters.SigmaPointKalmanFilter +===================================== + +.. currentmodule:: navlie.filters + +.. autoclass:: SigmaPointKalmanFilter + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.filters.UnscentedKalmanFilter.rst.txt b/_build/html/_sources/_autosummary/navlie.filters.UnscentedKalmanFilter.rst.txt new file mode 100644 index 00000000..48cfcfd7 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.filters.UnscentedKalmanFilter.rst.txt @@ -0,0 +1,10 @@ +navlie.filters.UnscentedKalmanFilter +==================================== + +.. currentmodule:: navlie.filters + +.. autoclass:: UnscentedKalmanFilter + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.filters.check_outlier.rst.txt b/_build/html/_sources/_autosummary/navlie.filters.check_outlier.rst.txt new file mode 100644 index 00000000..8c57017a --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.filters.check_outlier.rst.txt @@ -0,0 +1,6 @@ +navlie.filters.check\_outlier +============================= + +.. currentmodule:: navlie.filters + +.. autofunction:: check_outlier \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.filters.generate_sigmapoints.rst.txt b/_build/html/_sources/_autosummary/navlie.filters.generate_sigmapoints.rst.txt new file mode 100644 index 00000000..0e3d73b3 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.filters.generate_sigmapoints.rst.txt @@ -0,0 +1,6 @@ +navlie.filters.generate\_sigmapoints +==================================== + +.. currentmodule:: navlie.filters + +.. autofunction:: generate_sigmapoints \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.filters.mean_state.rst.txt b/_build/html/_sources/_autosummary/navlie.filters.mean_state.rst.txt new file mode 100644 index 00000000..768de0f1 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.filters.mean_state.rst.txt @@ -0,0 +1,6 @@ +navlie.filters.mean\_state +========================== + +.. currentmodule:: navlie.filters + +.. autofunction:: mean_state \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.filters.rst.txt b/_build/html/_sources/_autosummary/navlie.filters.rst.txt new file mode 100644 index 00000000..31deba7f --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.filters.rst.txt @@ -0,0 +1,46 @@ +navlie.filters +============== + +.. automodule:: navlie.filters + + + + + + + + .. rubric:: Functions + + .. autosummary:: + :toctree: + + check_outlier + generate_sigmapoints + mean_state + run_filter + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + CubatureKalmanFilter + ExtendedKalmanFilter + GaussHermiteKalmanFilter + IteratedKalmanFilter + SigmaPointKalmanFilter + UnscentedKalmanFilter + + + + + + + + + diff --git a/_build/html/_sources/_autosummary/navlie.filters.run_filter.rst.txt b/_build/html/_sources/_autosummary/navlie.filters.run_filter.rst.txt new file mode 100644 index 00000000..3f92b237 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.filters.run_filter.rst.txt @@ -0,0 +1,6 @@ +navlie.filters.run\_filter +========================== + +.. currentmodule:: navlie.filters + +.. autofunction:: run_filter \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.imm.IMMResult.rst.txt b/_build/html/_sources/_autosummary/navlie.imm.IMMResult.rst.txt new file mode 100644 index 00000000..c73bc08b --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.imm.IMMResult.rst.txt @@ -0,0 +1,10 @@ +navlie.imm.IMMResult +==================== + +.. currentmodule:: navlie.imm + +.. autoclass:: IMMResult + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.imm.IMMResultList.rst.txt b/_build/html/_sources/_autosummary/navlie.imm.IMMResultList.rst.txt new file mode 100644 index 00000000..bfc03531 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.imm.IMMResultList.rst.txt @@ -0,0 +1,10 @@ +navlie.imm.IMMResultList +======================== + +.. currentmodule:: navlie.imm + +.. autoclass:: IMMResultList + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.imm.IMMState.rst.txt b/_build/html/_sources/_autosummary/navlie.imm.IMMState.rst.txt new file mode 100644 index 00000000..31721ab9 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.imm.IMMState.rst.txt @@ -0,0 +1,10 @@ +navlie.imm.IMMState +=================== + +.. currentmodule:: navlie.imm + +.. autoclass:: IMMState + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.imm.InteractingModelFilter.rst.txt b/_build/html/_sources/_autosummary/navlie.imm.InteractingModelFilter.rst.txt new file mode 100644 index 00000000..d60023ce --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.imm.InteractingModelFilter.rst.txt @@ -0,0 +1,10 @@ +navlie.imm.InteractingModelFilter +================================= + +.. currentmodule:: navlie.imm + +.. autoclass:: InteractingModelFilter + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.imm.gaussian_mixing.rst.txt b/_build/html/_sources/_autosummary/navlie.imm.gaussian_mixing.rst.txt new file mode 100644 index 00000000..ceab06be --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.imm.gaussian_mixing.rst.txt @@ -0,0 +1,6 @@ +navlie.imm.gaussian\_mixing +=========================== + +.. currentmodule:: navlie.imm + +.. autofunction:: gaussian_mixing \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.imm.gaussian_mixing_vectorspace.rst.txt b/_build/html/_sources/_autosummary/navlie.imm.gaussian_mixing_vectorspace.rst.txt new file mode 100644 index 00000000..ae5a3089 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.imm.gaussian_mixing_vectorspace.rst.txt @@ -0,0 +1,6 @@ +navlie.imm.gaussian\_mixing\_vectorspace +======================================== + +.. currentmodule:: navlie.imm + +.. autofunction:: gaussian_mixing_vectorspace \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.imm.reparametrize_gaussians_about_X_par.rst.txt b/_build/html/_sources/_autosummary/navlie.imm.reparametrize_gaussians_about_X_par.rst.txt new file mode 100644 index 00000000..d41719d5 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.imm.reparametrize_gaussians_about_X_par.rst.txt @@ -0,0 +1,6 @@ +navlie.imm.reparametrize\_gaussians\_about\_X\_par +================================================== + +.. currentmodule:: navlie.imm + +.. autofunction:: reparametrize_gaussians_about_X_par \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.imm.rst.txt b/_build/html/_sources/_autosummary/navlie.imm.rst.txt new file mode 100644 index 00000000..c7b7615e --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.imm.rst.txt @@ -0,0 +1,45 @@ +navlie.imm +========== + +.. automodule:: navlie.imm + + + + + + + + .. rubric:: Functions + + .. autosummary:: + :toctree: + + gaussian_mixing + gaussian_mixing_vectorspace + reparametrize_gaussians_about_X_par + run_imm_filter + update_X + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + IMMResult + IMMResultList + IMMState + InteractingModelFilter + + + + + + + + + diff --git a/_build/html/_sources/_autosummary/navlie.imm.run_imm_filter.rst.txt b/_build/html/_sources/_autosummary/navlie.imm.run_imm_filter.rst.txt new file mode 100644 index 00000000..664f1bb1 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.imm.run_imm_filter.rst.txt @@ -0,0 +1,6 @@ +navlie.imm.run\_imm\_filter +=========================== + +.. currentmodule:: navlie.imm + +.. autofunction:: run_imm_filter \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.imm.update_X.rst.txt b/_build/html/_sources/_autosummary/navlie.imm.update_X.rst.txt new file mode 100644 index 00000000..a3430fed --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.imm.update_X.rst.txt @@ -0,0 +1,6 @@ +navlie.imm.update\_X +==================== + +.. currentmodule:: navlie.imm + +.. autofunction:: update_X \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.camera.PinholeCamera.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.camera.PinholeCamera.rst.txt new file mode 100644 index 00000000..f6f84b08 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.camera.PinholeCamera.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.camera.PinholeCamera +=============================== + +.. currentmodule:: navlie.lib.camera + +.. autoclass:: PinholeCamera + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.camera.PoseMatrix.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.camera.PoseMatrix.rst.txt new file mode 100644 index 00000000..24f8028b --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.camera.PoseMatrix.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.camera.PoseMatrix +============================ + +.. currentmodule:: navlie.lib.camera + +.. autoclass:: PoseMatrix + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.camera.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.camera.rst.txt new file mode 100644 index 00000000..1c25fb39 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.camera.rst.txt @@ -0,0 +1,32 @@ +navlie.lib.camera +================= + +.. automodule:: navlie.lib.camera + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + PinholeCamera + PoseMatrix + + + + + + + + + diff --git a/_build/html/_sources/_autosummary/navlie.lib.datasets.SimulatedInertialGPSDataset.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.datasets.SimulatedInertialGPSDataset.rst.txt new file mode 100644 index 00000000..08f43c62 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.datasets.SimulatedInertialGPSDataset.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.datasets.SimulatedInertialGPSDataset +=============================================== + +.. currentmodule:: navlie.lib.datasets + +.. autoclass:: SimulatedInertialGPSDataset + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.datasets.SimulatedInertialLandmarkDataset.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.datasets.SimulatedInertialLandmarkDataset.rst.txt new file mode 100644 index 00000000..3b935bb7 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.datasets.SimulatedInertialLandmarkDataset.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.datasets.SimulatedInertialLandmarkDataset +==================================================== + +.. currentmodule:: navlie.lib.datasets + +.. autoclass:: SimulatedInertialLandmarkDataset + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.datasets.SimulatedPoseRangingDataset.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.datasets.SimulatedPoseRangingDataset.rst.txt new file mode 100644 index 00000000..621f9f1c --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.datasets.SimulatedPoseRangingDataset.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.datasets.SimulatedPoseRangingDataset +=============================================== + +.. currentmodule:: navlie.lib.datasets + +.. autoclass:: SimulatedPoseRangingDataset + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.datasets.generate_landmark_positions.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.datasets.generate_landmark_positions.rst.txt new file mode 100644 index 00000000..2538be3a --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.datasets.generate_landmark_positions.rst.txt @@ -0,0 +1,6 @@ +navlie.lib.datasets.generate\_landmark\_positions +================================================= + +.. currentmodule:: navlie.lib.datasets + +.. autofunction:: generate_landmark_positions \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.datasets.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.datasets.rst.txt new file mode 100644 index 00000000..cbfb9b06 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.datasets.rst.txt @@ -0,0 +1,40 @@ +navlie.lib.datasets +=================== + +.. automodule:: navlie.lib.datasets + + + + + + + + .. rubric:: Functions + + .. autosummary:: + :toctree: + + generate_landmark_positions + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + SimulatedInertialGPSDataset + SimulatedInertialLandmarkDataset + SimulatedPoseRangingDataset + + + + + + + + + diff --git a/_build/html/_sources/_autosummary/navlie.lib.imu.G_matrix.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.imu.G_matrix.rst.txt new file mode 100644 index 00000000..23ce529c --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.imu.G_matrix.rst.txt @@ -0,0 +1,6 @@ +navlie.lib.imu.G\_matrix +======================== + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: G_matrix \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.imu.G_matrix_inv.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.imu.G_matrix_inv.rst.txt new file mode 100644 index 00000000..83190a0e --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.imu.G_matrix_inv.rst.txt @@ -0,0 +1,6 @@ +navlie.lib.imu.G\_matrix\_inv +============================= + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: G_matrix_inv \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.imu.IMU.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.imu.IMU.rst.txt new file mode 100644 index 00000000..dd7e48d0 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.imu.IMU.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.imu.IMU +================== + +.. currentmodule:: navlie.lib.imu + +.. autoclass:: IMU + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.imu.IMUKinematics.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.imu.IMUKinematics.rst.txt new file mode 100644 index 00000000..aab31572 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.imu.IMUKinematics.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.imu.IMUKinematics +============================ + +.. currentmodule:: navlie.lib.imu + +.. autoclass:: IMUKinematics + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.imu.IMUState.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.imu.IMUState.rst.txt new file mode 100644 index 00000000..fde4052b --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.imu.IMUState.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.imu.IMUState +======================= + +.. currentmodule:: navlie.lib.imu + +.. autoclass:: IMUState + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.imu.L_matrix.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.imu.L_matrix.rst.txt new file mode 100644 index 00000000..b1acfeb2 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.imu.L_matrix.rst.txt @@ -0,0 +1,6 @@ +navlie.lib.imu.L\_matrix +======================== + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: L_matrix \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.imu.M_matrix.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.imu.M_matrix.rst.txt new file mode 100644 index 00000000..e6339ca9 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.imu.M_matrix.rst.txt @@ -0,0 +1,6 @@ +navlie.lib.imu.M\_matrix +======================== + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: M_matrix \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.imu.N_matrix.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.imu.N_matrix.rst.txt new file mode 100644 index 00000000..ebecf6b7 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.imu.N_matrix.rst.txt @@ -0,0 +1,6 @@ +navlie.lib.imu.N\_matrix +======================== + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: N_matrix \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.imu.U_matrix.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.imu.U_matrix.rst.txt new file mode 100644 index 00000000..6c6c3737 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.imu.U_matrix.rst.txt @@ -0,0 +1,6 @@ +navlie.lib.imu.U\_matrix +======================== + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: U_matrix \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.imu.U_matrix_inv.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.imu.U_matrix_inv.rst.txt new file mode 100644 index 00000000..28d7140c --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.imu.U_matrix_inv.rst.txt @@ -0,0 +1,6 @@ +navlie.lib.imu.U\_matrix\_inv +============================= + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: U_matrix_inv \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.imu.U_tilde_matrix.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.imu.U_tilde_matrix.rst.txt new file mode 100644 index 00000000..58b61c9f --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.imu.U_tilde_matrix.rst.txt @@ -0,0 +1,6 @@ +navlie.lib.imu.U\_tilde\_matrix +=============================== + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: U_tilde_matrix \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.imu.adjoint_IE3.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.imu.adjoint_IE3.rst.txt new file mode 100644 index 00000000..4b0bff12 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.imu.adjoint_IE3.rst.txt @@ -0,0 +1,6 @@ +navlie.lib.imu.adjoint\_IE3 +=========================== + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: adjoint_IE3 \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.imu.delta_matrix.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.imu.delta_matrix.rst.txt new file mode 100644 index 00000000..b91120ac --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.imu.delta_matrix.rst.txt @@ -0,0 +1,6 @@ +navlie.lib.imu.delta\_matrix +============================ + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: delta_matrix \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.imu.get_unbiased_imu.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.imu.get_unbiased_imu.rst.txt new file mode 100644 index 00000000..9b35ce2f --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.imu.get_unbiased_imu.rst.txt @@ -0,0 +1,6 @@ +navlie.lib.imu.get\_unbiased\_imu +================================= + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: get_unbiased_imu \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.imu.inverse_IE3.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.imu.inverse_IE3.rst.txt new file mode 100644 index 00000000..e1857eca --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.imu.inverse_IE3.rst.txt @@ -0,0 +1,6 @@ +navlie.lib.imu.inverse\_IE3 +=========================== + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: inverse_IE3 \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.imu.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.imu.rst.txt new file mode 100644 index 00000000..7ded5990 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.imu.rst.txt @@ -0,0 +1,51 @@ +navlie.lib.imu +============== + +.. automodule:: navlie.lib.imu + + + + + + + + .. rubric:: Functions + + .. autosummary:: + :toctree: + + G_matrix + G_matrix_inv + L_matrix + M_matrix + N_matrix + U_matrix + U_matrix_inv + U_tilde_matrix + adjoint_IE3 + delta_matrix + get_unbiased_imu + inverse_IE3 + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + IMU + IMUKinematics + IMUState + + + + + + + + + diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.AbsolutePosition.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.AbsolutePosition.rst.txt new file mode 100644 index 00000000..071b4177 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.AbsolutePosition.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.AbsolutePosition +================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: AbsolutePosition + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.AbsoluteVelocity.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.AbsoluteVelocity.rst.txt new file mode 100644 index 00000000..a7dd329f --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.AbsoluteVelocity.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.AbsoluteVelocity +================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: AbsoluteVelocity + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.Altitude.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.Altitude.rst.txt new file mode 100644 index 00000000..fa3777b6 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.Altitude.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.Altitude +========================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: Altitude + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.BodyFrameVelocity.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.BodyFrameVelocity.rst.txt new file mode 100644 index 00000000..2938a897 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.BodyFrameVelocity.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.BodyFrameVelocity +=================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: BodyFrameVelocity + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.CameraProjection.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.CameraProjection.rst.txt new file mode 100644 index 00000000..b157a313 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.CameraProjection.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.CameraProjection +================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: CameraProjection + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.DoubleIntegrator.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.DoubleIntegrator.rst.txt new file mode 100644 index 00000000..04e207b3 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.DoubleIntegrator.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.DoubleIntegrator +================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: DoubleIntegrator + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.DoubleIntegratorWithBias.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.DoubleIntegratorWithBias.rst.txt new file mode 100644 index 00000000..613e08bc --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.DoubleIntegratorWithBias.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.DoubleIntegratorWithBias +========================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: DoubleIntegratorWithBias + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.GlobalPosition.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.GlobalPosition.rst.txt new file mode 100644 index 00000000..2a84bea5 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.GlobalPosition.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.GlobalPosition +================================ + +.. currentmodule:: navlie.lib.models + +.. autoclass:: GlobalPosition + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.Gravitometer.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.Gravitometer.rst.txt new file mode 100644 index 00000000..85266c50 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.Gravitometer.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.Gravitometer +============================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: Gravitometer + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.InvariantMeasurement.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.InvariantMeasurement.rst.txt new file mode 100644 index 00000000..8636519d --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.InvariantMeasurement.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.InvariantMeasurement +====================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: InvariantMeasurement + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.InvariantPointRelativePosition.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.InvariantPointRelativePosition.rst.txt new file mode 100644 index 00000000..4b018ecc --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.InvariantPointRelativePosition.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.InvariantPointRelativePosition +================================================ + +.. currentmodule:: navlie.lib.models + +.. autoclass:: InvariantPointRelativePosition + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.LinearMeasurement.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.LinearMeasurement.rst.txt new file mode 100644 index 00000000..5ad7f33b --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.LinearMeasurement.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.LinearMeasurement +=================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: LinearMeasurement + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.Magnetometer.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.Magnetometer.rst.txt new file mode 100644 index 00000000..3217a8ea --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.Magnetometer.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.Magnetometer +============================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: Magnetometer + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.OneDimensionalPositionVelocityRange.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.OneDimensionalPositionVelocityRange.rst.txt new file mode 100644 index 00000000..cb6007ef --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.OneDimensionalPositionVelocityRange.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.OneDimensionalPositionVelocityRange +===================================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: OneDimensionalPositionVelocityRange + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.PointRelativePosition.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.PointRelativePosition.rst.txt new file mode 100644 index 00000000..ae77f493 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.PointRelativePosition.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.PointRelativePosition +======================================= + +.. currentmodule:: navlie.lib.models + +.. autoclass:: PointRelativePosition + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.PointRelativePositionSLAM.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.PointRelativePositionSLAM.rst.txt new file mode 100644 index 00000000..35be905e --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.PointRelativePositionSLAM.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.PointRelativePositionSLAM +=========================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: PointRelativePositionSLAM + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.RangePointToAnchor.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.RangePointToAnchor.rst.txt new file mode 100644 index 00000000..f2862bcd --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.RangePointToAnchor.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.RangePointToAnchor +==================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: RangePointToAnchor + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.RangePoseToAnchor.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.RangePoseToAnchor.rst.txt new file mode 100644 index 00000000..96f5b7e9 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.RangePoseToAnchor.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.RangePoseToAnchor +=================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: RangePoseToAnchor + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.RangePoseToPose.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.RangePoseToPose.rst.txt new file mode 100644 index 00000000..e23e49f4 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.RangePoseToPose.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.RangePoseToPose +================================= + +.. currentmodule:: navlie.lib.models + +.. autoclass:: RangePoseToPose + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.RangeRelativePose.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.RangeRelativePose.rst.txt new file mode 100644 index 00000000..ddc3abf1 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.RangeRelativePose.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.RangeRelativePose +=================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: RangeRelativePose + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.RelativeBodyFrameVelocity.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.RelativeBodyFrameVelocity.rst.txt new file mode 100644 index 00000000..47176d46 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.RelativeBodyFrameVelocity.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.RelativeBodyFrameVelocity +=========================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: RelativeBodyFrameVelocity + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.SingleIntegrator.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.SingleIntegrator.rst.txt new file mode 100644 index 00000000..2a62fd56 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.SingleIntegrator.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.models.SingleIntegrator +================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: SingleIntegrator + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.models.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.models.rst.txt new file mode 100644 index 00000000..a4499773 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.models.rst.txt @@ -0,0 +1,52 @@ +navlie.lib.models +================= + +.. automodule:: navlie.lib.models + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + AbsolutePosition + AbsoluteVelocity + Altitude + BodyFrameVelocity + CameraProjection + DoubleIntegrator + DoubleIntegratorWithBias + GlobalPosition + Gravitometer + InvariantMeasurement + InvariantPointRelativePosition + LinearMeasurement + Magnetometer + OneDimensionalPositionVelocityRange + PointRelativePosition + PointRelativePositionSLAM + RangePointToAnchor + RangePoseToAnchor + RangePoseToPose + RangeRelativePose + RelativeBodyFrameVelocity + SingleIntegrator + + + + + + + + + diff --git a/_build/html/_sources/_autosummary/navlie.lib.preintegration.AngularVelocityIncrement.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.preintegration.AngularVelocityIncrement.rst.txt new file mode 100644 index 00000000..ed38e157 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.preintegration.AngularVelocityIncrement.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.preintegration.AngularVelocityIncrement +================================================== + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: AngularVelocityIncrement + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.preintegration.BodyVelocityIncrement.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.preintegration.BodyVelocityIncrement.rst.txt new file mode 100644 index 00000000..4e80763d --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.preintegration.BodyVelocityIncrement.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.preintegration.BodyVelocityIncrement +=============================================== + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: BodyVelocityIncrement + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.preintegration.IMUIncrement.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.preintegration.IMUIncrement.rst.txt new file mode 100644 index 00000000..3981994d --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.preintegration.IMUIncrement.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.preintegration.IMUIncrement +====================================== + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: IMUIncrement + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.preintegration.LinearIncrement.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.preintegration.LinearIncrement.rst.txt new file mode 100644 index 00000000..c5da1061 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.preintegration.LinearIncrement.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.preintegration.LinearIncrement +========================================= + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: LinearIncrement + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.preintegration.PreintegratedAngularVelocity.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.preintegration.PreintegratedAngularVelocity.rst.txt new file mode 100644 index 00000000..fb60ace4 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.preintegration.PreintegratedAngularVelocity.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.preintegration.PreintegratedAngularVelocity +====================================================== + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: PreintegratedAngularVelocity + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.preintegration.PreintegratedBodyVelocity.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.preintegration.PreintegratedBodyVelocity.rst.txt new file mode 100644 index 00000000..894991a5 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.preintegration.PreintegratedBodyVelocity.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.preintegration.PreintegratedBodyVelocity +=================================================== + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: PreintegratedBodyVelocity + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.preintegration.PreintegratedIMUKinematics.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.preintegration.PreintegratedIMUKinematics.rst.txt new file mode 100644 index 00000000..1a954882 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.preintegration.PreintegratedIMUKinematics.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.preintegration.PreintegratedIMUKinematics +==================================================== + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: PreintegratedIMUKinematics + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.preintegration.PreintegratedLinearModel.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.preintegration.PreintegratedLinearModel.rst.txt new file mode 100644 index 00000000..082f830d --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.preintegration.PreintegratedLinearModel.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.preintegration.PreintegratedLinearModel +================================================== + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: PreintegratedLinearModel + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.preintegration.PreintegratedWheelOdometry.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.preintegration.PreintegratedWheelOdometry.rst.txt new file mode 100644 index 00000000..71d21557 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.preintegration.PreintegratedWheelOdometry.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.preintegration.PreintegratedWheelOdometry +==================================================== + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: PreintegratedWheelOdometry + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.preintegration.RelativeMotionIncrement.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.preintegration.RelativeMotionIncrement.rst.txt new file mode 100644 index 00000000..f8d40c93 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.preintegration.RelativeMotionIncrement.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.preintegration.RelativeMotionIncrement +================================================= + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: RelativeMotionIncrement + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.preintegration.WheelOdometryIncrement.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.preintegration.WheelOdometryIncrement.rst.txt new file mode 100644 index 00000000..5eaa4b5d --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.preintegration.WheelOdometryIncrement.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.preintegration.WheelOdometryIncrement +================================================ + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: WheelOdometryIncrement + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.preintegration.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.preintegration.rst.txt new file mode 100644 index 00000000..90c46d0c --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.preintegration.rst.txt @@ -0,0 +1,41 @@ +navlie.lib.preintegration +========================= + +.. automodule:: navlie.lib.preintegration + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + AngularVelocityIncrement + BodyVelocityIncrement + IMUIncrement + LinearIncrement + PreintegratedAngularVelocity + PreintegratedBodyVelocity + PreintegratedIMUKinematics + PreintegratedLinearModel + PreintegratedWheelOdometry + RelativeMotionIncrement + WheelOdometryIncrement + + + + + + + + + diff --git a/_build/html/_sources/_autosummary/navlie.lib.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.rst.txt new file mode 100644 index 00000000..33cf70de --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.rst.txt @@ -0,0 +1,37 @@ +navlie.lib +========== + +.. automodule:: navlie.lib + + + + + + + + + + + + + + + + + + + +.. rubric:: Modules + +.. autosummary:: + :toctree: + :template: custom-module-template.rst + :recursive: + + navlie.lib.camera + navlie.lib.datasets + navlie.lib.imu + navlie.lib.models + navlie.lib.preintegration + navlie.lib.states + diff --git a/_build/html/_sources/_autosummary/navlie.lib.states.MatrixLieGroupState.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.states.MatrixLieGroupState.rst.txt new file mode 100644 index 00000000..b7bd6ed7 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.states.MatrixLieGroupState.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.states.MatrixLieGroupState +===================================== + +.. currentmodule:: navlie.lib.states + +.. autoclass:: MatrixLieGroupState + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.states.SE23State.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.states.SE23State.rst.txt new file mode 100644 index 00000000..3a2acab9 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.states.SE23State.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.states.SE23State +=========================== + +.. currentmodule:: navlie.lib.states + +.. autoclass:: SE23State + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.states.SE2State.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.states.SE2State.rst.txt new file mode 100644 index 00000000..26d31deb --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.states.SE2State.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.states.SE2State +========================== + +.. currentmodule:: navlie.lib.states + +.. autoclass:: SE2State + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.states.SE3State.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.states.SE3State.rst.txt new file mode 100644 index 00000000..928977a9 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.states.SE3State.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.states.SE3State +========================== + +.. currentmodule:: navlie.lib.states + +.. autoclass:: SE3State + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.states.SL3State.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.states.SL3State.rst.txt new file mode 100644 index 00000000..dfe1fc10 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.states.SL3State.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.states.SL3State +========================== + +.. currentmodule:: navlie.lib.states + +.. autoclass:: SL3State + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.states.SO2State.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.states.SO2State.rst.txt new file mode 100644 index 00000000..9f2678f9 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.states.SO2State.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.states.SO2State +========================== + +.. currentmodule:: navlie.lib.states + +.. autoclass:: SO2State + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.states.SO3State.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.states.SO3State.rst.txt new file mode 100644 index 00000000..c5fd87ce --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.states.SO3State.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.states.SO3State +========================== + +.. currentmodule:: navlie.lib.states + +.. autoclass:: SO3State + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.states.StampedValue.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.states.StampedValue.rst.txt new file mode 100644 index 00000000..83bad4eb --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.states.StampedValue.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.states.StampedValue +============================== + +.. currentmodule:: navlie.lib.states + +.. autoclass:: StampedValue + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.states.VectorInput.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.states.VectorInput.rst.txt new file mode 100644 index 00000000..0023f248 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.states.VectorInput.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.states.VectorInput +============================= + +.. currentmodule:: navlie.lib.states + +.. autoclass:: VectorInput + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.states.VectorState.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.states.VectorState.rst.txt new file mode 100644 index 00000000..e91253a0 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.states.VectorState.rst.txt @@ -0,0 +1,10 @@ +navlie.lib.states.VectorState +============================= + +.. currentmodule:: navlie.lib.states + +.. autoclass:: VectorState + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.lib.states.rst.txt b/_build/html/_sources/_autosummary/navlie.lib.states.rst.txt new file mode 100644 index 00000000..24b7ca9b --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.lib.states.rst.txt @@ -0,0 +1,40 @@ +navlie.lib.states +================= + +.. automodule:: navlie.lib.states + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + MatrixLieGroupState + SE23State + SE2State + SE3State + SL3State + SO2State + SO3State + StampedValue + VectorInput + VectorState + + + + + + + + + diff --git a/_build/html/_sources/_autosummary/navlie.types.Dataset.rst.txt b/_build/html/_sources/_autosummary/navlie.types.Dataset.rst.txt new file mode 100644 index 00000000..d691044d --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.types.Dataset.rst.txt @@ -0,0 +1,10 @@ +navlie.types.Dataset +==================== + +.. currentmodule:: navlie.types + +.. autoclass:: Dataset + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.types.Input.rst.txt b/_build/html/_sources/_autosummary/navlie.types.Input.rst.txt new file mode 100644 index 00000000..e1cd1004 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.types.Input.rst.txt @@ -0,0 +1,10 @@ +navlie.types.Input +================== + +.. currentmodule:: navlie.types + +.. autoclass:: Input + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.types.Measurement.rst.txt b/_build/html/_sources/_autosummary/navlie.types.Measurement.rst.txt new file mode 100644 index 00000000..327432f7 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.types.Measurement.rst.txt @@ -0,0 +1,10 @@ +navlie.types.Measurement +======================== + +.. currentmodule:: navlie.types + +.. autoclass:: Measurement + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.types.MeasurementModel.rst.txt b/_build/html/_sources/_autosummary/navlie.types.MeasurementModel.rst.txt new file mode 100644 index 00000000..f90ca7b8 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.types.MeasurementModel.rst.txt @@ -0,0 +1,10 @@ +navlie.types.MeasurementModel +============================= + +.. currentmodule:: navlie.types + +.. autoclass:: MeasurementModel + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.types.ProcessModel.rst.txt b/_build/html/_sources/_autosummary/navlie.types.ProcessModel.rst.txt new file mode 100644 index 00000000..9619b0e5 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.types.ProcessModel.rst.txt @@ -0,0 +1,10 @@ +navlie.types.ProcessModel +========================= + +.. currentmodule:: navlie.types + +.. autoclass:: ProcessModel + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.types.State.rst.txt b/_build/html/_sources/_autosummary/navlie.types.State.rst.txt new file mode 100644 index 00000000..81afa6ff --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.types.State.rst.txt @@ -0,0 +1,10 @@ +navlie.types.State +================== + +.. currentmodule:: navlie.types + +.. autoclass:: State + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.types.StateWithCovariance.rst.txt b/_build/html/_sources/_autosummary/navlie.types.StateWithCovariance.rst.txt new file mode 100644 index 00000000..c0f962b0 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.types.StateWithCovariance.rst.txt @@ -0,0 +1,10 @@ +navlie.types.StateWithCovariance +================================ + +.. currentmodule:: navlie.types + +.. autoclass:: StateWithCovariance + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.types.rst.txt b/_build/html/_sources/_autosummary/navlie.types.rst.txt new file mode 100644 index 00000000..da1b20d1 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.types.rst.txt @@ -0,0 +1,37 @@ +navlie.types +============ + +.. automodule:: navlie.types + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + Dataset + Input + Measurement + MeasurementModel + ProcessModel + State + StateWithCovariance + + + + + + + + + diff --git a/_build/html/_sources/_autosummary/navlie.utils.GaussianResult.rst.txt b/_build/html/_sources/_autosummary/navlie.utils.GaussianResult.rst.txt new file mode 100644 index 00000000..a920d1d2 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.utils.GaussianResult.rst.txt @@ -0,0 +1,10 @@ +navlie.utils.GaussianResult +=========================== + +.. currentmodule:: navlie.utils + +.. autoclass:: GaussianResult + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.utils.GaussianResultList.rst.txt b/_build/html/_sources/_autosummary/navlie.utils.GaussianResultList.rst.txt new file mode 100644 index 00000000..2aee2fed --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.utils.GaussianResultList.rst.txt @@ -0,0 +1,10 @@ +navlie.utils.GaussianResultList +=============================== + +.. currentmodule:: navlie.utils + +.. autoclass:: GaussianResultList + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.utils.MonteCarloResult.rst.txt b/_build/html/_sources/_autosummary/navlie.utils.MonteCarloResult.rst.txt new file mode 100644 index 00000000..81755eb5 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.utils.MonteCarloResult.rst.txt @@ -0,0 +1,10 @@ +navlie.utils.MonteCarloResult +============================= + +.. currentmodule:: navlie.utils + +.. autoclass:: MonteCarloResult + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.utils.associate_stamps.rst.txt b/_build/html/_sources/_autosummary/navlie.utils.associate_stamps.rst.txt new file mode 100644 index 00000000..2174fc69 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.utils.associate_stamps.rst.txt @@ -0,0 +1,6 @@ +navlie.utils.associate\_stamps +============================== + +.. currentmodule:: navlie.utils + +.. autofunction:: associate_stamps \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.utils.find_nearest_stamp_idx.rst.txt b/_build/html/_sources/_autosummary/navlie.utils.find_nearest_stamp_idx.rst.txt new file mode 100644 index 00000000..1615cc7f --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.utils.find_nearest_stamp_idx.rst.txt @@ -0,0 +1,6 @@ +navlie.utils.find\_nearest\_stamp\_idx +====================================== + +.. currentmodule:: navlie.utils + +.. autofunction:: find_nearest_stamp_idx \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.utils.jacobian.rst.txt b/_build/html/_sources/_autosummary/navlie.utils.jacobian.rst.txt new file mode 100644 index 00000000..1b02c953 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.utils.jacobian.rst.txt @@ -0,0 +1,6 @@ +navlie.utils.jacobian +===================== + +.. currentmodule:: navlie.utils + +.. autofunction:: jacobian \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.utils.monte_carlo.rst.txt b/_build/html/_sources/_autosummary/navlie.utils.monte_carlo.rst.txt new file mode 100644 index 00000000..17886c27 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.utils.monte_carlo.rst.txt @@ -0,0 +1,6 @@ +navlie.utils.monte\_carlo +========================= + +.. currentmodule:: navlie.utils + +.. autofunction:: monte_carlo \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.utils.plot_error.rst.txt b/_build/html/_sources/_autosummary/navlie.utils.plot_error.rst.txt new file mode 100644 index 00000000..da67b0b7 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.utils.plot_error.rst.txt @@ -0,0 +1,6 @@ +navlie.utils.plot\_error +======================== + +.. currentmodule:: navlie.utils + +.. autofunction:: plot_error \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.utils.plot_meas.rst.txt b/_build/html/_sources/_autosummary/navlie.utils.plot_meas.rst.txt new file mode 100644 index 00000000..7a2608b1 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.utils.plot_meas.rst.txt @@ -0,0 +1,6 @@ +navlie.utils.plot\_meas +======================= + +.. currentmodule:: navlie.utils + +.. autofunction:: plot_meas \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.utils.plot_meas_by_model.rst.txt b/_build/html/_sources/_autosummary/navlie.utils.plot_meas_by_model.rst.txt new file mode 100644 index 00000000..57a6b919 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.utils.plot_meas_by_model.rst.txt @@ -0,0 +1,6 @@ +navlie.utils.plot\_meas\_by\_model +================================== + +.. currentmodule:: navlie.utils + +.. autofunction:: plot_meas_by_model \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.utils.plot_nees.rst.txt b/_build/html/_sources/_autosummary/navlie.utils.plot_nees.rst.txt new file mode 100644 index 00000000..5ca9c13a --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.utils.plot_nees.rst.txt @@ -0,0 +1,6 @@ +navlie.utils.plot\_nees +======================= + +.. currentmodule:: navlie.utils + +.. autofunction:: plot_nees \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.utils.plot_poses.rst.txt b/_build/html/_sources/_autosummary/navlie.utils.plot_poses.rst.txt new file mode 100644 index 00000000..b7ae0d81 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.utils.plot_poses.rst.txt @@ -0,0 +1,6 @@ +navlie.utils.plot\_poses +======================== + +.. currentmodule:: navlie.utils + +.. autofunction:: plot_poses \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.utils.randvec.rst.txt b/_build/html/_sources/_autosummary/navlie.utils.randvec.rst.txt new file mode 100644 index 00000000..37d661e7 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.utils.randvec.rst.txt @@ -0,0 +1,6 @@ +navlie.utils.randvec +==================== + +.. currentmodule:: navlie.utils + +.. autofunction:: randvec \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.utils.rst.txt b/_build/html/_sources/_autosummary/navlie.utils.rst.txt new file mode 100644 index 00000000..d1c57608 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.utils.rst.txt @@ -0,0 +1,53 @@ +navlie.utils +============ + +.. automodule:: navlie.utils + + + + + + + + .. rubric:: Functions + + .. autosummary:: + :toctree: + + associate_stamps + find_nearest_stamp_idx + jacobian + monte_carlo + plot_error + plot_meas + plot_meas_by_model + plot_nees + plot_poses + randvec + schedule_sequential_measurements + set_axes_equal + state_interp + van_loans + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + GaussianResult + GaussianResultList + MonteCarloResult + + + + + + + + + diff --git a/_build/html/_sources/_autosummary/navlie.utils.schedule_sequential_measurements.rst.txt b/_build/html/_sources/_autosummary/navlie.utils.schedule_sequential_measurements.rst.txt new file mode 100644 index 00000000..1e2d5b81 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.utils.schedule_sequential_measurements.rst.txt @@ -0,0 +1,6 @@ +navlie.utils.schedule\_sequential\_measurements +=============================================== + +.. currentmodule:: navlie.utils + +.. autofunction:: schedule_sequential_measurements \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.utils.set_axes_equal.rst.txt b/_build/html/_sources/_autosummary/navlie.utils.set_axes_equal.rst.txt new file mode 100644 index 00000000..1c458ce9 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.utils.set_axes_equal.rst.txt @@ -0,0 +1,6 @@ +navlie.utils.set\_axes\_equal +============================= + +.. currentmodule:: navlie.utils + +.. autofunction:: set_axes_equal \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.utils.state_interp.rst.txt b/_build/html/_sources/_autosummary/navlie.utils.state_interp.rst.txt new file mode 100644 index 00000000..6cdbdbe2 --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.utils.state_interp.rst.txt @@ -0,0 +1,6 @@ +navlie.utils.state\_interp +========================== + +.. currentmodule:: navlie.utils + +.. autofunction:: state_interp \ No newline at end of file diff --git a/_build/html/_sources/_autosummary/navlie.utils.van_loans.rst.txt b/_build/html/_sources/_autosummary/navlie.utils.van_loans.rst.txt new file mode 100644 index 00000000..2538562c --- /dev/null +++ b/_build/html/_sources/_autosummary/navlie.utils.van_loans.rst.txt @@ -0,0 +1,6 @@ +navlie.utils.van\_loans +======================= + +.. currentmodule:: navlie.utils + +.. autofunction:: van_loans \ No newline at end of file diff --git a/_build/html/_sources/api.rst.txt b/_build/html/_sources/api.rst.txt new file mode 100644 index 00000000..4870a37d --- /dev/null +++ b/_build/html/_sources/api.rst.txt @@ -0,0 +1,17 @@ +API Documentation +------------------ +Below is a list of all the modules in the navlie package. Click on any of the links to see the documentation for that module. Alternatively, you can use the search box at the top of the page to search for a particular class/function/module. + +.. autosummary:: + :toctree: _autosummary + :recursive: + :template: custom-module-template.rst + + navlie.composite + navlie.datagen + navlie.filters + navlie.imm + navlie.types + navlie.utils + navlie.batch + navlie.lib \ No newline at end of file diff --git a/_build/html/_sources/index.rst.txt b/_build/html/_sources/index.rst.txt new file mode 100644 index 00000000..fbb725ee --- /dev/null +++ b/_build/html/_sources/index.rst.txt @@ -0,0 +1,62 @@ +.. navlie documentation master file, created by + sphinx-quickstart on Wed Aug 24 15:11:06 2022. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. toctree:: + :maxdepth: 1 + :hidden: + + Home + Tutorial + API + + +Welcome to navlie! +------------------ + +.. make a row of three figures stacked side by side +.. image:: ./fun_figs.png + :width: 100% + :align: center + +navlie is a state estimation package specifically designed for both traditional and Lie-group-based estimation problems! + +The core idea behind this project is to use abstraction in such a way that both traditional and Lie-group-based problems fall under the exact same interface. Using this, a single estimator implementation can operate on a variety of state definitions, such as the usual vector space, and any Lie group. We allow the user to define their custom state, process model, and measurement models, after which they will have a variety of algorithms available to them, including: + +- Extended Kalman Filter +- Iterated Extended Kalman Filter +- Sigmapoint Kalman Filters (Unscented, Spherical Cubature, Gauss-Hermite) +- Interacting Multiple Model Filter +- Batch MAP Estimation + +In addition, navlie contains + +- A large collection of common process and measurement models +- Out-of-the-box on-manifold numerical Jacobians using finite differencing +- Various utils for plotting, error, and consistency evaluation +- Monte Carlo experiment executor with result aggregation +- A preintegration module for linear, wheel odometry, and IMU process models + +By implementing a few classes, the user can model a large variety of problems. The following diagram summarizes the abstraction + +.. image:: ./system_diagram.png + :width: 100% + :align: center + + +Installation +^^^^^^^^^^^^ + +Clone this repo, change to its directory, and execute + +.. code-block:: bash + + git clone git@github.com:decargroup/navlie.git + cd navlie && pip install -e . + +This command should automatically install all dependencies, including our package `pymlg `_ for back-end Lie group mathematical operations. + +Examples +^^^^^^^^ +A more in-depth `tutorial `_ can be found on this website, but there are also many examples found in the `examples/` folder. Simply run these as python3 scripts. \ No newline at end of file diff --git a/_build/html/_sources/tutorial.rst.txt b/_build/html/_sources/tutorial.rst.txt new file mode 100644 index 00000000..bdcf0772 --- /dev/null +++ b/_build/html/_sources/tutorial.rst.txt @@ -0,0 +1,27 @@ + +Getting Started +--------------- + +Welcome to the navlie tutorial! The following few pages will go through a toy localization problem, where we will be running state estimation algorithms using navlie's framework. The first step is to install this package. This should be done by directly cloning the git repo and performing a local pip install: + +.. code-block:: bash + + git clone git@github.com:decargroup/navlie.git + cd navlie && pip install -e . + +All the dependencies should get installed by this command and the package should now be ready to use. Use the column on the left to go to next page of the tutorial. + + +.. note:: + + Although this package is currently registed with PyPi, installation via ``pip install navlie`` will not work. We're still figuring out how to set this up properly. Sorry! Feel free to help. + + +.. toctree:: + :hidden: + + 1. Getting Started + 2. Toy Problem - Traditional <./tutorial/traditional.ipynb> + 3. Toy Problem - Lie groups <./tutorial/lie_groups.ipynb> + 4. Specifying Jacobians <./tutorial/jacobians.ipynb> + 4. Composite States <./tutorial/composite.ipynb> \ No newline at end of file diff --git a/_build/html/_sources/tutorial/composite.ipynb.txt b/_build/html/_sources/tutorial/composite.ipynb.txt new file mode 100644 index 00000000..8a00bfdb --- /dev/null +++ b/_build/html/_sources/tutorial/composite.ipynb.txt @@ -0,0 +1,406 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Composite States\n", + "\n", + "The [CompositeState](../_autosummary/navlie.composite.CompositeState.rst) is a class that allows you to arbitarily combine multiple states, potentially of different types, into a new state that can be used with the navlie framework.\n", + "\n", + "Let's consider the previous example where we used the following $SE(2)$ pose transformation matrix to represent the state:\n", + "\n", + "$$ \n", + "\\mathbf{T} = \\begin{bmatrix} \\mathbf{C}_{ab} & \\mathbf{r}_a \\\\ \\mathbf{0} & 1 \\end{bmatrix} \\in SE(2).\n", + "$$\n", + "\n", + "Suppose we now also want to estimate a wheel odometry bias $\\mathbf{b} \\in \\mathbb{R}^2$ in addition to the robot's pose. Our state is now \n", + "\n", + "$$\n", + "\\mathbf{x} = (\\mathbf{T}, \\mathbf{b}) \\in SE(2) \\times \\mathbb{R}^2.\n", + "$$\n", + "\n", + "This can be implemented easily using the [CompositeState](../_autosummary/navlie.composite.CompositeState.rst) class in one of two ways: either directly or by inheritance. We'll show the former approach first." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CompositeState(stamp=0.0, state_id=None) with substates:\n", + " SE2State(stamp=0.0, state_id=pose, direction=right)\n", + " [[ 0.99500417 -0.09983342 1.84679329]\n", + " [ 0.09983342 0.99500417 3.09491919]\n", + " [ 0. 0. 1. ]]\n", + " VectorState(stamp=0.0, dof=2, state_id=bias)\n", + " [0.1 2. ]\n" + ] + } + ], + "source": [ + "import navlie as nav \n", + "import numpy as np\n", + "\n", + "# Define the pose and bias as their own states\n", + "T = nav.lib.SE2State(value = [0.1, 2.0, 3.0], stamp = 0.0, state_id=\"pose\")\n", + "b = nav.lib.VectorState(value = [0.1, 2.0], stamp = 0.0, state_id=\"bias\")\n", + "\n", + "# Combine into a composite state, and its ready to use!\n", + "x = nav.CompositeState([T, b], stamp=0.0)\n", + "\n", + "print(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The ``CompositeState`` class is a subclass of the ``State`` class, but who's ``value`` is a list of states, referred to as the *substates*. A convenience of this class is that the composite state's ``plus``, ``minus``, and ``copy`` methods have already been implemented for you based on the implementations in the substates. Note that the order in which the states are listed is important, and will correspond to the order of the components in the vectors involved in the ``plus`` and ``minus`` operations. This can be demonstrated with the following example." + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Result after plus():\n", + "CompositeState(stamp=0.0, state_id=None) with substates:\n", + " SE2State(stamp=0.0, state_id=pose, direction=right)\n", + " [[ 0.45359612 -0.89120736 1.80531705]\n", + " [ 0.89120736 0.45359612 6.55185711]\n", + " [ 0. 0. 1. ]]\n", + " VectorState(stamp=0.0, dof=2, state_id=bias)\n", + " [4.1 7. ]\n", + "\n", + "Result after minus():\n", + "[[1.]\n", + " [2.]\n", + " [3.]\n", + " [4.]\n", + " [5.]]\n" + ] + } + ], + "source": [ + "# plus() and minus() have been defined for you. Here, the first three elements\n", + "# of the vector to be added correspond to the pose (since it has 3 DOF), and the\n", + "# last two to the bias.\n", + "x_temp = x.plus(np.array([1,2,3,4,5]))\n", + "print(\"\\nResult after plus():\")\n", + "print(x_temp)\n", + "\n", + "dx = x_temp.minus(x)\n", + "print(\"\\nResult after minus():\")\n", + "print(dx)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we must write a process model that works with this state. We'll use the same process model as before, but now we'll also include the wheel odometry bias in the state. The bias process model will be modelled as a random walk of the form \n", + "\n", + "$$\n", + "\\mathbf{b}_{k+1} = \\mathbf{b}_k + \\Delta t \\mathbf{w}^\\mathrm{bias}_k,\n", + "$$\n", + "\n", + "where $\\mathbf{w}^{\\mathrm{bias}}_k \\sim \\mathcal{N}(0, \\mathbf{Q}^{\\mathrm{bias}})$ represents random error associated with this otherwise constant process model, which allows the bias to slowly vary. The process model for the composite state is then" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [], + "source": [ + "from scipy.linalg import expm\n", + "\n", + "def wedge_se2(x):\n", + " return np.array([[ 0, -x[0], x[1]],\n", + " [x[0], 0, x[2]], \n", + " [ 0, 0, 0]])\n", + "\n", + "class WheeledRobotWithBias(nav.ProcessModel):\n", + " def __init__(self, input_covariance_matrix):\n", + " self.Q = input_covariance_matrix\n", + "\n", + " def evaluate(self, x: nav.CompositeState, u: nav.lib.VectorInput, dt:float):\n", + " pose = x.value[0]\n", + " bias = x.value[1]\n", + " vel = np.array([u.value[0] - bias.value[0], u.value[1] - bias.value[1], 0])\n", + " x_next = x.copy()\n", + " x_next.value[0].value = pose.value @ expm(wedge_se2(vel * dt))\n", + "\n", + " # Largely data generation and jacobian purposes, we also update the bias\n", + " # state with an input, even if the input here is always zero in the\n", + " # nominal case.\n", + " x_next.value[1].value = bias.value + u.value[2:4]*dt\n", + " return x_next\n", + " \n", + " def input_covariance(self, x: nav.CompositeState, u: nav.lib.VectorInput, dt:float):\n", + " return self.Q\n", + "\n", + "Q = np.eye(4) * 0.1**2\n", + "process_model = WheeledRobotWithBias(Q)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'd like to use the same measurement model as before, which was just a series of range measurements to known landmarks:" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [], + "source": [ + "class RangeToLandmarkSE2(nav.MeasurementModel):\n", + " def __init__(\n", + " self,\n", + " landmark_position: np.ndarray,\n", + " measurement_covariance: float,\n", + " ):\n", + " self.landmark_position = landmark_position\n", + " self.R = measurement_covariance\n", + "\n", + " def evaluate(self, x: nav.lib.SE2State):\n", + " pos = x.value[0:2, 2]\n", + " return np.linalg.norm(pos - self.landmark_position)\n", + "\n", + " def covariance(self, x: nav.lib.SE2State):\n", + " return self.R\n", + " \n", + "R = 0.1**2\n", + "landmarks = np.array([[1, 1], [1, 2], [2, 2], [2, 1]])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The problem is that this was made for an ``SE2State`` instead of our new composite state, and specifically the line `pos = x.value[0:2, 2]` is going to throw an error when we feed in a composite state. This is easy to change, but then that means we have to make a similar change for all sorts of different state definitions. An alternative is to use the [CompositeMeasurementModel](../_autosummary/navlie.composite.CompositeMeasurementModel.rst), which is just a lightweight wrapper around one measurement model that \"assigns\" the model to a specific substate, referenced to by its `state_id` field. It is used as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "RangeToLandmarkSE2(of substate pose)\n", + "Jacobian:\n", + "[[0. 0.46544123 0.88507893 0. 0. ]]\n" + ] + } + ], + "source": [ + "meas_models = []\n", + "for lm in landmarks:\n", + " meas_models.append(\n", + " nav.CompositeMeasurementModel(RangeToLandmarkSE2(lm, R), \"pose\")\n", + " )\n", + "\n", + "print(meas_models[0])\n", + "print(\"Jacobian:\")\n", + "print(meas_models[0].jacobian(x))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This does mean that the `state_id` of each substate must be unique, but this is a good practice anyway. The `CompositeMeasurementModel` will then automatically handle the extraction of the relevant substate from the composite state and pass it to the measurement model, as well as handle the corresponding Jacobian accordingly. This is a good way to avoid having to write a lot of boilerplate code for different state definitions. Notice in the above example that the Jacobian has two extra zeros at the end, which correspond to the bias state that has no effect on the measurement. This is automatically handled by the `CompositeMeasurementModel`.\n", + "\n", + "With our problem now set up, we can run a filter on it with the same snippet as usual!" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "dg = nav.DataGenerator(\n", + " process_model=process_model, \n", + " input_func=lambda t, x: np.array([0.5, 0.3, 0.0, 0.0]), \n", + " input_covariance= Q, \n", + " input_freq=50, \n", + " meas_model_list=meas_models, \n", + " meas_freq_list=[10, 10, 10, 10] \n", + ")\n", + "\n", + "state_data, input_data, meas_data = dg.generate(x, start=0, stop=30, noise=True)\n", + "\n", + "# First, define the filter\n", + "kalman_filter = nav.ExtendedKalmanFilter(process_model)\n", + "P0 = np.diag([0.1**2, 1**2, 1**2, 0.1**2, 0.1**2]) # Initial covariance\n", + "x = nav.StateWithCovariance(x, P0) # Estimate and covariance in one container\n", + "\n", + "meas_idx = 0\n", + "y = meas_data[meas_idx]\n", + "estimates = []\n", + "for k in range(len(input_data) - 1):\n", + " u = input_data[k]\n", + "\n", + " # Fuse any measurements that have occurred.\n", + " while y.stamp < input_data[k + 1].stamp and meas_idx < len(meas_data):\n", + " x = kalman_filter.correct(x, y, u)\n", + "\n", + " # Load the next measurement\n", + " meas_idx += 1\n", + " if meas_idx < len(meas_data):\n", + " y = meas_data[meas_idx]\n", + "\n", + " # Predict until the next input is available\n", + " dt = input_data[k + 1].stamp - x.state.stamp\n", + " x = kalman_filter.predict(x, u, dt)\n", + "\n", + " estimates.append(x.copy())\n", + "\n", + "\n", + "results = nav.GaussianResultList.from_estimates(estimates, state_data)\n", + "\n", + "import matplotlib.pyplot as plt\n", + "fig, axs = nav.plot_error(results)\n", + "axs[0,0].set_title(\"Pose Estimation Errors\")\n", + "axs[0,0].set_ylabel(\"theta (rad)\")\n", + "axs[1,0].set_ylabel(\"x (m)\")\n", + "axs[2,0].set_ylabel(\"y (m)\")\n", + "axs[2,0].set_xlabel(\"Time (s)\")\n", + "axs[0, 1].set_title(\"Bias Estimation Errors\")\n", + "axs[0, 1].set_ylabel(\"ang. vel. (rad/s)\")\n", + "axs[1, 1].set_ylabel(\"forward vel. (m/s)\")\n", + "axs[1, 1].set_xlabel(\"Time (s)\")\n", + "\n", + "fig, ax = nav.plot_nees(results)\n", + "ax.set_title(\"NEES\")\n", + "ax.set_xlabel(\"Time (s)\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inheriting from `CompositeState`\n", + "\n", + "The previous example showed how to use the `CompositeState` class directly, but it's also possible to inherit from it. This is useful if you want to add some extra methods or attributes to the composite state, or if you are going to frequently be using the same composite state. Here's an example of how you would do it:" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WheeledRobotState(stamp=0.1, state_id=None) with substates:\n", + " SE2State(stamp=0.1, state_id=pose, direction=right)\n", + " [[ 0.99500417 -0.09983342 1.84679329]\n", + " [ 0.09983342 0.99500417 3.09491919]\n", + " [ 0. 0. 1. ]]\n", + " VectorState(stamp=0.1, dof=2, state_id=bias)\n", + " [0.1 2. ]\n", + "SE2State(stamp=0.1, state_id=pose, direction=right)\n", + " [[ 0.99500417 -0.09983342 1.84679329]\n", + " [ 0.09983342 0.99500417 3.09491919]\n", + " [ 0. 0. 1. ]]\n" + ] + } + ], + "source": [ + "class WheeledRobotState(nav.CompositeState):\n", + " def __init__(self, pose_values: np.ndarray, bias_values: np.ndarray, stamp: float):\n", + " pose = nav.lib.SE2State(pose_values, stamp=stamp, state_id=\"pose\")\n", + " bias = nav.lib.VectorState(bias_values, stamp=stamp, state_id=\"bias\")\n", + " super().__init__([pose, bias], stamp=stamp)\n", + "\n", + " # Define any getter that you want for convenience! \n", + " @property\n", + " def pose(self):\n", + " return self.value[0]\n", + "\n", + " @property\n", + " def bias(self):\n", + " return self.value[1]\n", + "\n", + " def copy(self):\n", + " return WheeledRobotState(self.pose.copy(), self.bias.copy())\n", + " \n", + "x = WheeledRobotState([0.1, 2.0, 3.0], [0.1, 2.0], stamp = 0.1)\n", + "print(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This can end up looking a lot cleaner, and is potentially more flexible to work with since you can add methods and attributes to the composite state. For example, because of the getters we defined above, we can access the pose and bias more ergonomically with `x.pose` and `x.bias`." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.16" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_build/html/_sources/tutorial/jacobians.ipynb.txt b/_build/html/_sources/tutorial/jacobians.ipynb.txt new file mode 100644 index 00000000..ce634985 --- /dev/null +++ b/_build/html/_sources/tutorial/jacobians.ipynb.txt @@ -0,0 +1,341 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Jacobians in navlie\n", + "\n", + "As you may know, many state estimation algorithm require access to process model and measurement model Jacobians, with respect to the state and sometimes other inputs. For states belonging to Lie groups, algorithms will require _Lie Jacobians_, which differ from traditional derivatives as they conform to the constraints of the group. The abstraction provided by the $\\oplus$ and $\\ominus$ operators (implemented with `State.plus` and `State.minus` respectively) allow for a generic definition of a derivative:\n", + "\n", + "$$\n", + "\\left.\\frac{D f(\\mathcal{X})}{D \\mathcal{X}}\\right|_{\\bar{\\mathcal{X}} }\\triangleq \\left.\\frac{\\partial f(\\bar{\\mathcal{X}} \\oplus \\delta \\mathbf{x}) \\ominus f(\\bar{\\mathcal{X}})}{\\partial \\delta \\mathbf{x}}\\right|_{\\delta \\mathbf{x} = \\mathbf{0}},\n", + "$$\n", + "\n", + "which can be shown to fall back to a traditional derivatives when $\\oplus$ and $\\ominus$ are defined to be regular addition/subtraction. This derivative definition is used universally throughout navlie, and roughly follows what is done in the [Micro Lie Theory paper](https://arxiv.org/pdf/1812.01537.pdf). In that reference, seperate definitions are given for \"left\" and \"right\" derivatives, whereas we have aggregated them into a single definition, with left and right derivatives naturally arising from the choice of $\\oplus$ and $\\ominus$ operators.\n", + "\n", + "If you dont want to worry about this, the good news is that navlie computes Lie Jacobians for you by default using finite difference. However, finite difference can have some drawbacks, such as being computationally expensive and less accurate than analytic derivatives. In this notebook, we will show you how to use analytic derivatives in navlie, which offer the maximum accuracy and speed.\n", + "\n", + "## Jacobians - Traditional Approach\n", + "Recall the traditional approach to the previous example. We had defined the state to be $\\mathbf{x} = [\\theta, x, y]^T$ and the process model to be\n", + "\n", + "$$ \n", + "\\begin{aligned}\n", + "\\theta_{k+1} &= \\theta_k + \\omega_k \\Delta t \\\\\n", + "x_{k+1} &= x_k + v_k \\cos(\\theta_k) \\Delta t \\\\\n", + "y_{k+1} &= y_k + v_k \\sin(\\theta_k) \\Delta t\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "where $\\omega_k$ is the angular velocity and $v_k$ is the linear velocity. Since the state is just a regular vector, Lie Jacobians fall back to regular Jacobians, and standard derivative techniques lead to the following expressions for the process model Jacobian with respect to the state\n", + "\n", + "$$\n", + "\\mathbf{F} := \\frac{\\partial f(\\mathbf{x}_k, \\mathbf{u}_k)}{\\partial \\mathbf{x}_k} = \\begin{bmatrix} 1 & 0 & 0 \\\\ -v_k \\sin(\\theta_k) \\Delta t & 1 & 0 \\\\ v_k \\cos(\\theta_k) \\Delta t & 0 & 1 \\end{bmatrix}\n", + "$$\n", + "\n", + "To implement this Jacobian in navlie, all we need to do is override the `jacobian()` method in our process model, and it will get used automatically by the estimation algorithms. Adding this to our process model from before:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import navlie as nav\n", + "import numpy as np\n", + "\n", + "from navlie.lib import VectorInput, VectorState\n", + "\n", + "Q = np.eye(2) * 0.1**2 # Input noise covariance with 0.1 m/s of standard deviation\n", + "\n", + "class WheeledRobot(nav.ProcessModel):\n", + " def __init__(self, input_covariance):\n", + " self.Q = input_covariance\n", + "\n", + " def evaluate(self, x: VectorState, u: VectorInput, dt: float) -> VectorState:\n", + " x_next = x.copy()\n", + " x_next.value[0] += u.value[0] * dt\n", + " x_next.value[1] += u.value[1] * dt * np.cos(x.value[0])\n", + " x_next.value[2] += u.value[1] * dt * np.sin(x.value[0])\n", + " return x_next\n", + "\n", + " def input_covariance(self, x: VectorState, u: VectorInput, dt: float) -> np.ndarray:\n", + " return self.Q\n", + " \n", + " def jacobian(self, x:VectorState, u: VectorInput, dt: float) -> np.ndarray:\n", + " F = np.eye(3)\n", + " F[1, 0] = -u.value[1] * dt * np.sin(x.value[0])\n", + " F[2, 0] = u.value[1] * dt * np.cos(x.value[0])\n", + " return F\n", + "\n", + "process_model = WheeledRobot(Q) # instantiate it" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, lets just double check that we did everything correctly by comparing with finite difference. All process models inherit the `jacobian_fd()` method, which computes the Jacobian using finite difference. We can use this to compare with our analytic Jacobian." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Analyical:\n", + "[[ 1. 0. 0. ]\n", + " [-0.01682942 1. 0. ]\n", + " [ 0.01080605 0. 1. ]]\n", + "\n", + "Finite difference:\n", + "[[ 1. 0. 0. ]\n", + " [-0.01682943 1. 0. ]\n", + " [ 0.01080604 0. 1. ]]\n" + ] + } + ], + "source": [ + "x = VectorState([1,2,3]) \n", + "u = VectorInput([0.1, 0.2]) \n", + "dt = 0.1 \n", + "\n", + "print(\"Analyical:\")\n", + "print(process_model.jacobian(x, u, dt))\n", + "\n", + "print(\"\\nFinite difference:\")\n", + "print(process_model.jacobian_fd(x, u, dt))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The Jacobians match almost perfectly, but differ slightly due to errors in finite difference. This is expected, as finite difference is only an approximation. Nevertheless, finite difference is generally sufficiently accurate for most applications.\n", + "\n", + "
\n", + "Note: The `jacobian` methods must *always* return a 2D array.\n", + "
\n", + "\n", + "\n", + "\n", + "Moving on to the measurement model, which was previously defined to be \n", + "\n", + "$$\n", + "\\mathbf{y}_k = || \\mathbf{r}_k - \\boldsymbol{\\ell}^{(i)} || \n", + "$$ \n", + "\n", + "where $\\mathbf{r}_k$ is the robot's position and $\\boldsymbol{\\ell}^{(i)}$ is the $i$th landmark. The measurement model Jacobian with respect to the state is\n", + "\n", + "$$ \n", + "\\mathbf{G} := \\frac{\\partial g(\\mathbf{x}_k)}{\\partial \\mathbf{x}_k} = \\begin{bmatrix} 0 & \\frac{(\\mathbf{r}_k - \\boldsymbol{\\ell}^{(i)})^T}{||(\\mathbf{r}_k - \\boldsymbol{\\ell}^{(i)})||} \\end{bmatrix},\n", + "$$\n", + "\n", + "and we can implement this in navlie by again overriding the `jacobian()` method in our measurement model. Adding this to our measurement model from before:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Analyical:\n", + "[[0. 0.70710678 0.70710678]]\n", + "\n", + "Finite difference:\n", + "[[0. 0.70710696 0.70710696]]\n" + ] + } + ], + "source": [ + "class RangeToLandmark(nav.MeasurementModel):\n", + " def __init__(self, landmark_position: np.ndarray):\n", + " self.landmark_position = landmark_position\n", + "\n", + " def evaluate(self, x: VectorState) -> np.ndarray:\n", + " return np.linalg.norm(x.value[1:] - self.landmark_position)\n", + " \n", + " def covariance(self, x: VectorState) -> np.ndarray:\n", + " return 0.1**2\n", + " \n", + " def jacobian(self, x: VectorState) -> np.ndarray:\n", + " G = np.zeros((1, 3))\n", + " r = x.value[1:]\n", + " G[0,1:] = (r - self.landmark_position) / np.linalg.norm(r - self.landmark_position)\n", + " return G\n", + " \n", + "meas_model = RangeToLandmark(np.array([1, 2]))\n", + "\n", + "print(\"\\nAnalyical:\")\n", + "print(meas_model.jacobian(x))\n", + "\n", + "print(\"\\nFinite difference:\")\n", + "print(meas_model.jacobian_fd(x))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can again see that the results match nicely." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Jacobians - Lie Group Approach \n", + "\n", + "Now, lets see how to implement analytical Jacobians when states belong to Lie groups. In the previous example the state was $\\mathbf{T} \\in SE(2)$ and the process model was\n", + "\n", + "$$\n", + "\\mathbf{T}_{k+1} = \\mathbf{T}_k \\exp(\\boldsymbol{\\varpi}^\\wedge_k \\Delta t).\n", + "$$\n", + "\n", + "To derive the Jacobian, we can \"perturb\" both sides of the equation and manipulate. This is a common technique for deriving Lie Jacobians, and for computing matrix-vector derivatives in general. For more details, we recommend reading [State Estimation for Robotics by Tim Barfoot](http://asrl.utias.utoronto.ca/~tdb/bib/barfoot_ser17.pdf).\n", + "\n", + "$$ \n", + "\\begin{aligned}\n", + "\\mathbf{T}_{k+1} &= \\mathbf{T}_k \\exp(\\boldsymbol{\\varpi}^\\wedge_k \\Delta t) \\\\\n", + "\\bar{\\mathbf{T}}_{k+1} \\exp(\\delta \\boldsymbol{\\xi}_{k+1}^\\wedge) &= \\bar{\\mathbf{T}}_{k} \\exp(\\delta \\boldsymbol{\\xi}_{k}^\\wedge) \\exp(\\boldsymbol{\\varpi}^\\wedge_k \\Delta t) \\\\\n", + " \\exp(\\delta \\boldsymbol{\\xi}_{k+1}^\\wedge) &= \\underbrace{\\bar{\\mathbf{T}}_{k+1}^{-1} \\bar{\\mathbf{T}}_{k}}_{\\exp(\\boldsymbol{\\varpi}^\\wedge \\Delta t)^{-1}} \\exp(\\delta \\boldsymbol{\\xi}_{k}^\\wedge) \\exp(\\boldsymbol{\\varpi}^\\wedge_k \\Delta t) \\\\\n", + " \\exp(\\delta \\boldsymbol{\\xi}_{k+1}^\\wedge) &= \\exp((\\mathbf{Ad}(\\exp(\\boldsymbol{\\varpi}^\\wedge \\Delta t)^{-1}) \\delta \\boldsymbol{\\xi}_{k})^\\wedge) \\\\\n", + " \\delta \\boldsymbol{\\xi}_{k+1} &= \\underbrace{\\mathbf{Ad}(\\exp(\\boldsymbol{\\varpi}^\\wedge \\Delta t)^{-1})}_{\\mathbf{F}} \\delta \\boldsymbol{\\xi}_{k}\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "There, we used the _adjoint matrix_ $\\mathbf{Ad}(\\cdot)$, to invoke the identity $\\mathbf{X}^{-1} \\exp(\\boldsymbol{\\xi}^\\wedge) \\mathbf{X} = \\exp(\\mathbf{Ad}(\\mathbf{X}) \\boldsymbol{\\xi}^\\wedge)$, which is true for any $\\mathbf{X} \\in SE(2)$. The adjoint matrix for $SE(2)$ is given by \n", + "\n", + "$$ \n", + "\\mathbf{Ad}(\\mathbf{T}) = \\begin{bmatrix} 1 & \\mathbf{0} \\\\ - \\boldsymbol{\\Omega} \\mathbf{r} & \\mathbf{C} \\end{bmatrix}\n", + "$$\n", + "\n", + "where $\\boldsymbol{\\Omega} = \\begin{bmatrix} 0 & -1 \\\\ 1 \n", + "&0 \\end{bmatrix}$.\n", + "\n", + "
\n", + "Note: in this Jacobian derivation, we perturbed the state $\\mathbf{T} = \\bar{\\mathbf{T}} \\exp(\\delta \\boldsymbol{\\xi}^\\wedge)$ \"on the right\" because that corresponds to what was implemented in the `plus()` method of our `SE2State` class. It is important to be consistent here for everything to work.\n", + "
\n", + "\n", + "Now, we can implement this Jacobian in navlie by overriding the `jacobian()` method in our process model. Adding this to our process model from before:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Analyical:\n", + "[[ 1. 0. 0. ]\n", + " [ 0.0394695 0.92106099 0.38941834]\n", + " [ 0.19470917 -0.38941834 0.92106099]]\n", + "\n", + "Finite difference:\n", + "[[ 1.00000000e+00 -1.10747782e-11 -1.10747782e-11]\n", + " [ 3.94695038e-02 9.21060995e-01 3.89418343e-01]\n", + " [ 1.94709171e-01 -3.89418342e-01 9.21060994e-01]]\n" + ] + } + ], + "source": [ + "from navlie.lib import SE2State, VectorInput\n", + "from scipy.linalg import expm\n", + "\n", + "\n", + "def wedge_se2(x:np):\n", + " return np.array([[ 0, -x[0], x[1]],\n", + " [x[0], 0, x[2]], \n", + " [ 0, 0, 0]])\n", + "\n", + "def adjoint_se2(T:np.ndarray):\n", + " C = T[:2, :2]\n", + " r = T[:2, 2]\n", + " Omega = np.array([[0, -1], [1, 0]])\n", + " Ad = np.zeros((3,3))\n", + " Ad[0,0] = 1\n", + " Ad[1:,1:] = C\n", + " Ad[1:,0] = - Omega @ r\n", + " return Ad\n", + "\n", + "\n", + "class WheeledRobotSE2(nav.ProcessModel):\n", + " def __init__(self, input_covariance_matrix):\n", + " self.Q = input_covariance_matrix\n", + "\n", + " def evaluate(self, x:SE2State, u:VectorInput, dt:float):\n", + " u = np.array([u.value[0], u.value[1], 0])\n", + " x_next = x.copy()\n", + " x_next.value = x.value @ expm(wedge_se2(u * dt))\n", + " return x_next\n", + " def input_covariance(self, x:SE2State, u:VectorInput, dt:float):\n", + " return self.Q\n", + "\n", + " def jacobian(self, x:SE2State, u:VectorInput, dt:float):\n", + " u = np.array([u.value[0], u.value[1], 0])\n", + " return adjoint_se2(expm(-wedge_se2(u * dt)))\n", + "\n", + "Q = np.eye(2) * 0.1**2\n", + "process_model = WheeledRobotSE2(Q)\n", + "x = SE2State(expm(wedge_se2(np.array([1,2,3]))))\n", + "u = VectorInput([4, 2])\n", + "dt = 0.1\n", + "\n", + "print(\"\\nAnalyical:\")\n", + "print(process_model.jacobian(x, u, dt))\n", + "\n", + "print(\"\\nFinite difference:\")\n", + "print(process_model.jacobian_fd(x, u, dt))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that when using Lie groups, our Jacobian no longer has dependence on the state itself. This can be a tangible advantage when the state estimate has high uncertainty, where using a traditional approach can result in excessive linearization errors when the state estimate is far from the true value." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.16" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_build/html/_sources/tutorial/lie_groups.ipynb.txt b/_build/html/_sources/tutorial/lie_groups.ipynb.txt new file mode 100644 index 00000000..fd96344d --- /dev/null +++ b/_build/html/_sources/tutorial/lie_groups.ipynb.txt @@ -0,0 +1,425 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Toy Problem - Lie group approach\n", + "\n", + "![Toy Problem](../toy_problem.png)\n", + "\n", + "Another way we could approach the same state estimation task is to instead use Lie group theory, which is becoming increasingly common practice in state estimation. Lie group theory can be very abstract, and the main references that navlie refer to are the following:\n", + "\n", + "1. [A micro Lie theory for state estimation in robotics](https://arxiv.org/abs/1812.01537)\n", + "2. [T.Barfoot, State Estimation for Robotics](http://asrl.utias.utoronto.ca/~tdb/bib/barfoot_ser17.pdf)\n", + "\n", + "\n", + "## Define the State\n", + "Instead of representing the state using a vector, we will represent the state using an element of the *special Euclidean group* $SE(2)$, sometimes called *pose transformation matrices*. Elements of this group are 3x3 matrices of the form \n", + "\n", + "$$ \n", + "\\mathbf{T} = \\begin{bmatrix} \\mathbf{C}_{ab}(\\theta) & \\mathbf{r}_a \\\\ \\mathbf{0} & 1 \\end{bmatrix} \\in SE(2)\n", + "$$\n", + "\n", + "where $\\mathbf{r}_a = [x,y]^T$ again denotes the position of the robot and $\\mathbf{C}_{ab}(\\theta) \\in SO(2)$ is a rotation matrix (sometimes called a direction cosine matrix) with the form \n", + "\n", + "$$ \n", + "\\mathbf{C}_{ab}(\\theta) = \\begin{bmatrix} \\cos \\theta & - \\sin \\theta \\\\ \\sin \\theta & \\cos \\theta \\end{bmatrix}.\n", + "$$\n", + "\n", + "The rotation matrix transforms vectors resolved in one frame to another frame, i.e. $\\mathbf{r}_a = \\mathbf{C}_{ab} \\mathbf{r}_b$. Unlike vectors, elements of $SO(2)$ or $SE(2)$ cannot be added together to produce another valid element of $SE(2)$, but they can be multiplied together with the result still having the same form.\n", + "\n", + "$$\n", + "\\mathbf{T}_1 \\mathbf{T}_2 \\in SE(2)\n", + "$$\n", + "\n", + " To proceed further with our mathematical setup, we need to define a few very common operators seen in Lie group theory. The first two are the \"wedge\" $(\\cdot)^\\wedge$ and \"vee\" $(\\cdot)^\\vee$ operators, which for this specific group has the form\n", + "\n", + "$$ \n", + "\\begin{bmatrix} \\theta \\\\ x \\\\ y \\end{bmatrix}^\\wedge = \\begin{bmatrix} 0 & -\\theta & x \\\\ \\theta & 0 & y \\\\ 0 & 0 & 0 \\end{bmatrix}\n", + "$$\n", + "\n", + "and the $(\\cdot)^\\vee$ operator simply does the exact inverse of $(\\cdot)^\\wedge$. We can implement them as follows.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "%reset -f\n", + "import numpy as np\n", + "\n", + "# Helper functions for SE(2)\n", + "def wedge_se2(x):\n", + " return np.array([[ 0, -x[0], x[1]],\n", + " [x[0], 0, x[2]], \n", + " [ 0, 0, 0]])\n", + "\n", + "def vee_se2(X):\n", + " return np.array([X[1, 0], X[0, 2], X[1, 2]])\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Two other fundamental relationships appearing in Lie group theory are the exponential (denoted $\\exp$) and logarithmic (denoted $\\log$) maps. While these have a deeper definition, for our case it suffices to think of them as simply the [matrix exponential](https://en.wikipedia.org/wiki/Matrix_exponential) and [matrix logarithm](https://en.wikipedia.org/wiki/Logarithm_of_a_matrix). Using the wedge and vee operators for $SE(2)$ defined above, we can convert a 3x1 vector to an $SE(2)$ element and back as follows" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "An element of SE2:\n", + "[[ 0.99500417 -0.09983342 0.18467933]\n", + " [ 0.09983342 0.99500417 0.30949192]\n", + " [ 0. 0. 1. ]]\n", + "\n", + "The original vector 'representing' it:\n", + "[0.1 0.2 0.3]\n" + ] + } + ], + "source": [ + "from scipy.linalg import expm, logm\n", + "\n", + "T = expm(wedge_se2(np.array([0.1, 0.2, 0.3])))\n", + "print(\"An element of SE2:\")\n", + "print(T)\n", + "\n", + "x = vee_se2(logm(T))\n", + "print(\"\\nThe original vector 'representing' it:\")\n", + "print(x)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now have the tools we need to abstract-ify our problem a little bit. As commonly seen in the literature, we can define the so-called \"oplus\" and \"ominus\" operators as follows (sometimes called \"boxplus\" $\\boxplus$ and \"boxminus\" $\\boxminus$):\n", + "\n", + "$$\n", + "\\begin{aligned}\n", + "\\mathbf{T}_2 &= \\mathbf{T}_1 \\oplus \\boldsymbol{\\xi} := \\mathbf{T}_1 \\exp(\\boldsymbol{\\xi}^\\wedge) \\\\\n", + "\\boldsymbol{\\varepsilon} &= \\mathbf{T}_2 \\ominus \\mathbf{T}_1 := \\log(\\mathbf{T}_2^{-1} \\mathbf{T}_1)^\\vee\n", + "\\end{aligned}\n", + "$$ \n", + "\n", + "Here, both $\\boldsymbol{\\varepsilon}, \\boldsymbol{\\xi} \\in \\mathbb{R}^3$ are 3x1 vectors. The $\\oplus: SE(2) \\times \\mathbb{R}^3 \\to SE(2)$ operator \"adds\" a vector to an $SE(2)$ element to produce another $SE(2)$ element, and the $\\ominus:SE(2) \\times SE(2) \\to \\mathbb{R}^3$ operator \"subtracts\" two $SE(2)$ elements to produce a vector that represents the \"difference\" between them. \n", + "\n", + "\n", + "With this context, lets implement an $SE(2)$ state inside navlie's framework. To define a custom state, you must subclass the `nav.State` abstract class and you *must* implement the `plus`, `minus`, and `copy` methods. These methods play exactly the role of $\\oplus$ and $\\ominus$ described above, while the `copy` method is used to create a deep copy of that state object. In addition, state objects must hold an integer property named `dof` that specifies the *degrees of freedom* associated with that state. For $SE(2)$, this is 3." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "SE2State(stamp=0.0, dof=3, state_id=None)\n", + " [[1. 0. 0.]\n", + " [0. 1. 0.]\n", + " [0. 0. 1.]]\n" + ] + } + ], + "source": [ + "import navlie as nav\n", + "\n", + "class SE2State(nav.State):\n", + " def __init__(self, value :np.ndarray, stamp: float):\n", + " super().__init__(value=value, dof=3, stamp=stamp)\n", + "\n", + " def plus(self, dx: np.ndarray):\n", + " new_value = self.value @ expm(wedge_se2(dx))\n", + " return SE2State(new_value, self.stamp)\n", + "\n", + " def minus(self, other: \"SE2State\"):\n", + " other_inv = np.linalg.inv(other.value)\n", + " return vee_se2(logm(other_inv @ self.value))\n", + " \n", + " def copy(self):\n", + " return SE2State(self.value.copy(), self.stamp)\n", + "\n", + "x = SE2State(np.eye(3), 0.0)\n", + "print(x)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Define the Process Model\n", + "\n", + "Now, we must adapt the process model to work with our new `SE2State`. It is well known that the rotational kinematics can be written directly in terms of rotation matrices using \n", + "\n", + "$$ \n", + "\\dot{\\mathbf{C}}_{ab} = \\mathbf{C}_{ab}\\begin{bmatrix}0 & -\\omega \\\\ \\omega & 0 \\end{bmatrix} \n", + "$$\n", + "\n", + "and that the translational kinematics can be written in vector form using \n", + "\n", + "$$ \n", + "\\dot{\\mathbf{r}}_a = \\mathbf{C}_{ab} \\begin{bmatrix} v \\\\ 0 \\end{bmatrix} .\n", + "$$\n", + "\n", + "By stacking these into matrices it follows that \n", + "$$ \n", + "\\dot{\\mathbf{T}} = \\mathbf{T} \\boldsymbol{\\varpi}^\\wedge\n", + "$$\n", + "\n", + "where $\\boldsymbol{\\varpi} = [\\omega, v, 0]^T$. This equation is now a linear, matrix-valued ODE, and can be integrated exactly over a short duration $\\Delta t = t_{k+1} - t_k$ using the matrix exponential. This gives us the following discrete-time process model:\n", + "\n", + "$$\n", + "\\mathbf{T}_{k+1} = \\mathbf{T}_k \\exp(\\boldsymbol{\\varpi}_k^\\wedge \\Delta t)\n", + "$$\n", + "\n", + "which we can implement as follows" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "class WheeledRobotSE2(nav.ProcessModel):\n", + " def __init__(self, input_covariance_matrix):\n", + " self.Q = input_covariance_matrix\n", + "\n", + " def evaluate(self, x:SE2State, u:nav.lib.VectorInput, dt:float):\n", + " vel = np.array([u.value[0], u.value[1], 0])\n", + " x_next = x.copy()\n", + " x_next.value = x.value @ expm(wedge_se2(vel * dt))\n", + " return x_next\n", + " \n", + " def input_covariance(self, x:SE2State, u:nav.lib.VectorInput, dt:float):\n", + " return self.Q\n", + "\n", + "Q = np.eye(2) * 0.1**2\n", + "process_model = WheeledRobotSE2(Q)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Define the Measurement Model\n", + "\n", + "Finally, our measurement model remains largely unchanged. We just need to extract the position from an `SE2State` object now, as done below." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "class RangeToLandmarkSE2(nav.MeasurementModel):\n", + " def __init__(\n", + " self,\n", + " landmark_position: np.ndarray,\n", + " measurement_covariance: float,\n", + " ):\n", + " self.landmark_position = landmark_position\n", + " self.R = measurement_covariance\n", + "\n", + " def evaluate(self, x: SE2State):\n", + " pos = x.value[0:2, 2]\n", + " return np.linalg.norm(pos - self.landmark_position)\n", + "\n", + " def covariance(self, x: SE2State):\n", + " return self.R\n", + " \n", + "\n", + "landmarks = np.array([[1, 1], [1, 2], [2, 2], [2, 1]])\n", + "meas_models = [RangeToLandmarkSE2(landmark, 0.1**2) for landmark in landmarks]" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run the Filter!\n", + "\n", + "And that's it! All remaining snippets are now _literally_ copy-pasted from our previous approach with zero modifications. Using the abstraction framework in navlie, we can easily switch between different state representations and process/measurement models without having to change any of data generation or filtering code. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "SE2State(stamp=0.02, dof=3, state_id=None)\n", + " [[ 9.99950000e-01 -9.99983333e-03 5.99990000e-03]\n", + " [ 9.99983333e-03 9.99950000e-01 2.99997500e-05]\n", + " [ 0.00000000e+00 0.00000000e+00 1.00000000e+00]]\n", + "VectorInput(stamp=0.04, state_id=None)\n", + " [0.52438924 0.40056502]\n", + "Measurement(stamp=0.0, state_id=None) of PoseRangeToLandMark\n", + " 2.299276237837416\n" + ] + } + ], + "source": [ + "dg = nav.DataGenerator(\n", + " process_model=process_model, # process model to use\n", + " input_func=lambda t, x: np.array([0.5, 0.3]), # a callable that specifies the input values over time\n", + " input_covariance= Q, # numpy array or callable that specifies the input covariance over time\n", + " input_freq=50, # the frequency (Hz) at which the input is sampled (and the process model integrated)\n", + " meas_model_list=meas_models, # a list of measurement models to use\n", + " meas_freq_list=[10, 10, 10, 10] # corresponding measurement frequencies (Hz)\n", + ")\n", + "\n", + "state_data, input_data, meas_data = dg.generate(x, start=0, stop=30, noise=True)\n", + "\n", + "print(state_data[1])\n", + "print(input_data[2])\n", + "print(meas_data[3])" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# First, define the filter\n", + "kalman_filter = nav.ExtendedKalmanFilter(process_model)\n", + "P0 = np.diag([0.1**2, 1**2, 1**2]) # Initial covariance\n", + "x = nav.StateWithCovariance(x, P0) # Estimate and covariance in one container\n", + "\n", + "meas_idx = 0\n", + "y = meas_data[meas_idx]\n", + "estimates = []\n", + "for k in range(len(input_data) - 1):\n", + " u = input_data[k]\n", + "\n", + " # Fuse any measurements that have occurred.\n", + " while y.stamp < input_data[k + 1].stamp and meas_idx < len(meas_data):\n", + " x = kalman_filter.correct(x, y, u)\n", + "\n", + " # Load the next measurement\n", + " meas_idx += 1\n", + " if meas_idx < len(meas_data):\n", + " y = meas_data[meas_idx]\n", + "\n", + " # Predict until the next input is available\n", + " dt = input_data[k + 1].stamp - x.state.stamp\n", + " x = kalman_filter.predict(x, u, dt)\n", + "\n", + " estimates.append(x.copy())\n", + "\n", + "\n", + "results = nav.GaussianResultList.from_estimates(estimates, state_data)\n", + "\n", + "import matplotlib.pyplot as plt\n", + "fig, axs = nav.plot_error(results)\n", + "axs[0].set_title(\"Estimation Errors\")\n", + "axs[0].set_ylabel(\"theta (rad)\")\n", + "axs[1].set_ylabel(\"x (m)\")\n", + "axs[2].set_ylabel(\"y (m)\")\n", + "axs[2].set_xlabel(\"Time (s)\")\n", + "\n", + "fig, ax = nav.plot_nees(results)\n", + "ax.set_title(\"NEES\")\n", + "ax.set_xlabel(\"Time (s)\")\n", + "plt.show()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Built-in Lie group states \n", + "While we implemented our own `SE2State` from scratch here for pedagogical purposes, navlie comes with many built-in Lie group states that you can use out of the box. Some of the built-in Lie group states include:\n", + "\n", + "- `nav.lib.SO2State`: representing 2D rotations using, beloning to the group $SO(2)$\n", + "- `nav.lib.SO3State`: representing 3D rotations using, beloning to the group $SO(3)$\n", + "- `nav.lib.SE2State`: representing 2D poses using, beloning to the group $SE(2)$\n", + "- `nav.lib.SE3State`: representing 3D poses using, beloning to the group $SE(3)$\n", + "- `nav.lib.SE23State`: representing \"extended\" poses that also contain velocity information, belonging to the group $SE_2(3)$\n", + "- `nav.lib.SL3State`: representing 3D homographies, belonging to the group $SL(3)$\n", + "\n", + "Each of these classes stores the value as a square numpy array in the `x.value` property. Moreover, closed-form formulas for the exponential and logarithmic maps have been implemented for each of these states, which is faster than using `scipy.linalg.expm` and `scipy.linalg.logm`. These underlying operations have even been implemented in C++ for maximum speed. " + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.16" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_build/html/_sources/tutorial/traditional.ipynb.txt b/_build/html/_sources/tutorial/traditional.ipynb.txt new file mode 100644 index 00000000..f18bd608 --- /dev/null +++ b/_build/html/_sources/tutorial/traditional.ipynb.txt @@ -0,0 +1,393 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Toy Problem - Traditional Approach\n", + "\n", + "In this tutorial, we'll simulate a simple 2D localization problem as per the figure below. We'll assume that we have a robot following a simple body-frame-velocity model, which has access to noisy measurements of its forward velocity $v$ and angular velocity $\\omega$. In addition, this robot will have a time-of-flight sensor that gives it range measurements to a few known landmarks in the environment. \n", + "\n", + "![Toy Problem](../toy_problem.png)\n", + "\n", + "\n", + "## Define the State\n", + "The first step is to define the state of the robot. We'll start with a more traditional approach and define the state of the robot to be a vector of the form $\\mathbf{x} = [\\theta, x, y ]^T$, where $x$ and $y$ are the robot's position in the world and $\\theta$ is its orientation. We'll also define the control inputs to be $\\mathbf{u} = [\\omega, v]^T$, the robot's forward and angular velocity. The process (motion) model of the robot is then given by:\n", + "\n", + "$$\n", + "\\begin{aligned}\n", + " \\dot{\\theta} &= \\omega,\\\\\n", + " \\dot{x} &= v \\cos(\\theta), \\\\\n", + " \\dot{y} &= v \\sin(\\theta). \n", + "\\end{aligned}\n", + "$$\n", + "\n", + "However, this is in continuous time, and we need to discretize it to use it in a filter. For now, we'll use the simple Euler discretization method, which gives us the following discrete-time process model:\n", + "\n", + "$$\n", + "\\begin{aligned}\n", + " \\theta_{k+1} &= \\theta_k + \\omega_k \\Delta t, \\\\\n", + " x_{k+1} &= x_k + v_k \\cos(\\theta_k) \\Delta t, \\\\\n", + " y_{k+1} &= y_k + v_k \\sin(\\theta_k) \\Delta t.\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "Lets now code up our state and process model using navlie's framework. Since our state is just a regular 3x1 vector, we can use a standard type from the built-in library: [navlie.lib.VectorState](../_autosummary/navlie.lib.states.VectorState.rst)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "VectorState(stamp=0.0, dof=3, state_id=None)\n", + " [0. 0. 0.]\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "np.random.seed(0)\n", + "import navlie as nav\n", + "from navlie.lib import VectorState\n", + "\n", + "x = VectorState([0, 0, 0], stamp=0.0)\n", + "print(x)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `VectorState` is a subclass of the abstract [State](../_autosummary/navlie.types.State.rst) class in navlie, which is one of the core primitive types. The value of the state is stored as a numpy array, and can be accessed directly through `x.value`. \n", + "\n", + "\n", + "## Define the Process Model\n", + "For the process model, we'll choose to define our own from scratch here. Process models in navlie *must* inherit from the abstract [navlie.ProcessModel](../_autosummary/navlie.types.ProcessModel.rst) class and implement the `evaluate` and either the `input_covariance` or `covariance` methods." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from navlie.lib import VectorInput\n", + "\n", + "Q = np.eye(2) * 0.1**2 # Input noise covariance with 0.1 m/s of standard deviation\n", + "\n", + "class WheeledRobot(nav.ProcessModel):\n", + " def __init__(self, input_covariance):\n", + " self.Q = input_covariance\n", + "\n", + " def evaluate(self, x: VectorState, u: VectorInput, dt: float) -> VectorState:\n", + " x_next = x.copy()\n", + " x_next.value[0] += u.value[0] * dt\n", + " x_next.value[1] += u.value[1] * dt * np.cos(x.value[0])\n", + " x_next.value[2] += u.value[1] * dt * np.sin(x.value[0])\n", + " return x_next\n", + "\n", + " def input_covariance(self, x: VectorState, u: VectorInput, dt: float) -> np.ndarray:\n", + " return self.Q\n", + " \n", + "process_model = WheeledRobot(Q) # instantiate it" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The methods in navlie process models must always accept the arguments shown above: a `State` object, an `Input` object, and a float `dt`. The `evaluate` method must always return a valid (i.e. subclass of a) `State` object, and the `input_covariance` method must always return a square numpy array. There are more optional methods that can be implemented for performance reasons, but we will cover those later.\n", + "\n", + "## Define the Measurement Model(s)\n", + "Moving on to the measurement model, if $\\mathbf{r}_a = [x,y]^T$ denotes the position vector of the robot resolved in the world frame, and $\\mathbf{\\ell}^{(i)}_{a} \\in \\mathbb{R}^2$ is the 2 x 1 position vector of landmark $i$, then the measurement model for each landmark is simply \n", + "\n", + "$$ \n", + "y_i = ||\\mathbf{r}_a - \\mathbf{\\ell}^{(i)}_{a}||\n", + "$$\n", + "\n", + "In navlie, measurement models must be implemented in a similar way to process models: inherit from the [navlie.MeasurementModel](../_autosummary/navlie.types.MeasurementModel.rst) abstract class, and then implement the `evaluate` and `covariance` methods. Here's an example for this problem:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "class RangeToLandmark(nav.MeasurementModel):\n", + " def __init__(self, landmark_position: np.ndarray):\n", + " self.landmark_position = landmark_position\n", + "\n", + " def evaluate(self, x: VectorState) -> np.ndarray:\n", + " return np.linalg.norm(x.value[1:] - self.landmark_position)\n", + " \n", + " def covariance(self, x: VectorState) -> np.ndarray:\n", + " return 0.1**2\n", + " \n", + "landmarks = np.array([[1, 1], [1, 2], [2, 2], [2, 1]])\n", + "meas_models = [RangeToLandmark(landmark) for landmark in landmarks]" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## (Simulation only) Generate fake data\n", + "\n", + "The next step is to generate some fake data for our simulation (although navlie is also compatible with real data). To do this, we will use the [DataGenerator](../_autosummary/navlie.datagen.DataGenerator.rst) class which is used as follows" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "VectorState(stamp=0.0, dof=3, state_id=None)\n", + " [0. 0. 0.]\n", + "VectorInput(stamp=0.0, state_id=None)\n", + " [0.4867558 0.40227221]\n", + "Measurement(stamp=0.0, state_id=None) of RangeToLandmark\n", + " 1.5906187969698615\n" + ] + } + ], + "source": [ + "dg = nav.DataGenerator(\n", + " process_model=process_model, # process model to use\n", + " input_func=lambda t, x: np.array([0.3, 0.5]), # a callable that specifies the input values over time\n", + " input_covariance= Q, # numpy array or callable that specifies the input covariance over time\n", + " input_freq=50, # the frequency (Hz) at which the input is sampled (and the process model integrated)\n", + " meas_model_list=meas_models, # a list of measurement models to use\n", + " meas_freq_list=[10, 10, 10, 10] # corresponding measurement frequencies (Hz)\n", + ")\n", + "\n", + "state_data, input_data, meas_data = dg.generate(x, start=0, stop=30, noise=True)\n", + "\n", + "print(state_data[0])\n", + "print(input_data[0])\n", + "print(meas_data[0])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The output of the `DataGenerator.generate` method is three lists: a list of ground-truth `State` objects, a list of `Input` objects, and a list of [Measurement](../_autosummary/navlie.types.Measurement.rst) objects, with the input/measurement lists possibly being corrupted by random noise if the `noise=True` flag is set. Each item in these lists correspond to different points in time. We can plot the trajectory as follows" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAA440lEQVR4nO3deXhU5dnH8e+dPSGEEJKwhEBYBQKyhR0FxQVKBdyKS1W01bqgrVqRVl+lvqW11dcqtbaKWneLK4oguFBUBJSw74JsSQiQBEhCFrLd7x8zxAAhAcnkzHJ/rmuua84yZ34Py9znnOec84iqYowxJnAFOR3AGGOMs6wQGGNMgLNCYIwxAc4KgTHGBDgrBMYYE+CsEBhjTICzQmAanYhcKyKfeGjbL4nIHz2x7Vq+a5KILG6E7zksIh09/T0mcFkhMB4hIsNFZImI5IvIARH5WkQGAKjq66p6kRdkXCQiv/TAds9x/3gfFpEiEdEa04dFpN3pbE9Vo1V1+xlm8khbjX8IcTqA8T8iEgN8BNwGvAWEAecAR5zM1VhU9SsgGkBEUoAdQKyqVhy/roiE1Dbfm4iIAKKqVU5nMZ5hRwTGE7oCqOqbqlqpqiWq+omqroUTT6m495hvF5GtIlIoIv8rIp3cRxQFIvKWiITV9tkan+98fAgRaS4iH4lIjogcdL9v6142HVdxetq9l/60e343EfnUfRSzRUR+VmN7LUTkQ3emb4FOp/sHIyLTROQdEXlNRAqASSIyUESWisghEckWkaePtvf49olIuIg8LiK7RWSfiPxLRCJrrDteRFa7M34vIqPraOtQEVnuPmpbLiJDa2xnkYhMF5GvgWLgXhFZcVxb7hGRD073z8B4IVW1l70a9AXEAHnAy8AYoPlxyycBi2tMK/CB+3OpuI4cPgc6As2AjcANtX22xuc7u9+/BPzR/b4FcDkQBTQF3gZm1/jcIuCXNaabABnAjbiOlvsCuUAP9/L/4DrCaQL0BLKOz1LLn0WKO1+Ie3oaUA5MwLUjFgn0Bwa7vzMF2AT85iTt+xvwIRDnbtMc4M/uZQOBfOBC97aTgG4naWsccBC4zv29V7unW9RYf7f77yMECAcOAN1rbGMVcLnT/97sdeYvOyIwDU5VC4DhuH7AZgI57j3plnV87K+qWqCqG4D1wCequl1V84GPcf0on26OPFV9V1WLVbUQmA6MqOMjPwV2quq/VbVCVVcB7wJXikgwrqLykKoWqep6XIXux1iqqrNVtUpdR0srVHWZ+zt3As/WltN9iuYW4G5VPeBu05+Aq9yr/AJ4UVU/dW87S1U3nyTDWGCrqr7q/t43gc3AJTXWeUlVN7iXHwFmAT93Z0nFVbQ++pF/BsaLWCEwHqGqm1R1kqq2xbX33AZ4so6P7KvxvqSW6ejTzSAiUSLyrIjscp+G+RKIdf+o16Y9MMh9iuaQiBwCrgVaAQm49owzaqy/63QzudXcBiLS1X3aaq8755+A+Fo+l4Dr6GZFjXzz3fMBkoHvTzFDG07MvwvXUUStOXEVvmvcBek64C13gTA+zgqB8Tj3XulLuArCmSrC9WMIgIi0qmPde4GzgEGqGgOce/RjR6Mdt34G8IWqxtZ4RavqbUAOUIHrx/ao07r6p4bjv/efuPbGu7hz/r5GxppycRXF1Br5mqnq0SKZwcn7LY7/zj24Cl9N7XCd7qr1M6q6DCjD1d9wDfDqSb7L+BgrBKbBuTtc763RMZuM6xz0sgbY/BogVUT6iEgErnPuJ9MU1w/nIRGJAx4+bvk+XP0QR30EdBWR60Qk1P0aICLdVbUSeA+Y5j7S6AHc0ADtOZqzADgsIt1wXW11AnVdtTMT+JuIJAKISJKIXOxe5QXgRhEZJSJB7mXdTtLWee62XiMiISIyEehB/ad6XgGeBspV1eP3UJjGYYXAeEIhMAj4RkSKcBWA9bj20M+Iqn4HPAJ8BmwF6voxehJXZ2yuO8P845Y/BVzhvqJohvuc+0W4zrnvAfYCf8HVUQowGdcpqr24jnD+fabtcfstrj3sQlw/9LPqWPd+YBuwzH0a6TNcRz2o6re4Orr/hqvT+At+2Os/vq15uPpE7sXVsT8F+Kmq5taT9VVcR3avnW4jjfcSVRuYxhhvJSJBQCXQXlV3e0GeSGA/0E9VtzqdxzQMOyIwxrv1BEpxHYV4g9uA5VYE/IvdWWyMlxKRy4HngPtVtcwL8uzE1Yk9wdkkpqHZqSFjjAlwdmrIGGMCnM+dGoqPj9eUlBSnYxhjjE9ZsWJFrqom1LbM5wpBSkoK6enpTscwxhifIiInvRPeTg0ZY0yAs0JgjDEBzgqBMcYEOCsExhgT4KwQGGNMgLNCYIwxAc4KgTHGBDifu4/AmIZUUlbJ/sJScgqPUFBaTtGRSorLKig6UklJeSXHP4IlKEhoEhZCVFgw0eEhRIWH0CwylMSm4SQ0DSc02PatjO+xQmD8WmWVsiuviB25rtfOvCJ25RWTdbCE/YVHOHykokG/L65JGIlNw2nbPIoO8VF0iI8mJT6KTgnRJDYNxzXKozHexQqB8RuVVcrmvQWsz8pnfVYBG/bksym7kJLyyup1YiJC6BDfhO5tYhjh3otPbBpBQtNwmkWG0iQsmKjwEJqEBRMZFkzQcT/cFZVafcRQVFZB0ZEKDhaXVx9V7C88wv6CUnYfKOLLrTmUVVRVf7ZFkzBSk5qR2iaGnm2a0Tu5GW2bR2GM06wQGJ9VUVnF+j0FfLM9j292HGD5zgMUlrr28KPDQ+jRJoarB7aje+umdEyIpkN8E5pHhZ7RXnloMESGBdMiuv51q6qU7IJSduYWsW3/YTbuKWD9nnye/2o75ZWuU05JsZEM6hDHwA5xDOrYgpQWUXbUYBqdFQLjUw4WlfHFdzl8vnk/X2zZT4H7h79jfBN+enZrBnaIo09yc9rHRREU5OwPalCQkBQbSVJsJMM6x1fPP1JRyXd7D7Ny90G+2ZHHl1tzeG+Va8z45LhIRnVryfndEhnUMY7wkGCn4psA4nPjEaSlpak9dC6w5BQeYe7aPcxdl82KXQepUoiPDmPkWYmM6JrAoI5xJDaNcDrmj6aqfJ9TxNLteSzavJ/F23I5UlFFVFgwI7omcEnvNpzfLZGIUCsK5scTkRWqmlbrMisExhsVlpbz8fq9zFmzh6+35VKl0K1VUy7q0ZLzu7fk7KRmju/xe0pJWSVLt+eycPN+FmzYR07hEaLDQ7gotSXj+yQxrFMLQuzqJHOarBAYn7E28xCvL9vNh2v2UFJeSXJcJON7JzGuTxu6tmzqdLxGV1mlLNuex4er9zBvfTaFpRW0iongqoHJTByQTOtmkU5HND7CCoHxaqXllcxelcVr3+xifVYBkaHBjOvdhokDk+mbHGudp25HKir57+b9vPltBl9uzUGAUd1b8vPB7Tm3S7z9OZk6WSEwXulQcRmvLdvFS0t2knu4jG6tmnLNoHZM6JtETESo0/G82u68Yt5cvpu30zPIPVxGUmwk7eKieGFSGlFhdg2IOZEVAuNV9hWU8uwX2/nP8t0Ul1Uy8qwEbjm3I0M6trC92tNUVlHFB6uzuO+dtdXz2sVFMWfycJpFWTE1P7BCYLzCgaIy/rloG68s3UVllTKudxtuPrcj3VvHOB3N51VVKY98tJGXluysntejdQzv3DbEjhAMYIXAOKygtJznv9zOC4t3UFJeyaV92/KbC7qQHGd31XrCE59+x4zPt1ZPD+8cz0s3DrArjQKcFQLjiKoq5e0VGTy2YAu5h8sY26s1d1/Yhc6JgXf1T2NTVaZ9uIGXl/4wXvnvxnTjVyM6OZjKOMkKgWl0K3YdYNqHG1mXlU//9s2Zdkkqvdo2czpWwKmsUm5+JZ2Fm/dXz3v/9qH0bdfcwVTGCVYITKM5VFzGH+du4p0VmbSMCef3P+nOuN5trBPYYbmHj5D2x8+qp1vFRPDllPMIC7HTRYHCCoFpFPPWZfPQB+s5VFzOzed2ZPJ5nWkSbh2V3mTJ97lcM/Ob6ukZV/dlXO82DiYyjcUKgfGo/YWlPDR7A/M37KVnUgx/ufxsUtvYaSBvparc8uoKPt24r3rexkcutquL/FxdhcBjx4UiEiEi34rIGhHZICJ/qGWdcBGZJSLbROQbEUnxVB7jGZ9t3MfoJ7/iv1v2M3VMN2bfPsyKgJcTEWZen8bn946ontfjoQUs3Lyvjk8Zf+bJE4RHgPNVtTfQBxgtIoOPW+cXwEFV7Qz8DfiLB/OYBlRaXslDH6znl6+k0yomgrl3ncOtIzrZJYo+pFNCNDsfHctlfZMAuOmldC7/55IThuc0/s9j/2vV5bB7MtT9Ov5f2HjgZff7d4BRYr2KXu+7fYWMe3oxryzdxc3ndOD9O4bSOfEURmoxXumJiX2YfccwAFbsOkiH381jz6ESh1OZxuTR3TcRCRaR1cB+4FNV/ea4VZKADABVrQDygRa1bOcWEUkXkfScnBxPRjb1mLcumwn/+JoDReW8fNNAHhjbwwZP8QN9kmPZOn0MMRGufoKhjy5k/vpsh1OZxuLRQqCqlaraB2gLDBSRnj9yO8+papqqpiUkJDRoRnNqKquURz/ezO2vr6Rbq6bMvWs4I7ra34U/CQ0OYu20i7nnwq4A3PraSu6etdrZUKZRNMoJXVU9BPwXGH3coiwgGUBEQoBmQF5jZDKnLr+4nEn//pZ/ffE91w5qx5u3DKZljO+OCGbqdteoLrx3+1AA3l+VRcrUuVRWWb+BP/PkVUMJIhLrfh8JXAhsPm61D4Eb3O+vABaq9VR5lcyDxVzxryUs257HXy7vxfRLe9mpoADQr11z1k27qHq60+/nUVha7mAi40mePCJoDfxXRNYCy3H1EXwkIo+IyDj3Oi8ALURkG3APMNWDecxpWp+Vz6XPLGFvQSmv3DSIiQPaOR3JNKKmEaHs+PNPaBbpepx1r2mfsCuvyOFUxhPshjJTq0Vb9nP76ytpHhXGv28cEJDDRJof/PLldD7b5LrP4K1fDWFghziHE5nT5cgNZcZ3zV+fzc2vpJPSognv3T7UioDh+RvSuNfdifyzZ5fy3y376/mE8SVWCMwxPlidxR1vrOLstrH851fWKWx+cOeoLjx2xdkA3Pjv5Xy8zi4v9RdWCEy1t5Zn8JtZqxmQ0pxXbhpo4wabE1yZlswz1/YD4LbXV/LOikyHE5mGYIXAAPB2egZT3l3LOV0SeOnGgfbUUHNSP+nVmn/fOACA3769hjlr9jicyJwpKwSGeeuyuf/dtZzTJZ6Z1/cnItQuDzV1O++sRF77xSAA7nxzFV98Z3f8+zIrBAFu0Zb9/Po/q+jXrjnPXtff7hEwp2x4l/jq00Q3vPgtK3cfdDiR+bGsEASwFbsOcOtrK+iS2JQXJg2w59Gb0/aTXq3506W9ALjsmSXsyLX7DHyRFYIAtSuviJtfWUHrZpG88ouB1TcNGXO6rhnUrvrS0vMeX8ThIxUOJzKnywpBAMovLufGl5ZTpcqLkwYQHx3udCTj4+4c1YULuicC0PPhBVTZs4l8ihWCAFNWUcWvXksn80AJz12XRof4Jk5HMn7i+RsGEOYemKjzA/McTmNOhxWCADNtzgaWbT/AX67oZY8JMA1uyx9dDxiuUvj1f1Y5nMacKisEAeSdFZm88c1ubh3RiUv7tnU6jvFDIlL91NIPVu/h0402DrIvsEIQIDbuKeCB99cxpGMLfntRV6fjGD/WNCKUd28bAsDNr6STU3jE4USmPlYIAkB+STm3vb6C2KhQZlzd1waYNx7Xv30ct43sBMCA6Z/ha085DjT2i+DnVJUH3l9H1sESnrm2HwlN7Qoh0zjuH92NSPdd6j97dqnDaUxdrBD4uQ9W7+GjtdncfWFX+re3zmHTuI72FyzfeZCvttpjKLyVFQI/lnmwmP+ZvZ609s25dUQnp+OYABQSHMQ7t7r6C6574VuOVFQ6nMjUxgqBn6qsUu55aw0K/G1iH4KDxOlIJkClpcRxQfeWAPR6+BOH05jaWCHwU69/s4tvdxzgoUt6kBwX5XQcE+Cev8E1QmJZZRVz19qANt7GCoEfys4v4a/zt3BOl3iu7G/3Cxjv8Nk95wJwxxsrqaiscjiNqckKgR96+IMNVFRVMX1CL0TslJDxDp0TmzK0UwsALnn6a4fTmJo8VghEJFlE/isiG0Vkg4j8upZ1RopIvoisdr8e8lSeQLFgw14+2biP31zQlXYt7JSQ8S5HB7PZlF3Ausx8h9OYozx5RFAB3KuqPYDBwB0i0qOW9b5S1T7u1yMezOP3SssreWTORrq1asovhndwOo4xJwgKEl6+aSAAlzy92OE05iiPFQJVzVbVle73hcAmIMlT32fghcU7yDpUwsOXpBJqdw8bLzWia0L1+1eX7XIwiTmqUX4tRCQF6At8U8viISKyRkQ+FpHUk3z+FhFJF5H0nBy7KaU2+wtLeea/27ioR0uGuM/DGuOtlv1uFAD/M3u9jV3gBTxeCEQkGngX+I2qFhy3eCXQXlV7A38HZte2DVV9TlXTVDUtISGhtlUC3hOffEdZZRW//0l3p6MYU69WzSLonRwLwOQ3Vzobxni2EIhIKK4i8Lqqvnf8clUtUNXD7vfzgFARifdkJn+0bX8hs9IzuH5ICik20IzxEW//ynXH8bx1eykttzuOneTJq4YEeAHYpKpPnGSdVu71EJGB7jx5nsrkr576fBtRocHccV5np6MYc8rCQoL4WZrrPpcbXvzW4TSBzZNHBMOA64Dza1we+hMRuVVEbnWvcwWwXkTWADOAq9SeV3tavttXyEdr93DD0BTimoQ5HceY0/LoZWcD8M2OA5SU2VGBU0I8tWFVXQzUeTeTqj4NPO2pDIHgqc+20iQshJvP6eh0FGNOW1CQ8PPB7Xht2W6ueX4Z798+zOlIAcmuMfRhW/cVMnddNpOGptDcjgaMj/rf8T0BWLX7kD2d1CFWCHzYC4t3EB4SxE1285jxYSLCZX1dtxj99u21DqcJTFYIfFTu4SO8tyqLy/u3tb4B4/P+coWrr2DOmj0OJwlMVgh81GvLdlFWUcVNw+xowPi+0OAgOia4Ln1+/qvtDqcJPFYIfFBpeSWvLt3F+d0S6ZwY7XQcYxrErFtc9xX8ce4mh5MEHisEPuiTjfvIKypj0tAUp6MY02ASmoZXv9+UffxDCIwnWSHwQbOW7yYpNpLhne0mbONfnruuPwDXPl/bY8mMp1gh8DG784r5elseEwckE2TjEBs/c1FqKwAOFJXZw+gakRUCH/P2igyCBK6wISiNnxrS0fX03GcWbXM4SeCwQuBDVJX3VmZxTpcE2sRGOh3HGI94+pq+ADz+yXcOJwkcVgh8yKqMQ2QdKmF8nzZORzHGY1pE/9BpbM8fahxWCHzI3LXZhAUHcUGPlk5HMcajrhqQDMBjC7Y4nCQwWCHwEVVVyrx12ZzbNYGYiFCn4xjjUQ+MdQ2w9OLXOxxOEhisEPiIVRkHyc4vZezZrZyOYozHNa2xs2OD1nieFQIfsXDzfoKDhPO72WkhExgmuPvCZn5pj5zwNCsEPuKL73Lo3645zSLttJAJDPeP6QbA/31qVw95mhUCH5BTeIT1WQWMOCvB6SgmQERHN/wzrKZNm8bjjz9+yuu3bnbql0inpKSQm5tb5zoPPPAAycnJJ7TNG9p6Oupra3FxMWPHjqVbt26kpqYyderUerdphcAHfLU1B4ARXa0QmMASE+EaRHFdZv5J16msPLU+hEsuuYRvv/XtsZFPta2//e1v2bx5M6tWreLrr7/m448/rnN9KwQ+YPHWXFo0CaNH6xino5gANmfOHAYNGkTfvn254IIL2LdvH+Da+73pppsYOXIkHTt2ZMaMGdWfmT59Ol27dmX48OFs2fLDpaAjR47k7rvvJi0tje7du7N8+XIuu+wyunTpwoMPPli9XviiJ8h+6decM6gvzz33XPX86Oho7r33Xnr37s3SpUur55eUlDBmzBhmzpx5Qv7BgwfTunVrr23rhAkT6N+/P6mpqWfU1qioKM477zwAwsLC6NevH5mZmXU3WFV96tW/f38NNMP/8rne+mq60zFMAGnSpMkJ8w4cOKBVVVWqqjpz5ky95557VFX14Ycf1iFDhmhpaanm5ORoXFyclpWVaXp6uvbs2VOLioo0Pz9fO3XqpI899piqqo4YMUKnTJmiqqpPPvmktm7dWvfs2aOlpaWalJSkubm5qqq6d3+Otr//I02+511NTU2tng/orFmzqrO1b99ed+zYoaNGjdKXX375tNrmLW3Ny8tTVdXi4uIGa+vBgwe1Q4cO+v333yuQrif5XfXY4PUikgy8ArQEFHhOVZ86bh0BngJ+AhQDk1R1pacy+aJ9BaVkHCjhhiEpTkcxfm72qiweW7CFPYdKKCmvZPaqLCa4h5AEyMzMZOLEiWRnZ1NWVkaHDj8MijR27FjCw8MJDw8nMTGRffv28dVXX3HppZcSFRUFwLhx4475vqPTvXr1IjU1tXpvvWPHjmRkZNCiRQv++Y+n2fPiywDkHznA1q1badGiBcHBwVx++eXHbG/8+PFMmTKFa6+91ifbOmPGDN5//30AMjIyzritFRUVXH311dx111107Nixzj8PT54aqgDuVdUewGDgDhHpcdw6Y4Au7tctwD89mMcnpe88CEBaSpzDSYw/m70qi9+9t46sQyUooAq/e28ds1dlVa9z5513MnnyZNatW8ezzz5LaWlp9bLw8B8eCxEcHExFRUW933n0M0FBQcd8PigoiIqKChYtWsRnn31G+xufoM1NT9O959nV3xkREUFwcPAx2xs2bBjz58/HtRN9cpVV6rVtXbp0KWvWrKFv375n3NZbbrmFLl268Jvf/KbefB4rBKqafXTvXlULgU1A0nGrjQdecR/FLANiReTUTuIFiPRdB4gIDSK1jfUPGM95bMEWSo67caukvPKYRzzk5+eTlOT6L/zyyy/Xu81zzz2X2bNnU1JSQmFhIXPmzDmtTPn5+TRv3pzbL0ilPC+D9OV1d/Q+8sgjNG/enDvuuKPO9coqq7y2rVFRUWzevJlly5bVuX59bX3wwQfJz8/nySefPKXvb5TOYhFJAfoCx482kQRk1JjO5MRigYjcIiLpIpKek5PjsZzeaG1mPr2SmhEabP36xnP2HCo5ZlrLj5D5jxv4ZvrPaNu2LU888QTTpk3jyiuvpH///sTH1z8oUr9+/Zg4cSK9e/dmzJgxDBgw4LQyjR49moqKCv45eRwHv3iZ0NZn1fuZp556ipKSEqZMmXLCsilTptC2bVuqylxtO7T4da9ra/fu3Zk6dSqDBw/+0W3NzMxk+vTpbNy4kX79+tGnTx+ef/75Orcl9R1GnSkRiQa+AKar6nvHLfsIeFRVF7unPwfuV9X0k20vLS1N09NPutivVFUpZ//hEy7rl8Qj43s6Hcf4sWGPLiTruGIAkBQbyddTz3cg0bFSps4FYOejY894W97eVk8RkRWqmlbbMo/uZopIKPAu8PrxRcAtC0iuMd3WPc8AmQdLOHykgu522ajxsPsuPovI0GPPQ0eGBnPfxfXvhfuaQGrrqfJYIXBfEfQCsElVnzjJah8C14vLYCBfVbM9lcnXbNrrGsC7W6umDicx/m5C3yT+fFkvkmIjEVx7x3++rNcxV9I4KSzE9VO1v7C0njXr5+1tdYLHLh8FhgHXAetEZLV73u+BdgCq+i9gHq5LR7fhunz0Rg/m8TmbswsRgbOsEJhGMKFvktf+GF7aJ4lZ6Rl8tCabm4Z3qP8D9fDmtjrBY4XAfd6/ztHV3TdL1N3FH8B25hXRplkkUWGerNfGeL/zuycyKz2DL77LaZBCYI5ll6J4sYwDxSTH2djExgzp5BrQfvG2uh8sZ34cKwRebPeBYpKbRzkdwxjHHR2Vr7LKs1c5BiorBF6qpKyS/YVHaBdnhcAY41lWCLzU0euc29qpIWOMh1kh8FJ5h48AkBAd4XASY7yLp2+CDURWCLxUXlEZAHFNwhxOYox3iI92/V/YV3DE4ST+xwqBlzpaCI7+4zcm0HVJdN1P892+QoeT+B8rBF7qwGFXIWhuRwTGAD/cWGmFoOFZIfBSh0rKaBIWbE8dNcYt2X0FXebBEx8YZ86M/cp4qdLyKiLDgutf0ZgA0TzKdS/BoeIyh5P4HysEXupIeSURoVYIjDmqeZTrNOnB4nKHk/gfKwReqrTCCoExNTWzIwKPsULgpUrLq4gItb8eY446ekRwqMSOCBpavb80InKniDRvjDDmB1WqBEmdD281JqAEu/8/2POGGt6p7HK2BJaLyFsiMto94IzxsGAR+wdvTA1llVUAhNmVdA2u3j9RVX0Q6IJrtLFJwFYR+ZOIdPJwtoAWFGSFwJiaKqpchcAuqW54p/Qn6h5AZq/7VQE0B94Rkb96MFtACxahyp6pYky18grX/4fQEDsp0dDqHfpKRH4NXA/kAs8D96lquYgEAVuBKZ6NGJiCg4UKOyIwplppRSUA4SF2NV1DO5UxEOOAy1R1V82ZqlolIj/1TCzTJCyYoiMVTscwxmvsK3ANXN8yJtzhJP6n3kKgqg/XsWxTw8YxR8VEhFJYaoXAmKOy3I+WaNPMxuhoaNbr4qWaRoRSXFZJuftKCWMC3dHBmtrEWiFoaB4rBCLyoojsF5H1J1k+UkTyRWS1+/WQp7L4ophI18HaYTsqMAaAPe5CkNTcCkFD8+QRwUvA6HrW+UpV+7hfj3gwi89pFum6nf6g3U5vDADbc4sAaN/CxvFuaB4rBKr6JXDAU9v3d61iXENU2mhMxrhsz3EVgs4J0Q4n8T9O9xEMEZE1IvKxiKSebCURuUVE0kUkPScnpzHzOaZVM1ch2Ftgz143pqYQu6GswTn5J7oSaK+qvYG/A7NPtqKqPqeqaaqalpCQ0Fj5HHW0EGTnlzqcxBjj7xwrBKpaoKqH3e/nAaEiEu9UHm8TFRZCs8hQ9lohMMZ4mGOFQERaHX2AnYgMdGfJcyqPN0qKjWT3gWKnYxjjuCPuu4qNZ5zKncU/ioi8CYwE4kUkE3gYCAVQ1X8BVwC3iUgFUAJc5X6mkXHrlBjN6oyDTscwxnFLvnftIw7sEOdwEv/ksUKgqlfXs/xp4GlPfb8/6JTQhI/W7qHUhq00Ae6TDfsAuKhHS4eT+CfrfvdinROjUf3hsjljAtWnG/cCcHFqK4eT+CcrBF6sk/t66a37Cx1OYoyzcg+7bqxMjrObyTzBCoEX65QQTVhwEBv3FDgdxRjjx6wQeLGwkCC6t27K6oxDTkcxxjEHi+wxK55mhcDLnd02lvVZ+TZspQlYb6/IAGBiWrLDSfyXFQIvd3bbZhSVVbI957DTUYxxxKvLXGNi/Xxwe4eT+C8rBF6uT3IsAKt2H3I0hzFOyTjget5Wr7bNHE7iv6wQeLnOidG0aBLG0u1207UJPFV2SrRRWCHwciLCkE4tWPJ9LnbjtQk089ZnAzAgpbnDSfybFQIfMLRTPPsKjlQPzGFMoHjik+8AuOfCsxxO4t+sEPiAoZ1aALBkW67DSYxpXEd3foa4/w8Yz7BC4APat4giOS6S/24JjEF5jAEoKC13OkLAsELgA0SEC7q3ZPG2XIqO2GD2JjAcPS00aWiKs0ECgBUCH3FRj1aUVVTx5Xd2VGACw0tLdgJw70VdnQ0SAKwQ+IgBKc2JjQrl0437nI5ijMfVvJO+aUSog0kCgxUCHxESHMT53RL5bNM+G63J+L3nv9oOwMizAmOMcqdZIfAhl/RuQ0FpBYus09h4WHR0dINvc9q0aTz++OOntO6fP94MwF8vP/uU1k9JSSE3t+6r6lasWEGvXr3o3Lkzd911V/V9OU639XSdSltHjx5N7969SU1N5dZbb6Wysu6dRysEPuSczvHER4fz/sosp6MY4zGHa1wQkRgTUe/69f3IHXXbbbcxc+ZMtm7dytatW5k/f/6PzuiUU23rW2+9xZo1a1i/fj05OTm8/fbbda5vhcCHhAQHMa53GxZu3k9+sV1aZxrXnDlzGDRoEH379uWCCy5g3z5Xf9W0adO46aabGDlyJB07dmTGjBnVn5k+fTpdu3Zl+PDhbNmypXr+yJEjufvuu0lLS6N79+4sX76cyy67jC5dunDB1bcBrquFJkyYQP/+/UlNTeW5556r/nx0dDT33nsvvXv3ZunSpdXzS0pKGDNmDDNnzjwme3Z2NgUFBQwePBgR4frrr2f27NmOt/XBBx+sXq+h2goQExMDQEVFBWVlZYjISdsKgKr61Kt///4ayNZlHtL293+kry7d6XQU48eaNGlywrwDBw5oVVWVqqrOnDlT77nnHlVVffjhh3XIkCFaWlqqOTk5GhcXp2VlZZqenq49e/bUoqIizc/P106dOuljjz2mqqojRozQKVOmqKrqk08+qa1bt9Y9e/ZoaWmpBke30LZ3vaElZRWal5enqqrFxcWampqqubm5qqoK6KxZs6qztW/fXnfs2KGjRo3Sl19++YTsy5cv11GjRlVPf/nllzp27FjH25qUlFTdpoZq61EXXXSRxsbG6tVXX60VFRUKpOtJflc9Nni9iLwI/BTYr6o9a1kuwFPAT4BiYJKqrvRUHn+R2iaGbq2a8sY3u7l2ULv6K70xDSQzM5OJEyeSnZ1NWVkZHTp0qF42duxYwsPDCQ8PJzExkX379vHVV19x6aWXEhXlGl5y3Lhxx2zv6HSvXr1ITU2ldevWrM08REhsKyoLcokIDebRGTN4//33AcjIyGDr1q20aNGC4OBgLr/88mO2N378eKZMmcK1117rE20F6NixIxkZGbRo0YIZDdzWBQsWUFpayrXXXsvChQvrbK8nTw29BIyuY/kYoIv7dQvwTw9m8RsiwnVD2rMxu4CVuw86Hcf4kdmrshj26EI6TJ1LSXkls1cd2xd15513MnnyZNatW8ezzz5LaWlp9bLw8PDq98HBwVRU1H/j49HPBAUFVb8f9/TXIMK0n3Zj0aJFfPbZZyxdupQ1a9bQt2/f6u+MiIggODj4mO0NGzaM+fPn1/pwxqSkJDIzM39o6+K1pOfgaFuPTldUVDRoW2uKiIhg/PjxfPDBB3Wu57FCoKpfAgfqWGU88Ir7KGYZECsirT2Vx59M6JNE0/AQXlm6y+koxk/MXpXF795bR9ahEhRQhd+9t+6YH8j8/HySkpIAePnll+vd5rnnnsvs2bMpKSmhsLCQOXPm1Ll+SdkPHaH92jcnPz+f5s2bExUVxebNm1m2bFmdn3/kkUdo3rw5d9xxxwnLWrduTUxMDMuWLeP9lZk8+8JLaLs0x9p6vIZs6+HDh8nOdj21taKigrlz59KtW7c6t+dkZ3ESkFFjOtM9z9SjSXgIl/dvy7x12eQUHnE6jvEDjy3YQkn5Dz/EWn6ErU/+nIkj+9C2bVueeOIJpk2bxpVXXkn//v2Jj4+vd5v9+vVj4sSJ9O7dmzFjxjBgwIA617/37dUAtHRfKTR69GgqKiro3r07U6dOZfDgwfV+51NPPUVJSQlTpkw5YdkzzzzDL3/5S66+cCBBzVoS0THNsbYeryHbWlRUxLhx4zj77LPp06cPiYmJ3HrrrXVuS+o7tDgTIpICfHSSPoKPgEdVdbF7+nPgflVNr2XdW3CdPqJdu3b9d+2yPeHvcw4z6v++4K7zO3PPRfaIXnNmOkydS22/BALseHSsx79fVenwu3kAbJ0+htBgz+2jOt1Wp4jIClVNq22Zk0cEWUDN0ajbuuedQFWfU9U0VU1LSLA7DQE6JURzUY+WvLRk5zHXXRvzY7SJjTyt+Q3tb5+6HjDXrVVTjxYBcL6t3sjJQvAhcL24DAbyVTXbwTw+5/bzOlNQWsHry+wIyZyZ+y4+i8jQYzskI0ODue/ixjnanLFwGwCzfjXE49/ldFu9kScvH30TGAnEi0gm8DAQCqCq/wLm4bp0dBuuy0dv9FQWf9UnOZbhneN5fvEObhiaQsRx/7iNOVUT+rq65x5bsIU9h0poExvJfRefVT3fk15duhOAuCZhNIv0/APmnGyrt/JoH4EnpKWlaXr6Cd0IAWvJ97lcM/Mb/jAulRvsue3GB6VMnQvAst+NolWz+h8pYX4cb+0jMA1gSMcWDOoQx98XbrVBa4zP+dcX3wMQFRZsRcBBVgh8nIhw/5hu5B4u44XFO5yOY8wpU1UedT9l9Ksp5zmcJrBZIfAD/do15+LUljz7xffkHbb7Coxv+P376wHo0TqGFtHh9axtPMkKgZ+47+JulJRX8nf31RfGeLPS8kre/HY3AO/dPtThNMYKgZ/onBjN1QPb8eqyXWzKLnA6jjF1GvV/XwBwRf+2drWbF7BC4Efuu/gsYiJCeOiD9fU+jMoYp2zYk0/WoRIAHrvi1EYgM55lhcCPxEaFcf/obizfeZDZq20UM+Odxs5YDMC/Jw2wx6h7CSsEfuZnacn0To5l+tzNNoqZ8TpPfba1+v153RIdTGJqskLgZ4KChOkTenKwuIxHPtrodBxjquUdPsLfPnM9U2jl/1zocBpTkxUCP9QzqRm3j+zEuyszWbh5n9NxjAGg/x8/A+CeC7sS1yTM4TSmJisEfmry+Z05q2VTpr67zk4RGcf9/fMfTgndNaqLg0lMbawQ+KnwkGAev7I3eUVlPPzheqfjmAC2N7+U/3M/Zjr9wQscTmNqY4XAj/Vq24w7z+/M7NV7eGdFZv0fMKaBqSqD//w5APeP7ka83UHslawQ+Lk7z+/CoA5x/M/s9Wzbf9jpOCbA/OzZpQCEhQRx28hODqcxJ2OFwM8FBwlPXdWXyLBgJr+xktIa49Ia40nz12ezfOdBADb84WKH05i6WCEIAK2aRfB/P+vN5r2FPPzBBrvr2HjcvoJSbn1tJQAf3Tnc48NPmjNjfzsB4ryzEpl8XmdmpWfwylIb2tJ4TkVlFYP+5OoXuPP8zvRMauZwIlMfKwQB5J4Lu3JB90Qe+WgjS7blOh3H+KnOD3wMQIf4Jtx7UeCOA+xLrBAEkKAg4W8T+9Axvgm3v7GS3XnFTkcyfuaO11dWv1947wgHk5jTYYUgwDSNCGXm9WmowqSXvuVAUZnTkYyf+Oei75m7LhuAddMusgfK+RArBAEoJb4JM69PI/NgCTe9tJziMhvr2JyZeeuy+ct817CTn90zgqYRoQ4nMqfDo4VAREaLyBYR2SYiU2tZPklEckRktfv1S0/mMT8Y2CGOGVf1ZW3mISa/sYqKyiqnIxkftXL3QW53nxJ64+ZBdE6MdjiROV0eKwQiEgz8AxgD9ACuFpEetaw6S1X7uF/PeyqPOdHonq343wk9Wbh5P/e/u46qKrus1JyerfsKueyZJYBrkJmhneIdTmR+jBAPbnsgsE1VtwOIyH+A8YA9G9mLXDuoPXmHy3ji0+8ICRL+fFkvgoLs3K6p3/c5h7nwb18C8OtRXbgyLdnhRObH8mQhSAIyakxnAoNqWe9yETkX+A64W1Uzjl9BRG4BbgFo166dB6IGtrtGdaGisooZC7cRFATTJ1gxMHXbkVtUPe7wrSM6cfeFXR1OZM6E053Fc4AUVT0b+BR4ubaVVPU5VU1T1bSEhIRGDRgo7r6wK5PP68yb32bw4Afr7TSROakduUWc9/giAG4+pwNTx3RzNpA5Y548IsgCah4rtnXPq6aqeTUmnwf+6sE8pg4iwr0XdaVKlWcWfU/xkQoeu7K3PRrAHGPV7oNc6u4TmDQ0hQfG1tbtZ3yNJwvBcqCLiHTAVQCuAq6puYKItFbVbPfkOGCTB/OYeogI9118Fk3CQ3hswRYOlZTzzLX9iArz5D8T4ys+27iPX76SDrj6BOx0kP/w2O6eqlYAk4EFuH7g31LVDSLyiIiMc692l4hsEJE1wF3AJE/lMadGRLjjvM48elkvvvwuh2uf/4ZDxXbTWaB7/Ztd1UXgL5f3siLgZ8TXnkSZlpam6enpTscICPPXZ3PXm6tJah7J8zek0SnBrg8PRHfPWs37q1xndV+clMb53Vo6nMj8GCKyQlXTaltmJ4DNSY3u2ZrXbx5Efkk5l/7ja77amuN0JNOIqqqUHg/Nry4Cc+8abkXAT1khMHUakBLHB3cMo3WzSCb9ezmvLN1p4xkEgPzicjr+fh7FZa6BjNY8fBGpbexx0v7KCoGpV3JcFO/ePpTzzkrgoQ82cO9ba+z5RH7si+9y6P3IJwBEhgaz/U8/oVmkPTvIn1khMKckOjyEZ69L49ejuvD+6izGP/01W/cVOh3LNLA731zFDS9+C8C1g9qx6X9H282FAcAKgTllwUHC3Rd25dWbBnGwuIxxT3/NOysy7VSRHygoLSdl6lzmrNkDwFu/GsL0S3s5nMo0FisE5rQN7xLPvLvO4ey2zfjt22u4/fWV5B0+4nQs8yP959vdnD3tk+rpjY9czMAOcQ4mMo3N7hQyP0piTARv3DyY577czt8+/Y7lO7/kT5f24qLUVk5HM6eotLyS1IcXUOl+nMiNw1J4+JJUh1MZJ9gRgfnRgoOE20Z24sM7h5HYNIJbXl3BPbNW29GBD3grPYNu/zO/ugh8cd9IKwIBzI4IzBnr1iqG2XcM4+mFW3lm0fcs3LKf+0d3Y2JasnU0epm9+aUM/vPn1dOX9G7D36/u62Ai4w3szmLToLbuK+SB2ev5dscB+rWL5Y8TetGjTYzTsQKeqjL5jVXVYwoDfDXlPJLjohxMZRpTXXcWWyEwDU5VeW9lFtPnbeJQcRlX9k/m7gu70qpZhNPRAtK/v97BH+b8MB7UH8alcsPQFOcCGUfUVQjs1JBpcCLC5f3bMqp7In9fuI1Xlu7kgzVZ3HxOR341ohPR4fbPrjEs3prLz1/4pnq6V1Iz3rltCOEhwQ6mMt7IjgiMx2UcKOavC7YwZ80eWjQJ4+ZzO/Lzwe2tIHjIku9zuWbmN8fM+/aBUSQ2tSOyQGanhoxXWJNxiMc/2cJXW3OJjQrlF8M6cMOwFGIi7PEFDWHRlv1M+vfyY+Z9dOdweibZM4KMFQLjZVZnHOLvn2/l8837aRoRwjUD23HdkPa0bW4dl6dLVXnuy+38+ePNx8yffccw+iTHOhPKeCUrBMYrrc/K55+Lvmf+hr2oKhf2aMmkoR0Y3DEOEbvstC6Hj1Rw22sr+Gpr7jHz5911jl2lZWplhcB4tT2HSnht2S7e/HY3B4vL6ZIYzRX923Jp3yQSY+y8dk3vrMjkt2+vOWZe99YxvPqLgcRHhzuUyvgCKwTGJ5SWV/Lh6j3MSs9gxa6DBAmc2zWBy/u5rkAK1LGT12Ye4rbXVpJ1qOSY+bec25Gpo7vZTXvmlFghMD5ne85h3l2ZyXsrs8jOLyU8JIgRXRMY3bMVo7q1pFmUf3cwL9mWy69nrSan8NjHdXRKaMLzNwygQ3wTh5IZX2WFwPisyirlmx15LFi/lwUb9rG3oJSQIGFAShzDu8RzTpd4Uts0I9jH94oPFpXxj/9u4/nFO05YFhYSxIyr+jC6Z2sHkhl/YYXA+IWqKmVN5iHmb9jLF1ty2LzXNTBObFQowzrF0799c/q0iyW1TYzX3zS1O6+Yl5bs5MWvT/zhB2gZE84TP+vDsM7xjZzM+CvHCoGIjAaeAoKB51X10eOWhwOvAP2BPGCiqu6sa5tWCMxR+wtLWbItj8XbclmyLZc9+aUAhAUH0b1NDL3bNqNLy6Z0TYyma8umNG8S1ugZq6qUFbsPMndtNh+t3UPu4bKTrnvTsA5MPr8zcQ7kNP7PkUdMiEgw8A/gQiATWC4iH6rqxhqr/QI4qKqdReQq4C/ARE9lMv4lsWkEE/omMaFvEgD7CkpZtfsQqzIOsmr3Id5bmcXhIz+MrRwfHU6H+CjaxEbSJjaSpNhI2sRGENcknNjIUGKjQmkaEXrKp5lKyirZmVfErrwiduYVs2VvIct3HiDzYEm9n40KC+amYR24bkh7WtqVUcZhnrwMYyCwTVW3A4jIf4DxQM1CMB6Y5n7/DvC0iIj62vkq4xVaxkQwumcrRvd0DY6jquzJL2XrvkK27jvMd/sK2X2gmJXuPfSKqhP/mYlAdFgIYSFBhAYHsbeg9IxzdW8dw0/Pbs3YXq1JsU5e44U8WQiSgIwa05nAoJOto6oVIpIPtACOuUtGRG4BbgFo166dp/IaPyMiJLn3/EeelXjMssoqJafwCFmHSjhUXMah4nIOlZSTX1xGQWkF5ZVVVFQqO/KK+HbHgVq3HxospLRoQvsWTUhpEUWXltGkpcTRMb6J3RBnfIpPXJitqs8Bz4Grj8DhOMYPBAcJrZpF2KOxjcGzQ1VmAck1ptu659W6joiEAM1wdRobY4xpJJ4sBMuBLiLSQUTCgKuAD49b50PgBvf7K4CF1j9gjDGNy2Onhtzn/CcDC3BdPvqiqm4QkUeAdFX9EHgBeFVEtgEHcBULY4wxjcijfQSqOg+Yd9y8h2q8LwWu9GQGY4wxdfPkqSFjjDE+wAqBMcYEOCsExhgT4KwQGGNMgPO5p4+KSA6wy+kcJxHPcXdF+7FAaisEVnutrf6pvaom1LbA5wqBNxOR9JM93c/fBFJbIbDaa20NPHZqyBhjApwVAmOMCXBWCBrWc04HaESB1FYIrPZaWwOM9REYY0yAsyMCY4wJcFYIjDEmwFkhaGAi8piIbBaRtSLyvojEOp3JU0TkShHZICJVIuKXl+CJyGgR2SIi20RkqtN5PElEXhSR/SKy3uksniYiySLyXxHZ6P43/GunMznJCkHD+xToqapnA98Bv3M4jyetBy4DvnQ6iCeISDDwD2AM0AO4WkR6OJvKo14CRjsdopFUAPeqag9gMHCHn//d1skKQQNT1U9UtcI9uQzXyGx+SVU3qeoWp3N40EBgm6puV9Uy4D/AeIczeYyqfolrXBC/p6rZqrrS/b4Q2IRrDPWAZIXAs24CPnY6hPnRkoCMGtOZBPCPhb8SkRSgL/CNw1Ec4xOD13sbEfkMaFXLogdU9QP3Og/gOvx8vTGzNbRTaasxvkpEooF3gd+oaoHTeZxiheBHUNUL6louIpOAnwKjfH0M5vra6ueygOQa023d84wfEJFQXEXgdVV9z+k8TrJTQw1MREYDU4BxqlrsdB5zRpYDXUSkg4iE4RpT+0OHM5kGICKCa8z0Tar6hNN5nGaFoOE9DTQFPhWR1SLyL6cDeYqIXCoimcAQYK6ILHA6U0Nyd/pPBhbg6kx8S1U3OJvKc0TkTWApcJaIZIrIL5zO5EHDgOuA893/T1eLyE+cDuUUe8SEMcYEODsiMMaYAGeFwBhjApwVAmOMCXBWCIwxJsBZITDGmABnhcAYYwKcFQJjjAlwVgiMOUMiMsA9/kSEiDRxP9++p9O5jDlVdkOZMQ1ARP4IRACRQKaq/tnhSMacMisExjQA97OIlgOlwFBVrXQ4kjGnzE4NGdMwWgDRuJ4zFeFwFmNOix0RGNMARORDXCOYdQBaq+pkhyMZc8psPAJjzpCIXA+Uq+ob7nGOl4jI+aq60OlsxpwKOyIwxpgAZ30ExhgT4KwQGGNMgLNCYIwxAc4KgTHGBDgrBMYYE+CsEBhjTICzQmCMMQHu/wGAM5bvW0+i9wAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "# Plot the state trajectory\n", + "pos = np.array([state.value[1:] for state in state_data])\n", + "plt.plot(pos[:, 0], pos[:, 1])\n", + "plt.scatter(landmarks[:, 0], landmarks[:, 1])\n", + "# add labels\n", + "for i, landmark in enumerate(landmarks):\n", + " plt.annotate(f\"Landmark {i}\", landmark)\n", + "plt.xlabel(\"x\")\n", + "plt.ylabel(\"y\")\n", + "plt.title(\"Simulated Trajectory\")\n", + "plt.axis(\"equal\")\n", + "\n", + "\n", + "# Plot the input data\n", + "plt.figure()\n", + "u_array = np.array([u.value for u in input_data])\n", + "u_stamps = np.array([u.stamp for u in input_data])\n", + "plt.plot(u_stamps, u_array[:, 0], label=\"omega\")\n", + "plt.plot(u_stamps, u_array[:, 1], label=\"v\")\n", + "plt.xlabel(\"Time (s)\")\n", + "plt.ylabel(\"Input\")\n", + "plt.title(\"Input Data\")\n", + "plt.legend()\n", + "plt.show()\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run a filter!\n", + "\n", + "Finally, lets run an extended Kalman filter on this data to get a state estimate that uses only the noisy measurements. In the below filter, we instantiate the [ExtendedKalmanFilter](../_autosummary/navlie.filters.ExtendedKalmanFilter.rst) to use on our data, and looping over the input measurements while also calling the correction step whenever a measurement occurs." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "# First, define the filter\n", + "kalman_filter = nav.ExtendedKalmanFilter(process_model)\n", + "\n", + "# You can try other filters too!\n", + "# kalman_filter = nav.UnscentedKalmanFilter(process_model)\n", + "# kalman_filter = nav.IteratedKalmanFIlter(process_model)\n", + "\n", + "P0 = np.diag([0.1**2, 1**2, 1**2]) # Initial covariance\n", + "x = nav.StateWithCovariance(x, P0) # Estimate and covariance in one container\n", + "\n", + "meas_idx = 0\n", + "y = meas_data[meas_idx]\n", + "estimates = []\n", + "for k in range(len(input_data) - 1):\n", + " u = input_data[k]\n", + "\n", + " # Fuse any measurements that have occurred.\n", + " while y.stamp < input_data[k + 1].stamp and meas_idx < len(meas_data):\n", + " x = kalman_filter.correct(x, y, u)\n", + "\n", + " # Load the next measurement\n", + " meas_idx += 1\n", + " if meas_idx < len(meas_data):\n", + " y = meas_data[meas_idx]\n", + "\n", + " # Predict until the next input is available\n", + " dt = input_data[k + 1].stamp - x.state.stamp\n", + " x = kalman_filter.predict(x, u, dt)\n", + "\n", + " estimates.append(x.copy())" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The filters in navlie are all designed to be *stateless*: this means that the actual state estimate is stored externally to the filter objects, in this case in a container called [StateWithCovariance](../_autosummary/navlie.types.StateWithCovariance.rst). Although this adds a slight burden on the user, it has the advantage of being more transparent, and also providing the ability to combine different filters in the same loop! For example, you could use an EKF for the prediction, but a UKF for the correction, or even to use different filters for different measurement models!\n", + "\n", + "\n", + "Once estimates have been obtained, we will often be interested in evaluating the performance. The [GaussianResultList](../_autosummary/navlie.utils.GaussianResultList.rst) object is a useful container for evaluating the quality of the state estimates when ground truth data is available. It calculates useful metrics such as raw error, Mahalanobis distance, and normalized estimation error squared (NEES). " + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "results = nav.GaussianResultList.from_estimates(estimates, state_data)\n", + "# results.nees \n", + "# results.three_sigma\n", + "# results.error\n", + "# results.md # mahalanobis distance\n", + "# # and more...\n", + "\n", + "# Some plotting functions that work directly with GaussianResultList\n", + "fig, axs = nav.plot_error(results)\n", + "axs[0].set_title(\"Estimation Errors\")\n", + "axs[0].set_ylabel(\"theta (rad)\")\n", + "axs[1].set_ylabel(\"x (m)\")\n", + "axs[2].set_ylabel(\"y (m)\")\n", + "axs[2].set_xlabel(\"Time (s)\")\n", + "\n", + "fig, ax = nav.plot_nees(results)\n", + "ax.set_title(\"NEES\")\n", + "ax.set_xlabel(\"Time (s)\")\n", + "plt.show()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As a final note, `GaussianResultList` will invoke the `State.minus` method of the state objects to calculate the error. As we will see next, this allows us to implement a custom measure of error, when it might not make sense to directly subtract two of our state objects." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.16" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_build/html/_static/basic.css b/_build/html/_static/basic.css new file mode 100644 index 00000000..b97662dd --- /dev/null +++ b/_build/html/_static/basic.css @@ -0,0 +1,921 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 270px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_build/html/_static/css/blank.css b/_build/html/_static/css/blank.css new file mode 100644 index 00000000..8a686ec7 --- /dev/null +++ b/_build/html/_static/css/blank.css @@ -0,0 +1,2 @@ +/* This file is intentionally left blank to override the stylesheet of the +parent theme via theme.conf. The parent style we import directly in theme.css */ \ No newline at end of file diff --git a/_build/html/_static/css/index.ff1ffe594081f20da1ef19478df9384b.css b/_build/html/_static/css/index.ff1ffe594081f20da1ef19478df9384b.css new file mode 100644 index 00000000..9b1c5d79 --- /dev/null +++ b/_build/html/_static/css/index.ff1ffe594081f20da1ef19478df9384b.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v4.5.0 (https://getbootstrap.com/) + * Copyright 2011-2020 The Bootstrap Authors + * Copyright 2011-2020 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:540px;--breakpoint-md:720px;--breakpoint-lg:960px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:1rem;line-height:1.5;color:#212529;text-align:left}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;background-color:transparent}a:hover{color:#0056b3}a:not([href]),a:not([href]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{margin-top:1rem;margin-bottom:1rem;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer:before{content:"\2014\00A0"}.img-fluid,.img-thumbnail{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:540px){.container{max-width:540px}}@media (min-width:720px){.container{max-width:720px}}@media (min-width:960px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1400px}}.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:540px){.container,.container-sm{max-width:540px}}@media (min-width:720px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:960px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1400px}}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;min-width:0;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.33333%;max-width:8.33333%}.col-2{flex:0 0 16.66667%;max-width:16.66667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333%;max-width:33.33333%}.col-5{flex:0 0 41.66667%;max-width:41.66667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333%;max-width:58.33333%}.col-8{flex:0 0 66.66667%;max-width:66.66667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333%;max-width:83.33333%}.col-11{flex:0 0 91.66667%;max-width:91.66667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333%}.offset-2{margin-left:16.66667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333%}.offset-5{margin-left:41.66667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333%}.offset-8{margin-left:66.66667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333%}.offset-11{margin-left:91.66667%}@media (min-width:540px){.col-sm{flex-basis:0;flex-grow:1;min-width:0;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.33333%;max-width:8.33333%}.col-sm-2{flex:0 0 16.66667%;max-width:16.66667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333%;max-width:33.33333%}.col-sm-5{flex:0 0 41.66667%;max-width:41.66667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333%;max-width:58.33333%}.col-sm-8{flex:0 0 66.66667%;max-width:66.66667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333%;max-width:83.33333%}.col-sm-11{flex:0 0 91.66667%;max-width:91.66667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}}@media (min-width:720px){.col-md{flex-basis:0;flex-grow:1;min-width:0;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.33333%;max-width:8.33333%}.col-md-2{flex:0 0 16.66667%;max-width:16.66667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333%;max-width:33.33333%}.col-md-5{flex:0 0 41.66667%;max-width:41.66667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333%;max-width:58.33333%}.col-md-8{flex:0 0 66.66667%;max-width:66.66667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333%;max-width:83.33333%}.col-md-11{flex:0 0 91.66667%;max-width:91.66667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}}@media (min-width:960px){.col-lg{flex-basis:0;flex-grow:1;min-width:0;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.33333%;max-width:8.33333%}.col-lg-2{flex:0 0 16.66667%;max-width:16.66667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333%;max-width:33.33333%}.col-lg-5{flex:0 0 41.66667%;max-width:41.66667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}.col-lg-8{flex:0 0 66.66667%;max-width:66.66667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333%;max-width:83.33333%}.col-lg-11{flex:0 0 91.66667%;max-width:91.66667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}}@media (min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;min-width:0;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.33333%;max-width:8.33333%}.col-xl-2{flex:0 0 16.66667%;max-width:16.66667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333%;max-width:33.33333%}.col-xl-5{flex:0 0 41.66667%;max-width:41.66667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333%;max-width:58.33333%}.col-xl-8{flex:0 0 66.66667%;max-width:66.66667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333%;max-width:83.33333%}.col-xl-11{flex:0 0 91.66667%;max-width:91.66667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th,.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:hsla(0,0%,100%,.075)}@media (max-width:539.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:719.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:959.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{appearance:none}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size],textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media (min-width:540px){.form-inline label{justify-content:center}.form-inline .form-group,.form-inline label{display:flex;align-items:center;margin-bottom:0}.form-inline .form-group{flex:0 0 auto;flex-flow:row wrap}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary.focus,.btn-primary:focus,.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary.focus,.btn-secondary:focus,.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success.focus,.btn-success:focus,.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info.focus,.btn-info:focus,.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning.focus,.btn-warning:focus,.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger.focus,.btn-danger:focus,.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light.focus,.btn-light:focus,.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark.focus,.btn-dark:focus,.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:540px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:720px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:960px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";display:none}.dropleft .dropdown-toggle:before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label:after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label:before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label:before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label:before,.custom-control-input[disabled]~.custom-control-label:before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label:before{pointer-events:none;background-color:#fff;border:1px solid #adb5bd}.custom-control-label:after,.custom-control-label:before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:""}.custom-control-label:after{background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label:before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label:after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label:after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label:after{background-color:#fff;transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center/8px 10px;border:1px solid #ced4da;border-radius:.25rem;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{position:relative;width:100%;height:calc(1.5em + .75rem + 2px)}.custom-file-input{z-index:2;margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]:after{content:attr(data-browse)}.custom-file-label{left:0;z-index:1;height:calc(1.5em + .75rem + 2px);font-weight:400;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label,.custom-file-label:after{position:absolute;top:0;right:0;padding:.375rem .75rem;line-height:1.5;color:#495057}.custom-file-label:after{bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;appearance:none}.custom-range:focus{outline:none}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label:before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label:before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;padding:.5rem 1rem}.navbar,.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat 50%;background-size:100% 100%}@media (max-width:539.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:540px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:719.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:720px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:959.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:960px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(0,0,0,0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:hsla(0,0%,100%,.5);border-color:hsla(0,0%,100%,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(255,255,255,0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-bottom:-.75rem;border-bottom:0}.card-header-pills,.card-header-tabs{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img,.card-img-bottom,.card-img-top{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:540px){.card-deck{display:flex;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:540px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:540px){.card-columns{column-count:3;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb,.breadcrumb-item{display:flex}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:540px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{height:1rem;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress,.progress-bar{display:flex;overflow:hidden}.progress-bar{flex-direction:column;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:540px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:720px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:960px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:hsla(0,0%,100%,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:flex;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:hsla(0,0%,100%,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translateY(-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered:before{display:block;height:calc(100vh - 1rem);height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable:before{content:none}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:540px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered:before{height:calc(100vh - 3.5rem);height:min-content}.modal-sm{max-width:300px}}@media (min-width:960px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{top:0;left:0;z-index:1060;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{top:0;border-width:0 .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{top:1px;border-width:0 .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner:after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@keyframes spinner-border{to{transform:rotate(1turn)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid;border-right:.25em solid transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix:after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:540px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:720px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:960px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive:before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9:before{padding-top:42.85714%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:540px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:720px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:960px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:540px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:720px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:960px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{user-select:all!important}.user-select-auto{user-select:auto!important}.user-select-none{user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{position:fixed;right:0;left:0;z-index:1030}.fixed-bottom{bottom:0}@supports (position:sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:540px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:720px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:960px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:transparent}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:540px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:720px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:960px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:960px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}html{font-size:var(--pst-font-size-base);scroll-padding-top:calc(var(--pst-header-height) + 12px)}body{padding-top:calc(var(--pst-header-height) + 20px);background-color:#fff;font-family:var(--pst-font-family-base);font-weight:400;line-height:1.65;color:rgba(var(--pst-color-text-base),1)}p{margin-bottom:1.15rem;font-size:1em;color:rgba(var(--pst-color-paragraph),1)}p.rubric{border-bottom:1px solid #c9c9c9}a{color:rgba(var(--pst-color-link),1);text-decoration:none}a:hover{color:rgba(var(--pst-color-link-hover),1);text-decoration:underline}a.headerlink{color:rgba(var(--pst-color-headerlink),1);font-size:.8em;padding:0 4px;text-decoration:none}a.headerlink:hover{background-color:rgba(var(--pst-color-headerlink),1);color:rgba(var(--pst-color-headerlink-hover),1)}.heading-style,h1,h2,h3,h4,h5,h6{margin:2.75rem 0 1.05rem;font-family:var(--pst-font-family-heading);font-weight:400;line-height:1.15}h1{margin-top:0;font-size:var(--pst-font-size-h1);color:rgba(var(--pst-color-h1),1)}h2{font-size:var(--pst-font-size-h2);color:rgba(var(--pst-color-h2),1)}h3{font-size:var(--pst-font-size-h3);color:rgba(var(--pst-color-h3),1)}h4{font-size:var(--pst-font-size-h4);color:rgba(var(--pst-color-h4),1)}h5{font-size:var(--pst-font-size-h5);color:rgba(var(--pst-color-h5),1)}h6{font-size:var(--pst-font-size-h6);color:rgba(var(--pst-color-h6),1)}.text_small,small{font-size:var(--pst-font-size-milli)}hr{border:0;border-top:1px solid #e5e5e5}code,kbd,pre,samp{font-family:var(--pst-font-family-monospace)}code{color:rgba(var(--pst-color-inline-code),1)}pre{margin:1.5em 0;padding:10px;background-color:rgba(var(--pst-color-preformatted-background),1);color:rgba(var(--pst-color-preformatted-text),1);line-height:1.2em;border:1px solid #c9c9c9;border-radius:.2rem;box-shadow:1px 1px 1px #d8d8d8}dd{margin-top:3px;margin-bottom:10px;margin-left:30px}.navbar{position:fixed;min-height:var(--pst-header-height);width:100%;padding:0}.navbar .container-xl{height:100%}@media (min-width:960px){.navbar #navbar-end>.navbar-end-item{display:inline-block}}.navbar-brand{position:relative;height:var(--pst-header-height);width:auto;padding:.5rem 0}.navbar-brand img{max-width:100%;height:100%;width:auto}.navbar-light{background:#fff!important;box-shadow:0 .125rem .25rem 0 rgba(0,0,0,.11)}.navbar-light .navbar-nav li a.nav-link{padding:0 .5rem;color:rgba(var(--pst-color-navbar-link),1)}.navbar-light .navbar-nav li a.nav-link:hover{color:rgba(var(--pst-color-navbar-link-hover),1)}.navbar-light .navbar-nav>.active>.nav-link{font-weight:600;color:rgba(var(--pst-color-navbar-link-active),1)}.navbar-header a{padding:0 15px}.admonition,div.admonition{margin:1.5625em auto;padding:0 .6rem .8rem;overflow:hidden;page-break-inside:avoid;border-left:.2rem solid;border-left-color:rgba(var(--pst-color-admonition-default),1);border-bottom-color:rgba(var(--pst-color-admonition-default),1);border-right-color:rgba(var(--pst-color-admonition-default),1);border-top-color:rgba(var(--pst-color-admonition-default),1);border-radius:.2rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1);transition:color .25s,background-color .25s,border-color .25s}.admonition :last-child,div.admonition :last-child{margin-bottom:0}.admonition p.admonition-title~*,div.admonition p.admonition-title~*{padding:0 1.4rem}.admonition>ol,.admonition>ul,div.admonition>ol,div.admonition>ul{margin-left:1em}.admonition>.admonition-title,div.admonition>.admonition-title{position:relative;margin:0 -.6rem;padding:.4rem .6rem .4rem 2rem;font-weight:700;background-color:rgba(var(--pst-color-admonition-default),.1)}.admonition>.admonition-title:before,div.admonition>.admonition-title:before{position:absolute;left:.6rem;width:1rem;height:1rem;color:rgba(var(--pst-color-admonition-default),1);font-family:Font Awesome\ 5 Free;font-weight:900;content:var(--pst-icon-admonition-default)}.admonition>.admonition-title+*,div.admonition>.admonition-title+*{margin-top:.4em}.admonition.attention,div.admonition.attention{border-color:rgba(var(--pst-color-admonition-attention),1)}.admonition.attention>.admonition-title,div.admonition.attention>.admonition-title{background-color:rgba(var(--pst-color-admonition-attention),.1)}.admonition.attention>.admonition-title:before,div.admonition.attention>.admonition-title:before{color:rgba(var(--pst-color-admonition-attention),1);content:var(--pst-icon-admonition-attention)}.admonition.caution,div.admonition.caution{border-color:rgba(var(--pst-color-admonition-caution),1)}.admonition.caution>.admonition-title,div.admonition.caution>.admonition-title{background-color:rgba(var(--pst-color-admonition-caution),.1)}.admonition.caution>.admonition-title:before,div.admonition.caution>.admonition-title:before{color:rgba(var(--pst-color-admonition-caution),1);content:var(--pst-icon-admonition-caution)}.admonition.warning,div.admonition.warning{border-color:rgba(var(--pst-color-admonition-warning),1)}.admonition.warning>.admonition-title,div.admonition.warning>.admonition-title{background-color:rgba(var(--pst-color-admonition-warning),.1)}.admonition.warning>.admonition-title:before,div.admonition.warning>.admonition-title:before{color:rgba(var(--pst-color-admonition-warning),1);content:var(--pst-icon-admonition-warning)}.admonition.danger,div.admonition.danger{border-color:rgba(var(--pst-color-admonition-danger),1)}.admonition.danger>.admonition-title,div.admonition.danger>.admonition-title{background-color:rgba(var(--pst-color-admonition-danger),.1)}.admonition.danger>.admonition-title:before,div.admonition.danger>.admonition-title:before{color:rgba(var(--pst-color-admonition-danger),1);content:var(--pst-icon-admonition-danger)}.admonition.error,div.admonition.error{border-color:rgba(var(--pst-color-admonition-error),1)}.admonition.error>.admonition-title,div.admonition.error>.admonition-title{background-color:rgba(var(--pst-color-admonition-error),.1)}.admonition.error>.admonition-title:before,div.admonition.error>.admonition-title:before{color:rgba(var(--pst-color-admonition-error),1);content:var(--pst-icon-admonition-error)}.admonition.hint,div.admonition.hint{border-color:rgba(var(--pst-color-admonition-hint),1)}.admonition.hint>.admonition-title,div.admonition.hint>.admonition-title{background-color:rgba(var(--pst-color-admonition-hint),.1)}.admonition.hint>.admonition-title:before,div.admonition.hint>.admonition-title:before{color:rgba(var(--pst-color-admonition-hint),1);content:var(--pst-icon-admonition-hint)}.admonition.tip,div.admonition.tip{border-color:rgba(var(--pst-color-admonition-tip),1)}.admonition.tip>.admonition-title,div.admonition.tip>.admonition-title{background-color:rgba(var(--pst-color-admonition-tip),.1)}.admonition.tip>.admonition-title:before,div.admonition.tip>.admonition-title:before{color:rgba(var(--pst-color-admonition-tip),1);content:var(--pst-icon-admonition-tip)}.admonition.important,div.admonition.important{border-color:rgba(var(--pst-color-admonition-important),1)}.admonition.important>.admonition-title,div.admonition.important>.admonition-title{background-color:rgba(var(--pst-color-admonition-important),.1)}.admonition.important>.admonition-title:before,div.admonition.important>.admonition-title:before{color:rgba(var(--pst-color-admonition-important),1);content:var(--pst-icon-admonition-important)}.admonition.note,div.admonition.note{border-color:rgba(var(--pst-color-admonition-note),1)}.admonition.note>.admonition-title,div.admonition.note>.admonition-title{background-color:rgba(var(--pst-color-admonition-note),.1)}.admonition.note>.admonition-title:before,div.admonition.note>.admonition-title:before{color:rgba(var(--pst-color-admonition-note),1);content:var(--pst-icon-admonition-note)}table.field-list{border-collapse:separate;border-spacing:10px;margin-left:1px}table.field-list th.field-name{padding:1px 8px 1px 5px;white-space:nowrap;background-color:#eee}table.field-list td.field-body p{font-style:italic}table.field-list td.field-body p>strong{font-style:normal}table.field-list td.field-body blockquote{border-left:none;margin:0 0 .3em;padding-left:30px}.table.autosummary td:first-child{white-space:nowrap}.sig{font-family:var(--pst-font-family-monospace)}.sig-inline.c-texpr,.sig-inline.cpp-texpr{font-family:unset}.sig.c .k,.sig.c .kt,.sig.c .m,.sig.c .s,.sig.c .sc,.sig.cpp .k,.sig.cpp .kt,.sig.cpp .m,.sig.cpp .s,.sig.cpp .sc{color:rgba(var(--pst-color-text-base),1)}.sig-name{color:rgba(var(--pst-color-inline-code),1)}blockquote{padding:0 1em;color:#6a737d;border-left:.25em solid #dfe2e5}dt.label>span.brackets:not(:only-child):before{content:"["}dt.label>span.brackets:not(:only-child):after{content:"]"}a.footnote-reference{vertical-align:super;font-size:small}div.deprecated{margin-bottom:10px;margin-top:10px;padding:7px;background-color:#f3e5e5;border:1px solid #eed3d7;border-radius:.5rem}div.deprecated p{color:#b94a48;display:inline}.topic{background-color:#eee}.seealso dd{margin-top:0;margin-bottom:0}.viewcode-back{font-family:var(--pst-font-family-base)}.viewcode-block:target{background-color:#f4debf;border-top:1px solid #ac9;border-bottom:1px solid #ac9}span.guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}footer{width:100%;border-top:1px solid #ccc;padding:10px}footer .footer-item p{margin-bottom:0}.bd-search{position:relative;padding:1rem 15px;margin-right:-15px;margin-left:-15px}.bd-search .icon{position:absolute;color:#a4a6a7;left:25px;top:25px}.bd-search input{border-radius:0;border:0;border-bottom:1px solid #e5e5e5;padding-left:35px}.bd-toc{-ms-flex-order:2;order:2;height:calc(100vh - 2rem);overflow-y:auto}@supports (position:-webkit-sticky) or (position:sticky){.bd-toc{position:-webkit-sticky;position:sticky;top:calc(var(--pst-header-height) + 20px);height:calc(100vh - 5rem);overflow-y:auto}}.bd-toc .onthispage{color:#a4a6a7}.section-nav{padding-left:0;border-left:1px solid #eee;border-bottom:none}.section-nav ul{padding-left:1rem}.toc-entry,.toc-entry a{display:block}.toc-entry a{padding:.125rem 1.5rem;color:rgba(var(--pst-color-toc-link),1)}@media (min-width:1200px){.toc-entry a{padding-right:0}}.toc-entry a:hover{color:rgba(var(--pst-color-toc-link-hover),1);text-decoration:none}.bd-sidebar{padding-top:1em}@media (min-width:720px){.bd-sidebar{border-right:1px solid rgba(0,0,0,.1)}@supports (position:-webkit-sticky) or (position:sticky){.bd-sidebar{position:-webkit-sticky;position:sticky;top:calc(var(--pst-header-height) + 20px);z-index:1000;height:calc(100vh - var(--pst-header-height) - 20px)}}}.bd-sidebar.no-sidebar{border-right:0}.bd-links{padding-top:1rem;padding-bottom:1rem;margin-right:-15px;margin-left:-15px}@media (min-width:720px){.bd-links{display:block}@supports (position:-webkit-sticky) or (position:sticky){.bd-links{max-height:calc(100vh - 11rem);overflow-y:auto}}}.bd-sidenav{display:none}.bd-content{padding-top:20px}.bd-content .section{max-width:100%}.bd-content .section table{display:block;overflow:auto}.bd-toc-link{display:block;padding:.25rem 1.5rem;font-weight:600;color:rgba(0,0,0,.65)}.bd-toc-link:hover{color:rgba(0,0,0,.85);text-decoration:none}.bd-toc-item.active{margin-bottom:1rem}.bd-toc-item.active:not(:first-child){margin-top:1rem}.bd-toc-item.active>.bd-toc-link{color:rgba(0,0,0,.85)}.bd-toc-item.active>.bd-toc-link:hover{background-color:transparent}.bd-toc-item.active>.bd-sidenav{display:block}nav.bd-links p.caption{font-size:var(--pst-sidebar-caption-font-size);text-transform:uppercase;font-weight:700;position:relative;margin-top:1.25em;margin-bottom:.5em;padding:0 1.5rem;color:rgba(var(--pst-color-sidebar-caption),1)}nav.bd-links p.caption:first-child{margin-top:0}.bd-sidebar .nav{font-size:var(--pst-sidebar-font-size)}.bd-sidebar .nav ul{list-style:none;padding:0 0 0 1.5rem}.bd-sidebar .nav li>a{display:block;padding:.25rem 1.5rem;color:rgba(var(--pst-color-sidebar-link),1)}.bd-sidebar .nav li>a:hover{color:rgba(var(--pst-color-sidebar-link-hover),1);text-decoration:none;background-color:transparent}.bd-sidebar .nav li>a.reference.external:after{font-family:Font Awesome\ 5 Free;font-weight:900;content:"\f35d";font-size:.75em;margin-left:.3em}.bd-sidebar .nav .active:hover>a,.bd-sidebar .nav .active>a{font-weight:600;color:rgba(var(--pst-color-sidebar-link-active),1)}.toc-h2{font-size:.85rem}.toc-h3{font-size:.75rem}.toc-h4{font-size:.65rem}.toc-entry>.nav-link.active{font-weight:600;color:#130654;color:rgba(var(--pst-color-toc-link-active),1);background-color:transparent;border-left:2px solid rgba(var(--pst-color-toc-link-active),1)}.nav-link:hover{border-style:none}#navbar-main-elements li.nav-item i{font-size:.7rem;padding-left:2px;vertical-align:middle}.bd-toc .nav .nav{display:none}.bd-toc .nav .nav.visible,.bd-toc .nav>.active>ul{display:block}.prev-next-area{margin:20px 0}.prev-next-area p{margin:0 .3em;line-height:1.3em}.prev-next-area i{font-size:1.2em}.prev-next-area a{display:flex;align-items:center;border:none;padding:10px;max-width:45%;overflow-x:hidden;color:rgba(0,0,0,.65);text-decoration:none}.prev-next-area a p.prev-next-title{color:rgba(var(--pst-color-link),1);font-weight:600;font-size:1.1em}.prev-next-area a:hover p.prev-next-title{text-decoration:underline}.prev-next-area a .prev-next-info{flex-direction:column;margin:0 .5em}.prev-next-area a .prev-next-info .prev-next-subtitle{text-transform:capitalize}.prev-next-area a.left-prev{float:left}.prev-next-area a.right-next{float:right}.prev-next-area a.right-next div.prev-next-info{text-align:right}.alert{padding-bottom:0}.alert-info a{color:#e83e8c}#navbar-icon-links i.fa,#navbar-icon-links i.fab,#navbar-icon-links i.far,#navbar-icon-links i.fas{vertical-align:middle;font-style:normal;font-size:1.5rem;line-height:1.25}#navbar-icon-links i.fa-github-square:before{color:#333}#navbar-icon-links i.fa-twitter-square:before{color:#55acee}#navbar-icon-links i.fa-gitlab:before{color:#548}#navbar-icon-links i.fa-bitbucket:before{color:#0052cc}.tocsection{border-left:1px solid #eee;padding:.3rem 1.5rem}.tocsection i{padding-right:.5rem}.editthispage{padding-top:2rem}.editthispage a{color:var(--pst-color-sidebar-link-active)}.xr-wrap[hidden]{display:block!important}.toctree-checkbox{position:absolute;display:none}.toctree-checkbox~ul{display:none}.toctree-checkbox~label i{transform:rotate(0deg)}.toctree-checkbox:checked~ul{display:block}.toctree-checkbox:checked~label i{transform:rotate(180deg)}.bd-sidebar li{position:relative}.bd-sidebar label{position:absolute;top:0;right:0;height:30px;width:30px;cursor:pointer;display:flex;justify-content:center;align-items:center}.bd-sidebar label:hover{background:rgba(var(--pst-color-sidebar-expander-background-hover),1)}.bd-sidebar label i{display:inline-block;font-size:.75rem;text-align:center}.bd-sidebar label i:hover{color:rgba(var(--pst-color-sidebar-link-hover),1)}.bd-sidebar li.has-children>.reference{padding-right:30px}div.doctest>div.highlight span.gp,span.linenos,table.highlighttable td.linenos{user-select:none;-webkit-user-select:text;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.docutils.container{padding-left:unset;padding-right:unset} \ No newline at end of file diff --git a/_build/html/_static/css/theme.css b/_build/html/_static/css/theme.css new file mode 100644 index 00000000..2e03fe37 --- /dev/null +++ b/_build/html/_static/css/theme.css @@ -0,0 +1,120 @@ +/* Provided by the Sphinx base theme template at build time */ +@import "../basic.css"; + +:root { + /***************************************************************************** + * Theme config + **/ + --pst-header-height: 60px; + + /***************************************************************************** + * Font size + **/ + --pst-font-size-base: 15px; /* base font size - applied at body / html level */ + + /* heading font sizes */ + --pst-font-size-h1: 36px; + --pst-font-size-h2: 32px; + --pst-font-size-h3: 26px; + --pst-font-size-h4: 21px; + --pst-font-size-h5: 18px; + --pst-font-size-h6: 16px; + + /* smaller then heading font sizes*/ + --pst-font-size-milli: 12px; + + --pst-sidebar-font-size: .9em; + --pst-sidebar-caption-font-size: .9em; + + /***************************************************************************** + * Font family + **/ + /* These are adapted from https://systemfontstack.com/ */ + --pst-font-family-base-system: -apple-system, BlinkMacSystemFont, Segoe UI, "Helvetica Neue", + Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol; + --pst-font-family-monospace-system: "SFMono-Regular", Menlo, Consolas, Monaco, + Liberation Mono, Lucida Console, monospace; + + --pst-font-family-base: var(--pst-font-family-base-system); + --pst-font-family-heading: var(--pst-font-family-base); + --pst-font-family-monospace: var(--pst-font-family-monospace-system); + + /***************************************************************************** + * Color + * + * Colors are defined in rgb string way, "red, green, blue" + **/ + --pst-color-primary: 19, 6, 84; + --pst-color-success: 40, 167, 69; + --pst-color-info: 0, 123, 255; /*23, 162, 184;*/ + --pst-color-warning: 255, 193, 7; + --pst-color-danger: 220, 53, 69; + --pst-color-text-base: 51, 51, 51; + + --pst-color-h1: var(--pst-color-primary); + --pst-color-h2: var(--pst-color-primary); + --pst-color-h3: var(--pst-color-text-base); + --pst-color-h4: var(--pst-color-text-base); + --pst-color-h5: var(--pst-color-text-base); + --pst-color-h6: var(--pst-color-text-base); + --pst-color-paragraph: var(--pst-color-text-base); + --pst-color-link: 0, 91, 129; + --pst-color-link-hover: 227, 46, 0; + --pst-color-headerlink: 198, 15, 15; + --pst-color-headerlink-hover: 255, 255, 255; + --pst-color-preformatted-text: 34, 34, 34; + --pst-color-preformatted-background: 250, 250, 250; + --pst-color-inline-code: 232, 62, 140; + + --pst-color-active-navigation: 19, 6, 84; + --pst-color-navbar-link: 77, 77, 77; + --pst-color-navbar-link-hover: var(--pst-color-active-navigation); + --pst-color-navbar-link-active: var(--pst-color-active-navigation); + --pst-color-sidebar-link: 77, 77, 77; + --pst-color-sidebar-link-hover: var(--pst-color-active-navigation); + --pst-color-sidebar-link-active: var(--pst-color-active-navigation); + --pst-color-sidebar-expander-background-hover: 244, 244, 244; + --pst-color-sidebar-caption: 77, 77, 77; + --pst-color-toc-link: 119, 117, 122; + --pst-color-toc-link-hover: var(--pst-color-active-navigation); + --pst-color-toc-link-active: var(--pst-color-active-navigation); + + /***************************************************************************** + * Icon + **/ + + /* font awesome icons*/ + --pst-icon-check-circle: '\f058'; + --pst-icon-info-circle: '\f05a'; + --pst-icon-exclamation-triangle: '\f071'; + --pst-icon-exclamation-circle: '\f06a'; + --pst-icon-times-circle: '\f057'; + --pst-icon-lightbulb: '\f0eb'; + + /***************************************************************************** + * Admonitions + **/ + + --pst-color-admonition-default: var(--pst-color-info); + --pst-color-admonition-note: var(--pst-color-info); + --pst-color-admonition-attention: var(--pst-color-warning); + --pst-color-admonition-caution: var(--pst-color-warning); + --pst-color-admonition-warning: var(--pst-color-warning); + --pst-color-admonition-danger: var(--pst-color-danger); + --pst-color-admonition-error: var(--pst-color-danger); + --pst-color-admonition-hint: var(--pst-color-success); + --pst-color-admonition-tip: var(--pst-color-success); + --pst-color-admonition-important: var(--pst-color-success); + + --pst-icon-admonition-default: var(--pst-icon-info-circle); + --pst-icon-admonition-note: var(--pst-icon-info-circle); + --pst-icon-admonition-attention: var(--pst-icon-exclamation-circle); + --pst-icon-admonition-caution: var(--pst-icon-exclamation-triangle); + --pst-icon-admonition-warning: var(--pst-icon-exclamation-triangle); + --pst-icon-admonition-danger: var(--pst-icon-exclamation-triangle); + --pst-icon-admonition-error: var(--pst-icon-times-circle); + --pst-icon-admonition-hint: var(--pst-icon-lightbulb); + --pst-icon-admonition-tip: var(--pst-icon-lightbulb); + --pst-icon-admonition-important: var(--pst-icon-exclamation-circle); + +} diff --git a/_build/html/_static/doctools.js b/_build/html/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/_build/html/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_build/html/_static/documentation_options.js b/_build/html/_static/documentation_options.js new file mode 100644 index 00000000..ba054525 --- /dev/null +++ b/_build/html/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '0.1.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: true, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_build/html/_static/file.png b/_build/html/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/_build/html/_static/file.png differ diff --git a/_build/html/_static/js/index.be7d3bbb2ef33a8344ce.js b/_build/html/_static/js/index.be7d3bbb2ef33a8344ce.js new file mode 100644 index 00000000..b71f7fcc --- /dev/null +++ b/_build/html/_static/js/index.be7d3bbb2ef33a8344ce.js @@ -0,0 +1,32 @@ +!function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=2)}([function(t,e){t.exports=jQuery},function(t,e,n){"use strict";n.r(e),function(t){ +/**! + * @fileOverview Kickass library to create and place poppers near their reference elements. + * @version 1.16.1 + * @license + * Copyright (c) 2016 Federico Zivolo and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var n="undefined"!=typeof window&&"undefined"!=typeof document&&"undefined"!=typeof navigator,i=function(){for(var t=["Edge","Trident","Firefox"],e=0;e=0)return 1;return 0}();var o=n&&window.Promise?function(t){var e=!1;return function(){e||(e=!0,window.Promise.resolve().then((function(){e=!1,t()})))}}:function(t){var e=!1;return function(){e||(e=!0,setTimeout((function(){e=!1,t()}),i))}};function r(t){return t&&"[object Function]"==={}.toString.call(t)}function s(t,e){if(1!==t.nodeType)return[];var n=t.ownerDocument.defaultView.getComputedStyle(t,null);return e?n[e]:n}function a(t){return"HTML"===t.nodeName?t:t.parentNode||t.host}function l(t){if(!t)return document.body;switch(t.nodeName){case"HTML":case"BODY":return t.ownerDocument.body;case"#document":return t.body}var e=s(t),n=e.overflow,i=e.overflowX,o=e.overflowY;return/(auto|scroll|overlay)/.test(n+o+i)?t:l(a(t))}function c(t){return t&&t.referenceNode?t.referenceNode:t}var u=n&&!(!window.MSInputMethodContext||!document.documentMode),h=n&&/MSIE 10/.test(navigator.userAgent);function f(t){return 11===t?u:10===t?h:u||h}function d(t){if(!t)return document.documentElement;for(var e=f(10)?document.body:null,n=t.offsetParent||null;n===e&&t.nextElementSibling;)n=(t=t.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&"BODY"!==i&&"HTML"!==i?-1!==["TH","TD","TABLE"].indexOf(n.nodeName)&&"static"===s(n,"position")?d(n):n:t?t.ownerDocument.documentElement:document.documentElement}function p(t){return null!==t.parentNode?p(t.parentNode):t}function m(t,e){if(!(t&&t.nodeType&&e&&e.nodeType))return document.documentElement;var n=t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING,i=n?t:e,o=n?e:t,r=document.createRange();r.setStart(i,0),r.setEnd(o,0);var s,a,l=r.commonAncestorContainer;if(t!==l&&e!==l||i.contains(o))return"BODY"===(a=(s=l).nodeName)||"HTML"!==a&&d(s.firstElementChild)!==s?d(l):l;var c=p(t);return c.host?m(c.host,e):m(t,p(e).host)}function g(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"top",n="top"===e?"scrollTop":"scrollLeft",i=t.nodeName;if("BODY"===i||"HTML"===i){var o=t.ownerDocument.documentElement,r=t.ownerDocument.scrollingElement||o;return r[n]}return t[n]}function v(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=g(e,"top"),o=g(e,"left"),r=n?-1:1;return t.top+=i*r,t.bottom+=i*r,t.left+=o*r,t.right+=o*r,t}function _(t,e){var n="x"===e?"Left":"Top",i="Left"===n?"Right":"Bottom";return parseFloat(t["border"+n+"Width"])+parseFloat(t["border"+i+"Width"])}function b(t,e,n,i){return Math.max(e["offset"+t],e["scroll"+t],n["client"+t],n["offset"+t],n["scroll"+t],f(10)?parseInt(n["offset"+t])+parseInt(i["margin"+("Height"===t?"Top":"Left")])+parseInt(i["margin"+("Height"===t?"Bottom":"Right")]):0)}function y(t){var e=t.body,n=t.documentElement,i=f(10)&&getComputedStyle(n);return{height:b("Height",e,n,i),width:b("Width",e,n,i)}}var w=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},E=function(){function t(t,e){for(var n=0;n2&&void 0!==arguments[2]&&arguments[2],i=f(10),o="HTML"===e.nodeName,r=D(t),a=D(e),c=l(t),u=s(e),h=parseFloat(u.borderTopWidth),d=parseFloat(u.borderLeftWidth);n&&o&&(a.top=Math.max(a.top,0),a.left=Math.max(a.left,0));var p=S({top:r.top-a.top-h,left:r.left-a.left-d,width:r.width,height:r.height});if(p.marginTop=0,p.marginLeft=0,!i&&o){var m=parseFloat(u.marginTop),g=parseFloat(u.marginLeft);p.top-=h-m,p.bottom-=h-m,p.left-=d-g,p.right-=d-g,p.marginTop=m,p.marginLeft=g}return(i&&!n?e.contains(c):e===c&&"BODY"!==c.nodeName)&&(p=v(p,e)),p}function k(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=t.ownerDocument.documentElement,i=N(t,n),o=Math.max(n.clientWidth,window.innerWidth||0),r=Math.max(n.clientHeight,window.innerHeight||0),s=e?0:g(n),a=e?0:g(n,"left"),l={top:s-i.top+i.marginTop,left:a-i.left+i.marginLeft,width:o,height:r};return S(l)}function O(t){var e=t.nodeName;if("BODY"===e||"HTML"===e)return!1;if("fixed"===s(t,"position"))return!0;var n=a(t);return!!n&&O(n)}function A(t){if(!t||!t.parentElement||f())return document.documentElement;for(var e=t.parentElement;e&&"none"===s(e,"transform");)e=e.parentElement;return e||document.documentElement}function I(t,e,n,i){var o=arguments.length>4&&void 0!==arguments[4]&&arguments[4],r={top:0,left:0},s=o?A(t):m(t,c(e));if("viewport"===i)r=k(s,o);else{var u=void 0;"scrollParent"===i?"BODY"===(u=l(a(e))).nodeName&&(u=t.ownerDocument.documentElement):u="window"===i?t.ownerDocument.documentElement:i;var h=N(u,s,o);if("HTML"!==u.nodeName||O(s))r=h;else{var f=y(t.ownerDocument),d=f.height,p=f.width;r.top+=h.top-h.marginTop,r.bottom=d+h.top,r.left+=h.left-h.marginLeft,r.right=p+h.left}}var g="number"==typeof(n=n||0);return r.left+=g?n:n.left||0,r.top+=g?n:n.top||0,r.right-=g?n:n.right||0,r.bottom-=g?n:n.bottom||0,r}function x(t){return t.width*t.height}function j(t,e,n,i,o){var r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;if(-1===t.indexOf("auto"))return t;var s=I(n,i,r,o),a={top:{width:s.width,height:e.top-s.top},right:{width:s.right-e.right,height:s.height},bottom:{width:s.width,height:s.bottom-e.bottom},left:{width:e.left-s.left,height:s.height}},l=Object.keys(a).map((function(t){return C({key:t},a[t],{area:x(a[t])})})).sort((function(t,e){return e.area-t.area})),c=l.filter((function(t){var e=t.width,i=t.height;return e>=n.clientWidth&&i>=n.clientHeight})),u=c.length>0?c[0].key:l[0].key,h=t.split("-")[1];return u+(h?"-"+h:"")}function L(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,o=i?A(e):m(e,c(n));return N(n,o,i)}function P(t){var e=t.ownerDocument.defaultView.getComputedStyle(t),n=parseFloat(e.marginTop||0)+parseFloat(e.marginBottom||0),i=parseFloat(e.marginLeft||0)+parseFloat(e.marginRight||0);return{width:t.offsetWidth+i,height:t.offsetHeight+n}}function F(t){var e={left:"right",right:"left",bottom:"top",top:"bottom"};return t.replace(/left|right|bottom|top/g,(function(t){return e[t]}))}function R(t,e,n){n=n.split("-")[0];var i=P(t),o={width:i.width,height:i.height},r=-1!==["right","left"].indexOf(n),s=r?"top":"left",a=r?"left":"top",l=r?"height":"width",c=r?"width":"height";return o[s]=e[s]+e[l]/2-i[l]/2,o[a]=n===a?e[a]-i[c]:e[F(a)],o}function M(t,e){return Array.prototype.find?t.find(e):t.filter(e)[0]}function B(t,e,n){return(void 0===n?t:t.slice(0,function(t,e,n){if(Array.prototype.findIndex)return t.findIndex((function(t){return t[e]===n}));var i=M(t,(function(t){return t[e]===n}));return t.indexOf(i)}(t,"name",n))).forEach((function(t){t.function&&console.warn("`modifier.function` is deprecated, use `modifier.fn`!");var n=t.function||t.fn;t.enabled&&r(n)&&(e.offsets.popper=S(e.offsets.popper),e.offsets.reference=S(e.offsets.reference),e=n(e,t))})),e}function H(){if(!this.state.isDestroyed){var t={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};t.offsets.reference=L(this.state,this.popper,this.reference,this.options.positionFixed),t.placement=j(this.options.placement,t.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),t.originalPlacement=t.placement,t.positionFixed=this.options.positionFixed,t.offsets.popper=R(this.popper,t.offsets.reference,t.placement),t.offsets.popper.position=this.options.positionFixed?"fixed":"absolute",t=B(this.modifiers,t),this.state.isCreated?this.options.onUpdate(t):(this.state.isCreated=!0,this.options.onCreate(t))}}function q(t,e){return t.some((function(t){var n=t.name;return t.enabled&&n===e}))}function Q(t){for(var e=[!1,"ms","Webkit","Moz","O"],n=t.charAt(0).toUpperCase()+t.slice(1),i=0;i1&&void 0!==arguments[1]&&arguments[1],n=Z.indexOf(t),i=Z.slice(n+1).concat(Z.slice(0,n));return e?i.reverse():i}var et="flip",nt="clockwise",it="counterclockwise";function ot(t,e,n,i){var o=[0,0],r=-1!==["right","left"].indexOf(i),s=t.split(/(\+|\-)/).map((function(t){return t.trim()})),a=s.indexOf(M(s,(function(t){return-1!==t.search(/,|\s/)})));s[a]&&-1===s[a].indexOf(",")&&console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.");var l=/\s*,\s*|\s+/,c=-1!==a?[s.slice(0,a).concat([s[a].split(l)[0]]),[s[a].split(l)[1]].concat(s.slice(a+1))]:[s];return(c=c.map((function(t,i){var o=(1===i?!r:r)?"height":"width",s=!1;return t.reduce((function(t,e){return""===t[t.length-1]&&-1!==["+","-"].indexOf(e)?(t[t.length-1]=e,s=!0,t):s?(t[t.length-1]+=e,s=!1,t):t.concat(e)}),[]).map((function(t){return function(t,e,n,i){var o=t.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+o[1],s=o[2];if(!r)return t;if(0===s.indexOf("%")){var a=void 0;switch(s){case"%p":a=n;break;case"%":case"%r":default:a=i}return S(a)[e]/100*r}if("vh"===s||"vw"===s){return("vh"===s?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0))/100*r}return r}(t,o,e,n)}))}))).forEach((function(t,e){t.forEach((function(n,i){X(n)&&(o[e]+=n*("-"===t[i-1]?-1:1))}))})),o}var rt={placement:"bottom",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(t){var e=t.placement,n=e.split("-")[0],i=e.split("-")[1];if(i){var o=t.offsets,r=o.reference,s=o.popper,a=-1!==["bottom","top"].indexOf(n),l=a?"left":"top",c=a?"width":"height",u={start:T({},l,r[l]),end:T({},l,r[l]+r[c]-s[c])};t.offsets.popper=C({},s,u[i])}return t}},offset:{order:200,enabled:!0,fn:function(t,e){var n=e.offset,i=t.placement,o=t.offsets,r=o.popper,s=o.reference,a=i.split("-")[0],l=void 0;return l=X(+n)?[+n,0]:ot(n,r,s,a),"left"===a?(r.top+=l[0],r.left-=l[1]):"right"===a?(r.top+=l[0],r.left+=l[1]):"top"===a?(r.left+=l[0],r.top-=l[1]):"bottom"===a&&(r.left+=l[0],r.top+=l[1]),t.popper=r,t},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(t,e){var n=e.boundariesElement||d(t.instance.popper);t.instance.reference===n&&(n=d(n));var i=Q("transform"),o=t.instance.popper.style,r=o.top,s=o.left,a=o[i];o.top="",o.left="",o[i]="";var l=I(t.instance.popper,t.instance.reference,e.padding,n,t.positionFixed);o.top=r,o.left=s,o[i]=a,e.boundaries=l;var c=e.priority,u=t.offsets.popper,h={primary:function(t){var n=u[t];return u[t]l[t]&&!e.escapeWithReference&&(i=Math.min(u[n],l[t]-("right"===t?u.width:u.height))),T({},n,i)}};return c.forEach((function(t){var e=-1!==["left","top"].indexOf(t)?"primary":"secondary";u=C({},u,h[e](t))})),t.offsets.popper=u,t},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(t){var e=t.offsets,n=e.popper,i=e.reference,o=t.placement.split("-")[0],r=Math.floor,s=-1!==["top","bottom"].indexOf(o),a=s?"right":"bottom",l=s?"left":"top",c=s?"width":"height";return n[a]r(i[a])&&(t.offsets.popper[l]=r(i[a])),t}},arrow:{order:500,enabled:!0,fn:function(t,e){var n;if(!G(t.instance.modifiers,"arrow","keepTogether"))return t;var i=e.element;if("string"==typeof i){if(!(i=t.instance.popper.querySelector(i)))return t}else if(!t.instance.popper.contains(i))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),t;var o=t.placement.split("-")[0],r=t.offsets,a=r.popper,l=r.reference,c=-1!==["left","right"].indexOf(o),u=c?"height":"width",h=c?"Top":"Left",f=h.toLowerCase(),d=c?"left":"top",p=c?"bottom":"right",m=P(i)[u];l[p]-ma[p]&&(t.offsets.popper[f]+=l[f]+m-a[p]),t.offsets.popper=S(t.offsets.popper);var g=l[f]+l[u]/2-m/2,v=s(t.instance.popper),_=parseFloat(v["margin"+h]),b=parseFloat(v["border"+h+"Width"]),y=g-t.offsets.popper[f]-_-b;return y=Math.max(Math.min(a[u]-m,y),0),t.arrowElement=i,t.offsets.arrow=(T(n={},f,Math.round(y)),T(n,d,""),n),t},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(t,e){if(q(t.instance.modifiers,"inner"))return t;if(t.flipped&&t.placement===t.originalPlacement)return t;var n=I(t.instance.popper,t.instance.reference,e.padding,e.boundariesElement,t.positionFixed),i=t.placement.split("-")[0],o=F(i),r=t.placement.split("-")[1]||"",s=[];switch(e.behavior){case et:s=[i,o];break;case nt:s=tt(i);break;case it:s=tt(i,!0);break;default:s=e.behavior}return s.forEach((function(a,l){if(i!==a||s.length===l+1)return t;i=t.placement.split("-")[0],o=F(i);var c=t.offsets.popper,u=t.offsets.reference,h=Math.floor,f="left"===i&&h(c.right)>h(u.left)||"right"===i&&h(c.left)h(u.top)||"bottom"===i&&h(c.top)h(n.right),m=h(c.top)h(n.bottom),v="left"===i&&d||"right"===i&&p||"top"===i&&m||"bottom"===i&&g,_=-1!==["top","bottom"].indexOf(i),b=!!e.flipVariations&&(_&&"start"===r&&d||_&&"end"===r&&p||!_&&"start"===r&&m||!_&&"end"===r&&g),y=!!e.flipVariationsByContent&&(_&&"start"===r&&p||_&&"end"===r&&d||!_&&"start"===r&&g||!_&&"end"===r&&m),w=b||y;(f||v||w)&&(t.flipped=!0,(f||v)&&(i=s[l+1]),w&&(r=function(t){return"end"===t?"start":"start"===t?"end":t}(r)),t.placement=i+(r?"-"+r:""),t.offsets.popper=C({},t.offsets.popper,R(t.instance.popper,t.offsets.reference,t.placement)),t=B(t.instance.modifiers,t,"flip"))})),t},behavior:"flip",padding:5,boundariesElement:"viewport",flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(t){var e=t.placement,n=e.split("-")[0],i=t.offsets,o=i.popper,r=i.reference,s=-1!==["left","right"].indexOf(n),a=-1===["top","left"].indexOf(n);return o[s?"left":"top"]=r[n]-(a?o[s?"width":"height"]:0),t.placement=F(e),t.offsets.popper=S(o),t}},hide:{order:800,enabled:!0,fn:function(t){if(!G(t.instance.modifiers,"hide","preventOverflow"))return t;var e=t.offsets.reference,n=M(t.instance.modifiers,(function(t){return"preventOverflow"===t.name})).boundaries;if(e.bottomn.right||e.top>n.bottom||e.right2&&void 0!==arguments[2]?arguments[2]:{};w(this,t),this.scheduleUpdate=function(){return requestAnimationFrame(i.update)},this.update=o(this.update.bind(this)),this.options=C({},t.Defaults,s),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=e&&e.jquery?e[0]:e,this.popper=n&&n.jquery?n[0]:n,this.options.modifiers={},Object.keys(C({},t.Defaults.modifiers,s.modifiers)).forEach((function(e){i.options.modifiers[e]=C({},t.Defaults.modifiers[e]||{},s.modifiers?s.modifiers[e]:{})})),this.modifiers=Object.keys(this.options.modifiers).map((function(t){return C({name:t},i.options.modifiers[t])})).sort((function(t,e){return t.order-e.order})),this.modifiers.forEach((function(t){t.enabled&&r(t.onLoad)&&t.onLoad(i.reference,i.popper,i.options,t,i.state)})),this.update();var a=this.options.eventsEnabled;a&&this.enableEventListeners(),this.state.eventsEnabled=a}return E(t,[{key:"update",value:function(){return H.call(this)}},{key:"destroy",value:function(){return W.call(this)}},{key:"enableEventListeners",value:function(){return Y.call(this)}},{key:"disableEventListeners",value:function(){return z.call(this)}}]),t}();st.Utils=("undefined"!=typeof window?window:t).PopperUtils,st.placements=J,st.Defaults=rt,e.default=st}.call(this,n(4))},function(t,e,n){t.exports=n(5)},function(t,e,n){ +/*! + * Bootstrap v4.5.0 (https://getbootstrap.com/) + * Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +!function(t,e,n){"use strict";function i(t,e){for(var n=0;n=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}};c.jQueryDetection(),e.fn.emulateTransitionEnd=l,e.event.special[c.TRANSITION_END]={bindType:"transitionend",delegateType:"transitionend",handle:function(t){if(e(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var u="alert",h=e.fn[u],f=function(){function t(t){this._element=t}var n=t.prototype;return n.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},n.dispose=function(){e.removeData(this._element,"bs.alert"),this._element=null},n._getRootElement=function(t){var n=c.getSelectorFromElement(t),i=!1;return n&&(i=document.querySelector(n)),i||(i=e(t).closest(".alert")[0]),i},n._triggerCloseEvent=function(t){var n=e.Event("close.bs.alert");return e(t).trigger(n),n},n._removeElement=function(t){var n=this;if(e(t).removeClass("show"),e(t).hasClass("fade")){var i=c.getTransitionDurationFromElement(t);e(t).one(c.TRANSITION_END,(function(e){return n._destroyElement(t,e)})).emulateTransitionEnd(i)}else this._destroyElement(t)},n._destroyElement=function(t){e(t).detach().trigger("closed.bs.alert").remove()},t._jQueryInterface=function(n){return this.each((function(){var i=e(this),o=i.data("bs.alert");o||(o=new t(this),i.data("bs.alert",o)),"close"===n&&o[n](this)}))},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},o(t,null,[{key:"VERSION",get:function(){return"4.5.0"}}]),t}();e(document).on("click.bs.alert.data-api",'[data-dismiss="alert"]',f._handleDismiss(new f)),e.fn[u]=f._jQueryInterface,e.fn[u].Constructor=f,e.fn[u].noConflict=function(){return e.fn[u]=h,f._jQueryInterface};var d=e.fn.button,p=function(){function t(t){this._element=t}var n=t.prototype;return n.toggle=function(){var t=!0,n=!0,i=e(this._element).closest('[data-toggle="buttons"]')[0];if(i){var o=this._element.querySelector('input:not([type="hidden"])');if(o){if("radio"===o.type)if(o.checked&&this._element.classList.contains("active"))t=!1;else{var r=i.querySelector(".active");r&&e(r).removeClass("active")}t&&("checkbox"!==o.type&&"radio"!==o.type||(o.checked=!this._element.classList.contains("active")),e(o).trigger("change")),o.focus(),n=!1}}this._element.hasAttribute("disabled")||this._element.classList.contains("disabled")||(n&&this._element.setAttribute("aria-pressed",!this._element.classList.contains("active")),t&&e(this._element).toggleClass("active"))},n.dispose=function(){e.removeData(this._element,"bs.button"),this._element=null},t._jQueryInterface=function(n){return this.each((function(){var i=e(this).data("bs.button");i||(i=new t(this),e(this).data("bs.button",i)),"toggle"===n&&i[n]()}))},o(t,null,[{key:"VERSION",get:function(){return"4.5.0"}}]),t}();e(document).on("click.bs.button.data-api",'[data-toggle^="button"]',(function(t){var n=t.target,i=n;if(e(n).hasClass("btn")||(n=e(n).closest(".btn")[0]),!n||n.hasAttribute("disabled")||n.classList.contains("disabled"))t.preventDefault();else{var o=n.querySelector('input:not([type="hidden"])');if(o&&(o.hasAttribute("disabled")||o.classList.contains("disabled")))return void t.preventDefault();"LABEL"===i.tagName&&o&&"checkbox"===o.type&&t.preventDefault(),p._jQueryInterface.call(e(n),"toggle")}})).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',(function(t){var n=e(t.target).closest(".btn")[0];e(n).toggleClass("focus",/^focus(in)?$/.test(t.type))})),e(window).on("load.bs.button.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-toggle="buttons"] .btn')),e=0,n=t.length;e0,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var n=t.prototype;return n.next=function(){this._isSliding||this._slide("next")},n.nextWhenVisible=function(){!document.hidden&&e(this._element).is(":visible")&&"hidden"!==e(this._element).css("visibility")&&this.next()},n.prev=function(){this._isSliding||this._slide("prev")},n.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(".carousel-item-next, .carousel-item-prev")&&(c.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},n.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},n.to=function(t){var n=this;this._activeElement=this._element.querySelector(".active.carousel-item");var i=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)e(this._element).one("slid.bs.carousel",(function(){return n.to(t)}));else{if(i===t)return this.pause(),void this.cycle();var o=t>i?"next":"prev";this._slide(o,this._items[t])}},n.dispose=function(){e(this._element).off(g),e.removeData(this._element,"bs.carousel"),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},n._getConfig=function(t){return t=a(a({},_),t),c.typeCheckConfig(m,t,b),t},n._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;this.touchDeltaX=0,e>0&&this.prev(),e<0&&this.next()}},n._addEventListeners=function(){var t=this;this._config.keyboard&&e(this._element).on("keydown.bs.carousel",(function(e){return t._keydown(e)})),"hover"===this._config.pause&&e(this._element).on("mouseenter.bs.carousel",(function(e){return t.pause(e)})).on("mouseleave.bs.carousel",(function(e){return t.cycle(e)})),this._config.touch&&this._addTouchEventListeners()},n._addTouchEventListeners=function(){var t=this;if(this._touchSupported){var n=function(e){t._pointerEvent&&y[e.originalEvent.pointerType.toUpperCase()]?t.touchStartX=e.originalEvent.clientX:t._pointerEvent||(t.touchStartX=e.originalEvent.touches[0].clientX)},i=function(e){t._pointerEvent&&y[e.originalEvent.pointerType.toUpperCase()]&&(t.touchDeltaX=e.originalEvent.clientX-t.touchStartX),t._handleSwipe(),"hover"===t._config.pause&&(t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout((function(e){return t.cycle(e)}),500+t._config.interval))};e(this._element.querySelectorAll(".carousel-item img")).on("dragstart.bs.carousel",(function(t){return t.preventDefault()})),this._pointerEvent?(e(this._element).on("pointerdown.bs.carousel",(function(t){return n(t)})),e(this._element).on("pointerup.bs.carousel",(function(t){return i(t)})),this._element.classList.add("pointer-event")):(e(this._element).on("touchstart.bs.carousel",(function(t){return n(t)})),e(this._element).on("touchmove.bs.carousel",(function(e){return function(e){e.originalEvent.touches&&e.originalEvent.touches.length>1?t.touchDeltaX=0:t.touchDeltaX=e.originalEvent.touches[0].clientX-t.touchStartX}(e)})),e(this._element).on("touchend.bs.carousel",(function(t){return i(t)})))}},n._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},n._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(".carousel-item")):[],this._items.indexOf(t)},n._getItemByDirection=function(t,e){var n="next"===t,i="prev"===t,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=(o+("prev"===t?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},n._triggerSlideEvent=function(t,n){var i=this._getItemIndex(t),o=this._getItemIndex(this._element.querySelector(".active.carousel-item")),r=e.Event("slide.bs.carousel",{relatedTarget:t,direction:n,from:o,to:i});return e(this._element).trigger(r),r},n._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var n=[].slice.call(this._indicatorsElement.querySelectorAll(".active"));e(n).removeClass("active");var i=this._indicatorsElement.children[this._getItemIndex(t)];i&&e(i).addClass("active")}},n._slide=function(t,n){var i,o,r,s=this,a=this._element.querySelector(".active.carousel-item"),l=this._getItemIndex(a),u=n||a&&this._getItemByDirection(t,a),h=this._getItemIndex(u),f=Boolean(this._interval);if("next"===t?(i="carousel-item-left",o="carousel-item-next",r="left"):(i="carousel-item-right",o="carousel-item-prev",r="right"),u&&e(u).hasClass("active"))this._isSliding=!1;else if(!this._triggerSlideEvent(u,r).isDefaultPrevented()&&a&&u){this._isSliding=!0,f&&this.pause(),this._setActiveIndicatorElement(u);var d=e.Event("slid.bs.carousel",{relatedTarget:u,direction:r,from:l,to:h});if(e(this._element).hasClass("slide")){e(u).addClass(o),c.reflow(u),e(a).addClass(i),e(u).addClass(i);var p=parseInt(u.getAttribute("data-interval"),10);p?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=p):this._config.interval=this._config.defaultInterval||this._config.interval;var m=c.getTransitionDurationFromElement(a);e(a).one(c.TRANSITION_END,(function(){e(u).removeClass(i+" "+o).addClass("active"),e(a).removeClass("active "+o+" "+i),s._isSliding=!1,setTimeout((function(){return e(s._element).trigger(d)}),0)})).emulateTransitionEnd(m)}else e(a).removeClass("active"),e(u).addClass("active"),this._isSliding=!1,e(this._element).trigger(d);f&&this.cycle()}},t._jQueryInterface=function(n){return this.each((function(){var i=e(this).data("bs.carousel"),o=a(a({},_),e(this).data());"object"==typeof n&&(o=a(a({},o),n));var r="string"==typeof n?n:o.slide;if(i||(i=new t(this,o),e(this).data("bs.carousel",i)),"number"==typeof n)i.to(n);else if("string"==typeof r){if(void 0===i[r])throw new TypeError('No method named "'+r+'"');i[r]()}else o.interval&&o.ride&&(i.pause(),i.cycle())}))},t._dataApiClickHandler=function(n){var i=c.getSelectorFromElement(this);if(i){var o=e(i)[0];if(o&&e(o).hasClass("carousel")){var r=a(a({},e(o).data()),e(this).data()),s=this.getAttribute("data-slide-to");s&&(r.interval=!1),t._jQueryInterface.call(e(o),r),s&&e(o).data("bs.carousel").to(s),n.preventDefault()}}},o(t,null,[{key:"VERSION",get:function(){return"4.5.0"}},{key:"Default",get:function(){return _}}]),t}();e(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",w._dataApiClickHandler),e(window).on("load.bs.carousel.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-ride="carousel"]')),n=0,i=t.length;n0&&(this._selector=s,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var n=t.prototype;return n.toggle=function(){e(this._element).hasClass("show")?this.hide():this.show()},n.show=function(){var n,i,o=this;if(!(this._isTransitioning||e(this._element).hasClass("show")||(this._parent&&0===(n=[].slice.call(this._parent.querySelectorAll(".show, .collapsing")).filter((function(t){return"string"==typeof o._config.parent?t.getAttribute("data-parent")===o._config.parent:t.classList.contains("collapse")}))).length&&(n=null),n&&(i=e(n).not(this._selector).data("bs.collapse"))&&i._isTransitioning))){var r=e.Event("show.bs.collapse");if(e(this._element).trigger(r),!r.isDefaultPrevented()){n&&(t._jQueryInterface.call(e(n).not(this._selector),"hide"),i||e(n).data("bs.collapse",null));var s=this._getDimension();e(this._element).removeClass("collapse").addClass("collapsing"),this._element.style[s]=0,this._triggerArray.length&&e(this._triggerArray).removeClass("collapsed").attr("aria-expanded",!0),this.setTransitioning(!0);var a="scroll"+(s[0].toUpperCase()+s.slice(1)),l=c.getTransitionDurationFromElement(this._element);e(this._element).one(c.TRANSITION_END,(function(){e(o._element).removeClass("collapsing").addClass("collapse show"),o._element.style[s]="",o.setTransitioning(!1),e(o._element).trigger("shown.bs.collapse")})).emulateTransitionEnd(l),this._element.style[s]=this._element[a]+"px"}}},n.hide=function(){var t=this;if(!this._isTransitioning&&e(this._element).hasClass("show")){var n=e.Event("hide.bs.collapse");if(e(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",c.reflow(this._element),e(this._element).addClass("collapsing").removeClass("collapse show");var o=this._triggerArray.length;if(o>0)for(var r=0;r0},i._getOffset=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=a(a({},e.offsets),t._config.offset(e.offsets,t._element)||{}),e}:e.offset=this._config.offset,e},i._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),a(a({},t),this._config.popperConfig)},t._jQueryInterface=function(n){return this.each((function(){var i=e(this).data("bs.dropdown");if(i||(i=new t(this,"object"==typeof n?n:null),e(this).data("bs.dropdown",i)),"string"==typeof n){if(void 0===i[n])throw new TypeError('No method named "'+n+'"');i[n]()}}))},t._clearMenus=function(n){if(!n||3!==n.which&&("keyup"!==n.type||9===n.which))for(var i=[].slice.call(document.querySelectorAll('[data-toggle="dropdown"]')),o=0,r=i.length;o0&&s--,40===n.which&&sdocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},n._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},n._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right)
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:M,popperConfig:null},K={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},$=function(){function t(t,e){if(void 0===n)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var i=t.prototype;return i.enable=function(){this._isEnabled=!0},i.disable=function(){this._isEnabled=!1},i.toggleEnabled=function(){this._isEnabled=!this._isEnabled},i.toggle=function(t){if(this._isEnabled)if(t){var n=this.constructor.DATA_KEY,i=e(t.currentTarget).data(n);i||(i=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(e(this.getTipElement()).hasClass("show"))return void this._leave(null,this);this._enter(null,this)}},i.dispose=function(){clearTimeout(this._timeout),e.removeData(this.element,this.constructor.DATA_KEY),e(this.element).off(this.constructor.EVENT_KEY),e(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&e(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},i.show=function(){var t=this;if("none"===e(this.element).css("display"))throw new Error("Please use show on visible elements");var i=e.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){e(this.element).trigger(i);var o=c.findShadowRoot(this.element),r=e.contains(null!==o?o:this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!r)return;var s=this.getTipElement(),a=c.getUID(this.constructor.NAME);s.setAttribute("id",a),this.element.setAttribute("aria-describedby",a),this.setContent(),this.config.animation&&e(s).addClass("fade");var l="function"==typeof this.config.placement?this.config.placement.call(this,s,this.element):this.config.placement,u=this._getAttachment(l);this.addAttachmentClass(u);var h=this._getContainer();e(s).data(this.constructor.DATA_KEY,this),e.contains(this.element.ownerDocument.documentElement,this.tip)||e(s).appendTo(h),e(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,s,this._getPopperConfig(u)),e(s).addClass("show"),"ontouchstart"in document.documentElement&&e(document.body).children().on("mouseover",null,e.noop);var f=function(){t.config.animation&&t._fixTransition();var n=t._hoverState;t._hoverState=null,e(t.element).trigger(t.constructor.Event.SHOWN),"out"===n&&t._leave(null,t)};if(e(this.tip).hasClass("fade")){var d=c.getTransitionDurationFromElement(this.tip);e(this.tip).one(c.TRANSITION_END,f).emulateTransitionEnd(d)}else f()}},i.hide=function(t){var n=this,i=this.getTipElement(),o=e.Event(this.constructor.Event.HIDE),r=function(){"show"!==n._hoverState&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),e(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),t&&t()};if(e(this.element).trigger(o),!o.isDefaultPrevented()){if(e(i).removeClass("show"),"ontouchstart"in document.documentElement&&e(document.body).children().off("mouseover",null,e.noop),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,e(this.tip).hasClass("fade")){var s=c.getTransitionDurationFromElement(i);e(i).one(c.TRANSITION_END,r).emulateTransitionEnd(s)}else r();this._hoverState=""}},i.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},i.isWithContent=function(){return Boolean(this.getTitle())},i.addAttachmentClass=function(t){e(this.getTipElement()).addClass("bs-tooltip-"+t)},i.getTipElement=function(){return this.tip=this.tip||e(this.config.template)[0],this.tip},i.setContent=function(){var t=this.getTipElement();this.setElementContent(e(t.querySelectorAll(".tooltip-inner")),this.getTitle()),e(t).removeClass("fade show")},i.setElementContent=function(t,n){"object"!=typeof n||!n.nodeType&&!n.jquery?this.config.html?(this.config.sanitize&&(n=q(n,this.config.whiteList,this.config.sanitizeFn)),t.html(n)):t.text(n):this.config.html?e(n).parent().is(t)||t.empty().append(n):t.text(e(n).text())},i.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},i._getPopperConfig=function(t){var e=this;return a(a({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),this.config.popperConfig)},i._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=a(a({},e.offsets),t.config.offset(e.offsets,t.element)||{}),e}:e.offset=this.config.offset,e},i._getContainer=function(){return!1===this.config.container?document.body:c.isElement(this.config.container)?e(this.config.container):e(document).find(this.config.container)},i._getAttachment=function(t){return z[t.toUpperCase()]},i._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach((function(n){if("click"===n)e(t.element).on(t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if("manual"!==n){var i="hover"===n?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,o="hover"===n?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;e(t.element).on(i,t.config.selector,(function(e){return t._enter(e)})).on(o,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t.element&&t.hide()},e(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=a(a({},this.config),{},{trigger:"manual",selector:""}):this._fixTitle()},i._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},i._enter=function(t,n){var i=this.constructor.DATA_KEY;(n=n||e(t.currentTarget).data(i))||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(i,n)),t&&(n._activeTrigger["focusin"===t.type?"focus":"hover"]=!0),e(n.getTipElement()).hasClass("show")||"show"===n._hoverState?n._hoverState="show":(clearTimeout(n._timeout),n._hoverState="show",n.config.delay&&n.config.delay.show?n._timeout=setTimeout((function(){"show"===n._hoverState&&n.show()}),n.config.delay.show):n.show())},i._leave=function(t,n){var i=this.constructor.DATA_KEY;(n=n||e(t.currentTarget).data(i))||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(i,n)),t&&(n._activeTrigger["focusout"===t.type?"focus":"hover"]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState="out",n.config.delay&&n.config.delay.hide?n._timeout=setTimeout((function(){"out"===n._hoverState&&n.hide()}),n.config.delay.hide):n.hide())},i._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},i._getConfig=function(t){var n=e(this.element).data();return Object.keys(n).forEach((function(t){-1!==V.indexOf(t)&&delete n[t]})),"number"==typeof(t=a(a(a({},this.constructor.Default),n),"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),c.typeCheckConfig(Q,t,this.constructor.DefaultType),t.sanitize&&(t.template=q(t.template,t.whiteList,t.sanitizeFn)),t},i._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},i._cleanTipClass=function(){var t=e(this.getTipElement()),n=t.attr("class").match(U);null!==n&&n.length&&t.removeClass(n.join(""))},i._handlePopperPlacementChange=function(t){this.tip=t.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},i._fixTransition=function(){var t=this.getTipElement(),n=this.config.animation;null===t.getAttribute("x-placement")&&(e(t).removeClass("fade"),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},t._jQueryInterface=function(n){return this.each((function(){var i=e(this).data("bs.tooltip"),o="object"==typeof n&&n;if((i||!/dispose|hide/.test(n))&&(i||(i=new t(this,o),e(this).data("bs.tooltip",i)),"string"==typeof n)){if(void 0===i[n])throw new TypeError('No method named "'+n+'"');i[n]()}}))},o(t,null,[{key:"VERSION",get:function(){return"4.5.0"}},{key:"Default",get:function(){return X}},{key:"NAME",get:function(){return Q}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return K}},{key:"EVENT_KEY",get:function(){return".bs.tooltip"}},{key:"DefaultType",get:function(){return Y}}]),t}();e.fn[Q]=$._jQueryInterface,e.fn[Q].Constructor=$,e.fn[Q].noConflict=function(){return e.fn[Q]=W,$._jQueryInterface};var G="popover",J=e.fn[G],Z=new RegExp("(^|\\s)bs-popover\\S+","g"),tt=a(a({},$.Default),{},{placement:"right",trigger:"click",content:"",template:''}),et=a(a({},$.DefaultType),{},{content:"(string|element|function)"}),nt={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"},it=function(t){var n,i;function r(){return t.apply(this,arguments)||this}i=t,(n=r).prototype=Object.create(i.prototype),n.prototype.constructor=n,n.__proto__=i;var s=r.prototype;return s.isWithContent=function(){return this.getTitle()||this._getContent()},s.addAttachmentClass=function(t){e(this.getTipElement()).addClass("bs-popover-"+t)},s.getTipElement=function(){return this.tip=this.tip||e(this.config.template)[0],this.tip},s.setContent=function(){var t=e(this.getTipElement());this.setElementContent(t.find(".popover-header"),this.getTitle());var n=this._getContent();"function"==typeof n&&(n=n.call(this.element)),this.setElementContent(t.find(".popover-body"),n),t.removeClass("fade show")},s._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},s._cleanTipClass=function(){var t=e(this.getTipElement()),n=t.attr("class").match(Z);null!==n&&n.length>0&&t.removeClass(n.join(""))},r._jQueryInterface=function(t){return this.each((function(){var n=e(this).data("bs.popover"),i="object"==typeof t?t:null;if((n||!/dispose|hide/.test(t))&&(n||(n=new r(this,i),e(this).data("bs.popover",n)),"string"==typeof t)){if(void 0===n[t])throw new TypeError('No method named "'+t+'"');n[t]()}}))},o(r,null,[{key:"VERSION",get:function(){return"4.5.0"}},{key:"Default",get:function(){return tt}},{key:"NAME",get:function(){return G}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return nt}},{key:"EVENT_KEY",get:function(){return".bs.popover"}},{key:"DefaultType",get:function(){return et}}]),r}($);e.fn[G]=it._jQueryInterface,e.fn[G].Constructor=it,e.fn[G].noConflict=function(){return e.fn[G]=J,it._jQueryInterface};var ot="scrollspy",rt=e.fn[ot],st={offset:10,method:"auto",target:""},at={offset:"number",method:"string",target:"(string|element)"},lt=function(){function t(t,n){var i=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(n),this._selector=this._config.target+" .nav-link,"+this._config.target+" .list-group-item,"+this._config.target+" .dropdown-item",this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,e(this._scrollElement).on("scroll.bs.scrollspy",(function(t){return i._process(t)})),this.refresh(),this._process()}var n=t.prototype;return n.refresh=function(){var t=this,n=this._scrollElement===this._scrollElement.window?"offset":"position",i="auto"===this._config.method?n:this._config.method,o="position"===i?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(t){var n,r=c.getSelectorFromElement(t);if(r&&(n=document.querySelector(r)),n){var s=n.getBoundingClientRect();if(s.width||s.height)return[e(n)[i]().top+o,r]}return null})).filter((function(t){return t})).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},n.dispose=function(){e.removeData(this._element,"bs.scrollspy"),e(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},n._getConfig=function(t){if("string"!=typeof(t=a(a({},st),"object"==typeof t&&t?t:{})).target&&c.isElement(t.target)){var n=e(t.target).attr("id");n||(n=c.getUID(ot),e(t.target).attr("id",n)),t.target="#"+n}return c.typeCheckConfig(ot,t,at),t},n._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},n._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},n._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},n._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;)this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&(void 0===this._offsets[o+1]||t li > .active":".active";i=(i=e.makeArray(e(o).find(s)))[i.length-1]}var a=e.Event("hide.bs.tab",{relatedTarget:this._element}),l=e.Event("show.bs.tab",{relatedTarget:i});if(i&&e(i).trigger(a),e(this._element).trigger(l),!l.isDefaultPrevented()&&!a.isDefaultPrevented()){r&&(n=document.querySelector(r)),this._activate(this._element,o);var u=function(){var n=e.Event("hidden.bs.tab",{relatedTarget:t._element}),o=e.Event("shown.bs.tab",{relatedTarget:i});e(i).trigger(n),e(t._element).trigger(o)};n?this._activate(n,n.parentNode,u):u()}}},n.dispose=function(){e.removeData(this._element,"bs.tab"),this._element=null},n._activate=function(t,n,i){var o=this,r=(!n||"UL"!==n.nodeName&&"OL"!==n.nodeName?e(n).children(".active"):e(n).find("> li > .active"))[0],s=i&&r&&e(r).hasClass("fade"),a=function(){return o._transitionComplete(t,r,i)};if(r&&s){var l=c.getTransitionDurationFromElement(r);e(r).removeClass("show").one(c.TRANSITION_END,a).emulateTransitionEnd(l)}else a()},n._transitionComplete=function(t,n,i){if(n){e(n).removeClass("active");var o=e(n.parentNode).find("> .dropdown-menu .active")[0];o&&e(o).removeClass("active"),"tab"===n.getAttribute("role")&&n.setAttribute("aria-selected",!1)}if(e(t).addClass("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),c.reflow(t),t.classList.contains("fade")&&t.classList.add("show"),t.parentNode&&e(t.parentNode).hasClass("dropdown-menu")){var r=e(t).closest(".dropdown")[0];if(r){var s=[].slice.call(r.querySelectorAll(".dropdown-toggle"));e(s).addClass("active")}t.setAttribute("aria-expanded",!0)}i&&i()},t._jQueryInterface=function(n){return this.each((function(){var i=e(this),o=i.data("bs.tab");if(o||(o=new t(this),i.data("bs.tab",o)),"string"==typeof n){if(void 0===o[n])throw new TypeError('No method named "'+n+'"');o[n]()}}))},o(t,null,[{key:"VERSION",get:function(){return"4.5.0"}}]),t}();e(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',(function(t){t.preventDefault(),ut._jQueryInterface.call(e(this),"show")})),e.fn.tab=ut._jQueryInterface,e.fn.tab.Constructor=ut,e.fn.tab.noConflict=function(){return e.fn.tab=ct,ut._jQueryInterface};var ht=e.fn.toast,ft={animation:"boolean",autohide:"boolean",delay:"number"},dt={animation:!0,autohide:!0,delay:500},pt=function(){function t(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var n=t.prototype;return n.show=function(){var t=this,n=e.Event("show.bs.toast");if(e(this._element).trigger(n),!n.isDefaultPrevented()){this._config.animation&&this._element.classList.add("fade");var i=function(){t._element.classList.remove("showing"),t._element.classList.add("show"),e(t._element).trigger("shown.bs.toast"),t._config.autohide&&(t._timeout=setTimeout((function(){t.hide()}),t._config.delay))};if(this._element.classList.remove("hide"),c.reflow(this._element),this._element.classList.add("showing"),this._config.animation){var o=c.getTransitionDurationFromElement(this._element);e(this._element).one(c.TRANSITION_END,i).emulateTransitionEnd(o)}else i()}},n.hide=function(){if(this._element.classList.contains("show")){var t=e.Event("hide.bs.toast");e(this._element).trigger(t),t.isDefaultPrevented()||this._close()}},n.dispose=function(){clearTimeout(this._timeout),this._timeout=null,this._element.classList.contains("show")&&this._element.classList.remove("show"),e(this._element).off("click.dismiss.bs.toast"),e.removeData(this._element,"bs.toast"),this._element=null,this._config=null},n._getConfig=function(t){return t=a(a(a({},dt),e(this._element).data()),"object"==typeof t&&t?t:{}),c.typeCheckConfig("toast",t,this.constructor.DefaultType),t},n._setListeners=function(){var t=this;e(this._element).on("click.dismiss.bs.toast",'[data-dismiss="toast"]',(function(){return t.hide()}))},n._close=function(){var t=this,n=function(){t._element.classList.add("hide"),e(t._element).trigger("hidden.bs.toast")};if(this._element.classList.remove("show"),this._config.animation){var i=c.getTransitionDurationFromElement(this._element);e(this._element).one(c.TRANSITION_END,n).emulateTransitionEnd(i)}else n()},t._jQueryInterface=function(n){return this.each((function(){var i=e(this),o=i.data("bs.toast");if(o||(o=new t(this,"object"==typeof n&&n),i.data("bs.toast",o)),"string"==typeof n){if(void 0===o[n])throw new TypeError('No method named "'+n+'"');o[n](this)}}))},o(t,null,[{key:"VERSION",get:function(){return"4.5.0"}},{key:"DefaultType",get:function(){return ft}},{key:"Default",get:function(){return dt}}]),t}();e.fn.toast=pt._jQueryInterface,e.fn.toast.Constructor=pt,e.fn.toast.noConflict=function(){return e.fn.toast=ht,pt._jQueryInterface},t.Alert=f,t.Button=p,t.Carousel=w,t.Collapse=D,t.Dropdown=x,t.Modal=F,t.Popover=it,t.Scrollspy=lt,t.Tab=ut,t.Toast=pt,t.Tooltip=$,t.Util=c,Object.defineProperty(t,"__esModule",{value:!0})}(e,n(0),n(1))},function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(t){"object"==typeof window&&(n=window)}t.exports=n},function(t,e,n){"use strict";n.r(e);n(0),n(3),n.p;$(document).ready(()=>{!function(){var t=document.getElementById("bd-docs-nav");let e=parseInt(sessionStorage.getItem("sidebar-scroll-top"),10);if(isNaN(e)){var n,i=t.querySelectorAll(".active"),o=0;for(n=i.length-1;n>0;n--){var r=i[n];void 0!==r&&(o+=r.offsetTop)}o-=t.offsetTop,void 0!==r&&o>.5*t.clientHeight&&(t.scrollTop=o-.2*t.clientHeight)}else t.scrollTop=e;window.addEventListener("beforeunload",()=>{sessionStorage.setItem("sidebar-scroll-top",t.scrollTop)})}(),$(window).on("activate.bs.scrollspy",(function(){document.querySelectorAll("#bd-toc-nav a").forEach(t=>{t.parentElement.classList.remove("active")}),document.querySelectorAll("#bd-toc-nav a.active").forEach(t=>{t.parentElement.classList.add("active")})}))})}]); \ No newline at end of file diff --git a/_build/html/_static/language_data.js b/_build/html/_static/language_data.js new file mode 100644 index 00000000..250f5665 --- /dev/null +++ b/_build/html/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, is available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_build/html/_static/minus.png b/_build/html/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/_build/html/_static/minus.png differ diff --git a/_build/html/_static/nbsphinx-broken-thumbnail.svg b/_build/html/_static/nbsphinx-broken-thumbnail.svg new file mode 100644 index 00000000..4919ca88 --- /dev/null +++ b/_build/html/_static/nbsphinx-broken-thumbnail.svg @@ -0,0 +1,9 @@ + + + + diff --git a/_build/html/_static/nbsphinx-code-cells.css b/_build/html/_static/nbsphinx-code-cells.css new file mode 100644 index 00000000..a3fb27c3 --- /dev/null +++ b/_build/html/_static/nbsphinx-code-cells.css @@ -0,0 +1,259 @@ +/* remove conflicting styling from Sphinx themes */ +div.nbinput.container div.prompt *, +div.nboutput.container div.prompt *, +div.nbinput.container div.input_area pre, +div.nboutput.container div.output_area pre, +div.nbinput.container div.input_area .highlight, +div.nboutput.container div.output_area .highlight { + border: none; + padding: 0; + margin: 0; + box-shadow: none; +} + +div.nbinput.container > div[class*=highlight], +div.nboutput.container > div[class*=highlight] { + margin: 0; +} + +div.nbinput.container div.prompt *, +div.nboutput.container div.prompt * { + background: none; +} + +div.nboutput.container div.output_area .highlight, +div.nboutput.container div.output_area pre { + background: unset; +} + +div.nboutput.container div.output_area div.highlight { + color: unset; /* override Pygments text color */ +} + +/* avoid gaps between output lines */ +div.nboutput.container div[class*=highlight] pre { + line-height: normal; +} + +/* input/output containers */ +div.nbinput.container, +div.nboutput.container { + display: -webkit-flex; + display: flex; + align-items: flex-start; + margin: 0; + width: 100%; +} +@media (max-width: 540px) { + div.nbinput.container, + div.nboutput.container { + flex-direction: column; + } +} + +/* input container */ +div.nbinput.container { + padding-top: 5px; +} + +/* last container */ +div.nblast.container { + padding-bottom: 5px; +} + +/* input prompt */ +div.nbinput.container div.prompt pre, +/* for sphinx_immaterial theme: */ +div.nbinput.container div.prompt pre > code { + color: #307FC1; +} + +/* output prompt */ +div.nboutput.container div.prompt pre, +/* for sphinx_immaterial theme: */ +div.nboutput.container div.prompt pre > code { + color: #BF5B3D; +} + +/* all prompts */ +div.nbinput.container div.prompt, +div.nboutput.container div.prompt { + width: 4.5ex; + padding-top: 5px; + position: relative; + user-select: none; +} + +div.nbinput.container div.prompt > div, +div.nboutput.container div.prompt > div { + position: absolute; + right: 0; + margin-right: 0.3ex; +} + +@media (max-width: 540px) { + div.nbinput.container div.prompt, + div.nboutput.container div.prompt { + width: unset; + text-align: left; + padding: 0.4em; + } + div.nboutput.container div.prompt.empty { + padding: 0; + } + + div.nbinput.container div.prompt > div, + div.nboutput.container div.prompt > div { + position: unset; + } +} + +/* disable scrollbars and line breaks on prompts */ +div.nbinput.container div.prompt pre, +div.nboutput.container div.prompt pre { + overflow: hidden; + white-space: pre; +} + +/* input/output area */ +div.nbinput.container div.input_area, +div.nboutput.container div.output_area { + -webkit-flex: 1; + flex: 1; + overflow: auto; +} +@media (max-width: 540px) { + div.nbinput.container div.input_area, + div.nboutput.container div.output_area { + width: 100%; + } +} + +/* input area */ +div.nbinput.container div.input_area { + border: 1px solid #e0e0e0; + border-radius: 2px; + /*background: #f5f5f5;*/ +} + +/* override MathJax center alignment in output cells */ +div.nboutput.container div[class*=MathJax] { + text-align: left !important; +} + +/* override sphinx.ext.imgmath center alignment in output cells */ +div.nboutput.container div.math p { + text-align: left; +} + +/* standard error */ +div.nboutput.container div.output_area.stderr { + background: #fdd; +} + +/* ANSI colors */ +.ansi-black-fg { color: #3E424D; } +.ansi-black-bg { background-color: #3E424D; } +.ansi-black-intense-fg { color: #282C36; } +.ansi-black-intense-bg { background-color: #282C36; } +.ansi-red-fg { color: #E75C58; } +.ansi-red-bg { background-color: #E75C58; } +.ansi-red-intense-fg { color: #B22B31; } +.ansi-red-intense-bg { background-color: #B22B31; } +.ansi-green-fg { color: #00A250; } +.ansi-green-bg { background-color: #00A250; } +.ansi-green-intense-fg { color: #007427; } +.ansi-green-intense-bg { background-color: #007427; } +.ansi-yellow-fg { color: #DDB62B; } +.ansi-yellow-bg { background-color: #DDB62B; } +.ansi-yellow-intense-fg { color: #B27D12; } +.ansi-yellow-intense-bg { background-color: #B27D12; } +.ansi-blue-fg { color: #208FFB; } +.ansi-blue-bg { background-color: #208FFB; } +.ansi-blue-intense-fg { color: #0065CA; } +.ansi-blue-intense-bg { background-color: #0065CA; } +.ansi-magenta-fg { color: #D160C4; } +.ansi-magenta-bg { background-color: #D160C4; } +.ansi-magenta-intense-fg { color: #A03196; } +.ansi-magenta-intense-bg { background-color: #A03196; } +.ansi-cyan-fg { color: #60C6C8; } +.ansi-cyan-bg { background-color: #60C6C8; } +.ansi-cyan-intense-fg { color: #258F8F; } +.ansi-cyan-intense-bg { background-color: #258F8F; } +.ansi-white-fg { color: #C5C1B4; } +.ansi-white-bg { background-color: #C5C1B4; } +.ansi-white-intense-fg { color: #A1A6B2; } +.ansi-white-intense-bg { background-color: #A1A6B2; } + +.ansi-default-inverse-fg { color: #FFFFFF; } +.ansi-default-inverse-bg { background-color: #000000; } + +.ansi-bold { font-weight: bold; } +.ansi-underline { text-decoration: underline; } + + +div.nbinput.container div.input_area div[class*=highlight] > pre, +div.nboutput.container div.output_area div[class*=highlight] > pre, +div.nboutput.container div.output_area div[class*=highlight].math, +div.nboutput.container div.output_area.rendered_html, +div.nboutput.container div.output_area > div.output_javascript, +div.nboutput.container div.output_area:not(.rendered_html) > img{ + padding: 5px; + margin: 0; +} + +/* fix copybtn overflow problem in chromium (needed for 'sphinx_copybutton') */ +div.nbinput.container div.input_area > div[class^='highlight'], +div.nboutput.container div.output_area > div[class^='highlight']{ + overflow-y: hidden; +} + +/* hide copy button on prompts for 'sphinx_copybutton' extension ... */ +.prompt .copybtn, +/* ... and 'sphinx_immaterial' theme */ +.prompt .md-clipboard.md-icon { + display: none; +} + +/* Some additional styling taken form the Jupyter notebook CSS */ +.jp-RenderedHTMLCommon table, +div.rendered_html table { + border: none; + border-collapse: collapse; + border-spacing: 0; + color: black; + font-size: 12px; + table-layout: fixed; +} +.jp-RenderedHTMLCommon thead, +div.rendered_html thead { + border-bottom: 1px solid black; + vertical-align: bottom; +} +.jp-RenderedHTMLCommon tr, +.jp-RenderedHTMLCommon th, +.jp-RenderedHTMLCommon td, +div.rendered_html tr, +div.rendered_html th, +div.rendered_html td { + text-align: right; + vertical-align: middle; + padding: 0.5em 0.5em; + line-height: normal; + white-space: normal; + max-width: none; + border: none; +} +.jp-RenderedHTMLCommon th, +div.rendered_html th { + font-weight: bold; +} +.jp-RenderedHTMLCommon tbody tr:nth-child(odd), +div.rendered_html tbody tr:nth-child(odd) { + background: #f5f5f5; +} +.jp-RenderedHTMLCommon tbody tr:hover, +div.rendered_html tbody tr:hover { + background: rgba(66, 165, 245, 0.2); +} + diff --git a/_build/html/_static/nbsphinx-gallery.css b/_build/html/_static/nbsphinx-gallery.css new file mode 100644 index 00000000..365c27a9 --- /dev/null +++ b/_build/html/_static/nbsphinx-gallery.css @@ -0,0 +1,31 @@ +.nbsphinx-gallery { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); + gap: 5px; + margin-top: 1em; + margin-bottom: 1em; +} + +.nbsphinx-gallery > a { + padding: 5px; + border: 1px dotted currentColor; + border-radius: 2px; + text-align: center; +} + +.nbsphinx-gallery > a:hover { + border-style: solid; +} + +.nbsphinx-gallery img { + max-width: 100%; + max-height: 100%; +} + +.nbsphinx-gallery > a > div:first-child { + display: flex; + align-items: start; + justify-content: center; + height: 120px; + margin-bottom: 5px; +} diff --git a/_build/html/_static/nbsphinx-no-thumbnail.svg b/_build/html/_static/nbsphinx-no-thumbnail.svg new file mode 100644 index 00000000..9dca7588 --- /dev/null +++ b/_build/html/_static/nbsphinx-no-thumbnail.svg @@ -0,0 +1,9 @@ + + + + diff --git a/_build/html/_static/plus.png b/_build/html/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/_build/html/_static/plus.png differ diff --git a/_build/html/_static/pygments.css b/_build/html/_static/pygments.css new file mode 100644 index 00000000..6110e9f1 --- /dev/null +++ b/_build/html/_static/pygments.css @@ -0,0 +1,84 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #8f5902; font-style: italic } /* Comment */ +.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ +.highlight .g { color: #000000 } /* Generic */ +.highlight .k { color: #204a87; font-weight: bold } /* Keyword */ +.highlight .l { color: #000000 } /* Literal */ +.highlight .n { color: #000000 } /* Name */ +.highlight .o { color: #ce5c00; font-weight: bold } /* Operator */ +.highlight .x { color: #000000 } /* Other */ +.highlight .p { color: #000000; font-weight: bold } /* Punctuation */ +.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #8f5902; font-style: italic } /* Comment.Preproc */ +.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #a40000 } /* Generic.Deleted */ +.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ +.highlight .ges { color: #000000; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #ef2929 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #000000; font-style: italic } /* Generic.Output */ +.highlight .gp { color: #8f5902 } /* Generic.Prompt */ +.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ +.highlight .kc { color: #204a87; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #204a87; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #204a87; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #204a87; font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: #204a87; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #204a87; font-weight: bold } /* Keyword.Type */ +.highlight .ld { color: #000000 } /* Literal.Date */ +.highlight .m { color: #0000cf; font-weight: bold } /* Literal.Number */ +.highlight .s { color: #4e9a06 } /* Literal.String */ +.highlight .na { color: #c4a000 } /* Name.Attribute */ +.highlight .nb { color: #204a87 } /* Name.Builtin */ +.highlight .nc { color: #000000 } /* Name.Class */ +.highlight .no { color: #000000 } /* Name.Constant */ +.highlight .nd { color: #5c35cc; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #ce5c00 } /* Name.Entity */ +.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #000000 } /* Name.Function */ +.highlight .nl { color: #f57900 } /* Name.Label */ +.highlight .nn { color: #000000 } /* Name.Namespace */ +.highlight .nx { color: #000000 } /* Name.Other */ +.highlight .py { color: #000000 } /* Name.Property */ +.highlight .nt { color: #204a87; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #000000 } /* Name.Variable */ +.highlight .ow { color: #204a87; font-weight: bold } /* Operator.Word */ +.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ +.highlight .w { color: #f8f8f8 } /* Text.Whitespace */ +.highlight .mb { color: #0000cf; font-weight: bold } /* Literal.Number.Bin */ +.highlight .mf { color: #0000cf; font-weight: bold } /* Literal.Number.Float */ +.highlight .mh { color: #0000cf; font-weight: bold } /* Literal.Number.Hex */ +.highlight .mi { color: #0000cf; font-weight: bold } /* Literal.Number.Integer */ +.highlight .mo { color: #0000cf; font-weight: bold } /* Literal.Number.Oct */ +.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */ +.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ +.highlight .sc { color: #4e9a06 } /* Literal.String.Char */ +.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */ +.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ +.highlight .se { color: #4e9a06 } /* Literal.String.Escape */ +.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ +.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ +.highlight .sx { color: #4e9a06 } /* Literal.String.Other */ +.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ +.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ +.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ +.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #000000 } /* Name.Function.Magic */ +.highlight .vc { color: #000000 } /* Name.Variable.Class */ +.highlight .vg { color: #000000 } /* Name.Variable.Global */ +.highlight .vi { color: #000000 } /* Name.Variable.Instance */ +.highlight .vm { color: #000000 } /* Name.Variable.Magic */ +.highlight .il { color: #0000cf; font-weight: bold } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_build/html/_static/searchtools.js b/_build/html/_static/searchtools.js new file mode 100644 index 00000000..97d56a74 --- /dev/null +++ b/_build/html/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_build/html/_static/sphinx_highlight.js b/_build/html/_static/sphinx_highlight.js new file mode 100644 index 00000000..aae669d7 --- /dev/null +++ b/_build/html/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/_build/html/_static/vendor/fontawesome/5.13.0/LICENSE.txt b/_build/html/_static/vendor/fontawesome/5.13.0/LICENSE.txt new file mode 100644 index 00000000..f31bef92 --- /dev/null +++ b/_build/html/_static/vendor/fontawesome/5.13.0/LICENSE.txt @@ -0,0 +1,34 @@ +Font Awesome Free License +------------------------- + +Font Awesome Free is free, open source, and GPL friendly. You can use it for +commercial projects, open source projects, or really almost whatever you want. +Full Font Awesome Free license: https://fontawesome.com/license/free. + +# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/) +In the Font Awesome Free download, the CC BY 4.0 license applies to all icons +packaged as SVG and JS file types. + +# Fonts: SIL OFL 1.1 License (https://scripts.sil.org/OFL) +In the Font Awesome Free download, the SIL OFL license applies to all icons +packaged as web and desktop font files. + +# Code: MIT License (https://opensource.org/licenses/MIT) +In the Font Awesome Free download, the MIT license applies to all non-font and +non-icon files. + +# Attribution +Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font +Awesome Free files already contain embedded comments with sufficient +attribution, so you shouldn't need to do anything additional when using these +files normally. + +We've kept attribution comments terse, so we ask that you do not actively work +to remove them from files, especially code. They're a great way for folks to +learn about Font Awesome. + +# Brand Icons +All brand icons are trademarks of their respective owners. The use of these +trademarks does not indicate endorsement of the trademark holder by Font +Awesome, nor vice versa. **Please do not use brand logos for any purpose except +to represent the company, product, or service to which they refer.** diff --git a/_build/html/_static/vendor/fontawesome/5.13.0/css/all.min.css b/_build/html/_static/vendor/fontawesome/5.13.0/css/all.min.css new file mode 100644 index 00000000..3d28ab20 --- /dev/null +++ b/_build/html/_static/vendor/fontawesome/5.13.0/css/all.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.13.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\f95b"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\f952"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\f905"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\f907"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\f95c"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\f95d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-wash:before{content:"\f95e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt-slash:before{content:"\f95f"}.fa-handshake-slash:before{content:"\f960"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side-cough:before{content:"\f961"}.fa-head-side-cough-slash:before{content:"\f962"}.fa-head-side-mask:before{content:"\f963"}.fa-head-side-virus:before{content:"\f964"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-user:before{content:"\f965"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\f913"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\f955"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\f966"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\f967"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\f91a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\f956"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\f968"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\f91e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\f969"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pump-medical:before{content:"\f96a"}.fa-pump-soap:before{content:"\f96b"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-virus:before{content:"\f96c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\f957"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\f96e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\f96f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\f970"}.fa-store-slash:before{content:"\f971"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\f972"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\f941"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\f949"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-virus:before{content:"\f974"}.fa-virus-slash:before{content:"\f975"}.fa-viruses:before{content:"\f976"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.fab,.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.eot b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.eot new file mode 100644 index 00000000..a1bc094a Binary files /dev/null and b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.eot differ diff --git a/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.svg b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.svg new file mode 100644 index 00000000..46ad237a --- /dev/null +++ b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.svg @@ -0,0 +1,3570 @@ + + + + + +Created by FontForge 20190801 at Mon Mar 23 10:45:51 2020 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.ttf b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.ttf new file mode 100644 index 00000000..948a2a6c Binary files /dev/null and b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.ttf differ diff --git a/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff new file mode 100644 index 00000000..2a89d521 Binary files /dev/null and b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff differ diff --git a/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2 b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2 new file mode 100644 index 00000000..141a90a9 Binary files /dev/null and b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2 differ diff --git a/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.eot b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.eot new file mode 100644 index 00000000..38cf2517 Binary files /dev/null and b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.eot differ diff --git a/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.svg b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.svg new file mode 100644 index 00000000..48634a9a --- /dev/null +++ b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.svg @@ -0,0 +1,803 @@ + + + + + +Created by FontForge 20190801 at Mon Mar 23 10:45:51 2020 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.ttf b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.ttf new file mode 100644 index 00000000..abe99e20 Binary files /dev/null and b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.ttf differ diff --git a/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.woff b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.woff new file mode 100644 index 00000000..24de566a Binary files /dev/null and b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.woff differ diff --git a/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.woff2 b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.woff2 new file mode 100644 index 00000000..7e0118e5 Binary files /dev/null and b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.woff2 differ diff --git a/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.eot b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.eot new file mode 100644 index 00000000..d3b77c22 Binary files /dev/null and b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.eot differ diff --git a/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.svg b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.svg new file mode 100644 index 00000000..7742838b --- /dev/null +++ b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.svg @@ -0,0 +1,4938 @@ + + + + + +Created by FontForge 20190801 at Mon Mar 23 10:45:51 2020 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.ttf b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.ttf new file mode 100644 index 00000000..5b979039 Binary files /dev/null and b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.ttf differ diff --git a/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff new file mode 100644 index 00000000..beec7917 Binary files /dev/null and b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff differ diff --git a/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2 b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2 new file mode 100644 index 00000000..978a681a Binary files /dev/null and b/_build/html/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2 differ diff --git a/_build/html/_static/webpack-macros.html b/_build/html/_static/webpack-macros.html new file mode 100644 index 00000000..748f33e6 --- /dev/null +++ b/_build/html/_static/webpack-macros.html @@ -0,0 +1,25 @@ + +{% macro head_pre_icons() %} + + + +{% endmacro %} + +{% macro head_pre_fonts() %} +{% endmacro %} + +{% macro head_pre_bootstrap() %} + + +{% endmacro %} + +{% macro head_js_preload() %} + +{% endmacro %} + +{% macro body_post() %} + +{% endmacro %} \ No newline at end of file diff --git a/_build/html/api.html b/_build/html/api.html new file mode 100644 index 00000000..163e11ac --- /dev/null +++ b/_build/html/api.html @@ -0,0 +1,1109 @@ + + + + + + + + API Documentation — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

API Documentation

+

Below is a list of all the modules in the navlie package. Click on any of the links to see the documentation for that module. Alternatively, you can use the search box at the top of the page to search for a particular class/function/module.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

navlie.composite

navlie.datagen

Tools for data generation.

navlie.filters

Module containing many predict-correct style filters.

navlie.imm

Module for the Interacting Multiple Model (IMM) filter.

navlie.types

This module contains the core primitive types used throughout navlie.

navlie.utils

Collection of miscellaneous utility functions and classes.

navlie.batch

A subpackage for batch least-squares estimation.

navlie.lib

The built-in library of common state, process model, and measurement model implementations.

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/genindex.html b/_build/html/genindex.html new file mode 100644 index 00000000..374dec61 --- /dev/null +++ b/_build/html/genindex.html @@ -0,0 +1,2554 @@ + + + + + + + Index — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ +
+ + + + + + +
+ +
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | J + | L + | M + | N + | O + | P + | R + | S + | T + | U + | V + | W + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + +
+ +

I

+ + + +
+ +

J

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + + +
+ + + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/index.html b/_build/html/index.html new file mode 100644 index 00000000..8998f847 --- /dev/null +++ b/_build/html/index.html @@ -0,0 +1,247 @@ + + + + + + + + Welcome to navlie! — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+
+
+

Welcome to navlie!

+_images/fun_figs.png +

navlie is a state estimation package specifically designed for both traditional and Lie-group-based estimation problems!

+

The core idea behind this project is to use abstraction in such a way that both traditional and Lie-group-based problems fall under the exact same interface. Using this, a single estimator implementation can operate on a variety of state definitions, such as the usual vector space, and any Lie group. We allow the user to define their custom state, process model, and measurement models, after which they will have a variety of algorithms available to them, including:

+
    +
  • Extended Kalman Filter

  • +
  • Iterated Extended Kalman Filter

  • +
  • Sigmapoint Kalman Filters (Unscented, Spherical Cubature, Gauss-Hermite)

  • +
  • Interacting Multiple Model Filter

  • +
  • Batch MAP Estimation

  • +
+

In addition, navlie contains

+
    +
  • A large collection of common process and measurement models

  • +
  • Out-of-the-box on-manifold numerical Jacobians using finite differencing

  • +
  • Various utils for plotting, error, and consistency evaluation

  • +
  • Monte Carlo experiment executor with result aggregation

  • +
  • A preintegration module for linear, wheel odometry, and IMU process models

  • +
+

By implementing a few classes, the user can model a large variety of problems. The following diagram summarizes the abstraction

+_images/system_diagram.png +
+

Installation

+

Clone this repo, change to its directory, and execute

+
git clone git@github.com:decargroup/navlie.git
+cd navlie && pip install -e .
+
+
+

This command should automatically install all dependencies, including our package pymlg for back-end Lie group mathematical operations.

+
+
+

Examples

+

A more in-depth tutorial can be found on this website, but there are also many examples found in the examples/ folder. Simply run these as python3 scripts.

+
+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/objects.inv b/_build/html/objects.inv new file mode 100644 index 00000000..1cb2b6ee Binary files /dev/null and b/_build/html/objects.inv differ diff --git a/_build/html/py-modindex.html b/_build/html/py-modindex.html new file mode 100644 index 00000000..c79544d2 --- /dev/null +++ b/_build/html/py-modindex.html @@ -0,0 +1,287 @@ + + + + + + + Python Module Index — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ +
+ + + + + + +
+ +
+ + +

Python Module Index

+ +
+ n +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ n
+ navlie +
    + navlie.batch +
    + navlie.batch.estimator +
    + navlie.batch.gaussian_mixtures +
    + navlie.batch.losses +
    + navlie.batch.problem +
    + navlie.batch.residuals +
    + navlie.composite +
    + navlie.datagen +
    + navlie.filters +
    + navlie.imm +
    + navlie.lib +
    + navlie.lib.camera +
    + navlie.lib.datasets +
    + navlie.lib.imu +
    + navlie.lib.models +
    + navlie.lib.preintegration +
    + navlie.lib.states +
    + navlie.types +
    + navlie.utils +
+ + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/search.html b/_build/html/search.html new file mode 100644 index 00000000..05359643 --- /dev/null +++ b/_build/html/search.html @@ -0,0 +1,206 @@ + + + + + + + Search — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ +
+ + + + + + +
+ +
+ +

Search

+ + + + +

+ Searching for multiple words only shows matches that contain + all words. +

+ + +
+ + + +
+ + + +
+ +
+ + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/searchindex.js b/_build/html/searchindex.js new file mode 100644 index 00000000..8224f2d8 --- /dev/null +++ b/_build/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["_autosummary/navlie.batch", "_autosummary/navlie.batch.estimator", "_autosummary/navlie.batch.estimator.BatchEstimator", "_autosummary/navlie.batch.gaussian_mixtures", "_autosummary/navlie.batch.gaussian_mixtures.GaussianMixtureResidual", "_autosummary/navlie.batch.gaussian_mixtures.HessianSumMixtureResidual", "_autosummary/navlie.batch.gaussian_mixtures.MaxMixtureResidual", "_autosummary/navlie.batch.gaussian_mixtures.MaxSumMixtureResidual", "_autosummary/navlie.batch.gaussian_mixtures.SumMixtureResidual", "_autosummary/navlie.batch.losses", "_autosummary/navlie.batch.losses.CauchyLoss", "_autosummary/navlie.batch.losses.L2Loss", "_autosummary/navlie.batch.losses.LossFunction", "_autosummary/navlie.batch.problem", "_autosummary/navlie.batch.problem.OptimizationSummary", "_autosummary/navlie.batch.problem.Problem", "_autosummary/navlie.batch.residuals", "_autosummary/navlie.batch.residuals.MeasurementResidual", "_autosummary/navlie.batch.residuals.PriorResidual", "_autosummary/navlie.batch.residuals.ProcessResidual", "_autosummary/navlie.batch.residuals.Residual", "_autosummary/navlie.composite", "_autosummary/navlie.composite.CompositeInput", "_autosummary/navlie.composite.CompositeMeasurement", "_autosummary/navlie.composite.CompositeMeasurementModel", "_autosummary/navlie.composite.CompositeProcessModel", "_autosummary/navlie.composite.CompositeState", "_autosummary/navlie.datagen", "_autosummary/navlie.datagen.DataGenerator", "_autosummary/navlie.datagen.generate_measurement", "_autosummary/navlie.filters", "_autosummary/navlie.filters.CubatureKalmanFilter", "_autosummary/navlie.filters.ExtendedKalmanFilter", "_autosummary/navlie.filters.GaussHermiteKalmanFilter", "_autosummary/navlie.filters.IteratedKalmanFilter", "_autosummary/navlie.filters.SigmaPointKalmanFilter", "_autosummary/navlie.filters.UnscentedKalmanFilter", "_autosummary/navlie.filters.check_outlier", "_autosummary/navlie.filters.generate_sigmapoints", "_autosummary/navlie.filters.mean_state", "_autosummary/navlie.filters.run_filter", "_autosummary/navlie.imm", "_autosummary/navlie.imm.IMMResult", "_autosummary/navlie.imm.IMMResultList", "_autosummary/navlie.imm.IMMState", "_autosummary/navlie.imm.InteractingModelFilter", "_autosummary/navlie.imm.gaussian_mixing", "_autosummary/navlie.imm.gaussian_mixing_vectorspace", "_autosummary/navlie.imm.reparametrize_gaussians_about_X_par", "_autosummary/navlie.imm.run_imm_filter", "_autosummary/navlie.imm.update_X", "_autosummary/navlie.lib", "_autosummary/navlie.lib.camera", "_autosummary/navlie.lib.camera.PinholeCamera", "_autosummary/navlie.lib.camera.PoseMatrix", "_autosummary/navlie.lib.datasets", "_autosummary/navlie.lib.datasets.SimulatedInertialGPSDataset", "_autosummary/navlie.lib.datasets.SimulatedInertialLandmarkDataset", "_autosummary/navlie.lib.datasets.SimulatedPoseRangingDataset", "_autosummary/navlie.lib.datasets.generate_landmark_positions", "_autosummary/navlie.lib.imu", "_autosummary/navlie.lib.imu.G_matrix", "_autosummary/navlie.lib.imu.G_matrix_inv", "_autosummary/navlie.lib.imu.IMU", "_autosummary/navlie.lib.imu.IMUKinematics", "_autosummary/navlie.lib.imu.IMUState", "_autosummary/navlie.lib.imu.L_matrix", "_autosummary/navlie.lib.imu.M_matrix", "_autosummary/navlie.lib.imu.N_matrix", "_autosummary/navlie.lib.imu.U_matrix", "_autosummary/navlie.lib.imu.U_matrix_inv", "_autosummary/navlie.lib.imu.U_tilde_matrix", "_autosummary/navlie.lib.imu.adjoint_IE3", "_autosummary/navlie.lib.imu.delta_matrix", "_autosummary/navlie.lib.imu.get_unbiased_imu", "_autosummary/navlie.lib.imu.inverse_IE3", "_autosummary/navlie.lib.models", "_autosummary/navlie.lib.models.AbsolutePosition", "_autosummary/navlie.lib.models.AbsoluteVelocity", "_autosummary/navlie.lib.models.Altitude", "_autosummary/navlie.lib.models.BodyFrameVelocity", "_autosummary/navlie.lib.models.CameraProjection", "_autosummary/navlie.lib.models.DoubleIntegrator", "_autosummary/navlie.lib.models.DoubleIntegratorWithBias", "_autosummary/navlie.lib.models.GlobalPosition", "_autosummary/navlie.lib.models.Gravitometer", "_autosummary/navlie.lib.models.InvariantMeasurement", "_autosummary/navlie.lib.models.InvariantPointRelativePosition", "_autosummary/navlie.lib.models.LinearMeasurement", "_autosummary/navlie.lib.models.Magnetometer", "_autosummary/navlie.lib.models.OneDimensionalPositionVelocityRange", "_autosummary/navlie.lib.models.PointRelativePosition", "_autosummary/navlie.lib.models.PointRelativePositionSLAM", "_autosummary/navlie.lib.models.RangePointToAnchor", "_autosummary/navlie.lib.models.RangePoseToAnchor", "_autosummary/navlie.lib.models.RangePoseToPose", "_autosummary/navlie.lib.models.RangeRelativePose", "_autosummary/navlie.lib.models.RelativeBodyFrameVelocity", "_autosummary/navlie.lib.models.SingleIntegrator", "_autosummary/navlie.lib.preintegration", "_autosummary/navlie.lib.preintegration.AngularVelocityIncrement", "_autosummary/navlie.lib.preintegration.BodyVelocityIncrement", "_autosummary/navlie.lib.preintegration.IMUIncrement", "_autosummary/navlie.lib.preintegration.LinearIncrement", "_autosummary/navlie.lib.preintegration.PreintegratedAngularVelocity", "_autosummary/navlie.lib.preintegration.PreintegratedBodyVelocity", "_autosummary/navlie.lib.preintegration.PreintegratedIMUKinematics", "_autosummary/navlie.lib.preintegration.PreintegratedLinearModel", "_autosummary/navlie.lib.preintegration.PreintegratedWheelOdometry", "_autosummary/navlie.lib.preintegration.RelativeMotionIncrement", "_autosummary/navlie.lib.preintegration.WheelOdometryIncrement", "_autosummary/navlie.lib.states", "_autosummary/navlie.lib.states.MatrixLieGroupState", "_autosummary/navlie.lib.states.SE23State", "_autosummary/navlie.lib.states.SE2State", "_autosummary/navlie.lib.states.SE3State", "_autosummary/navlie.lib.states.SL3State", "_autosummary/navlie.lib.states.SO2State", "_autosummary/navlie.lib.states.SO3State", "_autosummary/navlie.lib.states.StampedValue", "_autosummary/navlie.lib.states.VectorInput", "_autosummary/navlie.lib.states.VectorState", "_autosummary/navlie.types", "_autosummary/navlie.types.Dataset", "_autosummary/navlie.types.Input", "_autosummary/navlie.types.Measurement", "_autosummary/navlie.types.MeasurementModel", "_autosummary/navlie.types.ProcessModel", "_autosummary/navlie.types.State", "_autosummary/navlie.types.StateWithCovariance", "_autosummary/navlie.utils", "_autosummary/navlie.utils.GaussianResult", "_autosummary/navlie.utils.GaussianResultList", "_autosummary/navlie.utils.MonteCarloResult", "_autosummary/navlie.utils.associate_stamps", "_autosummary/navlie.utils.find_nearest_stamp_idx", "_autosummary/navlie.utils.jacobian", "_autosummary/navlie.utils.monte_carlo", "_autosummary/navlie.utils.plot_error", "_autosummary/navlie.utils.plot_meas", "_autosummary/navlie.utils.plot_meas_by_model", "_autosummary/navlie.utils.plot_nees", "_autosummary/navlie.utils.plot_poses", "_autosummary/navlie.utils.randvec", "_autosummary/navlie.utils.schedule_sequential_measurements", "_autosummary/navlie.utils.set_axes_equal", "_autosummary/navlie.utils.state_interp", "_autosummary/navlie.utils.van_loans", "api", "index", "tutorial", "tutorial/composite", "tutorial/jacobians", "tutorial/lie_groups", "tutorial/traditional"], "filenames": ["_autosummary/navlie.batch.rst", "_autosummary/navlie.batch.estimator.rst", "_autosummary/navlie.batch.estimator.BatchEstimator.rst", "_autosummary/navlie.batch.gaussian_mixtures.rst", "_autosummary/navlie.batch.gaussian_mixtures.GaussianMixtureResidual.rst", "_autosummary/navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.rst", "_autosummary/navlie.batch.gaussian_mixtures.MaxMixtureResidual.rst", "_autosummary/navlie.batch.gaussian_mixtures.MaxSumMixtureResidual.rst", "_autosummary/navlie.batch.gaussian_mixtures.SumMixtureResidual.rst", "_autosummary/navlie.batch.losses.rst", "_autosummary/navlie.batch.losses.CauchyLoss.rst", "_autosummary/navlie.batch.losses.L2Loss.rst", "_autosummary/navlie.batch.losses.LossFunction.rst", "_autosummary/navlie.batch.problem.rst", "_autosummary/navlie.batch.problem.OptimizationSummary.rst", "_autosummary/navlie.batch.problem.Problem.rst", "_autosummary/navlie.batch.residuals.rst", "_autosummary/navlie.batch.residuals.MeasurementResidual.rst", "_autosummary/navlie.batch.residuals.PriorResidual.rst", "_autosummary/navlie.batch.residuals.ProcessResidual.rst", "_autosummary/navlie.batch.residuals.Residual.rst", "_autosummary/navlie.composite.rst", "_autosummary/navlie.composite.CompositeInput.rst", "_autosummary/navlie.composite.CompositeMeasurement.rst", "_autosummary/navlie.composite.CompositeMeasurementModel.rst", "_autosummary/navlie.composite.CompositeProcessModel.rst", "_autosummary/navlie.composite.CompositeState.rst", "_autosummary/navlie.datagen.rst", "_autosummary/navlie.datagen.DataGenerator.rst", "_autosummary/navlie.datagen.generate_measurement.rst", "_autosummary/navlie.filters.rst", "_autosummary/navlie.filters.CubatureKalmanFilter.rst", "_autosummary/navlie.filters.ExtendedKalmanFilter.rst", "_autosummary/navlie.filters.GaussHermiteKalmanFilter.rst", "_autosummary/navlie.filters.IteratedKalmanFilter.rst", "_autosummary/navlie.filters.SigmaPointKalmanFilter.rst", "_autosummary/navlie.filters.UnscentedKalmanFilter.rst", "_autosummary/navlie.filters.check_outlier.rst", "_autosummary/navlie.filters.generate_sigmapoints.rst", "_autosummary/navlie.filters.mean_state.rst", "_autosummary/navlie.filters.run_filter.rst", "_autosummary/navlie.imm.rst", "_autosummary/navlie.imm.IMMResult.rst", "_autosummary/navlie.imm.IMMResultList.rst", "_autosummary/navlie.imm.IMMState.rst", "_autosummary/navlie.imm.InteractingModelFilter.rst", "_autosummary/navlie.imm.gaussian_mixing.rst", "_autosummary/navlie.imm.gaussian_mixing_vectorspace.rst", "_autosummary/navlie.imm.reparametrize_gaussians_about_X_par.rst", "_autosummary/navlie.imm.run_imm_filter.rst", "_autosummary/navlie.imm.update_X.rst", "_autosummary/navlie.lib.rst", "_autosummary/navlie.lib.camera.rst", "_autosummary/navlie.lib.camera.PinholeCamera.rst", "_autosummary/navlie.lib.camera.PoseMatrix.rst", "_autosummary/navlie.lib.datasets.rst", "_autosummary/navlie.lib.datasets.SimulatedInertialGPSDataset.rst", "_autosummary/navlie.lib.datasets.SimulatedInertialLandmarkDataset.rst", "_autosummary/navlie.lib.datasets.SimulatedPoseRangingDataset.rst", "_autosummary/navlie.lib.datasets.generate_landmark_positions.rst", "_autosummary/navlie.lib.imu.rst", "_autosummary/navlie.lib.imu.G_matrix.rst", "_autosummary/navlie.lib.imu.G_matrix_inv.rst", "_autosummary/navlie.lib.imu.IMU.rst", "_autosummary/navlie.lib.imu.IMUKinematics.rst", "_autosummary/navlie.lib.imu.IMUState.rst", "_autosummary/navlie.lib.imu.L_matrix.rst", "_autosummary/navlie.lib.imu.M_matrix.rst", "_autosummary/navlie.lib.imu.N_matrix.rst", "_autosummary/navlie.lib.imu.U_matrix.rst", "_autosummary/navlie.lib.imu.U_matrix_inv.rst", "_autosummary/navlie.lib.imu.U_tilde_matrix.rst", "_autosummary/navlie.lib.imu.adjoint_IE3.rst", "_autosummary/navlie.lib.imu.delta_matrix.rst", "_autosummary/navlie.lib.imu.get_unbiased_imu.rst", "_autosummary/navlie.lib.imu.inverse_IE3.rst", "_autosummary/navlie.lib.models.rst", "_autosummary/navlie.lib.models.AbsolutePosition.rst", "_autosummary/navlie.lib.models.AbsoluteVelocity.rst", "_autosummary/navlie.lib.models.Altitude.rst", "_autosummary/navlie.lib.models.BodyFrameVelocity.rst", "_autosummary/navlie.lib.models.CameraProjection.rst", "_autosummary/navlie.lib.models.DoubleIntegrator.rst", "_autosummary/navlie.lib.models.DoubleIntegratorWithBias.rst", "_autosummary/navlie.lib.models.GlobalPosition.rst", "_autosummary/navlie.lib.models.Gravitometer.rst", "_autosummary/navlie.lib.models.InvariantMeasurement.rst", "_autosummary/navlie.lib.models.InvariantPointRelativePosition.rst", "_autosummary/navlie.lib.models.LinearMeasurement.rst", "_autosummary/navlie.lib.models.Magnetometer.rst", "_autosummary/navlie.lib.models.OneDimensionalPositionVelocityRange.rst", "_autosummary/navlie.lib.models.PointRelativePosition.rst", "_autosummary/navlie.lib.models.PointRelativePositionSLAM.rst", "_autosummary/navlie.lib.models.RangePointToAnchor.rst", "_autosummary/navlie.lib.models.RangePoseToAnchor.rst", "_autosummary/navlie.lib.models.RangePoseToPose.rst", "_autosummary/navlie.lib.models.RangeRelativePose.rst", "_autosummary/navlie.lib.models.RelativeBodyFrameVelocity.rst", "_autosummary/navlie.lib.models.SingleIntegrator.rst", "_autosummary/navlie.lib.preintegration.rst", "_autosummary/navlie.lib.preintegration.AngularVelocityIncrement.rst", "_autosummary/navlie.lib.preintegration.BodyVelocityIncrement.rst", "_autosummary/navlie.lib.preintegration.IMUIncrement.rst", "_autosummary/navlie.lib.preintegration.LinearIncrement.rst", "_autosummary/navlie.lib.preintegration.PreintegratedAngularVelocity.rst", "_autosummary/navlie.lib.preintegration.PreintegratedBodyVelocity.rst", "_autosummary/navlie.lib.preintegration.PreintegratedIMUKinematics.rst", "_autosummary/navlie.lib.preintegration.PreintegratedLinearModel.rst", "_autosummary/navlie.lib.preintegration.PreintegratedWheelOdometry.rst", "_autosummary/navlie.lib.preintegration.RelativeMotionIncrement.rst", "_autosummary/navlie.lib.preintegration.WheelOdometryIncrement.rst", "_autosummary/navlie.lib.states.rst", "_autosummary/navlie.lib.states.MatrixLieGroupState.rst", "_autosummary/navlie.lib.states.SE23State.rst", "_autosummary/navlie.lib.states.SE2State.rst", "_autosummary/navlie.lib.states.SE3State.rst", "_autosummary/navlie.lib.states.SL3State.rst", "_autosummary/navlie.lib.states.SO2State.rst", "_autosummary/navlie.lib.states.SO3State.rst", "_autosummary/navlie.lib.states.StampedValue.rst", "_autosummary/navlie.lib.states.VectorInput.rst", "_autosummary/navlie.lib.states.VectorState.rst", "_autosummary/navlie.types.rst", "_autosummary/navlie.types.Dataset.rst", "_autosummary/navlie.types.Input.rst", "_autosummary/navlie.types.Measurement.rst", "_autosummary/navlie.types.MeasurementModel.rst", "_autosummary/navlie.types.ProcessModel.rst", "_autosummary/navlie.types.State.rst", "_autosummary/navlie.types.StateWithCovariance.rst", "_autosummary/navlie.utils.rst", "_autosummary/navlie.utils.GaussianResult.rst", "_autosummary/navlie.utils.GaussianResultList.rst", "_autosummary/navlie.utils.MonteCarloResult.rst", "_autosummary/navlie.utils.associate_stamps.rst", "_autosummary/navlie.utils.find_nearest_stamp_idx.rst", "_autosummary/navlie.utils.jacobian.rst", "_autosummary/navlie.utils.monte_carlo.rst", "_autosummary/navlie.utils.plot_error.rst", "_autosummary/navlie.utils.plot_meas.rst", "_autosummary/navlie.utils.plot_meas_by_model.rst", "_autosummary/navlie.utils.plot_nees.rst", "_autosummary/navlie.utils.plot_poses.rst", "_autosummary/navlie.utils.randvec.rst", "_autosummary/navlie.utils.schedule_sequential_measurements.rst", "_autosummary/navlie.utils.set_axes_equal.rst", "_autosummary/navlie.utils.state_interp.rst", "_autosummary/navlie.utils.van_loans.rst", "api.rst", "index.rst", "tutorial.rst", "tutorial/composite.ipynb", "tutorial/jacobians.ipynb", "tutorial/lie_groups.ipynb", "tutorial/traditional.ipynb"], "titles": ["navlie.batch", "navlie.batch.estimator", "navlie.batch.estimator.BatchEstimator", "navlie.batch.gaussian_mixtures", "navlie.batch.gaussian_mixtures.GaussianMixtureResidual", "navlie.batch.gaussian_mixtures.HessianSumMixtureResidual", "navlie.batch.gaussian_mixtures.MaxMixtureResidual", "navlie.batch.gaussian_mixtures.MaxSumMixtureResidual", "navlie.batch.gaussian_mixtures.SumMixtureResidual", "navlie.batch.losses", "navlie.batch.losses.CauchyLoss", "navlie.batch.losses.L2Loss", "navlie.batch.losses.LossFunction", "navlie.batch.problem", "navlie.batch.problem.OptimizationSummary", "navlie.batch.problem.Problem", "navlie.batch.residuals", "navlie.batch.residuals.MeasurementResidual", "navlie.batch.residuals.PriorResidual", "navlie.batch.residuals.ProcessResidual", "navlie.batch.residuals.Residual", "navlie.composite", "navlie.composite.CompositeInput", "navlie.composite.CompositeMeasurement", "navlie.composite.CompositeMeasurementModel", "navlie.composite.CompositeProcessModel", "navlie.composite.CompositeState", "navlie.datagen", "navlie.datagen.DataGenerator", "navlie.datagen.generate_measurement", "navlie.filters", "navlie.filters.CubatureKalmanFilter", "navlie.filters.ExtendedKalmanFilter", "navlie.filters.GaussHermiteKalmanFilter", "navlie.filters.IteratedKalmanFilter", "navlie.filters.SigmaPointKalmanFilter", "navlie.filters.UnscentedKalmanFilter", "navlie.filters.check_outlier", "navlie.filters.generate_sigmapoints", "navlie.filters.mean_state", "navlie.filters.run_filter", "navlie.imm", "navlie.imm.IMMResult", "navlie.imm.IMMResultList", "navlie.imm.IMMState", "navlie.imm.InteractingModelFilter", "navlie.imm.gaussian_mixing", "navlie.imm.gaussian_mixing_vectorspace", "navlie.imm.reparametrize_gaussians_about_X_par", "navlie.imm.run_imm_filter", "navlie.imm.update_X", "navlie.lib", "navlie.lib.camera", "navlie.lib.camera.PinholeCamera", "navlie.lib.camera.PoseMatrix", "navlie.lib.datasets", "navlie.lib.datasets.SimulatedInertialGPSDataset", "navlie.lib.datasets.SimulatedInertialLandmarkDataset", "navlie.lib.datasets.SimulatedPoseRangingDataset", "navlie.lib.datasets.generate_landmark_positions", "navlie.lib.imu", "navlie.lib.imu.G_matrix", "navlie.lib.imu.G_matrix_inv", "navlie.lib.imu.IMU", "navlie.lib.imu.IMUKinematics", "navlie.lib.imu.IMUState", "navlie.lib.imu.L_matrix", "navlie.lib.imu.M_matrix", "navlie.lib.imu.N_matrix", "navlie.lib.imu.U_matrix", "navlie.lib.imu.U_matrix_inv", "navlie.lib.imu.U_tilde_matrix", "navlie.lib.imu.adjoint_IE3", "navlie.lib.imu.delta_matrix", "navlie.lib.imu.get_unbiased_imu", "navlie.lib.imu.inverse_IE3", "navlie.lib.models", "navlie.lib.models.AbsolutePosition", "navlie.lib.models.AbsoluteVelocity", "navlie.lib.models.Altitude", "navlie.lib.models.BodyFrameVelocity", "navlie.lib.models.CameraProjection", "navlie.lib.models.DoubleIntegrator", "navlie.lib.models.DoubleIntegratorWithBias", "navlie.lib.models.GlobalPosition", "navlie.lib.models.Gravitometer", "navlie.lib.models.InvariantMeasurement", "navlie.lib.models.InvariantPointRelativePosition", "navlie.lib.models.LinearMeasurement", "navlie.lib.models.Magnetometer", "navlie.lib.models.OneDimensionalPositionVelocityRange", "navlie.lib.models.PointRelativePosition", "navlie.lib.models.PointRelativePositionSLAM", "navlie.lib.models.RangePointToAnchor", "navlie.lib.models.RangePoseToAnchor", "navlie.lib.models.RangePoseToPose", "navlie.lib.models.RangeRelativePose", "navlie.lib.models.RelativeBodyFrameVelocity", "navlie.lib.models.SingleIntegrator", "navlie.lib.preintegration", "navlie.lib.preintegration.AngularVelocityIncrement", "navlie.lib.preintegration.BodyVelocityIncrement", "navlie.lib.preintegration.IMUIncrement", "navlie.lib.preintegration.LinearIncrement", "navlie.lib.preintegration.PreintegratedAngularVelocity", "navlie.lib.preintegration.PreintegratedBodyVelocity", "navlie.lib.preintegration.PreintegratedIMUKinematics", "navlie.lib.preintegration.PreintegratedLinearModel", "navlie.lib.preintegration.PreintegratedWheelOdometry", "navlie.lib.preintegration.RelativeMotionIncrement", "navlie.lib.preintegration.WheelOdometryIncrement", "navlie.lib.states", "navlie.lib.states.MatrixLieGroupState", "navlie.lib.states.SE23State", "navlie.lib.states.SE2State", "navlie.lib.states.SE3State", "navlie.lib.states.SL3State", "navlie.lib.states.SO2State", "navlie.lib.states.SO3State", "navlie.lib.states.StampedValue", "navlie.lib.states.VectorInput", "navlie.lib.states.VectorState", "navlie.types", "navlie.types.Dataset", "navlie.types.Input", "navlie.types.Measurement", "navlie.types.MeasurementModel", "navlie.types.ProcessModel", "navlie.types.State", "navlie.types.StateWithCovariance", "navlie.utils", "navlie.utils.GaussianResult", "navlie.utils.GaussianResultList", "navlie.utils.MonteCarloResult", "navlie.utils.associate_stamps", "navlie.utils.find_nearest_stamp_idx", "navlie.utils.jacobian", "navlie.utils.monte_carlo", "navlie.utils.plot_error", "navlie.utils.plot_meas", "navlie.utils.plot_meas_by_model", "navlie.utils.plot_nees", "navlie.utils.plot_poses", "navlie.utils.randvec", "navlie.utils.schedule_sequential_measurements", "navlie.utils.set_axes_equal", "navlie.utils.state_interp", "navlie.utils.van_loans", "API Documentation", "Welcome to navlie!", "Getting Started", "Composite States", "Jacobians in navlie", "Toy Problem - Lie group approach", "Toy Problem - Traditional Approach"], "terms": {"A": [0, 4, 5, 6, 7, 8, 16, 17, 18, 19, 20, 26, 28, 43, 45, 46, 48, 50, 53, 54, 55, 60, 65, 79, 88, 91, 100, 101, 102, 103, 107, 110, 112, 113, 114, 115, 116, 117, 118, 120, 121, 123, 125, 128, 129, 131, 132, 133, 136, 138, 139, 140, 142, 147, 149, 151, 153], "subpackag": 0, "least": [0, 5, 7, 8, 9, 11, 12, 13, 15], "squar": [0, 4, 5, 7, 8, 9, 11, 12, 13, 15, 18, 37, 42, 49, 98, 129, 131, 133, 143, 153, 154], "estim": [0, 16, 20, 31, 32, 33, 34, 35, 36, 42, 45, 86, 131, 132, 133, 149, 150, 151, 152, 153, 154], "modul": [0, 1, 30, 41, 51, 52, 60, 122, 148, 149], "construct": [1, 4, 13, 86], "problem": [1, 2, 4, 9, 11, 12, 149, 150, 151], "compos": 1, "prior": [1, 16, 18], "residu": [1, 4, 5, 6, 7, 8, 10, 13, 15, 87], "process": [1, 2, 19, 25, 28, 31, 32, 33, 34, 35, 36, 45, 49, 51, 64, 80, 82, 83, 97, 98, 100, 101, 103, 104, 105, 106, 107, 108, 110, 119, 120, 127, 149, 151, 152], "measur": [1, 2, 4, 5, 6, 7, 8, 16, 17, 18, 19, 20, 23, 24, 28, 29, 31, 32, 33, 34, 35, 36, 40, 45, 49, 51, 52, 53, 56, 57, 58, 63, 64, 74, 77, 78, 79, 80, 81, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 100, 101, 102, 103, 109, 110, 123, 126, 139, 140, 144, 149, 151, 152], "The": [1, 2, 4, 5, 6, 10, 11, 12, 17, 24, 25, 26, 28, 31, 32, 33, 34, 35, 36, 42, 43, 45, 46, 51, 58, 64, 65, 67, 68, 80, 81, 82, 83, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 127, 128, 131, 132, 137, 142, 144, 146, 149, 150, 151, 152, 153, 154], "batchestim": 1, "solv": [1, 2, 13, 15], "method": [1, 4, 5, 6, 7, 8, 20, 25, 26, 31, 32, 33, 35, 36, 38, 43, 46, 64, 80, 82, 83, 97, 98, 104, 105, 106, 107, 108, 123, 126, 127, 128, 132, 136, 146, 147, 151, 152, 153, 154], "over": [1, 100, 101, 102, 103, 109, 110, 153, 154], "sequenc": 1, "input": [1, 2, 4, 5, 6, 7, 8, 17, 18, 19, 20, 22, 25, 28, 31, 32, 33, 34, 35, 36, 40, 45, 49, 56, 57, 58, 63, 64, 66, 80, 82, 83, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 119, 120, 123, 127, 136, 151, 152, 153, 154], "data": [1, 2, 4, 27, 28, 40, 60, 63, 74, 119, 120, 123, 125, 129, 131, 132, 133, 137, 138, 139, 140, 151, 153], "ar": [1, 4, 5, 6, 7, 8, 16, 26, 31, 33, 35, 36, 59, 64, 65, 66, 81, 97, 132, 133, 137, 142, 144, 146, 147, 149, 151, 152, 153, 154], "automat": [1, 45, 149, 151, 152], "creat": [1, 2, 19, 22, 43, 63, 79, 109, 118, 124, 132, 138, 139, 140, 141, 142, 153], "ad": [1, 13, 15, 79, 119, 120, 151, 152, 153], "us": [1, 2, 9, 11, 12, 13, 15, 16, 17, 19, 20, 24, 25, 26, 28, 31, 32, 33, 34, 35, 36, 42, 43, 45, 52, 53, 63, 64, 65, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 102, 103, 104, 105, 106, 107, 108, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 125, 126, 127, 128, 129, 131, 132, 136, 137, 147, 148, 149, 150, 151, 152, 153, 154], "gener": [1, 2, 17, 18, 19, 22, 26, 27, 28, 29, 31, 33, 35, 36, 38, 53, 58, 59, 65, 88, 101, 109, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 124, 125, 128, 138, 143, 144, 151, 152, 153], "definit": [1, 149, 151, 152, 153], "defin": [1, 4, 9, 11, 12, 26, 43, 112, 113, 114, 115, 116, 117, 118, 127, 132, 133, 149, 151, 152], "class": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 35, 36, 41, 42, 43, 44, 45, 52, 53, 54, 55, 56, 57, 58, 60, 63, 64, 65, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 148, 149, 151, 152, 153, 154], "solver_typ": 2, "str": [2, 15, 31, 33, 35, 36, 38, 65, 112, 113, 114, 115, 116, 117, 118, 136, 138, 141, 142], "gn": [2, 15], "max_it": [2, 15, 34], "int": [2, 14, 15, 22, 26, 38, 53, 56, 57, 58, 59, 63, 65, 100, 101, 102, 103, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 124, 128, 133, 134, 135, 137, 142, 143], "100": [2, 15, 58], "step_tol": [2, 15, 34], "float": [2, 4, 5, 6, 7, 8, 10, 11, 12, 14, 15, 22, 23, 25, 26, 28, 31, 32, 33, 34, 35, 36, 42, 43, 44, 45, 46, 47, 53, 57, 58, 59, 63, 64, 65, 66, 69, 70, 71, 73, 79, 80, 82, 83, 85, 86, 89, 90, 93, 94, 95, 96, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 124, 125, 127, 128, 131, 132, 133, 134, 135, 136, 141, 142, 144, 146, 147, 151, 152, 153, 154], "1e": [2, 4, 5, 6, 7, 8, 15, 17, 18, 19, 20, 24, 25, 26, 64, 65, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 112, 113, 114, 115, 116, 117, 118, 121, 126, 127, 128, 136], "07": [2, 15], "ftol": [2, 15], "none": [2, 4, 5, 6, 7, 8, 15, 17, 18, 19, 20, 26, 28, 29, 31, 32, 33, 34, 35, 36, 53, 56, 57, 58, 63, 64, 65, 79, 85, 86, 89, 91, 100, 101, 102, 103, 104, 105, 106, 107, 108, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 124, 125, 128, 136, 138, 139, 140, 141, 142, 151, 153, 154], "gradient_tol": [2, 15], "tau": [2, 15], "11": [2, 15, 45, 152], "verbos": [2, 15, 137], "bool": [2, 4, 5, 6, 7, 8, 15, 17, 18, 19, 20, 25, 28, 29, 31, 32, 33, 34, 35, 36, 40, 43, 53, 56, 57, 58, 132, 133, 138, 139, 140, 141, 142], "true": [2, 4, 5, 15, 16, 29, 31, 33, 34, 35, 36, 42, 43, 56, 57, 58, 131, 132, 133, 138, 139, 140, 151, 152, 153, 154], "base": [2, 4, 5, 6, 7, 8, 10, 11, 12, 14, 15, 17, 18, 19, 20, 22, 23, 24, 25, 26, 28, 31, 32, 33, 34, 35, 36, 42, 43, 44, 45, 53, 54, 56, 57, 58, 63, 64, 65, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 123, 124, 125, 126, 127, 128, 129, 131, 132, 133, 139, 140, 149, 151], "object": [2, 14, 15, 22, 25, 26, 28, 29, 32, 35, 43, 44, 45, 53, 54, 63, 64, 65, 80, 82, 83, 86, 97, 98, 104, 105, 106, 107, 108, 109, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 124, 125, 127, 128, 129, 131, 132, 133, 136, 137, 139, 140, 142, 146, 153, 154], "main": [2, 13, 15, 153], "instanti": [2, 53, 152, 154], "batchestiamtor": 2, "paramet": [2, 4, 5, 6, 7, 8, 10, 15, 17, 18, 19, 20, 23, 24, 25, 26, 28, 29, 31, 32, 33, 34, 35, 36, 38, 39, 40, 42, 43, 45, 46, 47, 48, 49, 50, 53, 58, 59, 63, 64, 65, 74, 79, 80, 81, 82, 83, 85, 86, 87, 88, 89, 91, 93, 95, 96, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 125, 127, 129, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147], "solver": [2, 5, 15], "option": [2, 4, 5, 6, 7, 8, 15, 20, 22, 23, 26, 28, 29, 31, 32, 33, 34, 35, 36, 43, 53, 58, 63, 65, 79, 85, 86, 89, 91, 103, 112, 113, 114, 115, 116, 117, 118, 119, 120, 124, 125, 128, 132, 133, 134, 136, 137, 138, 139, 140, 141, 142, 143, 154], "type": [2, 4, 5, 6, 7, 8, 10, 15, 17, 18, 19, 20, 22, 23, 25, 26, 29, 31, 32, 33, 34, 35, 36, 38, 39, 42, 43, 45, 46, 50, 53, 59, 63, 64, 65, 74, 80, 82, 83, 86, 87, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 131, 132, 133, 134, 135, 136, 137, 143, 146, 147, 151, 154], "either": [2, 13, 15, 28, 112, 113, 114, 115, 116, 117, 118, 127, 132, 142, 146, 151, 154], "lm": [2, 151], "default": [2, 4, 5, 6, 7, 8, 15, 20, 23, 28, 29, 31, 32, 33, 34, 35, 36, 43, 53, 58, 63, 64, 65, 79, 85, 86, 89, 103, 112, 113, 114, 115, 116, 117, 118, 119, 120, 125, 127, 132, 133, 134, 136, 137, 138, 139, 140, 141, 142, 143, 152], "maximum": [2, 134, 137, 152, 153], "number": [2, 6, 7, 8, 39, 59, 128, 133, 137], "optim": [2, 4, 5, 6, 7, 8, 14, 15, 20], "iter": [2, 34, 39, 137, 149], "converg": [2, 15], "step": [2, 31, 32, 33, 34, 35, 36, 45, 97, 132, 133, 136, 142, 150, 154], "toler": 2, "7": [2, 6, 136, 151], "exit": 2, "when": [2, 24, 25, 26, 43, 64, 65, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 103, 104, 105, 106, 107, 108, 126, 127, 128, 132, 151, 152, 154], "delta": [2, 19, 25, 26, 64, 65, 80, 82, 83, 86, 97, 98, 100, 101, 103, 104, 105, 106, 107, 108, 110, 112, 113, 114, 115, 116, 117, 118, 121, 127, 128, 147, 151, 152, 153, 154], "x": [2, 4, 11, 17, 18, 19, 24, 25, 26, 31, 32, 33, 34, 35, 36, 45, 48, 50, 53, 64, 65, 72, 74, 75, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 102, 103, 104, 105, 106, 107, 108, 112, 113, 114, 115, 116, 117, 118, 121, 126, 127, 128, 136, 147, 151, 152, 153, 154], "_2": [2, 97, 153], "text": [2, 138], "where": [2, 4, 11, 12, 18, 19, 20, 26, 53, 64, 65, 77, 78, 79, 81, 82, 83, 85, 86, 88, 89, 91, 92, 93, 94, 96, 97, 98, 100, 101, 103, 110, 126, 127, 132, 136, 147, 150, 151, 152, 153, 154], "i": [2, 4, 5, 6, 7, 8, 10, 11, 12, 13, 15, 17, 18, 19, 20, 23, 24, 25, 26, 28, 29, 31, 32, 33, 34, 35, 36, 43, 45, 48, 50, 53, 60, 63, 64, 65, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 121, 125, 126, 127, 128, 129, 132, 133, 135, 136, 137, 146, 147, 148, 149, 150, 151, 152, 153, 154], "chang": [2, 149, 151, 153], "state": [2, 4, 5, 6, 7, 8, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 28, 29, 31, 32, 33, 34, 35, 36, 38, 39, 40, 42, 43, 45, 48, 49, 50, 51, 53, 56, 57, 58, 63, 64, 65, 66, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 103, 104, 105, 106, 107, 108, 123, 124, 125, 126, 127, 129, 131, 132, 133, 136, 139, 140, 146, 149, 150, 152], "success": 2, "rel": [2, 53, 80, 91, 92, 96, 97], "cost": [2, 10, 11, 12, 14, 15], "decreas": 2, "c": [2, 5, 10, 64, 81, 85, 88, 89, 91, 92, 100, 113, 114, 115, 116, 117, 118, 136, 142, 151, 152, 153], "function": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 17, 18, 19, 20, 24, 25, 26, 27, 28, 30, 41, 43, 55, 60, 64, 65, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 103, 104, 105, 106, 107, 108, 119, 120, 126, 127, 130, 132, 134, 136, 137, 141, 148, 153, 154], "accept": [2, 28, 132, 137, 154], "gradient": 2, "infin": 2, "norm": [2, 136, 151, 152, 153, 154], "max_i": 2, "nabla": 2, "j": [2, 4, 26, 45, 65, 100, 101, 102, 103, 105, 109, 110, 112, 113, 114, 115, 116, 117, 118, 121, 128], "_i": [2, 103, 107], "mathbf": [2, 4, 17, 18, 19, 24, 25, 26, 64, 65, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 100, 101, 103, 104, 105, 106, 107, 108, 110, 112, 113, 114, 115, 116, 117, 118, 121, 126, 127, 128, 142, 147, 151, 152, 153, 154], "e": [2, 4, 10, 11, 12, 17, 18, 19, 93, 94, 113, 114, 115, 116, 117, 118, 149, 150, 153, 154], "t": [2, 4, 5, 6, 7, 8, 17, 18, 19, 20, 25, 54, 64, 80, 81, 82, 83, 85, 87, 89, 91, 92, 97, 98, 100, 101, 104, 105, 106, 107, 108, 110, 113, 114, 115, 117, 118, 127, 136, 147, 151, 152, 153, 154], "h": [2, 45], "print": [2, 137, 151, 152, 153, 154], "dure": [2, 15], "runtim": 2, "x0": [2, 18, 28, 40, 49, 56, 57, 58], "p0": [2, 40, 49, 151, 153, 154], "ndarrai": [2, 4, 5, 6, 7, 8, 15, 17, 18, 19, 20, 22, 23, 24, 25, 26, 28, 31, 33, 35, 36, 37, 38, 39, 40, 42, 43, 45, 47, 48, 49, 50, 53, 54, 56, 57, 58, 59, 63, 64, 65, 66, 68, 74, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 124, 125, 126, 127, 128, 129, 131, 132, 133, 135, 136, 143, 147, 151, 152, 153, 154], "input_data": [2, 40, 49, 151, 153, 154], "list": [2, 4, 5, 6, 7, 8, 14, 15, 17, 18, 19, 20, 22, 25, 26, 28, 29, 39, 40, 43, 44, 45, 46, 47, 48, 49, 56, 57, 58, 59, 65, 85, 89, 93, 94, 100, 101, 102, 103, 109, 110, 123, 132, 133, 134, 135, 138, 139, 140, 142, 144, 146, 148, 151, 153, 154], "meas_data": [2, 40, 49, 151, 153, 154], "process_model": [2, 19, 28, 31, 32, 33, 34, 35, 36, 151, 152, 153, 154], "processmodel": [2, 16, 19, 25, 28, 31, 32, 33, 34, 35, 36, 49, 64, 80, 82, 97, 98, 105, 106, 107, 151, 152, 153, 154], "return_opt_result": 2, "fals": [2, 4, 25, 28, 31, 32, 33, 34, 35, 36, 40, 43, 132, 138, 139, 140, 141, 142], "statewithcovari": [2, 31, 32, 33, 34, 35, 36, 40, 42, 44, 46, 48, 49, 50, 131, 132, 151, 153, 154], "propag": [2, 19, 31, 32, 33, 34, 35, 36, 64, 105, 136], "initi": [2, 28, 45, 58, 102, 144, 151, 153, 154], "forward": [2, 31, 32, 33, 34, 35, 36, 45, 53, 64, 107, 136, 151, 154], "time": [2, 14, 19, 25, 26, 28, 31, 32, 33, 34, 35, 36, 43, 58, 64, 80, 82, 83, 97, 98, 100, 103, 104, 105, 106, 107, 108, 110, 127, 132, 133, 137, 139, 140, 143, 144, 147, 151, 153, 154], "model": [2, 4, 5, 6, 7, 8, 17, 18, 19, 20, 23, 24, 25, 28, 29, 31, 32, 33, 34, 35, 36, 41, 45, 49, 51, 52, 53, 64, 100, 101, 103, 104, 105, 106, 107, 108, 110, 119, 120, 125, 126, 127, 139, 140, 144, 149, 151, 152], "an": [2, 11, 12, 16, 19, 20, 22, 26, 31, 32, 33, 34, 35, 36, 37, 39, 43, 49, 52, 63, 64, 65, 83, 92, 93, 94, 100, 101, 102, 103, 105, 109, 110, 119, 120, 128, 132, 142, 146, 151, 152, 153, 154], "timestep": [2, 45, 64, 147], "involv": [2, 38, 45, 151], "priorresidu": [2, 16], "processresidu": [2, 16], "each": [2, 4, 5, 6, 7, 8, 17, 18, 19, 20, 26, 28, 29, 38, 39, 42, 43, 45, 47, 48, 65, 95, 97, 128, 131, 132, 133, 144, 151, 153, 154], "connect": 2, "subsequ": 2, "through": [2, 19, 132, 136, 144, 150, 154], "measurementresidu": [2, 16], "np": [2, 4, 5, 6, 7, 8, 15, 17, 18, 19, 20, 22, 25, 26, 28, 31, 33, 35, 36, 38, 39, 40, 45, 47, 48, 49, 50, 53, 58, 59, 63, 64, 65, 74, 79, 80, 82, 83, 85, 87, 88, 89, 91, 93, 95, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 124, 125, 127, 128, 129, 136, 143, 147, 151, 152, 153, 154], "covari": [2, 4, 5, 6, 7, 8, 15, 22, 24, 25, 26, 28, 31, 32, 33, 35, 36, 37, 42, 43, 47, 48, 50, 58, 63, 64, 65, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 119, 120, 124, 126, 127, 129, 131, 132, 143, 151, 152, 153, 154], "form": [2, 4, 10, 18, 26, 77, 78, 79, 81, 85, 86, 88, 89, 93, 94, 97, 98, 100, 101, 103, 110, 112, 113, 114, 115, 116, 117, 118, 126, 127, 134, 147, 151, 153, 154], "flag": [2, 4, 5, 6, 7, 8, 20, 29, 142, 154], "return": [2, 4, 5, 6, 7, 8, 10, 15, 17, 18, 19, 20, 22, 24, 25, 26, 28, 29, 31, 32, 33, 34, 35, 36, 38, 39, 43, 45, 46, 47, 48, 49, 50, 53, 56, 57, 58, 59, 63, 64, 65, 74, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 123, 124, 126, 127, 128, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 143, 144, 146, 147, 151, 152, 153, 154], "result": [2, 32, 43, 132, 133, 137, 138, 141, 149, 151, 152, 153, 154], "dictionari": [2, 26], "from": [2, 4, 5, 6, 7, 8, 9, 10, 24, 25, 26, 28, 31, 32, 33, 35, 36, 38, 43, 45, 53, 60, 64, 67, 68, 74, 80, 81, 82, 83, 93, 94, 97, 98, 103, 104, 105, 106, 107, 108, 118, 126, 127, 128, 132, 134, 137, 144, 152, 153, 154], "error": [4, 5, 6, 7, 8, 10, 11, 12, 15, 16, 17, 18, 19, 20, 25, 37, 42, 43, 64, 80, 82, 83, 95, 97, 98, 104, 105, 106, 107, 108, 127, 131, 132, 133, 138, 149, 151, 152, 153, 154], "weight": [4, 5, 6, 7, 8, 9, 10, 11, 12, 38, 39, 46, 47], "abc": [4, 12, 20, 123, 124, 126, 127, 128], "gaussian": [4, 5, 6, 7, 8, 24, 25, 45, 46, 47, 48, 50, 64, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 126, 127, 131], "mixtur": [4, 5, 6, 7, 8, 45, 47], "can": [4, 17, 19, 26, 28, 52, 60, 64, 103, 112, 119, 120, 125, 127, 128, 129, 132, 133, 136, 142, 143, 146, 147, 148, 149, 151, 152, 153, 154], "instanc": [4, 39, 45, 49, 109, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 128], "non": [4, 137], "nois": [4, 24, 25, 28, 29, 53, 63, 64, 66, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 110, 119, 120, 126, 127, 147, 151, 152, 153, 154], "ha": [4, 22, 26, 50, 58, 63, 112, 113, 114, 115, 116, 117, 118, 119, 120, 124, 151, 152, 153, 154], "been": [4, 26, 65, 151, 153, 154], "fit": 4, "unknown": [4, 92], "associ": [4, 23, 24, 26, 28, 31, 33, 35, 36, 39, 42, 58, 63, 77, 78, 79, 80, 81, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 100, 101, 102, 103, 109, 110, 119, 120, 125, 126, 129, 131, 133, 134, 144, 151, 153], "loop": [4, 144, 154], "closur": 4, "one": [4, 64, 112, 127, 137, 144, 151, 153, 154], "compon": [4, 5, 6, 7, 8, 42, 79, 131, 133, 136, 151], "correspond": [4, 5, 6, 7, 8, 15, 20, 26, 29, 42, 43, 45, 47, 65, 125, 128, 129, 131, 132, 133, 151, 152, 153, 154], "small": [4, 39], "anoth": [4, 26, 65, 93, 96, 112, 113, 114, 115, 116, 117, 118, 121, 128, 153], "larg": [4, 149, 151, 153], "implement": [4, 5, 6, 7, 8, 20, 25, 43, 51, 80, 82, 83, 97, 98, 104, 105, 106, 107, 108, 126, 127, 128, 132, 149, 151, 152, 153, 154], "term": [4, 11, 12, 13, 15, 153], "log": [4, 153], "sum_": [4, 103], "k": [4, 19, 25, 31, 33, 35, 36, 53, 64, 80, 82, 83, 97, 98, 100, 101, 103, 104, 105, 106, 107, 108, 110, 127, 147, 151, 152, 153, 154], "1": [4, 5, 6, 7, 8, 10, 17, 18, 19, 20, 25, 26, 31, 33, 35, 36, 43, 64, 65, 79, 80, 82, 83, 86, 89, 95, 96, 97, 98, 100, 101, 103, 104, 105, 106, 107, 108, 110, 113, 114, 115, 116, 117, 118, 127, 132, 133, 136, 137, 141, 142, 143, 147, 151, 152, 153, 154], "w_k": 4, "det": [4, 116, 117, 118], "left": [4, 53, 86, 103, 112, 113, 114, 115, 116, 117, 118, 150, 152], "sqrt": [4, 136], "r": [4, 5, 6, 7, 8, 17, 18, 19, 20, 24, 25, 56, 57, 58, 64, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 113, 114, 115, 116, 117, 118, 126, 127, 141, 151, 152, 153, 154], "_k": [4, 19, 25, 64, 80, 82, 83, 97, 98, 103, 104, 105, 106, 107, 108, 110, 127, 147, 151, 152, 153], "right": [4, 53, 65, 86, 87, 103, 112, 113, 114, 115, 116, 117, 118, 136, 151, 152], "exp": [4, 80, 97, 100, 101, 110, 112, 113, 114, 115, 116, 117, 118, 152, 153], "boldsymbol": [4, 152, 153], "eta": 4, "normal": [4, 5, 6, 7, 8, 37, 42, 53, 131, 133, 136, 141, 154], "yield": 4, "argument": [4, 24, 25, 31, 32, 33, 34, 35, 36, 64, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 102, 104, 105, 106, 107, 108, 126, 127, 154], "constructor": 4, "must": [4, 5, 6, 7, 8, 9, 20, 28, 31, 32, 33, 34, 35, 36, 43, 48, 49, 91, 112, 113, 114, 115, 116, 117, 118, 126, 127, 128, 132, 133, 136, 137, 141, 151, 152, 153, 154], "sqrt_info_matrix": [4, 5, 6, 7, 8, 17, 18, 19, 20], "root": [4, 18, 42, 131, 133], "inform": [4, 5, 6, 7, 8, 17, 18, 19, 20, 81, 103, 119, 120, 127, 153], "matrix": [4, 5, 6, 7, 8, 15, 17, 18, 19, 20, 22, 25, 26, 45, 53, 63, 64, 65, 67, 68, 72, 75, 80, 82, 83, 87, 88, 94, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 124, 126, 127, 129, 142, 147, 151, 152, 153], "differ": [4, 5, 6, 7, 8, 17, 18, 19, 20, 23, 24, 25, 26, 31, 32, 33, 34, 35, 36, 43, 60, 64, 65, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 112, 113, 114, 115, 116, 117, 118, 121, 125, 126, 127, 128, 132, 133, 134, 136, 151, 152, 153, 154], "how": [4, 43, 52, 132, 150, 151, 152], "overal": [4, 144], "jacobian": [4, 5, 6, 7, 8, 15, 17, 18, 19, 20, 24, 25, 26, 32, 34, 64, 65, 66, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 103, 104, 105, 106, 107, 108, 112, 113, 114, 115, 116, 117, 118, 121, 126, 127, 128, 149, 151], "therefor": 4, "subclass": [4, 112, 151, 153, 154], "overwrit": [4, 102], "mix_error": [4, 5, 6, 7, 8], "mix_jacobian": [4, 5, 6, 7, 8], "which": [4, 5, 6, 7, 8, 9, 16, 20, 23, 24, 26, 29, 31, 32, 33, 34, 35, 36, 42, 45, 86, 93, 100, 101, 102, 103, 109, 110, 126, 127, 131, 132, 133, 137, 141, 144, 149, 151, 152, 153, 154], "abstract": [4, 12, 20, 109, 123, 124, 126, 127, 128, 149, 152, 153, 154], "error_value_list": [4, 5, 6, 7, 8], "sqrt_info_matrix_list": [4, 5, 6, 7, 8], "tupl": [4, 5, 6, 7, 8, 15, 17, 18, 19, 20, 24, 38, 74, 77, 78, 79, 81, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 103, 126, 134, 138, 139, 140, 141, 147], "thi": [4, 5, 6, 7, 8, 11, 12, 13, 15, 19, 23, 24, 25, 26, 31, 32, 33, 34, 35, 36, 48, 52, 53, 60, 63, 64, 65, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 125, 126, 127, 128, 129, 132, 133, 136, 137, 143, 144, 149, 150, 151, 152, 153, 154], "comput": [4, 5, 6, 7, 8, 15, 16, 17, 20, 28, 31, 32, 33, 35, 36, 39, 42, 50, 53, 66, 86, 87, 103, 131, 133, 136, 137, 147, 152], "factor": [4, 5, 6, 7, 8], "all": [4, 5, 6, 7, 8, 10, 22, 26, 28, 65, 132, 137, 144, 148, 149, 150, 151, 152, 153, 154], "assum": [4, 5, 6, 7, 8, 23, 28, 80, 81, 83, 86, 96, 112, 113, 114, 115, 116, 117, 118, 125, 133, 154], "have": [4, 5, 6, 7, 8, 24, 25, 26, 64, 65, 66, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 126, 127, 132, 138, 139, 140, 145, 149, 151, 152, 153, 154], "ident": [4, 5, 6, 7, 8, 53, 58, 102, 133, 152], "jacobian_list_of_list": [4, 5, 6, 7, 8], "For": [4, 5, 6, 7, 8, 17, 18, 19, 20, 26, 38, 65, 112, 113, 114, 115, 116, 117, 118, 121, 128, 132, 137, 151, 152, 153, 154], "everi": [4, 5, 6, 7, 8, 143], "w": [4, 5, 6, 7, 8, 17, 18, 19, 20, 22, 25, 63, 64, 80, 82, 83, 87, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 119, 120, 124, 127, 147, 151], "jacobian_list": [4, 5, 6, 7, 8], "outer": [4, 5, 6, 7, 8], "inner": [4, 5, 6, 7, 8], "contain": [4, 5, 6, 7, 8, 20, 23, 30, 47, 52, 53, 63, 65, 74, 80, 81, 86, 87, 95, 103, 119, 120, 122, 123, 125, 128, 129, 131, 132, 133, 137, 138, 142, 146, 149, 151, 153, 154], "evaluate_component_residu": [4, 5, 6, 7, 8], "compute_jacobian": [4, 5, 6, 7, 8, 17, 18, 19, 20], "evalu": [4, 5, 6, 7, 8, 10, 17, 18, 19, 20, 23, 24, 25, 26, 29, 32, 34, 53, 64, 65, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 112, 113, 114, 115, 116, 117, 118, 121, 125, 126, 127, 128, 149, 151, 152, 153, 154], "jacobian_fd": [4, 5, 6, 7, 8, 17, 18, 19, 20, 24, 25, 64, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 126, 127, 152], "step_siz": [4, 5, 6, 7, 8, 17, 18, 19, 20, 24, 25, 26, 64, 65, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 112, 113, 114, 115, 116, 117, 118, 121, 126, 127, 128, 136], "06": [4, 5, 6, 7, 8, 17, 18, 19, 20, 24, 25, 64, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 126, 127], "calcul": [4, 5, 6, 7, 8, 17, 18, 19, 20, 24, 25, 26, 31, 32, 33, 34, 35, 36, 43, 47, 64, 65, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 112, 113, 114, 115, 116, 117, 118, 121, 126, 127, 128, 132, 133, 136, 154], "finit": [4, 5, 6, 7, 8, 17, 18, 19, 20, 24, 25, 26, 64, 65, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 112, 113, 114, 115, 116, 117, 118, 121, 126, 127, 128, 136, 149, 152], "point": [4, 5, 6, 7, 8, 17, 18, 19, 20, 31, 32, 33, 34, 35, 36, 38, 43, 53, 82, 87, 93, 127, 132, 146, 154], "respect": [4, 5, 6, 7, 8, 17, 18, 19, 20, 24, 25, 26, 38, 64, 65, 66, 77, 78, 79, 80, 81, 82, 83, 84, 85, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 112, 113, 114, 115, 116, 117, 118, 121, 126, 127, 128, 152], "exampl": [4, 5, 6, 7, 8, 17, 18, 19, 20, 26, 43, 52, 55, 65, 132, 136, 151, 152, 154], "first": [4, 5, 6, 7, 8, 15, 17, 18, 19, 20, 93, 97, 127, 132, 134, 150, 151, 153, 154], "element": [4, 5, 6, 7, 8, 17, 18, 19, 20, 43, 48, 50, 64, 65, 93, 112, 113, 114, 115, 116, 117, 118, 121, 128, 132, 142, 151, 153], "0": [4, 5, 6, 7, 8, 10, 11, 17, 18, 19, 20, 25, 28, 34, 43, 56, 57, 58, 63, 64, 79, 80, 82, 83, 85, 89, 97, 98, 103, 104, 105, 106, 107, 108, 113, 114, 115, 126, 127, 132, 133, 134, 136, 141, 146, 147, 151, 152, 153, 154], "second": [4, 5, 6, 7, 8, 15, 17, 18, 19, 20, 24, 25, 64, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 126, 127, 134], "etc": [4, 5, 6, 7, 8, 17, 18, 19, 20], "no_use_complex_numb": 5, "normalization_const": 5, "gaussianmixtureresidu": [5, 6, 7, 8], "hessian": 5, "sum": [5, 42, 131], "patch": 5, "compat": [5, 49, 77, 78, 79, 85, 89, 95, 136, 154], "nonlinear": [5, 9, 11, 12, 13, 15, 32, 35], "follow": [5, 6, 7, 60, 64, 86, 128, 149, 150, 151, 152, 153, 154], "refer": [5, 6, 7, 8, 45, 64, 80, 151, 152, 153], "misc": 5, "korotkine2024hessian": 5, "titl": [5, 6, 7, 8, 154], "likelihood": 5, "author": [5, 6, 7, 8], "vassili": 5, "korotkin": 5, "mitchel": 5, "cohen": 5, "jame": 5, "richard": 5, "forb": 5, "year": [5, 6, 7, 8], "2024": 5, "eprint": 5, "2404": 5, "05452": 5, "archiveprefix": 5, "arxiv": 5, "primaryclass": 5, "ro": [5, 115, 118], "sum_mixture_residu": 5, "summixtureresidu": 5, "articl": [6, 7, 8], "olson2013infer": 6, "infer": 6, "network": 6, "robust": [6, 9, 10, 11, 15], "robot": [6, 7, 8, 58, 77, 78, 79, 80, 81, 91, 92, 94, 95, 96, 97, 110, 151, 152, 153, 154], "map": [6, 149, 153], "olson": 6, "edwin": 6, "agarw": 6, "pratik": 6, "journal": [6, 7, 8], "intern": [6, 22, 100, 101, 109, 110, 119, 120, 124], "research": 6, "volum": [6, 7, 8], "32": [6, 153], "page": [6, 7, 8, 148, 150], "826": 6, "840": 6, "2013": 6, "publish": 6, "sage": 6, "public": 6, "uk": 6, "london": 6, "england": 6, "damping_const": 7, "10": [7, 8, 45, 57, 58, 132, 137, 146, 151, 153, 154], "9381625": [7, 8], "pfeifer": [7, 8], "tim": [7, 8, 152], "lang": [7, 8], "sven": [7, 8], "protzel": [7, 8], "peter": [7, 8], "ieee": [7, 8, 45], "autom": [7, 8], "letter": [7, 8, 45], "advanc": [7, 8], "2021": [7, 8], "6": [7, 8, 58, 63, 102, 136, 151, 152], "2": [7, 8, 26, 65, 95, 96, 97, 114, 117, 127, 136, 137, 142, 146, 151, 152, 153, 154], "3941": [7, 8], "3948": [7, 8], "doi": [7, 8, 45], "1109": [7, 8, 45], "lra": [7, 8], "3067307": [7, 8], "compute_nonlinear_part": 7, "scalar_errors_differ": 7, "alpha": 7, "detail": [8, 60, 152], "see": [8, 52, 148, 152, 154], "here": [9, 10, 64, 81, 151, 152, 153, 154], "inherit": [9, 125, 126, 127, 128, 129, 152, 154], "lossfunct": [9, 10, 11, 15], "interfac": [9, 13, 149], "cauchi": 10, "taken": [10, 31, 32, 33, 34, 35, 36, 134], "mactavish": 10, "barfoot": [10, 68, 152, 153], "At": 10, "given": [10, 15, 22, 26, 28, 29, 31, 32, 33, 34, 35, 36, 40, 50, 53, 64, 65, 81, 82, 86, 95, 96, 97, 100, 101, 102, 103, 105, 109, 110, 112, 113, 114, 115, 116, 117, 118, 121, 128, 131, 137, 139, 140, 143, 147, 152, 154], "standard": [11, 15, 23, 24, 81, 120, 121, 152, 154], "l2": 11, "simpli": [11, 23, 86, 98, 125, 149, 153, 154], "5": [11, 56, 57, 65, 136, 142, 146, 151, 153, 154], "ones": 11, "rho": [11, 12], "often": [11, 12, 128, 154], "design": [11, 12, 149, 154], "variabl": [11, 12, 15, 20, 119, 120], "depend": [11, 12, 43, 64, 132, 149, 150, 152], "current": [11, 12, 19, 23, 31, 32, 33, 34, 35, 36, 45, 64, 86, 96, 125, 150], "valu": [11, 12, 22, 23, 25, 26, 28, 29, 31, 32, 33, 34, 35, 36, 43, 64, 65, 80, 82, 83, 86, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 124, 125, 127, 128, 131, 132, 133, 139, 140, 141, 146, 151, 152, 153, 154], "reweight": [11, 12], "our": [11, 12, 18, 19, 149, 151, 152, 153, 154], "origin": [11, 12, 103, 153], "ani": [12, 17, 19, 22, 23, 24, 26, 29, 53, 63, 65, 81, 86, 91, 92, 95, 96, 97, 100, 101, 102, 103, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 124, 125, 128, 146, 148, 149, 151, 152, 153, 154], "allow": [13, 144, 149, 151, 152, 154], "arbitrari": [13, 22, 31, 32, 33, 34, 35, 36, 119, 120, 124], "gauss": [13, 15, 31, 33, 35, 36, 38, 149], "newton": [13, 15], "levenberg": [13, 15], "marquardt": [13, 15], "code": [13, 43, 132, 137, 146, 151, 153, 154], "inspir": 13, "utiasstart": 13, "pyslam": 13, "repo": [13, 149, 150], "http": 13, "github": [13, 149, 150], "com": [13, 149, 150], "utiasstar": 13, "well": [13, 26, 151, 153], "cere": 13, "size_st": 14, "size_error": 14, "store": [14, 15, 54, 65, 94, 96, 113, 114, 115, 116, 117, 118, 123, 125, 153, 154], "summari": 14, "build": 15, "is_converg": 15, "delta_cost": 15, "dx": [15, 26, 65, 112, 113, 114, 115, 116, 117, 118, 121, 128, 151, 153], "grad_norm": 15, "add_residu": 15, "loss": 15, "l2loss": 15, "add": [15, 22, 25, 26, 28, 29, 63, 65, 100, 101, 102, 103, 110, 138, 151, 153, 154], "along": [15, 128, 142], "add_vari": 15, "kei": [15, 17, 18, 19, 20, 26], "hashabl": [15, 17, 18, 19, 20], "set_variables_const": 15, "set": [15, 16, 22, 26, 32, 53, 58, 64, 65, 145, 150, 151, 154], "held": 15, "constant": [15, 64, 151], "compute_error_jac_cost": 15, "dict": [15, 26, 32], "full": [15, 26, 64, 65], "vector": [15, 23, 26, 42, 48, 64, 65, 79, 85, 86, 88, 89, 93, 112, 113, 114, 115, 116, 117, 118, 120, 121, 125, 131, 136, 143, 146, 149, 151, 152, 153, 154], "If": [15, 25, 26, 28, 29, 31, 32, 33, 34, 35, 36, 53, 58, 64, 65, 80, 82, 83, 86, 97, 98, 102, 103, 104, 105, 106, 107, 108, 112, 113, 114, 115, 116, 117, 118, 127, 129, 135, 136, 137, 138, 139, 140, 141, 142, 146, 152], "get_covariance_block": 15, "key_1": 15, "key_2": 15, "retriev": 15, "block": [15, 26, 43, 65, 132, 146], "two": [15, 25, 26, 58, 64, 65, 80, 82, 83, 95, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 127, 132, 134, 151, 153, 154], "compute_covari": 15, "after": [15, 45, 149, 151], "commonli": [16, 80, 153], "These": [16, 26, 147, 153], "assign": [16, 22, 23, 24, 119, 120, 124, 128, 141, 151], "between": [16, 23, 25, 31, 32, 33, 34, 35, 36, 42, 43, 53, 64, 80, 82, 83, 86, 97, 98, 104, 105, 106, 107, 108, 125, 127, 131, 132, 133, 134, 141, 146, 153], "predict": [16, 23, 30, 31, 32, 33, 34, 35, 36, 40, 45, 53, 86, 105, 107, 125, 151, 153, 154], "actual": [16, 25, 80, 82, 83, 98, 104, 105, 106, 107, 108, 127, 141, 154], "compar": [16, 152], "measurementmodel": [16, 23, 24, 28, 29, 52, 77, 78, 79, 81, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 125, 144, 151, 152, 153, 154], "y": [17, 23, 26, 31, 32, 33, 34, 35, 36, 45, 53, 65, 77, 78, 79, 81, 85, 86, 87, 88, 89, 91, 92, 93, 94, 112, 113, 114, 115, 116, 117, 118, 121, 126, 128, 138, 139, 140, 151, 152, 153, 154], "g": [17, 24, 64, 77, 78, 79, 81, 84, 85, 86, 88, 89, 90, 91, 92, 93, 94, 95, 96, 126, 152], "neg": 17, "prior_stat": 18, "prior_covari": 18, "minu": [18, 19, 23, 26, 65, 86, 112, 113, 114, 115, 116, 117, 118, 121, 125, 128, 151, 152, 153, 154], "oper": [18, 19, 22, 23, 26, 65, 86, 96, 109, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 124, 125, 128, 149, 151, 152, 153], "_0": 18, "guess": 18, "u": [19, 25, 31, 32, 33, 34, 35, 36, 45, 53, 64, 74, 80, 82, 83, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 127, 151, 152, 153, 154], "math": [19, 142, 147], "_": [19, 25, 64, 80, 81, 82, 83, 85, 89, 91, 92, 97, 98, 100, 101, 103, 104, 105, 106, 107, 108, 110, 127, 142, 147, 151, 152, 153, 154], "hat": 19, "written": [19, 81, 153], "f": [19, 25, 80, 82, 83, 97, 98, 104, 105, 106, 107, 108, 127, 152, 153, 154], "x_k": [19, 152, 154], "x_k_hat": 19, "t_k": [19, 153], "self": [20, 26, 31, 32, 33, 34, 35, 36, 65, 112, 113, 114, 115, 116, 117, 118, 121, 128, 151, 152, 153, 154], "input_list": 22, "under": [22, 25, 149], "develop": [22, 25], "dof": [22, 26, 38, 43, 63, 65, 100, 101, 102, 103, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 124, 128, 132, 133, 136, 151, 153, 154], "degre": [22, 24, 26, 63, 65, 100, 101, 102, 103, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 124, 128, 129, 132, 141, 153], "freedom": [22, 24, 26, 63, 65, 100, 101, 102, 103, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 124, 128, 129, 132, 141, 153], "stamp": [22, 23, 26, 31, 32, 33, 34, 35, 36, 42, 43, 44, 45, 63, 65, 86, 100, 101, 102, 103, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 124, 125, 128, 129, 131, 132, 133, 134, 135, 146, 151, 153, 154], "timestamp": [22, 23, 26, 28, 42, 43, 63, 65, 86, 100, 101, 102, 103, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 124, 125, 128, 131, 132, 133, 134, 135, 137, 139, 140], "get_index_by_id": [22, 26, 65], "state_id": [22, 23, 24, 26, 29, 63, 65, 86, 96, 100, 101, 102, 103, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 124, 125, 128, 151, 153, 154], "get": [22, 26, 65, 123, 132, 152, 154], "index": [22, 26, 65, 135], "particular": [22, 26, 65, 148], "add_input": 22, "remove_input_by_id": 22, "remov": [22, 26, 65, 74], "id": [22, 23, 24, 26, 63, 65, 81, 86, 95, 96, 100, 101, 102, 103, 109, 110, 112, 113, 114, 115, 116, 117, 118, 125], "get_input_by_id": 22, "get_dof_by_id": [22, 26, 65], "sub": [22, 26, 65], "get_stamp_by_id": [22, 26, 65], "set_stamp_by_id": [22, 26, 65], "set_input_by_id": 22, "whole": [22, 26, 65], "set_stamp_for_al": [22, 26, 65], "subinput": 22, "to_list": [22, 26, 65], "convert": [22, 23, 26, 53, 65, 115, 118, 153], "back": [22, 26, 65, 149, 152, 153], "copi": [22, 26, 44, 53, 54, 63, 65, 100, 101, 102, 103, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 124, 128, 129, 151, 152, 153, 154], "deep": [22, 63, 109, 124, 153], "plu": [22, 26, 63, 65, 100, 101, 102, 103, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 124, 128, 151, 152, 153], "addit": [22, 24, 25, 32, 64, 66, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 109, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 124, 126, 127, 128, 149, 151, 152, 153, 154], "modifi": [22, 63, 103, 109, 119, 120, 124], "new": [22, 26, 28, 31, 32, 33, 34, 35, 36, 64, 65, 97, 100, 101, 102, 103, 109, 110, 115, 118, 124, 128, 132, 138, 139, 140, 141, 151, 152, 153], "shape": [22, 43, 58, 63, 65, 102, 119, 120, 124, 132, 133, 136, 143], "identifi": [22, 37, 53, 65, 91, 103, 119, 120, 124], "possibl": [22, 26, 119, 120, 124, 151], "replac": 23, "compositemeasurementmodel": [23, 96, 151], "per": [23, 59, 154], "numpi": [23, 25, 26, 42, 43, 64, 65, 80, 82, 83, 85, 86, 89, 96, 97, 98, 100, 101, 103, 104, 105, 106, 107, 108, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 125, 126, 127, 128, 129, 131, 132, 133, 135, 143, 151, 152, 153, 154], "y_check": [23, 86, 125], "By": [23, 86, 103, 119, 120, 125, 149, 153], "column": [23, 38, 86, 125, 143, 150], "thu": [23, 86, 125, 137], "subtract": [23, 26, 65, 86, 103, 112, 113, 114, 115, 116, 117, 118, 121, 125, 128, 152, 153, 154], "wrapper": [24, 151], "specif": [24, 26, 48, 65, 127, 149, 151, 153], "substat": [24, 26, 65, 96, 151], "referenc": [24, 151], "insid": [24, 96, 153], "compositest": [24, 25, 65, 81, 92, 95, 96], "take": [24, 26, 65], "care": [24, 26, 65, 136], "extract": [24, 26, 65, 151, 153], "relev": [24, 48, 151], "appli": [24, 28, 31, 32, 33, 34, 35, 36, 107], "It": [24, 26, 143, 151, 152, 153, 154], "also": [24, 26, 28, 65, 81, 93, 103, 105, 126, 127, 132, 136, 149, 151, 153, 154], "pad": 24, "zero": [24, 50, 88, 137, 143, 151, 152, 153], "appropri": [24, 26], "match": [24, 96, 134, 152], "larger": [24, 31, 32, 33, 34, 35, 36, 45], "onli": [24, 43, 48, 100, 132, 152], "singl": [24, 26, 28, 43, 98, 132, 133, 137, 149, 152], "uniqu": [24, 65, 91, 151], "mathcal": [24, 25, 26, 64, 65, 77, 78, 79, 80, 81, 82, 83, 84, 85, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 103, 104, 105, 106, 107, 108, 112, 113, 114, 115, 116, 117, 118, 121, 126, 127, 128, 147, 151, 152], "frac": [24, 25, 26, 65, 77, 78, 79, 80, 81, 82, 83, 84, 85, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 112, 113, 114, 115, 116, 117, 118, 121, 126, 127, 128, 152], "d": [24, 25, 26, 65, 77, 78, 79, 80, 81, 82, 83, 84, 85, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 112, 113, 114, 115, 116, 117, 118, 121, 126, 127, 128, 147, 151, 152], "evaluate_with_jacobian": [24, 25, 64, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 126, 127], "simultan": [24, 25, 64, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 126, 127, 131], "its": [24, 25, 32, 48, 58, 64, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 126, 127, 147, 149, 151, 154], "output": [24, 25, 32, 64, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 126, 127, 135, 136, 137, 154], "overrid": [24, 25, 64, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 126, 127, 152], "perform": [24, 25, 32, 37, 64, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 126, 127, 146, 150, 154], "reason": [24, 25, 64, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 126, 127, 154], "lot": [24, 25, 64, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 126, 127, 151], "common": [24, 25, 48, 51, 64, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 126, 127, 138, 139, 140, 149, 152, 153], "more": [24, 25, 64, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 126, 127, 132, 137, 149, 151, 152, 154], "effici": [24, 25, 64, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 126, 127], "them": [24, 25, 64, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 126, 127, 143, 149, 152, 153], "same": [24, 25, 26, 39, 64, 65, 66, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 112, 113, 114, 115, 116, 117, 118, 121, 126, 127, 128, 144, 149, 151, 153, 154], "call": [24, 25, 64, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 126, 127, 153, 154], "sqrt_inform": [24, 25, 64, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 107, 108, 126, 127], "model_list": [25, 144], "shared_input": 25, "should": [25, 39, 53, 103, 127, 128, 149, 150], "stackedprocessmodel": 25, "todo": 25, "document": [25, 67], "test": [25, 31, 32, 33, 34, 35, 36, 37, 128], "compositeinput": 25, "dt": [25, 31, 32, 33, 34, 35, 36, 45, 61, 62, 64, 66, 69, 70, 71, 73, 80, 82, 83, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 127, 147, 151, 152, 153, 154], "provid": [25, 26, 28, 29, 31, 32, 33, 34, 35, 36, 43, 64, 80, 82, 83, 97, 98, 102, 103, 104, 105, 106, 107, 108, 115, 118, 127, 132, 133, 146, 152, 154], "numer": [25, 80, 82, 83, 98, 104, 105, 106, 107, 108, 127, 149], "access": [25, 26, 80, 82, 83, 98, 104, 105, 106, 107, 108, 127, 151, 152, 154], "via": [25, 80, 82, 83, 86, 98, 104, 105, 106, 107, 108, 127, 150], "interv": [25, 31, 32, 33, 34, 35, 36, 43, 64, 80, 82, 83, 97, 98, 103, 104, 105, 106, 107, 108, 127, 132, 133, 141], "q": [25, 28, 56, 57, 58, 64, 80, 82, 83, 97, 98, 100, 101, 103, 104, 105, 106, 107, 108, 110, 127, 147, 151, 152, 153, 154], "sim": [25, 64, 80, 82, 83, 97, 98, 103, 104, 105, 106, 107, 108, 126, 127, 147, 151], "n": [25, 26, 43, 64, 65, 68, 80, 82, 83, 97, 98, 103, 104, 105, 106, 107, 108, 110, 126, 127, 132, 133, 136, 143, 147, 151], "overridden": [25, 64, 80, 82, 83, 97, 98, 104, 105, 106, 107, 108, 127], "approxim": [25, 64, 80, 82, 83, 97, 98, 104, 105, 106, 107, 108, 127, 152], "linear": [25, 43, 64, 80, 82, 83, 88, 97, 98, 104, 105, 106, 107, 108, 116, 127, 132, 146, 149, 152, 153], "procedur": [25, 64, 80, 82, 83, 97, 98, 104, 105, 106, 107, 108, 127, 136], "input_covari": [25, 28, 31, 33, 35, 36, 64, 80, 82, 83, 97, 98, 102, 103, 104, 105, 106, 107, 108, 127, 151, 152, 153, 154], "input_jacobian_fd": [25, 64, 80, 82, 83, 97, 98, 104, 105, 106, 107, 108, 127], "arg": [25, 64, 80, 82, 83, 97, 98, 104, 105, 106, 107, 108, 127, 136], "kwarg": [25, 64, 80, 82, 83, 97, 98, 104, 105, 106, 107, 108, 112, 116, 117, 127, 136], "state_list": [26, 139, 140, 146], "intend": [26, 43, 132], "hold": [26, 128, 153], "conceptu": 26, "potenti": [26, 151], "plus_jacobian": [26, 65, 112, 113, 114, 115, 116, 117, 118, 121, 128], "minus_jacobian": [26, 65, 112, 113, 114, 115, 116, 117, 118, 121, 128], "found": [26, 60, 149], "attribut": [26, 109, 128, 132, 146, 151], "both": [26, 43, 46, 66, 80, 81, 132, 149, 152, 153], "technic": [26, 112], "": [26, 29, 52, 65, 119, 120, 125, 131, 135, 142, 143, 146, 147, 150, 151, 152, 153], "get_slic": [26, 65], "slice": [26, 65, 132], "add_stat": [26, 65], "remove_state_by_id": [26, 65], "get_slice_by_id": [26, 65], "get_matrix_block_by_id": [26, 65], "mat": [26, 65], "state_id_1": [26, 65], "state_id_2": [26, 65], "portion": [26, 65], "subblock": [26, 65], "corrspond": [26, 65], "set_matrix_block_by_id": [26, 65], "new_mat_block": [26, 65], "enter": [26, 65], "updat": [26, 39, 45, 65, 100, 101, 102, 103, 109, 110, 151], "get_value_by_id": [26, 65], "get_state_by_id": [26, 65], "set_state_by_id": [26, 65], "set_value_by_id": [26, 65], "new_stamp": [26, 65], "inter": [26, 65, 103], "pars": [26, 65], "alwai": [26, 65, 112, 113, 114, 115, 116, 117, 118, 121, 128, 151, 152, 154], "arrai": [26, 43, 49, 65, 102, 112, 113, 114, 115, 116, 117, 118, 120, 121, 126, 128, 129, 132, 135, 136, 143, 151, 152, 153, 154], "plus_by_id": [26, 65], "jacobian_from_block": [26, 65, 112, 113, 114, 115, 116, 117, 118], "block_dict": 26, "entir": 26, "some": [26, 128, 132, 151, 152, 153, 154], "being": [26, 93, 152, 154], "That": [26, 65, 91, 92, 112, 113, 114, 115, 116, 117, 118, 121, 127, 128], "lie": [26, 45, 46, 48, 50, 65, 87, 94, 97, 112, 113, 114, 115, 116, 117, 118, 121, 128, 141, 149], "deriv": [26, 60, 65, 67, 112, 113, 114, 115, 116, 117, 118, 121, 128, 136, 152], "notat": [26, 65, 112, 113, 114, 115, 116, 117, 118, 121, 128], "oplu": [26, 65, 112, 113, 114, 115, 116, 117, 118, 121, 127, 128, 152, 153], "group": [26, 45, 46, 48, 50, 64, 65, 72, 75, 87, 94, 97, 101, 112, 113, 114, 115, 116, 117, 118, 121, 128, 149], "known": [26, 65, 91, 112, 113, 114, 115, 116, 117, 118, 121, 128, 151, 153, 154], "ominu": [26, 65, 112, 113, 114, 115, 116, 117, 118, 121, 128, 152, 153], "invers": [26, 65, 75, 112, 113, 114, 115, 116, 117, 118, 121, 128, 153], "x1": [26, 65, 112, 113, 114, 115, 116, 117, 118, 121, 128], "x2": [26, 65, 112, 113, 114, 115, 116, 117, 118, 121, 128], "minus_jacobian_fd": [26, 65, 112, 113, 114, 115, 116, 117, 118, 121, 128], "08": [26, 65, 112, 113, 114, 115, 116, 117, 118, 121, 128], "plus_jacobian_fd": [26, 65, 112, 113, 114, 115, 116, 117, 118, 121, 128], "tool": [27, 153], "input_func": [28, 151, 153, 154], "callabl": [28, 49, 103, 136, 137, 153, 154], "input_freq": [28, 56, 57, 58, 151, 153, 154], "meas_model_list": [28, 151, 153, 154], "meas_freq_list": [28, 151, 153, 154], "meas_offset_list": 28, "mani": [28, 30, 97, 112, 113, 114, 115, 116, 117, 118, 121, 128, 143, 149, 152, 153], "you": [28, 65, 126, 127, 128, 132, 136, 148, 151, 152, 153, 154], "want": [28, 132, 151, 152], "frequenc": [28, 58, 137, 144, 153, 154], "offset": [28, 134, 144], "specifi": [28, 126, 127, 138, 141, 142, 153, 154], "ground": [28, 29, 131, 139, 140, 154], "truth": [28, 29, 131, 139, 140, 154], "trajectori": [28, 43, 132, 133, 142, 154], "simul": [28, 55, 58], "static": [28, 43, 53, 63, 113, 114, 115, 117, 118, 132], "vari": [28, 151], "add_measurement_model": 28, "freq": [28, 144], "exist": 28, "start": [28, 58, 151, 153, 154], "stop": [28, 151, 153, 154], "integr": [28, 82, 83, 98, 153, 154], "noiseless": 28, "measuement": 28, "end": [28, 58, 113, 114, 115, 146, 149, 151, 152, 153, 154], "whether": [28, 29, 31, 32, 33, 34, 35, 36, 43, 86, 132, 133, 138, 139, 140, 141], "possibli": [28, 154], "noisi": [28, 58, 154], "request": 28, "field": [29, 85, 89, 151], "correct": [30, 31, 32, 33, 34, 35, 36, 40, 45, 103, 151, 153, 154], "style": [30, 40], "reject_outli": [31, 32, 33, 34, 35, 36], "iterate_mean": [31, 33, 35, 36], "sigmapointkalmanfilt": [31, 33, 36], "sigma": [31, 33, 35, 36, 38, 42, 43, 53, 131, 132, 138], "unscent": [31, 33, 35, 36, 38, 149], "cubatur": [31, 33, 35, 36, 38, 149], "gh": [31, 33, 35, 36, 38], "hermit": [31, 33, 35, 36, 38, 149], "ni": [31, 32, 33, 34, 35, 36, 37], "mean": [31, 33, 35, 36, 39, 42, 47, 48, 50, 88, 129, 131, 133, 143, 151, 154], "check": [31, 33, 35, 36, 53, 152], "x_": [31, 33, 35, 36, 152, 154], "fuse": [31, 32, 33, 34, 35, 36, 45, 86, 151, 153, 154], "produc": [31, 32, 33, 34, 35, 36, 143, 153], "vectorinput": [31, 33, 35, 36, 80, 82, 83, 97, 98, 100, 101, 103, 110, 119, 151, 152, 153, 154], "most": [31, 32, 33, 34, 35, 36, 45, 152], "recent": [31, 32, 33, 34, 35, 36, 45], "than": [31, 32, 33, 34, 35, 36, 45, 132, 137, 152, 153], "case": [31, 32, 33, 34, 35, 36, 127, 151, 153, 154], "user": [31, 32, 33, 34, 35, 36, 119, 120, 149, 154], "durat": [31, 32, 33, 34, 35, 36, 100, 101, 102, 103, 109, 110, 153], "next": [31, 32, 33, 34, 35, 36, 150, 151, 153, 154], "inpu": [31, 33, 35, 36], "grab": [31, 33, 35, 36], "On": [32, 34, 35, 45], "manifold": [32, 34, 35, 45, 136, 149], "kalman": [32, 34, 35, 149, 154], "x_jac": [32, 34], "output_detail": [32, 34], "just": [32, 132, 151, 152, 153, 154], "done": [32, 60, 101, 150, 152, 153], "valuat": [32, 34], "intermedi": 32, "innov": [32, 37, 86, 87], "0001": 34, "200": [34, 56, 57], "line_search": 34, "extendedkalmanfilt": [34, 40, 45, 151, 153, 154], "extend": [34, 64, 149, 153, 154], "outlier": 37, "unit": [38, 133], "three": [38, 42, 43, 131, 132, 138, 151, 154], "avail": [38, 149, 151, 153, 154], "sigmapoint": [38, 149], "repres": [38, 81, 98, 112, 113, 114, 115, 116, 117, 118, 120, 121, 127, 129, 142, 151, 153], "x_arrai": 39, "manner": 39, "until": [39, 151, 153, 154], "reach": 39, "maximun": 39, "averag": [39, 133], "thei": [39, 66, 149, 152, 153], "disable_progress_bar": 40, "execut": [40, 49, 137, 149], "_description_": [40, 49], "interact": [41, 45, 149], "multipl": [41, 45, 146, 149, 151], "filter": [41, 45, 49, 131, 149, 151], "imm_estim": 42, "immstat": [42, 43, 45], "state_tru": [42, 43, 131, 132], "gaussianresult": [42, 43, 132], "variou": [42, 131, 133, 149], "metric": [42, 131, 133, 154], "model_prob": [42, 43, 44], "ee": [42, 43, 131, 132, 133], "nee": [42, 43, 131, 132, 133, 141, 151, 153, 154], "md": [42, 43, 131, 132, 154], "mahalanobi": [42, 43, 131, 132, 154], "distanc": [42, 43, 131, 132, 154], "three_sigma": [42, 43, 131, 132, 154], "bound": [42, 43, 131, 132, 133, 138, 141, 146], "rmse": [42, 43, 131, 132, 133], "result_list": [43, 132], "immresult": 43, "gaussianresultlist": [43, 133, 137, 138, 141, 151, 153, 154], "let": [43, 132, 133, 151, 152, 153, 154], "len": [43, 132, 151, 153, 154], "from_estim": [43, 132, 151, 153, 154], "estimate_list": [43, 132], "state_true_list": [43, 132], "nearest": [43, 132, 135], "conveni": [43, 54, 132, 151], "interpol": [43, 132, 139, 140, 146], "do": [43, 132, 139, 140, 151, 152, 154], "line": [43, 128, 132, 139, 140, 141, 151], "up": [43, 53, 103, 132, 139, 140, 150, 151, 154], "exactli": [43, 132, 153], "throughout": [43, 122, 132, 133, 152], "value_tru": [43, 132], "nees_lower_bound": [43, 132, 133], "confidence_interv": [43, 132, 133, 141], "lower": [43, 132, 133], "side": [43, 132, 133, 152], "cumul": [43, 132, 133], "probabl": [43, 45, 132, 133, 141], "threshold": [43, 132, 133], "confid": [43, 132, 133, 141], "make": [43, 103, 132, 139, 140, 141, 143, 151, 154], "plot": [43, 132, 138, 139, 140, 141, 142, 145, 149, 154], "upper": [43, 132, 133], "ax": [43, 132, 138, 139, 140, 141, 142, 145, 151, 153, 154], "99": [43, 132], "nees_upper_bound": [43, 132, 133], "double_sid": [43, 132, 133], "doubl": [43, 82, 83, 132, 133, 152], "python": [43, 132, 146], "model_st": 44, "properti": [44, 53, 54, 65, 100, 101, 102, 103, 109, 110, 112, 113, 114, 115, 116, 117, 118, 129, 142, 151, 153], "kf_list": 45, "transition_matrix": 45, "p": [45, 50], "blom": 45, "bar": [45, 86, 103, 152], "shalom": 45, "algorithm": [45, 149, 150, 152], "system": [45, 147], "markovian": 45, "switch": [45, 153], "coeffici": 45, "transact": 45, "control": [45, 154], "vol": 45, "33": 45, "8": [45, 136, 153], "pp": 45, "780": 45, "783": 45, "aug": 45, "1988": 45, "9": [45, 63, 64, 68, 85, 136, 152, 153], "1299": 45, "mix": [45, 46, 48], "\u0107esi\u0107": 45, "markovi\u0107": 45, "petrovi\u0107": 45, "reduct": 45, "signal": 45, "24": [45, 154], "1719": 45, "1723": 45, "nov": 45, "2017": 45, "lsp": 45, "2723765": 45, "transit": [45, 103], "x_km": 45, "carri": 45, "out": [45, 146, 149, 150, 153], "previou": [45, 102, 151, 152, 153], "x_check": 45, "mu_km_model": 45, "x_list": [46, 48], "handl": [46, 136, 138, 139, 140, 151], "vectorspac": [46, 47], "x_par": 48, "reparametr": 48, "about": [48, 81, 131, 152], "tangent": [48, 50], "space": [48, 50, 58, 149], "own": [48, 58, 151, 153, 154], "To": [48, 97, 126, 127, 152, 153, 154], "chosen": [48, 86], "expand": 48, "around": [48, 50, 151], "onc": [48, 146, 154], "mai": [48, 142, 152], "fashion": [48, 146], "member": 48, "interactingmodelfilt": 49, "interactingmultiplemodel": 49, "q_profil": 49, "mu": 50, "express": [50, 152], "stateandcovari": 50, "x_hat": 50, "algebra": 50, "whose": 50, "built": [51, 154], "librari": [51, 154], "basic": 52, "pinhol": [52, 53, 81], "cameraproject": 52, "fu": 53, "fv": 53, "cu": 53, "cv": 53, "image_width": 53, "image_height": 53, "t_bc": 53, "posematrix": 53, "camera_id": 53, "util": [53, 149], "pixel": 53, "coordin": [53, 112, 113, 114, 115, 116, 117, 118], "imag": 53, "intrins": [53, 81], "focal": 53, "length": [53, 134, 142], "horizont": [53, 143], "vertic": [53, 59], "optic": 53, "axi": [53, 138, 139, 140, 154], "intersect": 53, "plane": 53, "width": 53, "height": [53, 79], "transform": [53, 81, 113, 114, 115, 151, 153], "bodi": [53, 58, 80, 81, 91, 92, 95, 96, 97, 113, 114, 115, 136, 154], "frame": [53, 58, 64, 77, 78, 80, 81, 85, 89, 91, 92, 95, 96, 97, 136, 153, 154], "get_cam_to_enu": 53, "dcm": 53, "relat": 53, "enu": 53, "z": [53, 79, 81, 86], "down": 53, "sigma_normalized_image_coord": 53, "r_normalized_image_coord": 53, "is_measurement_valid": 53, "uv": 53, "valid": [53, 79, 97, 153, 154], "posit": [53, 54, 65, 77, 79, 81, 87, 91, 92, 93, 94, 95, 96, 112, 113, 114, 115, 116, 117, 118, 132, 142, 152, 153, 154], "within": 53, "is_landmark_in_front_of_cam": 53, "pose": [53, 54, 64, 65, 81, 91, 92, 94, 95, 96, 113, 114, 142, 151, 153], "se3stat": [53, 58, 77, 79, 80, 85, 89, 91, 92, 94, 95, 97, 132, 142, 146, 153], "r_pw_a": 53, "landmark": [53, 59, 81, 91, 92, 151, 152, 153, 154], "front": 53, "free": [53, 150], "imust": [53, 56, 57, 64, 74, 77, 78, 79, 85, 89, 91, 92, 94, 95, 106], "imu": [53, 56, 57, 102, 149], "3d": [53, 58, 115, 116, 118, 142, 145, 153], "resolv": [53, 58, 64, 80, 81, 91, 92, 97, 153, 154], "world": [53, 77, 78, 85, 89, 97, 154], "resolve_landmark_in_cam_fram": 53, "project": [53, 81, 149], "r_pc_c": 53, "v": [53, 64, 78, 82, 83, 85, 86, 88, 89, 110, 113, 126, 153, 154], "to_normalized_coord": 53, "to_pixel_coor": 53, "mea": [53, 86], "se": [54, 80, 110, 142, 151, 152, 153], "3": [54, 60, 63, 64, 65, 81, 102, 113, 115, 116, 118, 132, 136, 142, 151, 152, 153, 154], "attitud": [54, 65, 87, 91, 92, 100, 112, 113, 114, 115, 116, 117, 118, 132, 136, 142], "collect": [55, 130, 149], "01": [56, 57, 58, 152, 153], "meas_freq": [56, 57, 58], "t_start": [56, 57, 58], "t_end": [56, 57, 58], "50": [56, 57, 137, 151, 153, 154], "noise_act": [56, 57, 58], "get_ground_truth": [56, 57, 58, 123], "groundtruth": [56, 57, 58, 123], "get_input_data": [56, 57, 58, 123], "retrun": [56, 57, 58, 123], "get_measurement_data": [56, 57, 58, 123], "cylinder_radiu": [57, 59], "max_height": [57, 59], "n_level": [57, 59], "n_landmarks_per_level": [57, 59], "get_groundtruth_landmark": 57, "30": [58, 151, 153, 154], "simpl": [58, 98, 125, 154], "rigid": [58, 95, 113, 114, 115], "move": [58, 152, 154], "rang": [58, 93, 94, 95, 96, 146, 151, 153, 154], "anchor": [58, 93, 94], "tag": [58, 95, 96], "mount": 58, "veloc": [58, 65, 78, 80, 97, 98, 100, 110, 112, 113, 114, 115, 116, 117, 118, 136, 152, 153, 154], "angular": [58, 80, 100, 110, 152, 154], "translat": [58, 80, 110, 153], "order": [58, 65, 82, 151], "arrang": 59, "cylind": 59, "radiu": 59, "top": [59, 148], "discret": [59, 64, 82, 83, 97, 98, 147, 153, 154], "level": [59, 137], "place": [59, 100, 101, 102, 103, 109, 110], "kinemat": [60, 64, 82, 153], "note": [60, 81, 151, 152, 154], "treatment": 60, "typic": 60, "sens": [60, 128, 154], "directli": [60, 86, 87, 103, 112, 127, 141, 150, 151, 153, 154], "se_2": [60, 64, 65, 153], "pdf": 60, "describ": [60, 63, 81, 91, 92, 119, 120, 153], "link": [60, 148], "graviti": [61, 62, 64, 102, 106], "gyro": [63, 65, 74, 102], "accel": [63, 69, 70, 71, 102], "bias_gyro_walk": 63, "bias_accel_walk": 63, "read": [63, 125, 152], "size": [63, 65, 95, 102, 136, 142], "acceleromet": [63, 65, 74], "drive": 63, "bia": [63, 65, 66, 74, 79, 83, 100, 101, 102, 103, 109, 110, 151], "random": [63, 83, 102, 103, 113, 114, 115, 117, 118, 128, 143, 146, 151, 154], "walk": [63, 83, 102, 103, 151], "12x12": 63, "12": [63, 102, 153], "continu": [64, 82, 147, 154], "dot": [64, 82, 83, 98, 112, 113, 114, 115, 116, 117, 118, 147, 153, 154], "omega": [64, 69, 70, 71, 100, 110, 152, 153, 154], "wedg": [64, 80, 97, 100, 101, 110, 112, 113, 114, 115, 116, 117, 118, 152, 153], "shown": [64, 103, 128, 152, 154], "matric": [64, 103, 147, 153], "quit": 64, "instead": [64, 84, 112, 151, 153], "belong": [64, 152, 153], "name": [64, 153], "increment": [64, 72, 75, 100, 101, 102, 103, 109, 110], "euclidean": [64, 72, 75, 153], "ie": 64, "g_a": 64, "inerti": [64, 92], "80665": [64, 85], "equat": [64, 68, 103, 105, 107, 152, 153], "assumpt": 64, "nav_stat": 65, "bias_gyro": 65, "bias_accel": 65, "direct": [65, 86, 112, 113, 114, 115, 116, 117, 118, 136, 151, 153], "composit": [65, 96], "navig": 65, "bias": [65, 74], "orient": [65, 154], "gyroscop": 65, "perturb": [65, 112, 113, 114, 115, 116, 117, 118, 128, 152], "nav": [65, 66, 132, 151, 152, 153, 154], "se23stat": [65, 77, 78, 79, 80, 85, 89, 91, 92, 94, 95, 97, 136, 153], "vectorst": [65, 82, 83, 88, 90, 93, 98, 107, 151, 152, 154], "gyro_bia": [65, 102], "accel_bia": [65, 102], "In": [65, 81, 98, 100, 101, 102, 103, 109, 110, 127, 128, 149, 152, 153, 154], "other": [65, 103, 112, 113, 114, 115, 116, 117, 118, 128, 152, 153, 154], "word": 65, "unbiased_gyro": 66, "unbiased_accel": 66, "sinc": [66, 151, 152, 154], "phi_vec": [67, 68], "m": [67, 89, 97, 136, 151, 152, 153, 154], "2nd": [68, 96], "edit": 68, "211": 68, "adjoint": [72, 152], "correupt": 74, "unbias": 74, "absolut": [77, 78, 95], "se2stat": [77, 80, 91, 92, 94, 95, 97, 112, 142, 151, 152, 153], "matrixliegroupst": [77, 78, 79, 80, 84, 85, 87, 89, 91, 94, 97, 104, 105, 108, 113, 114, 115, 116, 117, 118], "minimum": 79, "varianc": [79, 93], "minim": 79, "fix": [79, 81], "sensor": [79, 154], "local": [80, 85, 89, 150, 154], "comptabil": [80, 88, 91, 92, 94, 97], "so2stat": [80, 97, 153], "so3stat": [80, 85, 89, 97, 112, 153], "pose_state_id": [81, 92], "landmark_state_id": [81, 92], "camera": 81, "pinholecamera": 81, "thih": 81, "bc": 81, "so": [81, 113, 114, 115, 153], "_b": [81, 153], "mathbb": [81, 98, 113, 114, 115, 116, 117, 118, 151, 153, 154], "extrins": 81, "_c": [81, 147], "ell": [81, 91, 92, 103, 152, 154], "ab": [81, 85, 89, 91, 92, 142, 151, 153], "cdot": [81, 152, 153], "f_u": 81, "c_u": 81, "f_v": 81, "c_v": 81, "includ": [81, 103, 149, 151, 153], "input_jacobian": [82, 83, 127], "doubleintegr": 83, "b": [83, 103, 151], "rais": [83, 98, 129, 146], "valueerror": [83, 98, 129], "absoluteposit": 84, "deprec": 84, "gravity_vector": 85, "_a": [85, 89, 93, 94, 151, 153, 154], "magnet": [85, 89], "auto": 86, "invari": [86, 87], "readi": [86, 150, 151], "approx": 86, "xi": [86, 152, 153], "henc": [86, 136], "similarli": 86, "opposit": 86, "suppli": [86, 96, 103], "invariantinnov": 86, "indirectli": 86, "chain": 86, "rule": 86, "pointrelativeposit": 87, "magnetic_vector": 89, "landmark_posit": [91, 151, 152, 153, 154], "landmark_id": 91, "lndmark": 92, "anchor_posit": [93, 94], "dim": 93, "tag_body_posit": [94, 96], "tag_body_position1": 95, "tag_body_position2": 95, "state_id1": 95, "state_id2": 95, "nb_tag_body_posit": 96, "nb_state_id": 96, "neighbor": 96, "somewher": 96, "q1": 97, "q2": 97, "honest": 97, "sure": 97, "peopl": 97, "we": [97, 149, 150, 151, 152, 153, 154], "were": [97, 138, 139, 140], "while": [97, 151, 153, 154], "motion": [97, 154], "stack": [97, 102, 132, 143, 153], "_1": [97, 153], "bodyvelocityincr": [100, 104, 105, 108, 110], "give": [100, 137, 153, 154], "rotat": [100, 117, 118, 142, 153], "ij": [100, 101, 103, 105, 107, 110], "prod_": [100, 101, 103, 110], "reiniti": [100, 102, 103, 110], "rmi": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110], "relativemotionincr": [100, 101, 102, 103, 110], "later": [100, 101, 102, 103, 109, 110, 154], "symmetr": [100, 101, 102, 103, 109, 110, 129], "update_bia": [100, 101, 102, 103, 109, 110], "new_bia": [100, 101, 102, 103, 109, 110], "rtype": [100, 101, 110], "matrixliegroup": [101, 112, 113, 114, 115, 116, 117, 118], "trivial": 101, "original_valu": [102, 103, 110], "original_bia": [102, 103], "bias_jacobian": [102, 103], "new_gyro_bia": 102, "new_accel_bia": 102, "state_matrix": 103, "input_matrix": 103, "_j": 103, "rewritten": 103, "quantiti": 103, "total": [103, 133], "furthermor": 103, "augment": 103, "befor": [103, 151, 152], "itself": [103, 152], "preintegratedbodyveloc": [104, 108], "accord": 105, "accordingli": [105, 151], "imuincr": 106, "linearincr": 107, "incorpor": 109, "wheel": [110, 149, 151], "odometri": [110, 149, 151], "varpi": [110, 152, 153], "although": [112, 150, 154], "recommend": [112, 152], "exponenti": [112, 113, 114, 115, 116, 117, 118, 147, 153], "otherwis": [112, 113, 114, 115, 116, 117, 118, 151], "2d": [112, 113, 114, 115, 116, 117, 118, 142, 152, 153, 154], "pymlg": [112, 113, 114, 115, 116, 117, 118, 149], "se2": [112, 113, 114, 115, 116, 117, 118, 153], "so3": [112, 113, 114, 115, 116, 117, 118], "ext": [112, 113, 114, 115, 116, 117, 118], "5x5": 113, "se23": 113, "egin": [113, 114, 115], "bmatrix": [113, 114, 115, 151, 152, 153], "quad": [113, 114, 115, 116, 117, 118], "3x3": [114, 116, 118, 153], "4x4": 115, "se3": 115, "from_ro": [115, 118], "msg": [115, 118], "posestamp": 115, "messag": [115, 118, 137], "frame_id": [115, 118], "to_ro": [115, 118], "special": [116, 153], "sl3": 116, "sl": [116, 153], "im": [116, 117, 118], "2x2": 117, "so2": 117, "quaternionstamp": 118, "quaternion": 118, "unless": [119, 120], "someth": [119, 120, 128], "els": [119, 120], "fulli": [119, 120], "seper": [119, 120, 152], "memori": [119, 120], "1d": [120, 121], "core": [122, 149, 154], "primit": [122, 154], "without": [125, 129, 153], "period": [127, 147], "wai": [127, 143, 149, 151, 153, 154], "distribut": [127, 129], "u_": 127, "l": [127, 147], "sort": [128, 134, 151], "certain": 128, "label": [128, 138, 141, 142, 154], "differenti": 128, "tutori": [128, 149, 150, 154], "practic": [128, 151, 153], "randn": 128, "dx_test": 128, "assert": [128, 136], "allclos": [128, 136], "usual": [129, 149, 151], "doe": [129, 132, 151, 153], "enforc": 129, "symmetri": 129, "miscellan": 130, "interest": [131, 133, 154], "noth": 132, "ifi": [132, 153], "support": 132, "themselv": 132, "except": 132, "veri": [132, 153], "examin": 132, "last": [132, 151], "plot_error": [132, 151, 153, 154], "likewis": 132, "trial_result": 133, "mont": [133, 137, 149], "carlo": [133, 137, 149], "experi": [133, 137, 149], "trial": [133, 137], "denot": [133, 153, 154], "raw": [133, 154], "num_trial": [133, 137], "average_ne": 133, "average_e": 133, "total_rms": 133, "meaningless": 133, "expected_ne": 133, "expect": [133, 137, 141, 152], "first_stamp": 134, "second_stamp": 134, "max_differ": 134, "02": [134, 152, 153], "smallest": 134, "rpg_trajectory_evalu": 134, "toolbox": 134, "consid": [134, 151], "match_first_idx": 134, "match_second_idx": 134, "stamps_list": 135, "find": [135, 147], "indic": 135, "queri": [135, 146], "fun": 136, "reshap": 136, "4": [136, 151, 152], "def": [136, 151, 152, 153, 154], "jac_test": 136, "jac_tru": 136, "atol": 136, "c_ab": 136, "v_zw_a": 136, "v_zw_b": 136, "linalg": [136, 151, 152, 153, 154], "jac_fd": 136, "union": [136, 142], "central": 136, "complex": 136, "ensur": 136, "num_job": 137, "montecarloresult": [137, 141], "executor": [137, 149], "aappgreg": 137, "integ": [137, 153], "remain": [137, 153], "consist": [137, 149, 152], "concurr": 137, "run": [137, 149, 150, 151], "job": 137, "cpu": 137, "parallel": 137, "debug": 137, "below": [137, 148, 153, 154], "n_cpu": 137, "progress": 137, "abov": [137, 151, 153, 154], "sent": 137, "stdout": 137, "increas": 137, "report": 137, "sharei": [138, 139, 140], "color": [138, 141, 142], "figur": [138, 139, 140, 141, 150, 154], "plotter": 138, "plt": [138, 139, 140, 141, 142, 145, 151, 153, 154], "draw": [138, 139, 140, 141], "drawn": [138, 139, 140, 141], "meas_list": [139, 140], "domain": [139, 140], "similar": [139, 140, 151, 154], "Will": [139, 140, 143], "perfectli": [139, 140, 152], "95": 141, "expected_nees_color": 141, "show": [141, 151, 152, 153, 154], "fed": 141, "desir": 141, "region": 141, "wa": [141, 151, 152], "line_color": 142, "triad_color": 142, "arrow_length": 142, "linewidth": 142, "plot_2d": 142, "triad": 142, "planar": 142, "rgb": 142, "arrow": 142, "bird": 142, "ey": [142, 151, 152, 153, 154], "view": 142, "cov": 143, "num_sampl": 143, "independ": 143, "faster": [143, 153], "sampl": [143, 147, 153, 154], "avoid": [143, 151], "recomput": 143, "choleski": 143, "decomposit": 143, "schedul": 144, "sequenti": 144, "cannot": [144, 153], "reduc": 144, "individu": 144, "equal": [145, 154], "scale": 145, "matplotlib": [145, 151, 153, 154], "query_stamp": 146, "geodes": 146, "x_data": 146, "x_queri": 146, "x_interp": 146, "thereof": 146, "treat": 146, "typeerror": 146, "a_c": 147, "l_c": 147, "q_c": 147, "van": 147, "loan": 147, "hspace": 147, "5mm": 147, "power": 147, "spectral": 147, "densiti": 147, "equival": 147, "represent": [147, 153], "_d": 147, "a_d": 147, "q_d": 147, "navli": [148, 150, 151, 153, 154], "packag": [148, 149, 150], "click": 148, "altern": [148, 151], "search": 148, "box": [148, 149, 153], "tradit": 149, "idea": 149, "behind": 149, "fall": [149, 152], "exact": [149, 153], "varieti": 149, "custom": [149, 153, 154], "spheric": 149, "batch": 149, "differenc": 149, "aggreg": [149, 152], "preintegr": 149, "few": [149, 150, 153, 154], "diagram": 149, "summar": 149, "clone": [149, 150], "directori": 149, "git": [149, 150], "decargroup": [149, 150], "cd": [149, 150], "pip": [149, 150], "command": [149, 150], "mathemat": [149, 153], "depth": 149, "websit": 149, "folder": 149, "python3": 149, "script": 149, "welcom": 150, "go": [150, 151], "toi": 150, "framework": [150, 151, 153, 154], "instal": 150, "now": [150, 151, 152, 153, 154], "regist": 150, "pypi": 150, "work": [150, 151, 152, 153, 154], "re": 150, "still": [150, 153], "properli": 150, "sorri": 150, "feel": 150, "help": 150, "arbitarili": 151, "combin": [151, 154], "begin": [151, 152, 153, 154], "suppos": 151, "easili": [151, 153], "ll": [151, 154], "former": 151, "approach": 151, "48": 151, "import": [151, 152, 153, 154], "lib": [151, 152, 153, 154], "99500417": [151, 153], "09983342": [151, 153], "84679329": 151, "09491919": 151, "who": 151, "alreadi": 151, "demonstr": 151, "49": 151, "x_temp": 151, "nresult": 151, "45359612": 151, "89120736": 151, "80531705": 151, "55185711": 151, "write": 151, "mathrm": 151, "slowli": 151, "scipi": [151, 152, 153], "expm": [151, 152, 153], "wedge_se2": [151, 152, 153], "wheeledrobotwithbia": 151, "__init__": [151, 152, 153, 154], "input_covariance_matrix": [151, 152, 153], "vel": [151, 153], "x_next": [151, 152, 153, 154], "purpos": [151, 153], "even": [151, 153, 154], "nomin": 151, "like": 151, "seri": 151, "51": 151, "rangetolandmarkse2": [151, 153], "measurement_covari": [151, 153], "po": [151, 153, 154], "made": 151, "throw": 151, "feed": 151, "easi": 151, "lightweight": 151, "52": 151, "meas_model": [151, 152, 153, 154], "append": [151, 153, 154], "46544123": 151, "88507893": 151, "good": [151, 152], "anywai": 151, "pass": 151, "boilerpl": 151, "notic": 151, "extra": 151, "effect": 151, "With": [151, 153], "snippet": [151, 153], "53": 151, "dg": [151, 153, 154], "datagener": [151, 153, 154], "lambda": [151, 153, 154], "state_data": [151, 153, 154], "kalman_filt": [151, 153, 154], "diag": [151, 153, 154], "meas_idx": [151, 153, 154], "occur": [151, 153, 154], "load": [151, 153, 154], "pyplot": [151, 153, 154], "fig": [151, 153, 154], "set_titl": [151, 153, 154], "set_ylabel": [151, 153, 154], "theta": [151, 152, 153, 154], "rad": [151, 153, 154], "set_xlabel": [151, 153, 154], "ang": 151, "plot_ne": [151, 153, 154], "frequent": 151, "would": 151, "55": 151, "wheeledrobotst": 151, "pose_valu": 151, "bias_valu": 151, "super": [151, 153], "getter": 151, "look": 151, "cleaner": 151, "flexibl": 151, "becaus": [151, 152], "ergonom": 151, "As": [152, 153, 154], "know": 152, "requir": 152, "sometim": [152, 153], "conform": 152, "constraint": 152, "triangleq": 152, "partial": 152, "regular": [152, 154], "univers": 152, "roughli": 152, "what": 152, "micro": [152, 153], "theori": [152, 153], "paper": 152, "wherea": 152, "natur": 152, "aris": 152, "choic": 152, "dont": 152, "worri": 152, "howev": [152, 154], "drawback": 152, "computation": 152, "expens": 152, "less": 152, "accur": 152, "analyt": 152, "notebook": 152, "offer": 152, "accuraci": 152, "speed": [152, 153], "recal": 152, "had": 152, "align": [152, 153, 154], "theta_": [152, 154], "theta_k": [152, 154], "omega_k": [152, 154], "v_k": [152, 154], "co": [152, 153, 154], "y_": [152, 154], "y_k": [152, 154], "sin": [152, 153, 154], "techniqu": 152, "lead": 152, "need": [152, 153, 154], "deviat": [152, 154], "wheeledrobot": [152, 154], "did": 152, "everyth": 152, "correctli": 152, "analy": 152, "nfinit": 152, "01682942": 152, "01080605": 152, "01682943": 152, "01080604": 152, "almost": 152, "slightli": 152, "due": 152, "nevertheless": 152, "suffici": 152, "applic": 152, "previous": 152, "th": 152, "again": [152, 153], "rangetolandmark": [152, 154], "nanaly": 152, "70710678": 152, "70710696": 152, "nice": 152, "wedge_k": 152, "manipul": 152, "underbrac": 152, "There": [152, 154], "invok": [152, 154], "adjoint_se2": 152, "wheeledrobotse2": [152, 153], "0394695": 152, "92106099": 152, "38941834": 152, "19470917": 152, "00000000e": [152, 153], "00": [152, 153], "10747782e": 152, "94695038e": 152, "21060995e": 152, "89418343e": 152, "94709171e": 152, "89418342e": 152, "21060994e": 152, "longer": 152, "tangibl": 152, "advantag": [152, 154], "high": 152, "uncertainti": 152, "excess": 152, "far": 152, "could": [153, 154], "task": 153, "becom": 153, "increasingli": 153, "cosin": 153, "unlik": 153, "togeth": 153, "multipli": 153, "proce": 153, "further": 153, "setup": 153, "seen": 153, "vee": 153, "28": 153, "reset": 153, "helper": 153, "vee_se2": 153, "fundament": 153, "relationship": 153, "appear": 153, "logarithm": 153, "deeper": 153, "suffic": 153, "think": 153, "3x1": [153, 154], "logm": 153, "nthe": 153, "18467933": 153, "30949192": 153, "39": 153, "littl": 153, "bit": 153, "literatur": 153, "boxplu": 153, "boxminu": 153, "varepsilon": 153, "context": 153, "plai": 153, "role": 153, "new_valu": 153, "other_inv": 153, "inv": 153, "adapt": 153, "od": 153, "short": 153, "t_": 153, "final": [153, 154], "unchang": 153, "And": 153, "liter": 153, "past": 153, "modif": 153, "hz": [153, 154], "99950000e": 153, "99983333e": 153, "03": 153, "99990000e": 153, "99997500e": 153, "05": 153, "04": 153, "52438924": 153, "40056502": 153, "poserangetolandmark": 153, "299276237837416": 153, "scratch": [153, 154], "pedagog": 153, "come": 153, "belon": 153, "sl3state": 153, "homographi": 153, "moreov": 153, "close": 153, "formula": 153, "underli": 153, "flight": 154, "environ": 154, "euler": 154, "seed": 154, "choos": 154, "cover": 154, "those": 154, "y_i": 154, "23": 154, "real": 154, "4867558": 154, "40227221": 154, "5906187969698615": 154, "corrupt": 154, "item": 154, "25": 154, "scatter": 154, "enumer": 154, "annot": 154, "xlabel": 154, "ylabel": 154, "u_arrai": 154, "u_stamp": 154, "legend": 154, "whenev": 154, "26": 154, "try": 154, "too": 154, "unscentedkalmanfilt": 154, "iteratedkalmanfilt": 154, "stateless": 154, "extern": 154, "slight": 154, "burden": 154, "transpar": 154, "abil": 154, "ekf": 154, "ukf": 154, "obtain": 154, "qualiti": 154, "27": 154, "might": 154}, "objects": {"navlie": [[0, 0, 0, "-", "batch"], [21, 0, 0, "-", "composite"], [27, 0, 0, "-", "datagen"], [30, 0, 0, "-", "filters"], [41, 0, 0, "-", "imm"], [51, 0, 0, "-", "lib"], [122, 0, 0, "-", "types"], [130, 0, 0, "-", "utils"]], "navlie.batch": [[1, 0, 0, "-", "estimator"], [3, 0, 0, "-", "gaussian_mixtures"], [9, 0, 0, "-", "losses"], [13, 0, 0, "-", "problem"], [16, 0, 0, "-", "residuals"]], "navlie.batch.estimator": [[2, 1, 1, "", "BatchEstimator"]], "navlie.batch.estimator.BatchEstimator": [[2, 2, 1, "", "solve"]], "navlie.batch.gaussian_mixtures": [[4, 1, 1, "", "GaussianMixtureResidual"], [5, 1, 1, "", "HessianSumMixtureResidual"], [6, 1, 1, "", "MaxMixtureResidual"], [7, 1, 1, "", "MaxSumMixtureResidual"], [8, 1, 1, "", "SumMixtureResidual"]], "navlie.batch.gaussian_mixtures.GaussianMixtureResidual": [[4, 2, 1, "", "evaluate"], [4, 2, 1, "", "evaluate_component_residuals"], [4, 2, 1, "", "jacobian_fd"], [4, 2, 1, "", "mix_errors"], [4, 2, 1, "", "mix_jacobians"], [4, 2, 1, "", "sqrt_info_matrix"]], "navlie.batch.gaussian_mixtures.HessianSumMixtureResidual": [[5, 2, 1, "", "evaluate"], [5, 2, 1, "", "evaluate_component_residuals"], [5, 2, 1, "", "jacobian_fd"], [5, 2, 1, "", "mix_errors"], [5, 2, 1, "", "mix_jacobians"], [5, 3, 1, "", "no_use_complex_numbers"], [5, 3, 1, "", "normalization_constant"], [5, 2, 1, "", "sqrt_info_matrix"], [5, 3, 1, "", "sum_mixture_residual"]], "navlie.batch.gaussian_mixtures.MaxMixtureResidual": [[6, 2, 1, "", "evaluate"], [6, 2, 1, "", "evaluate_component_residuals"], [6, 2, 1, "", "jacobian_fd"], [6, 2, 1, "", "mix_errors"], [6, 2, 1, "", "mix_jacobians"], [6, 2, 1, "", "sqrt_info_matrix"]], "navlie.batch.gaussian_mixtures.MaxSumMixtureResidual": [[7, 2, 1, "", "compute_nonlinear_part"], [7, 3, 1, "", "damping_const"], [7, 2, 1, "", "evaluate"], [7, 2, 1, "", "evaluate_component_residuals"], [7, 2, 1, "", "jacobian_fd"], [7, 2, 1, "", "mix_errors"], [7, 2, 1, "", "mix_jacobians"], [7, 2, 1, "", "sqrt_info_matrix"]], "navlie.batch.gaussian_mixtures.SumMixtureResidual": [[8, 2, 1, "", "evaluate"], [8, 2, 1, "", "evaluate_component_residuals"], [8, 2, 1, "", "jacobian_fd"], [8, 2, 1, "", "mix_errors"], [8, 2, 1, "", "mix_jacobians"], [8, 2, 1, "", "sqrt_info_matrix"]], "navlie.batch.losses": [[10, 1, 1, "", "CauchyLoss"], [11, 1, 1, "", "L2Loss"], [12, 1, 1, "", "LossFunction"]], "navlie.batch.losses.CauchyLoss": [[10, 2, 1, "", "loss"], [10, 2, 1, "", "weight"]], "navlie.batch.losses.L2Loss": [[11, 2, 1, "", "loss"], [11, 2, 1, "", "weight"]], "navlie.batch.losses.LossFunction": [[12, 2, 1, "", "loss"], [12, 2, 1, "", "weight"]], "navlie.batch.problem": [[14, 1, 1, "", "OptimizationSummary"], [15, 1, 1, "", "Problem"]], "navlie.batch.problem.Problem": [[15, 2, 1, "", "add_residual"], [15, 2, 1, "", "add_variable"], [15, 2, 1, "", "compute_covariance"], [15, 2, 1, "", "compute_error_jac_cost"], [15, 2, 1, "", "get_covariance_block"], [15, 2, 1, "", "is_converged"], [15, 2, 1, "", "set_variables_constant"], [15, 2, 1, "", "solve"]], "navlie.batch.residuals": [[17, 1, 1, "", "MeasurementResidual"], [18, 1, 1, "", "PriorResidual"], [19, 1, 1, "", "ProcessResidual"], [20, 1, 1, "", "Residual"]], "navlie.batch.residuals.MeasurementResidual": [[17, 2, 1, "", "evaluate"], [17, 2, 1, "", "jacobian_fd"], [17, 2, 1, "", "sqrt_info_matrix"]], "navlie.batch.residuals.PriorResidual": [[18, 2, 1, "", "evaluate"], [18, 2, 1, "", "jacobian_fd"], [18, 2, 1, "", "sqrt_info_matrix"]], "navlie.batch.residuals.ProcessResidual": [[19, 2, 1, "", "evaluate"], [19, 2, 1, "", "jacobian_fd"], [19, 2, 1, "", "sqrt_info_matrix"]], "navlie.batch.residuals.Residual": [[20, 2, 1, "", "evaluate"], [20, 2, 1, "", "jacobian_fd"], [20, 2, 1, "", "sqrt_info_matrix"]], "navlie.composite": [[22, 1, 1, "", "CompositeInput"], [23, 1, 1, "", "CompositeMeasurement"], [24, 1, 1, "", "CompositeMeasurementModel"], [25, 1, 1, "", "CompositeProcessModel"], [26, 1, 1, "", "CompositeState"]], "navlie.composite.CompositeInput": [[22, 2, 1, "", "add_input"], [22, 2, 1, "", "copy"], [22, 3, 1, "", "covariance"], [22, 3, 1, "", "dof"], [22, 2, 1, "", "get_dof_by_id"], [22, 2, 1, "", "get_index_by_id"], [22, 2, 1, "", "get_input_by_id"], [22, 2, 1, "", "get_stamp_by_id"], [22, 2, 1, "", "plus"], [22, 2, 1, "", "remove_input_by_id"], [22, 2, 1, "", "set_input_by_id"], [22, 2, 1, "", "set_stamp_by_id"], [22, 2, 1, "", "set_stamp_for_all"], [22, 3, 1, "", "stamp"], [22, 3, 1, "", "state_id"], [22, 2, 1, "", "to_list"]], "navlie.composite.CompositeMeasurement": [[23, 2, 1, "", "minus"], [23, 3, 1, "", "model"], [23, 3, 1, "", "stamp"], [23, 3, 1, "", "state_id"], [23, 3, 1, "", "value"]], "navlie.composite.CompositeMeasurementModel": [[24, 2, 1, "", "covariance"], [24, 2, 1, "", "evaluate"], [24, 2, 1, "", "evaluate_with_jacobian"], [24, 2, 1, "", "jacobian"], [24, 2, 1, "", "jacobian_fd"], [24, 2, 1, "", "sqrt_information"]], "navlie.composite.CompositeProcessModel": [[25, 2, 1, "", "covariance"], [25, 2, 1, "", "evaluate"], [25, 2, 1, "", "evaluate_with_jacobian"], [25, 2, 1, "", "input_covariance"], [25, 2, 1, "", "input_jacobian_fd"], [25, 2, 1, "", "jacobian"], [25, 2, 1, "", "jacobian_fd"], [25, 2, 1, "", "sqrt_information"]], "navlie.composite.CompositeState": [[26, 2, 1, "", "add_state"], [26, 2, 1, "", "copy"], [26, 3, 1, "", "dof"], [26, 2, 1, "", "get_dof_by_id"], [26, 2, 1, "", "get_index_by_id"], [26, 2, 1, "", "get_matrix_block_by_ids"], [26, 2, 1, "", "get_slice_by_id"], [26, 2, 1, "", "get_slices"], [26, 2, 1, "", "get_stamp_by_id"], [26, 2, 1, "", "get_state_by_id"], [26, 2, 1, "", "get_value_by_id"], [26, 2, 1, "", "jacobian_from_blocks"], [26, 2, 1, "", "minus"], [26, 2, 1, "", "minus_jacobian"], [26, 2, 1, "", "minus_jacobian_fd"], [26, 2, 1, "", "plus"], [26, 2, 1, "", "plus_by_id"], [26, 2, 1, "", "plus_jacobian"], [26, 2, 1, "", "plus_jacobian_fd"], [26, 2, 1, "", "remove_state_by_id"], [26, 2, 1, "", "set_matrix_block_by_ids"], [26, 2, 1, "", "set_stamp_by_id"], [26, 2, 1, "", "set_stamp_for_all"], [26, 2, 1, "", "set_state_by_id"], [26, 2, 1, "", "set_value_by_id"], [26, 3, 1, "", "stamp"], [26, 3, 1, "", "state_id"], [26, 2, 1, "", "to_list"], [26, 3, 1, "", "value"]], "navlie.datagen": [[28, 1, 1, "", "DataGenerator"], [29, 4, 1, "", "generate_measurement"]], "navlie.datagen.DataGenerator": [[28, 2, 1, "", "add_measurement_model"], [28, 2, 1, "", "generate"]], "navlie.filters": [[31, 1, 1, "", "CubatureKalmanFilter"], [32, 1, 1, "", "ExtendedKalmanFilter"], [33, 1, 1, "", "GaussHermiteKalmanFilter"], [34, 1, 1, "", "IteratedKalmanFilter"], [35, 1, 1, "", "SigmaPointKalmanFilter"], [36, 1, 1, "", "UnscentedKalmanFilter"], [37, 4, 1, "", "check_outlier"], [38, 4, 1, "", "generate_sigmapoints"], [39, 4, 1, "", "mean_state"], [40, 4, 1, "", "run_filter"]], "navlie.filters.CubatureKalmanFilter": [[31, 2, 1, "", "correct"], [31, 3, 1, "", "iterate_mean"], [31, 3, 1, "", "method"], [31, 2, 1, "", "predict"], [31, 3, 1, "", "process_model"], [31, 3, 1, "", "reject_outliers"]], "navlie.filters.ExtendedKalmanFilter": [[32, 2, 1, "", "correct"], [32, 2, 1, "", "predict"], [32, 3, 1, "", "process_model"], [32, 3, 1, "", "reject_outliers"]], "navlie.filters.GaussHermiteKalmanFilter": [[33, 2, 1, "", "correct"], [33, 3, 1, "", "iterate_mean"], [33, 3, 1, "", "method"], [33, 2, 1, "", "predict"], [33, 3, 1, "", "process_model"], [33, 3, 1, "", "reject_outliers"]], "navlie.filters.IteratedKalmanFilter": [[34, 2, 1, "", "correct"], [34, 3, 1, "", "line_search"], [34, 3, 1, "", "max_iters"], [34, 2, 1, "", "predict"], [34, 3, 1, "", "process_model"], [34, 3, 1, "", "reject_outliers"], [34, 3, 1, "", "step_tol"]], "navlie.filters.SigmaPointKalmanFilter": [[35, 2, 1, "", "correct"], [35, 3, 1, "", "iterate_mean"], [35, 3, 1, "", "method"], [35, 2, 1, "", "predict"], [35, 3, 1, "", "process_model"], [35, 3, 1, "", "reject_outliers"]], "navlie.filters.UnscentedKalmanFilter": [[36, 2, 1, "", "correct"], [36, 3, 1, "", "iterate_mean"], [36, 3, 1, "", "method"], [36, 2, 1, "", "predict"], [36, 3, 1, "", "process_model"], [36, 3, 1, "", "reject_outliers"]], "navlie.imm": [[42, 1, 1, "", "IMMResult"], [43, 1, 1, "", "IMMResultList"], [44, 1, 1, "", "IMMState"], [45, 1, 1, "", "InteractingModelFilter"], [46, 4, 1, "", "gaussian_mixing"], [47, 4, 1, "", "gaussian_mixing_vectorspace"], [48, 4, 1, "", "reparametrize_gaussians_about_X_par"], [49, 4, 1, "", "run_imm_filter"], [50, 4, 1, "", "update_X"]], "navlie.imm.IMMResult": [[42, 3, 1, "", "covariance"], [42, 3, 1, "", "ees"], [42, 3, 1, "", "error"], [42, 3, 1, "", "md"], [42, 3, 1, "", "model_probabilities"], [42, 3, 1, "", "nees"], [42, 3, 1, "", "rmse"], [42, 3, 1, "", "stamp"], [42, 3, 1, "", "state"], [42, 3, 1, "", "state_true"], [42, 3, 1, "", "three_sigma"]], "navlie.imm.IMMResultList": [[43, 3, 1, "", "covariance"], [43, 3, 1, "", "dof"], [43, 3, 1, "", "ees"], [43, 3, 1, "", "error"], [43, 2, 1, "", "from_estimates"], [43, 3, 1, "", "md"], [43, 3, 1, "", "model_probabilities"], [43, 3, 1, "", "nees"], [43, 2, 1, "", "nees_lower_bound"], [43, 2, 1, "", "nees_upper_bound"], [43, 3, 1, "", "rmse"], [43, 3, 1, "", "stamp"], [43, 3, 1, "", "state"], [43, 3, 1, "", "state_true"], [43, 3, 1, "", "three_sigma"], [43, 3, 1, "", "value"], [43, 3, 1, "", "value_true"]], "navlie.imm.IMMState": [[44, 2, 1, "", "copy"], [44, 3, 1, "", "model_probabilities"], [44, 3, 1, "", "model_states"], [44, 5, 1, "", "stamp"]], "navlie.imm.InteractingModelFilter": [[45, 2, 1, "", "correct"], [45, 2, 1, "", "interaction"], [45, 2, 1, "", "predict"]], "navlie.lib": [[52, 0, 0, "-", "camera"], [55, 0, 0, "-", "datasets"], [60, 0, 0, "-", "imu"], [76, 0, 0, "-", "models"], [99, 0, 0, "-", "preintegration"], [111, 0, 0, "-", "states"]], "navlie.lib.camera": [[53, 1, 1, "", "PinholeCamera"], [54, 1, 1, "", "PoseMatrix"]], "navlie.lib.camera.PinholeCamera": [[53, 5, 1, "", "R_normalized_image_coords"], [53, 2, 1, "", "copy"], [53, 2, 1, "", "evaluate"], [53, 2, 1, "", "get_cam_to_enu"], [53, 5, 1, "", "intrinsics"], [53, 2, 1, "", "is_landmark_in_front_of_cam"], [53, 2, 1, "", "is_measurement_valid"], [53, 2, 1, "", "project"], [53, 2, 1, "", "resolve_landmark_in_cam_frame"], [53, 5, 1, "", "sigma_normalized_image_coords"], [53, 2, 1, "", "to_normalized_coords"], [53, 2, 1, "", "to_pixel_coors"]], "navlie.lib.camera.PoseMatrix": [[54, 5, 1, "", "attitude"], [54, 2, 1, "", "copy"], [54, 5, 1, "", "position"]], "navlie.lib.datasets": [[56, 1, 1, "", "SimulatedInertialGPSDataset"], [57, 1, 1, "", "SimulatedInertialLandmarkDataset"], [58, 1, 1, "", "SimulatedPoseRangingDataset"], [59, 4, 1, "", "generate_landmark_positions"]], "navlie.lib.datasets.SimulatedInertialGPSDataset": [[56, 2, 1, "", "get_ground_truth"], [56, 2, 1, "", "get_input_data"], [56, 2, 1, "", "get_measurement_data"]], "navlie.lib.datasets.SimulatedInertialLandmarkDataset": [[57, 2, 1, "", "get_ground_truth"], [57, 2, 1, "", "get_groundtruth_landmarks"], [57, 2, 1, "", "get_input_data"], [57, 2, 1, "", "get_measurement_data"]], "navlie.lib.datasets.SimulatedPoseRangingDataset": [[58, 2, 1, "", "get_ground_truth"], [58, 2, 1, "", "get_input_data"], [58, 2, 1, "", "get_measurement_data"]], "navlie.lib.imu": [[61, 4, 1, "", "G_matrix"], [62, 4, 1, "", "G_matrix_inv"], [63, 1, 1, "", "IMU"], [64, 1, 1, "", "IMUKinematics"], [65, 1, 1, "", "IMUState"], [66, 4, 1, "", "L_matrix"], [67, 4, 1, "", "M_matrix"], [68, 4, 1, "", "N_matrix"], [69, 4, 1, "", "U_matrix"], [70, 4, 1, "", "U_matrix_inv"], [71, 4, 1, "", "U_tilde_matrix"], [72, 4, 1, "", "adjoint_IE3"], [73, 4, 1, "", "delta_matrix"], [74, 4, 1, "", "get_unbiased_imu"], [75, 4, 1, "", "inverse_IE3"]], "navlie.lib.imu.IMU": [[63, 3, 1, "", "accel"], [63, 3, 1, "", "bias_accel_walk"], [63, 3, 1, "", "bias_gyro_walk"], [63, 2, 1, "", "copy"], [63, 3, 1, "", "covariance"], [63, 3, 1, "", "dof"], [63, 3, 1, "", "gyro"], [63, 2, 1, "", "plus"], [63, 2, 1, "", "random"], [63, 3, 1, "", "stamp"], [63, 3, 1, "", "state_id"]], "navlie.lib.imu.IMUKinematics": [[64, 2, 1, "", "covariance"], [64, 2, 1, "", "evaluate"], [64, 2, 1, "", "evaluate_with_jacobian"], [64, 2, 1, "", "input_covariance"], [64, 2, 1, "", "input_jacobian_fd"], [64, 2, 1, "", "jacobian"], [64, 2, 1, "", "jacobian_fd"], [64, 2, 1, "", "sqrt_information"]], "navlie.lib.imu.IMUState": [[65, 2, 1, "", "add_state"], [65, 5, 1, "", "attitude"], [65, 5, 1, "", "bias"], [65, 5, 1, "", "bias_accel"], [65, 5, 1, "", "bias_gyro"], [65, 2, 1, "", "copy"], [65, 5, 1, "", "direction"], [65, 3, 1, "", "dof"], [65, 2, 1, "", "get_dof_by_id"], [65, 2, 1, "", "get_index_by_id"], [65, 2, 1, "", "get_matrix_block_by_ids"], [65, 2, 1, "", "get_slice_by_id"], [65, 2, 1, "", "get_slices"], [65, 2, 1, "", "get_stamp_by_id"], [65, 2, 1, "", "get_state_by_id"], [65, 2, 1, "", "get_value_by_id"], [65, 2, 1, "", "jacobian_from_blocks"], [65, 2, 1, "", "minus"], [65, 2, 1, "", "minus_jacobian"], [65, 2, 1, "", "minus_jacobian_fd"], [65, 5, 1, "", "nav_state"], [65, 2, 1, "", "plus"], [65, 2, 1, "", "plus_by_id"], [65, 2, 1, "", "plus_jacobian"], [65, 2, 1, "", "plus_jacobian_fd"], [65, 5, 1, "", "pose"], [65, 5, 1, "", "position"], [65, 2, 1, "", "remove_state_by_id"], [65, 2, 1, "", "set_matrix_block_by_ids"], [65, 2, 1, "", "set_stamp_by_id"], [65, 2, 1, "", "set_stamp_for_all"], [65, 2, 1, "", "set_state_by_id"], [65, 2, 1, "", "set_value_by_id"], [65, 3, 1, "", "stamp"], [65, 3, 1, "", "state_id"], [65, 2, 1, "", "to_list"], [65, 3, 1, "", "value"], [65, 5, 1, "", "velocity"]], "navlie.lib.models": [[77, 1, 1, "", "AbsolutePosition"], [78, 1, 1, "", "AbsoluteVelocity"], [79, 1, 1, "", "Altitude"], [80, 1, 1, "", "BodyFrameVelocity"], [81, 1, 1, "", "CameraProjection"], [82, 1, 1, "", "DoubleIntegrator"], [83, 1, 1, "", "DoubleIntegratorWithBias"], [84, 1, 1, "", "GlobalPosition"], [85, 1, 1, "", "Gravitometer"], [86, 1, 1, "", "InvariantMeasurement"], [87, 1, 1, "", "InvariantPointRelativePosition"], [88, 1, 1, "", "LinearMeasurement"], [89, 1, 1, "", "Magnetometer"], [90, 1, 1, "", "OneDimensionalPositionVelocityRange"], [91, 1, 1, "", "PointRelativePosition"], [92, 1, 1, "", "PointRelativePositionSLAM"], [93, 1, 1, "", "RangePointToAnchor"], [94, 1, 1, "", "RangePoseToAnchor"], [95, 1, 1, "", "RangePoseToPose"], [96, 1, 1, "", "RangeRelativePose"], [97, 1, 1, "", "RelativeBodyFrameVelocity"], [98, 1, 1, "", "SingleIntegrator"]], "navlie.lib.models.AbsolutePosition": [[77, 2, 1, "", "covariance"], [77, 2, 1, "", "evaluate"], [77, 2, 1, "", "evaluate_with_jacobian"], [77, 2, 1, "", "jacobian"], [77, 2, 1, "", "jacobian_fd"], [77, 2, 1, "", "sqrt_information"]], "navlie.lib.models.AbsoluteVelocity": [[78, 2, 1, "", "covariance"], [78, 2, 1, "", "evaluate"], [78, 2, 1, "", "evaluate_with_jacobian"], [78, 2, 1, "", "jacobian"], [78, 2, 1, "", "jacobian_fd"], [78, 2, 1, "", "sqrt_information"]], "navlie.lib.models.Altitude": [[79, 2, 1, "", "covariance"], [79, 2, 1, "", "evaluate"], [79, 2, 1, "", "evaluate_with_jacobian"], [79, 2, 1, "", "jacobian"], [79, 2, 1, "", "jacobian_fd"], [79, 2, 1, "", "sqrt_information"]], "navlie.lib.models.BodyFrameVelocity": [[80, 2, 1, "", "covariance"], [80, 2, 1, "", "evaluate"], [80, 2, 1, "", "evaluate_with_jacobian"], [80, 2, 1, "", "input_covariance"], [80, 2, 1, "", "input_jacobian_fd"], [80, 2, 1, "", "jacobian"], [80, 2, 1, "", "jacobian_fd"], [80, 2, 1, "", "sqrt_information"]], "navlie.lib.models.CameraProjection": [[81, 2, 1, "", "covariance"], [81, 2, 1, "", "evaluate"], [81, 2, 1, "", "evaluate_with_jacobian"], [81, 2, 1, "", "jacobian"], [81, 2, 1, "", "jacobian_fd"], [81, 2, 1, "", "sqrt_information"]], "navlie.lib.models.DoubleIntegrator": [[82, 2, 1, "", "covariance"], [82, 2, 1, "", "evaluate"], [82, 2, 1, "", "evaluate_with_jacobian"], [82, 2, 1, "", "input_covariance"], [82, 2, 1, "", "input_jacobian"], [82, 2, 1, "", "input_jacobian_fd"], [82, 2, 1, "", "jacobian"], [82, 2, 1, "", "jacobian_fd"], [82, 2, 1, "", "sqrt_information"]], "navlie.lib.models.DoubleIntegratorWithBias": [[83, 2, 1, "", "covariance"], [83, 2, 1, "", "evaluate"], [83, 2, 1, "", "evaluate_with_jacobian"], [83, 2, 1, "", "input_covariance"], [83, 2, 1, "", "input_jacobian"], [83, 2, 1, "", "input_jacobian_fd"], [83, 2, 1, "", "jacobian"], [83, 2, 1, "", "jacobian_fd"], [83, 2, 1, "", "sqrt_information"]], "navlie.lib.models.GlobalPosition": [[84, 2, 1, "", "covariance"], [84, 2, 1, "", "evaluate"], [84, 2, 1, "", "evaluate_with_jacobian"], [84, 2, 1, "", "jacobian"], [84, 2, 1, "", "jacobian_fd"], [84, 2, 1, "", "sqrt_information"]], "navlie.lib.models.Gravitometer": [[85, 2, 1, "", "covariance"], [85, 2, 1, "", "evaluate"], [85, 2, 1, "", "evaluate_with_jacobian"], [85, 2, 1, "", "jacobian"], [85, 2, 1, "", "jacobian_fd"], [85, 2, 1, "", "sqrt_information"]], "navlie.lib.models.InvariantMeasurement": [[86, 2, 1, "", "minus"], [86, 3, 1, "", "model"], [86, 3, 1, "", "stamp"], [86, 3, 1, "", "state_id"], [86, 3, 1, "", "value"]], "navlie.lib.models.InvariantPointRelativePosition": [[87, 2, 1, "", "covariance"], [87, 2, 1, "", "evaluate"], [87, 2, 1, "", "evaluate_with_jacobian"], [87, 2, 1, "", "jacobian"], [87, 2, 1, "", "jacobian_fd"], [87, 2, 1, "", "sqrt_information"]], "navlie.lib.models.LinearMeasurement": [[88, 2, 1, "", "covariance"], [88, 2, 1, "", "evaluate"], [88, 2, 1, "", "evaluate_with_jacobian"], [88, 2, 1, "", "jacobian"], [88, 2, 1, "", "jacobian_fd"], [88, 2, 1, "", "sqrt_information"]], "navlie.lib.models.Magnetometer": [[89, 2, 1, "", "covariance"], [89, 2, 1, "", "evaluate"], [89, 2, 1, "", "evaluate_with_jacobian"], [89, 2, 1, "", "jacobian"], [89, 2, 1, "", "jacobian_fd"], [89, 2, 1, "", "sqrt_information"]], "navlie.lib.models.OneDimensionalPositionVelocityRange": [[90, 2, 1, "", "covariance"], [90, 2, 1, "", "evaluate"], [90, 2, 1, "", "evaluate_with_jacobian"], [90, 2, 1, "", "jacobian"], [90, 2, 1, "", "jacobian_fd"], [90, 2, 1, "", "sqrt_information"]], "navlie.lib.models.PointRelativePosition": [[91, 2, 1, "", "covariance"], [91, 2, 1, "", "evaluate"], [91, 2, 1, "", "evaluate_with_jacobian"], [91, 2, 1, "", "jacobian"], [91, 2, 1, "", "jacobian_fd"], [91, 2, 1, "", "sqrt_information"]], "navlie.lib.models.PointRelativePositionSLAM": [[92, 2, 1, "", "covariance"], [92, 2, 1, "", "evaluate"], [92, 2, 1, "", "evaluate_with_jacobian"], [92, 2, 1, "", "jacobian"], [92, 2, 1, "", "jacobian_fd"], [92, 2, 1, "", "sqrt_information"]], "navlie.lib.models.RangePointToAnchor": [[93, 2, 1, "", "covariance"], [93, 2, 1, "", "evaluate"], [93, 2, 1, "", "evaluate_with_jacobian"], [93, 2, 1, "", "jacobian"], [93, 2, 1, "", "jacobian_fd"], [93, 2, 1, "", "sqrt_information"]], "navlie.lib.models.RangePoseToAnchor": [[94, 2, 1, "", "covariance"], [94, 2, 1, "", "evaluate"], [94, 2, 1, "", "evaluate_with_jacobian"], [94, 2, 1, "", "jacobian"], [94, 2, 1, "", "jacobian_fd"], [94, 2, 1, "", "sqrt_information"]], "navlie.lib.models.RangePoseToPose": [[95, 2, 1, "", "covariance"], [95, 2, 1, "", "evaluate"], [95, 2, 1, "", "evaluate_with_jacobian"], [95, 2, 1, "", "jacobian"], [95, 2, 1, "", "jacobian_fd"], [95, 2, 1, "", "sqrt_information"]], "navlie.lib.models.RangeRelativePose": [[96, 2, 1, "", "covariance"], [96, 2, 1, "", "evaluate"], [96, 2, 1, "", "evaluate_with_jacobian"], [96, 2, 1, "", "jacobian"], [96, 2, 1, "", "jacobian_fd"], [96, 2, 1, "", "sqrt_information"]], "navlie.lib.models.RelativeBodyFrameVelocity": [[97, 2, 1, "", "covariance"], [97, 2, 1, "", "evaluate"], [97, 2, 1, "", "evaluate_with_jacobian"], [97, 2, 1, "", "input_covariance"], [97, 2, 1, "", "input_jacobian_fd"], [97, 2, 1, "", "jacobian"], [97, 2, 1, "", "jacobian_fd"], [97, 2, 1, "", "sqrt_information"]], "navlie.lib.models.SingleIntegrator": [[98, 2, 1, "", "covariance"], [98, 2, 1, "", "evaluate"], [98, 2, 1, "", "evaluate_with_jacobian"], [98, 2, 1, "", "input_covariance"], [98, 2, 1, "", "input_jacobian_fd"], [98, 2, 1, "", "jacobian"], [98, 2, 1, "", "jacobian_fd"], [98, 2, 1, "", "sqrt_information"]], "navlie.lib.preintegration": [[100, 1, 1, "", "AngularVelocityIncrement"], [101, 1, 1, "", "BodyVelocityIncrement"], [102, 1, 1, "", "IMUIncrement"], [103, 1, 1, "", "LinearIncrement"], [104, 1, 1, "", "PreintegratedAngularVelocity"], [105, 1, 1, "", "PreintegratedBodyVelocity"], [106, 1, 1, "", "PreintegratedIMUKinematics"], [107, 1, 1, "", "PreintegratedLinearModel"], [108, 1, 1, "", "PreintegratedWheelOdometry"], [109, 1, 1, "", "RelativeMotionIncrement"], [110, 1, 1, "", "WheelOdometryIncrement"]], "navlie.lib.preintegration.AngularVelocityIncrement": [[100, 2, 1, "", "copy"], [100, 3, 1, "", "covariance"], [100, 3, 1, "", "dof"], [100, 2, 1, "", "increment"], [100, 2, 1, "", "new"], [100, 2, 1, "", "plus"], [100, 5, 1, "", "stamp"], [100, 3, 1, "", "stamps"], [100, 3, 1, "", "state_id"], [100, 2, 1, "", "symmetrize"], [100, 2, 1, "", "update_bias"], [100, 5, 1, "", "value"]], "navlie.lib.preintegration.BodyVelocityIncrement": [[101, 2, 1, "", "copy"], [101, 3, 1, "", "covariance"], [101, 3, 1, "", "dof"], [101, 2, 1, "", "increment"], [101, 2, 1, "", "new"], [101, 2, 1, "", "plus"], [101, 5, 1, "", "stamp"], [101, 3, 1, "", "stamps"], [101, 3, 1, "", "state_id"], [101, 2, 1, "", "symmetrize"], [101, 2, 1, "", "update_bias"], [101, 5, 1, "", "value"]], "navlie.lib.preintegration.IMUIncrement": [[102, 5, 1, "", "accel_bias"], [102, 3, 1, "", "bias_jacobian"], [102, 2, 1, "", "copy"], [102, 3, 1, "", "covariance"], [102, 3, 1, "", "dof"], [102, 3, 1, "", "gravity"], [102, 5, 1, "", "gyro_bias"], [102, 2, 1, "", "increment"], [102, 3, 1, "", "input_covariance"], [102, 2, 1, "", "new"], [102, 3, 1, "", "new_bias"], [102, 3, 1, "", "original_bias"], [102, 3, 1, "", "original_value"], [102, 2, 1, "", "plus"], [102, 5, 1, "", "stamp"], [102, 3, 1, "", "stamps"], [102, 3, 1, "", "state_id"], [102, 2, 1, "", "symmetrize"], [102, 2, 1, "", "update_bias"], [102, 5, 1, "", "value"]], "navlie.lib.preintegration.LinearIncrement": [[103, 3, 1, "", "bias_jacobian"], [103, 2, 1, "", "copy"], [103, 3, 1, "", "covariance"], [103, 3, 1, "", "dof"], [103, 2, 1, "", "increment"], [103, 2, 1, "", "new"], [103, 3, 1, "", "new_bias"], [103, 3, 1, "", "original_bias"], [103, 3, 1, "", "original_value"], [103, 2, 1, "", "plus"], [103, 5, 1, "", "stamp"], [103, 3, 1, "", "stamps"], [103, 3, 1, "", "state_id"], [103, 2, 1, "", "symmetrize"], [103, 2, 1, "", "update_bias"], [103, 5, 1, "", "value"]], "navlie.lib.preintegration.PreintegratedAngularVelocity": [[104, 2, 1, "", "covariance"], [104, 2, 1, "", "evaluate"], [104, 2, 1, "", "evaluate_with_jacobian"], [104, 2, 1, "", "input_covariance"], [104, 2, 1, "", "input_jacobian_fd"], [104, 2, 1, "", "jacobian"], [104, 2, 1, "", "jacobian_fd"], [104, 2, 1, "", "sqrt_information"]], "navlie.lib.preintegration.PreintegratedBodyVelocity": [[105, 2, 1, "", "covariance"], [105, 2, 1, "", "evaluate"], [105, 2, 1, "", "evaluate_with_jacobian"], [105, 2, 1, "", "input_covariance"], [105, 2, 1, "", "input_jacobian_fd"], [105, 2, 1, "", "jacobian"], [105, 2, 1, "", "jacobian_fd"], [105, 2, 1, "", "sqrt_information"]], "navlie.lib.preintegration.PreintegratedIMUKinematics": [[106, 2, 1, "", "covariance"], [106, 2, 1, "", "evaluate"], [106, 2, 1, "", "evaluate_with_jacobian"], [106, 2, 1, "", "input_covariance"], [106, 2, 1, "", "input_jacobian_fd"], [106, 2, 1, "", "jacobian"], [106, 2, 1, "", "jacobian_fd"], [106, 2, 1, "", "sqrt_information"]], "navlie.lib.preintegration.PreintegratedLinearModel": [[107, 2, 1, "", "covariance"], [107, 2, 1, "", "evaluate"], [107, 2, 1, "", "evaluate_with_jacobian"], [107, 2, 1, "", "input_covariance"], [107, 2, 1, "", "input_jacobian_fd"], [107, 2, 1, "", "jacobian"], [107, 2, 1, "", "jacobian_fd"], [107, 2, 1, "", "sqrt_information"]], "navlie.lib.preintegration.PreintegratedWheelOdometry": [[108, 2, 1, "", "covariance"], [108, 2, 1, "", "evaluate"], [108, 2, 1, "", "evaluate_with_jacobian"], [108, 2, 1, "", "input_covariance"], [108, 2, 1, "", "input_jacobian_fd"], [108, 2, 1, "", "jacobian"], [108, 2, 1, "", "jacobian_fd"], [108, 2, 1, "", "sqrt_information"]], "navlie.lib.preintegration.RelativeMotionIncrement": [[109, 2, 1, "", "copy"], [109, 3, 1, "", "covariance"], [109, 3, 1, "", "dof"], [109, 2, 1, "", "increment"], [109, 2, 1, "", "new"], [109, 2, 1, "", "plus"], [109, 5, 1, "", "stamp"], [109, 3, 1, "", "stamps"], [109, 3, 1, "", "state_id"], [109, 2, 1, "", "symmetrize"], [109, 2, 1, "", "update_bias"]], "navlie.lib.preintegration.WheelOdometryIncrement": [[110, 2, 1, "", "copy"], [110, 3, 1, "", "covariance"], [110, 3, 1, "", "dof"], [110, 2, 1, "", "increment"], [110, 2, 1, "", "new"], [110, 3, 1, "", "original_value"], [110, 2, 1, "", "plus"], [110, 5, 1, "", "stamp"], [110, 3, 1, "", "stamps"], [110, 3, 1, "", "state_id"], [110, 2, 1, "", "symmetrize"], [110, 2, 1, "", "update_bias"], [110, 5, 1, "", "value"]], "navlie.lib.states": [[112, 1, 1, "", "MatrixLieGroupState"], [113, 1, 1, "", "SE23State"], [114, 1, 1, "", "SE2State"], [115, 1, 1, "", "SE3State"], [116, 1, 1, "", "SL3State"], [117, 1, 1, "", "SO2State"], [118, 1, 1, "", "SO3State"], [119, 1, 1, "", "StampedValue"], [120, 1, 1, "", "VectorInput"], [121, 1, 1, "", "VectorState"]], "navlie.lib.states.MatrixLieGroupState": [[112, 5, 1, "", "attitude"], [112, 2, 1, "", "copy"], [112, 3, 1, "", "direction"], [112, 3, 1, "", "dof"], [112, 2, 1, "", "dot"], [112, 3, 1, "", "group"], [112, 2, 1, "", "jacobian_from_blocks"], [112, 2, 1, "", "minus"], [112, 2, 1, "", "minus_jacobian"], [112, 2, 1, "", "minus_jacobian_fd"], [112, 2, 1, "", "plus"], [112, 2, 1, "", "plus_jacobian"], [112, 2, 1, "", "plus_jacobian_fd"], [112, 5, 1, "", "position"], [112, 3, 1, "", "stamp"], [112, 3, 1, "", "state_id"], [112, 3, 1, "", "value"], [112, 5, 1, "", "velocity"]], "navlie.lib.states.SE23State": [[113, 5, 1, "", "attitude"], [113, 2, 1, "", "copy"], [113, 3, 1, "", "direction"], [113, 3, 1, "", "dof"], [113, 2, 1, "", "dot"], [113, 3, 1, "", "group"], [113, 2, 1, "", "jacobian_from_blocks"], [113, 2, 1, "", "minus"], [113, 2, 1, "", "minus_jacobian"], [113, 2, 1, "", "minus_jacobian_fd"], [113, 2, 1, "", "plus"], [113, 2, 1, "", "plus_jacobian"], [113, 2, 1, "", "plus_jacobian_fd"], [113, 5, 1, "", "pose"], [113, 5, 1, "", "position"], [113, 2, 1, "", "random"], [113, 3, 1, "", "stamp"], [113, 3, 1, "", "state_id"], [113, 3, 1, "", "value"], [113, 5, 1, "", "velocity"]], "navlie.lib.states.SE2State": [[114, 5, 1, "", "attitude"], [114, 2, 1, "", "copy"], [114, 3, 1, "", "direction"], [114, 3, 1, "", "dof"], [114, 2, 1, "", "dot"], [114, 3, 1, "", "group"], [114, 2, 1, "", "jacobian_from_blocks"], [114, 2, 1, "", "minus"], [114, 2, 1, "", "minus_jacobian"], [114, 2, 1, "", "minus_jacobian_fd"], [114, 2, 1, "", "plus"], [114, 2, 1, "", "plus_jacobian"], [114, 2, 1, "", "plus_jacobian_fd"], [114, 5, 1, "", "pose"], [114, 5, 1, "", "position"], [114, 2, 1, "", "random"], [114, 3, 1, "", "stamp"], [114, 3, 1, "", "state_id"], [114, 3, 1, "", "value"], [114, 5, 1, "", "velocity"]], "navlie.lib.states.SE3State": [[115, 5, 1, "", "attitude"], [115, 2, 1, "", "copy"], [115, 3, 1, "", "direction"], [115, 3, 1, "", "dof"], [115, 2, 1, "", "dot"], [115, 2, 1, "", "from_ros"], [115, 3, 1, "", "group"], [115, 2, 1, "", "jacobian_from_blocks"], [115, 2, 1, "", "minus"], [115, 2, 1, "", "minus_jacobian"], [115, 2, 1, "", "minus_jacobian_fd"], [115, 2, 1, "", "plus"], [115, 2, 1, "", "plus_jacobian"], [115, 2, 1, "", "plus_jacobian_fd"], [115, 5, 1, "", "position"], [115, 2, 1, "", "random"], [115, 3, 1, "", "stamp"], [115, 3, 1, "", "state_id"], [115, 2, 1, "", "to_ros"], [115, 3, 1, "", "value"], [115, 5, 1, "", "velocity"]], "navlie.lib.states.SL3State": [[116, 5, 1, "", "attitude"], [116, 2, 1, "", "copy"], [116, 3, 1, "", "direction"], [116, 3, 1, "", "dof"], [116, 2, 1, "", "dot"], [116, 3, 1, "", "group"], [116, 2, 1, "", "jacobian_from_blocks"], [116, 2, 1, "", "minus"], [116, 2, 1, "", "minus_jacobian"], [116, 2, 1, "", "minus_jacobian_fd"], [116, 2, 1, "", "plus"], [116, 2, 1, "", "plus_jacobian"], [116, 2, 1, "", "plus_jacobian_fd"], [116, 5, 1, "", "position"], [116, 3, 1, "", "stamp"], [116, 3, 1, "", "state_id"], [116, 3, 1, "", "value"], [116, 5, 1, "", "velocity"]], "navlie.lib.states.SO2State": [[117, 5, 1, "", "attitude"], [117, 2, 1, "", "copy"], [117, 3, 1, "", "direction"], [117, 3, 1, "", "dof"], [117, 2, 1, "", "dot"], [117, 3, 1, "", "group"], [117, 2, 1, "", "jacobian_from_blocks"], [117, 2, 1, "", "minus"], [117, 2, 1, "", "minus_jacobian"], [117, 2, 1, "", "minus_jacobian_fd"], [117, 2, 1, "", "plus"], [117, 2, 1, "", "plus_jacobian"], [117, 2, 1, "", "plus_jacobian_fd"], [117, 5, 1, "", "position"], [117, 2, 1, "", "random"], [117, 3, 1, "", "stamp"], [117, 3, 1, "", "state_id"], [117, 3, 1, "", "value"], [117, 5, 1, "", "velocity"]], "navlie.lib.states.SO3State": [[118, 5, 1, "", "attitude"], [118, 2, 1, "", "copy"], [118, 3, 1, "", "direction"], [118, 3, 1, "", "dof"], [118, 2, 1, "", "dot"], [118, 2, 1, "", "from_ros"], [118, 3, 1, "", "group"], [118, 2, 1, "", "jacobian_from_blocks"], [118, 2, 1, "", "minus"], [118, 2, 1, "", "minus_jacobian"], [118, 2, 1, "", "minus_jacobian_fd"], [118, 2, 1, "", "plus"], [118, 2, 1, "", "plus_jacobian"], [118, 2, 1, "", "plus_jacobian_fd"], [118, 5, 1, "", "position"], [118, 2, 1, "", "random"], [118, 3, 1, "", "stamp"], [118, 3, 1, "", "state_id"], [118, 2, 1, "", "to_ros"], [118, 3, 1, "", "value"], [118, 5, 1, "", "velocity"]], "navlie.lib.states.StampedValue": [[119, 2, 1, "", "copy"], [119, 3, 1, "", "covariance"], [119, 3, 1, "", "dof"], [119, 2, 1, "", "plus"], [119, 3, 1, "", "stamp"], [119, 3, 1, "", "state_id"], [119, 3, 1, "", "value"]], "navlie.lib.states.VectorInput": [[120, 2, 1, "", "copy"], [120, 3, 1, "", "covariance"], [120, 3, 1, "", "dof"], [120, 2, 1, "", "plus"], [120, 3, 1, "", "stamp"], [120, 3, 1, "", "state_id"], [120, 3, 1, "", "value"]], "navlie.lib.states.VectorState": [[121, 2, 1, "", "copy"], [121, 3, 1, "", "dof"], [121, 2, 1, "", "minus"], [121, 2, 1, "", "minus_jacobian"], [121, 2, 1, "", "minus_jacobian_fd"], [121, 2, 1, "", "plus"], [121, 2, 1, "", "plus_jacobian"], [121, 2, 1, "", "plus_jacobian_fd"], [121, 3, 1, "", "stamp"], [121, 3, 1, "", "state_id"], [121, 3, 1, "", "value"]], "navlie.types": [[123, 1, 1, "", "Dataset"], [124, 1, 1, "", "Input"], [125, 1, 1, "", "Measurement"], [126, 1, 1, "", "MeasurementModel"], [127, 1, 1, "", "ProcessModel"], [128, 1, 1, "", "State"], [129, 1, 1, "", "StateWithCovariance"]], "navlie.types.Dataset": [[123, 2, 1, "", "get_ground_truth"], [123, 2, 1, "", "get_input_data"], [123, 2, 1, "", "get_measurement_data"]], "navlie.types.Input": [[124, 2, 1, "", "copy"], [124, 3, 1, "", "covariance"], [124, 3, 1, "", "dof"], [124, 2, 1, "", "plus"], [124, 3, 1, "", "stamp"], [124, 3, 1, "", "state_id"]], "navlie.types.Measurement": [[125, 2, 1, "", "minus"], [125, 3, 1, "", "model"], [125, 3, 1, "", "stamp"], [125, 3, 1, "", "state_id"], [125, 3, 1, "", "value"]], "navlie.types.MeasurementModel": [[126, 2, 1, "", "covariance"], [126, 2, 1, "", "evaluate"], [126, 2, 1, "", "evaluate_with_jacobian"], [126, 2, 1, "", "jacobian"], [126, 2, 1, "", "jacobian_fd"], [126, 2, 1, "", "sqrt_information"]], "navlie.types.ProcessModel": [[127, 2, 1, "", "covariance"], [127, 2, 1, "", "evaluate"], [127, 2, 1, "", "evaluate_with_jacobian"], [127, 2, 1, "", "input_covariance"], [127, 2, 1, "", "input_jacobian_fd"], [127, 2, 1, "", "jacobian"], [127, 2, 1, "", "jacobian_fd"], [127, 2, 1, "", "sqrt_information"]], "navlie.types.State": [[128, 2, 1, "", "copy"], [128, 3, 1, "", "dof"], [128, 2, 1, "", "minus"], [128, 2, 1, "", "minus_jacobian"], [128, 2, 1, "", "minus_jacobian_fd"], [128, 2, 1, "", "plus"], [128, 2, 1, "", "plus_jacobian"], [128, 2, 1, "", "plus_jacobian_fd"], [128, 3, 1, "", "stamp"], [128, 3, 1, "", "state_id"], [128, 3, 1, "", "value"]], "navlie.types.StateWithCovariance": [[129, 2, 1, "", "copy"], [129, 3, 1, "", "covariance"], [129, 5, 1, "", "stamp"], [129, 3, 1, "", "state"], [129, 2, 1, "", "symmetrize"]], "navlie.utils": [[131, 1, 1, "", "GaussianResult"], [132, 1, 1, "", "GaussianResultList"], [133, 1, 1, "", "MonteCarloResult"], [134, 4, 1, "", "associate_stamps"], [135, 4, 1, "", "find_nearest_stamp_idx"], [136, 4, 1, "", "jacobian"], [137, 4, 1, "", "monte_carlo"], [138, 4, 1, "", "plot_error"], [139, 4, 1, "", "plot_meas"], [140, 4, 1, "", "plot_meas_by_model"], [141, 4, 1, "", "plot_nees"], [142, 4, 1, "", "plot_poses"], [143, 4, 1, "", "randvec"], [144, 4, 1, "", "schedule_sequential_measurements"], [145, 4, 1, "", "set_axes_equal"], [146, 4, 1, "", "state_interp"], [147, 4, 1, "", "van_loans"]], "navlie.utils.GaussianResult": [[131, 3, 1, "", "covariance"], [131, 3, 1, "", "ees"], [131, 3, 1, "", "error"], [131, 3, 1, "", "md"], [131, 3, 1, "", "nees"], [131, 3, 1, "", "rmse"], [131, 3, 1, "", "stamp"], [131, 3, 1, "", "state"], [131, 3, 1, "", "state_true"], [131, 3, 1, "", "three_sigma"]], "navlie.utils.GaussianResultList": [[132, 3, 1, "", "covariance"], [132, 3, 1, "", "dof"], [132, 3, 1, "", "ees"], [132, 3, 1, "", "error"], [132, 2, 1, "", "from_estimates"], [132, 3, 1, "", "md"], [132, 3, 1, "", "nees"], [132, 2, 1, "", "nees_lower_bound"], [132, 2, 1, "", "nees_upper_bound"], [132, 3, 1, "", "rmse"], [132, 3, 1, "", "stamp"], [132, 3, 1, "", "state"], [132, 3, 1, "", "state_true"], [132, 3, 1, "", "three_sigma"], [132, 3, 1, "", "value"], [132, 3, 1, "", "value_true"]], "navlie.utils.MonteCarloResult": [[133, 3, 1, "", "average_ees"], [133, 3, 1, "", "average_nees"], [133, 3, 1, "", "dof"], [133, 3, 1, "", "expected_nees"], [133, 2, 1, "", "nees_lower_bound"], [133, 2, 1, "", "nees_upper_bound"], [133, 3, 1, "", "num_trials"], [133, 3, 1, "", "rmse"], [133, 3, 1, "", "stamp"], [133, 3, 1, "", "total_rmse"], [133, 3, 1, "", "trial_results"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:attribute", "4": "py:function", "5": "py:property"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "function", "Python function"], "5": ["py", "property", "Python property"]}, "titleterms": {"navli": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 149, 152], "batch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], "estim": [1, 2], "batchestim": 2, "gaussian_mixtur": [3, 4, 5, 6, 7, 8], "gaussianmixtureresidu": 4, "hessiansummixtureresidu": 5, "maxmixtureresidu": 6, "maxsummixtureresidu": 7, "summixtureresidu": 8, "loss": [9, 10, 11, 12], "cauchyloss": 10, "l2loss": 11, "lossfunct": 12, "problem": [13, 14, 15, 153, 154], "optimizationsummari": 14, "residu": [16, 17, 18, 19, 20], "measurementresidu": 17, "priorresidu": 18, "processresidu": 19, "composit": [21, 22, 23, 24, 25, 26, 151], "compositeinput": 22, "compositemeasur": 23, "compositemeasurementmodel": 24, "compositeprocessmodel": 25, "compositest": [26, 151], "datagen": [27, 28, 29], "datagener": 28, "generate_measur": 29, "filter": [30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 153, 154], "cubaturekalmanfilt": 31, "extendedkalmanfilt": 32, "gausshermitekalmanfilt": 33, "iteratedkalmanfilt": 34, "sigmapointkalmanfilt": 35, "unscentedkalmanfilt": 36, "check_outli": 37, "generate_sigmapoint": 38, "mean_stat": 39, "run_filt": 40, "imm": [41, 42, 43, 44, 45, 46, 47, 48, 49, 50], "immresult": 42, "immresultlist": 43, "immstat": 44, "interactingmodelfilt": 45, "gaussian_mix": 46, "gaussian_mixing_vectorspac": 47, "reparametrize_gaussians_about_x_par": 48, "run_imm_filt": 49, "update_x": 50, "lib": [51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121], "camera": [52, 53, 54], "pinholecamera": 53, "posematrix": 54, "dataset": [55, 56, 57, 58, 59, 123], "simulatedinertialgpsdataset": 56, "simulatedinertiallandmarkdataset": 57, "simulatedposerangingdataset": 58, "generate_landmark_posit": 59, "imu": [60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75], "g_matrix": 61, "g_matrix_inv": 62, "imukinemat": 64, "imust": 65, "l_matrix": 66, "m_matrix": 67, "n_matrix": 68, "u_matrix": 69, "u_matrix_inv": 70, "u_tilde_matrix": 71, "adjoint_ie3": 72, "delta_matrix": 73, "get_unbiased_imu": 74, "inverse_ie3": 75, "model": [76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 153, 154], "absoluteposit": 77, "absoluteveloc": 78, "altitud": 79, "bodyframeveloc": 80, "cameraproject": 81, "doubleintegr": 82, "doubleintegratorwithbia": 83, "globalposit": 84, "gravitomet": 85, "invariantmeasur": 86, "invariantpointrelativeposit": 87, "linearmeasur": 88, "magnetomet": 89, "onedimensionalpositionvelocityrang": 90, "pointrelativeposit": 91, "pointrelativepositionslam": 92, "rangepointtoanchor": 93, "rangeposetoanchor": 94, "rangeposetopos": 95, "rangerelativepos": 96, "relativebodyframeveloc": 97, "singleintegr": 98, "preintegr": [99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110], "angularvelocityincr": 100, "bodyvelocityincr": 101, "imuincr": 102, "linearincr": 103, "preintegratedangularveloc": 104, "preintegratedbodyveloc": 105, "preintegratedimukinemat": 106, "preintegratedlinearmodel": 107, "preintegratedwheelodometri": 108, "relativemotionincr": 109, "wheelodometryincr": 110, "state": [111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 128, 151, 153, 154], "matrixliegroupst": 112, "se23stat": 113, "se2stat": 114, "se3stat": 115, "sl3state": 116, "so2stat": 117, "so3stat": 118, "stampedvalu": 119, "vectorinput": 120, "vectorst": 121, "type": [122, 123, 124, 125, 126, 127, 128, 129], "input": 124, "measur": [125, 153, 154], "measurementmodel": 126, "processmodel": 127, "statewithcovari": 129, "util": [130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147], "gaussianresult": 131, "gaussianresultlist": 132, "montecarloresult": 133, "associate_stamp": 134, "find_nearest_stamp_idx": 135, "jacobian": [136, 152], "monte_carlo": 137, "plot_error": 138, "plot_mea": 139, "plot_meas_by_model": 140, "plot_ne": 141, "plot_pos": 142, "randvec": 143, "schedule_sequential_measur": 144, "set_axes_equ": 145, "state_interp": 146, "van_loan": 147, "api": 148, "document": 148, "welcom": 149, "instal": 149, "exampl": 149, "get": 150, "start": 150, "inherit": 151, "from": 151, "tradit": [152, 154], "approach": [152, 153, 154], "lie": [152, 153], "group": [152, 153], "toi": [153, 154], "defin": [153, 154], "process": [153, 154], "run": [153, 154], "built": 153, "": 154, "simul": 154, "onli": 154, "gener": 154, "fake": 154, "data": 154}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "nbsphinx": 4, "sphinx": 58}, "alltitles": {"navlie.batch": [[0, "module-navlie.batch"]], "navlie.batch.estimator": [[1, "module-navlie.batch.estimator"]], "navlie.batch.estimator.BatchEstimator": [[2, "navlie-batch-estimator-batchestimator"]], "navlie.batch.gaussian_mixtures": [[3, "module-navlie.batch.gaussian_mixtures"]], "navlie.batch.gaussian_mixtures.GaussianMixtureResidual": [[4, "navlie-batch-gaussian-mixtures-gaussianmixtureresidual"]], "navlie.batch.gaussian_mixtures.HessianSumMixtureResidual": [[5, "navlie-batch-gaussian-mixtures-hessiansummixtureresidual"]], "navlie.batch.gaussian_mixtures.MaxMixtureResidual": [[6, "navlie-batch-gaussian-mixtures-maxmixtureresidual"]], "navlie.batch.gaussian_mixtures.MaxSumMixtureResidual": [[7, "navlie-batch-gaussian-mixtures-maxsummixtureresidual"]], "navlie.batch.gaussian_mixtures.SumMixtureResidual": [[8, "navlie-batch-gaussian-mixtures-summixtureresidual"]], "navlie.batch.losses": [[9, "module-navlie.batch.losses"]], "navlie.batch.losses.CauchyLoss": [[10, "navlie-batch-losses-cauchyloss"]], "navlie.batch.losses.L2Loss": [[11, "navlie-batch-losses-l2loss"]], "navlie.batch.losses.LossFunction": [[12, "navlie-batch-losses-lossfunction"]], "navlie.batch.problem": [[13, "module-navlie.batch.problem"]], "navlie.batch.problem.OptimizationSummary": [[14, "navlie-batch-problem-optimizationsummary"]], "navlie.batch.problem.Problem": [[15, "navlie-batch-problem-problem"]], "navlie.batch.residuals": [[16, "module-navlie.batch.residuals"]], "navlie.batch.residuals.MeasurementResidual": [[17, "navlie-batch-residuals-measurementresidual"]], "navlie.batch.residuals.PriorResidual": [[18, "navlie-batch-residuals-priorresidual"]], "navlie.batch.residuals.ProcessResidual": [[19, "navlie-batch-residuals-processresidual"]], "navlie.batch.residuals.Residual": [[20, "navlie-batch-residuals-residual"]], "navlie.composite": [[21, "module-navlie.composite"]], "navlie.composite.CompositeInput": [[22, "navlie-composite-compositeinput"]], "navlie.composite.CompositeMeasurement": [[23, "navlie-composite-compositemeasurement"]], "navlie.composite.CompositeMeasurementModel": [[24, "navlie-composite-compositemeasurementmodel"]], "navlie.composite.CompositeProcessModel": [[25, "navlie-composite-compositeprocessmodel"]], "navlie.composite.CompositeState": [[26, "navlie-composite-compositestate"]], "navlie.datagen": [[27, "module-navlie.datagen"]], "navlie.datagen.DataGenerator": [[28, "navlie-datagen-datagenerator"]], "navlie.datagen.generate_measurement": [[29, "navlie-datagen-generate-measurement"]], "navlie.filters": [[30, "module-navlie.filters"]], "navlie.filters.CubatureKalmanFilter": [[31, "navlie-filters-cubaturekalmanfilter"]], "navlie.filters.ExtendedKalmanFilter": [[32, "navlie-filters-extendedkalmanfilter"]], "navlie.filters.GaussHermiteKalmanFilter": [[33, "navlie-filters-gausshermitekalmanfilter"]], "navlie.filters.IteratedKalmanFilter": [[34, "navlie-filters-iteratedkalmanfilter"]], "navlie.filters.SigmaPointKalmanFilter": [[35, "navlie-filters-sigmapointkalmanfilter"]], "navlie.filters.UnscentedKalmanFilter": [[36, "navlie-filters-unscentedkalmanfilter"]], "navlie.filters.check_outlier": [[37, "navlie-filters-check-outlier"]], "navlie.filters.generate_sigmapoints": [[38, "navlie-filters-generate-sigmapoints"]], "navlie.filters.mean_state": [[39, "navlie-filters-mean-state"]], "navlie.filters.run_filter": [[40, "navlie-filters-run-filter"]], "navlie.imm": [[41, "module-navlie.imm"]], "navlie.imm.IMMResult": [[42, "navlie-imm-immresult"]], "navlie.imm.IMMResultList": [[43, "navlie-imm-immresultlist"]], "navlie.imm.IMMState": [[44, "navlie-imm-immstate"]], "navlie.imm.InteractingModelFilter": [[45, "navlie-imm-interactingmodelfilter"]], "navlie.imm.gaussian_mixing": [[46, "navlie-imm-gaussian-mixing"]], "navlie.imm.gaussian_mixing_vectorspace": [[47, "navlie-imm-gaussian-mixing-vectorspace"]], "navlie.imm.reparametrize_gaussians_about_X_par": [[48, "navlie-imm-reparametrize-gaussians-about-x-par"]], "navlie.imm.run_imm_filter": [[49, "navlie-imm-run-imm-filter"]], "navlie.imm.update_X": [[50, "navlie-imm-update-x"]], "navlie.lib": [[51, "module-navlie.lib"]], "navlie.lib.camera": [[52, "module-navlie.lib.camera"]], "navlie.lib.camera.PinholeCamera": [[53, "navlie-lib-camera-pinholecamera"]], "navlie.lib.camera.PoseMatrix": [[54, "navlie-lib-camera-posematrix"]], "navlie.lib.datasets": [[55, "module-navlie.lib.datasets"]], "navlie.lib.datasets.SimulatedInertialGPSDataset": [[56, "navlie-lib-datasets-simulatedinertialgpsdataset"]], "navlie.lib.datasets.SimulatedInertialLandmarkDataset": [[57, "navlie-lib-datasets-simulatedinertiallandmarkdataset"]], "navlie.lib.datasets.SimulatedPoseRangingDataset": [[58, "navlie-lib-datasets-simulatedposerangingdataset"]], "navlie.lib.datasets.generate_landmark_positions": [[59, "navlie-lib-datasets-generate-landmark-positions"]], "navlie.lib.imu": [[60, "module-navlie.lib.imu"]], "navlie.lib.imu.G_matrix": [[61, "navlie-lib-imu-g-matrix"]], "navlie.lib.imu.G_matrix_inv": [[62, "navlie-lib-imu-g-matrix-inv"]], "navlie.lib.imu.IMU": [[63, "navlie-lib-imu-imu"]], "navlie.lib.imu.IMUKinematics": [[64, "navlie-lib-imu-imukinematics"]], "navlie.lib.imu.IMUState": [[65, "navlie-lib-imu-imustate"]], "navlie.lib.imu.L_matrix": [[66, "navlie-lib-imu-l-matrix"]], "navlie.lib.imu.M_matrix": [[67, "navlie-lib-imu-m-matrix"]], "navlie.lib.imu.N_matrix": [[68, "navlie-lib-imu-n-matrix"]], "navlie.lib.imu.U_matrix": [[69, "navlie-lib-imu-u-matrix"]], "navlie.lib.imu.U_matrix_inv": [[70, "navlie-lib-imu-u-matrix-inv"]], "navlie.lib.imu.U_tilde_matrix": [[71, "navlie-lib-imu-u-tilde-matrix"]], "navlie.lib.imu.adjoint_IE3": [[72, "navlie-lib-imu-adjoint-ie3"]], "navlie.lib.imu.delta_matrix": [[73, "navlie-lib-imu-delta-matrix"]], "navlie.lib.imu.get_unbiased_imu": [[74, "navlie-lib-imu-get-unbiased-imu"]], "navlie.lib.imu.inverse_IE3": [[75, "navlie-lib-imu-inverse-ie3"]], "navlie.lib.models": [[76, "module-navlie.lib.models"]], "navlie.lib.models.AbsolutePosition": [[77, "navlie-lib-models-absoluteposition"]], "navlie.lib.models.AbsoluteVelocity": [[78, "navlie-lib-models-absolutevelocity"]], "navlie.lib.models.Altitude": [[79, "navlie-lib-models-altitude"]], "navlie.lib.models.BodyFrameVelocity": [[80, "navlie-lib-models-bodyframevelocity"]], "navlie.lib.models.CameraProjection": [[81, "navlie-lib-models-cameraprojection"]], "navlie.lib.models.DoubleIntegrator": [[82, "navlie-lib-models-doubleintegrator"]], "navlie.lib.models.DoubleIntegratorWithBias": [[83, "navlie-lib-models-doubleintegratorwithbias"]], "navlie.lib.models.GlobalPosition": [[84, "navlie-lib-models-globalposition"]], "navlie.lib.models.Gravitometer": [[85, "navlie-lib-models-gravitometer"]], "navlie.lib.models.InvariantMeasurement": [[86, "navlie-lib-models-invariantmeasurement"]], "navlie.lib.models.InvariantPointRelativePosition": [[87, "navlie-lib-models-invariantpointrelativeposition"]], "navlie.lib.models.LinearMeasurement": [[88, "navlie-lib-models-linearmeasurement"]], "navlie.lib.models.Magnetometer": [[89, "navlie-lib-models-magnetometer"]], "navlie.lib.models.OneDimensionalPositionVelocityRange": [[90, "navlie-lib-models-onedimensionalpositionvelocityrange"]], "navlie.lib.models.PointRelativePosition": [[91, "navlie-lib-models-pointrelativeposition"]], "navlie.lib.models.PointRelativePositionSLAM": [[92, "navlie-lib-models-pointrelativepositionslam"]], "navlie.lib.models.RangePointToAnchor": [[93, "navlie-lib-models-rangepointtoanchor"]], "navlie.lib.models.RangePoseToAnchor": [[94, "navlie-lib-models-rangeposetoanchor"]], "navlie.lib.models.RangePoseToPose": [[95, "navlie-lib-models-rangeposetopose"]], "navlie.lib.models.RangeRelativePose": [[96, "navlie-lib-models-rangerelativepose"]], "navlie.lib.models.RelativeBodyFrameVelocity": [[97, "navlie-lib-models-relativebodyframevelocity"]], "navlie.lib.models.SingleIntegrator": [[98, "navlie-lib-models-singleintegrator"]], "navlie.lib.preintegration": [[99, "module-navlie.lib.preintegration"]], "navlie.lib.preintegration.AngularVelocityIncrement": [[100, "navlie-lib-preintegration-angularvelocityincrement"]], "navlie.lib.preintegration.BodyVelocityIncrement": [[101, "navlie-lib-preintegration-bodyvelocityincrement"]], "navlie.lib.preintegration.IMUIncrement": [[102, "navlie-lib-preintegration-imuincrement"]], "navlie.lib.preintegration.LinearIncrement": [[103, "navlie-lib-preintegration-linearincrement"]], "navlie.lib.preintegration.PreintegratedAngularVelocity": [[104, "navlie-lib-preintegration-preintegratedangularvelocity"]], "navlie.lib.preintegration.PreintegratedBodyVelocity": [[105, "navlie-lib-preintegration-preintegratedbodyvelocity"]], "navlie.lib.preintegration.PreintegratedIMUKinematics": [[106, "navlie-lib-preintegration-preintegratedimukinematics"]], "navlie.lib.preintegration.PreintegratedLinearModel": [[107, "navlie-lib-preintegration-preintegratedlinearmodel"]], "navlie.lib.preintegration.PreintegratedWheelOdometry": [[108, "navlie-lib-preintegration-preintegratedwheelodometry"]], "navlie.lib.preintegration.RelativeMotionIncrement": [[109, "navlie-lib-preintegration-relativemotionincrement"]], "navlie.lib.preintegration.WheelOdometryIncrement": [[110, "navlie-lib-preintegration-wheelodometryincrement"]], "navlie.lib.states": [[111, "module-navlie.lib.states"]], "navlie.lib.states.MatrixLieGroupState": [[112, "navlie-lib-states-matrixliegroupstate"]], "navlie.lib.states.SE23State": [[113, "navlie-lib-states-se23state"]], "navlie.lib.states.SE2State": [[114, "navlie-lib-states-se2state"]], "navlie.lib.states.SE3State": [[115, "navlie-lib-states-se3state"]], "navlie.lib.states.SL3State": [[116, "navlie-lib-states-sl3state"]], "navlie.lib.states.SO2State": [[117, "navlie-lib-states-so2state"]], "navlie.lib.states.SO3State": [[118, "navlie-lib-states-so3state"]], "navlie.lib.states.StampedValue": [[119, "navlie-lib-states-stampedvalue"]], "navlie.lib.states.VectorInput": [[120, "navlie-lib-states-vectorinput"]], "navlie.lib.states.VectorState": [[121, "navlie-lib-states-vectorstate"]], "navlie.types": [[122, "module-navlie.types"]], "navlie.types.Dataset": [[123, "navlie-types-dataset"]], "navlie.types.Input": [[124, "navlie-types-input"]], "navlie.types.Measurement": [[125, "navlie-types-measurement"]], "navlie.types.MeasurementModel": [[126, "navlie-types-measurementmodel"]], "navlie.types.ProcessModel": [[127, "navlie-types-processmodel"]], "navlie.types.State": [[128, "navlie-types-state"]], "navlie.types.StateWithCovariance": [[129, "navlie-types-statewithcovariance"]], "navlie.utils": [[130, "module-navlie.utils"]], "navlie.utils.GaussianResult": [[131, "navlie-utils-gaussianresult"]], "navlie.utils.GaussianResultList": [[132, "navlie-utils-gaussianresultlist"]], "navlie.utils.MonteCarloResult": [[133, "navlie-utils-montecarloresult"]], "navlie.utils.associate_stamps": [[134, "navlie-utils-associate-stamps"]], "navlie.utils.find_nearest_stamp_idx": [[135, "navlie-utils-find-nearest-stamp-idx"]], "navlie.utils.jacobian": [[136, "navlie-utils-jacobian"]], "navlie.utils.monte_carlo": [[137, "navlie-utils-monte-carlo"]], "navlie.utils.plot_error": [[138, "navlie-utils-plot-error"]], "navlie.utils.plot_meas": [[139, "navlie-utils-plot-meas"]], "navlie.utils.plot_meas_by_model": [[140, "navlie-utils-plot-meas-by-model"]], "navlie.utils.plot_nees": [[141, "navlie-utils-plot-nees"]], "navlie.utils.plot_poses": [[142, "navlie-utils-plot-poses"]], "navlie.utils.randvec": [[143, "navlie-utils-randvec"]], "navlie.utils.schedule_sequential_measurements": [[144, "navlie-utils-schedule-sequential-measurements"]], "navlie.utils.set_axes_equal": [[145, "navlie-utils-set-axes-equal"]], "navlie.utils.state_interp": [[146, "navlie-utils-state-interp"]], "navlie.utils.van_loans": [[147, "navlie-utils-van-loans"]], "API Documentation": [[148, "api-documentation"]], "Welcome to navlie!": [[149, "welcome-to-navlie"]], "Installation": [[149, "installation"]], "Examples": [[149, "examples"]], "Getting Started": [[150, "getting-started"]], "Composite States": [[151, "Composite-States"]], "Inheriting from CompositeState": [[151, "Inheriting-from-CompositeState"]], "Jacobians in navlie": [[152, "Jacobians-in-navlie"]], "Jacobians - Traditional Approach": [[152, "Jacobians---Traditional-Approach"]], "Jacobians - Lie Group Approach": [[152, "Jacobians---Lie-Group-Approach"]], "Toy Problem - Lie group approach": [[153, "Toy-Problem---Lie-group-approach"]], "Define the State": [[153, "Define-the-State"], [154, "Define-the-State"]], "Define the Process Model": [[153, "Define-the-Process-Model"], [154, "Define-the-Process-Model"]], "Define the Measurement Model": [[153, "Define-the-Measurement-Model"]], "Run the Filter!": [[153, "Run-the-Filter!"]], "Built-in Lie group states": [[153, "Built-in-Lie-group-states"]], "Toy Problem - Traditional Approach": [[154, "Toy-Problem---Traditional-Approach"]], "Define the Measurement Model(s)": [[154, "Define-the-Measurement-Model(s)"]], "(Simulation only) Generate fake data": [[154, "(Simulation-only)-Generate-fake-data"]], "Run a filter!": [[154, "Run-a-filter!"]]}, "indexentries": {"module": [[0, "module-navlie.batch"], [1, "module-navlie.batch.estimator"], [3, "module-navlie.batch.gaussian_mixtures"], [9, "module-navlie.batch.losses"], [13, "module-navlie.batch.problem"], [16, "module-navlie.batch.residuals"], [21, "module-navlie.composite"], [27, "module-navlie.datagen"], [30, "module-navlie.filters"], [41, "module-navlie.imm"], [51, "module-navlie.lib"], [52, "module-navlie.lib.camera"], [55, "module-navlie.lib.datasets"], [60, "module-navlie.lib.imu"], [76, "module-navlie.lib.models"], [99, "module-navlie.lib.preintegration"], [111, "module-navlie.lib.states"], [122, "module-navlie.types"], [130, "module-navlie.utils"]], "navlie.batch": [[0, "module-navlie.batch"]], "navlie.batch.estimator": [[1, "module-navlie.batch.estimator"]], "batchestimator (class in navlie.batch.estimator)": [[2, "navlie.batch.estimator.BatchEstimator"]], "solve() (navlie.batch.estimator.batchestimator method)": [[2, "navlie.batch.estimator.BatchEstimator.solve"]], "navlie.batch.gaussian_mixtures": [[3, "module-navlie.batch.gaussian_mixtures"]], "gaussianmixtureresidual (class in navlie.batch.gaussian_mixtures)": [[4, "navlie.batch.gaussian_mixtures.GaussianMixtureResidual"]], "evaluate() (navlie.batch.gaussian_mixtures.gaussianmixtureresidual method)": [[4, "navlie.batch.gaussian_mixtures.GaussianMixtureResidual.evaluate"]], "evaluate_component_residuals() (navlie.batch.gaussian_mixtures.gaussianmixtureresidual method)": [[4, "navlie.batch.gaussian_mixtures.GaussianMixtureResidual.evaluate_component_residuals"]], "jacobian_fd() (navlie.batch.gaussian_mixtures.gaussianmixtureresidual method)": [[4, "navlie.batch.gaussian_mixtures.GaussianMixtureResidual.jacobian_fd"]], "mix_errors() (navlie.batch.gaussian_mixtures.gaussianmixtureresidual method)": [[4, "navlie.batch.gaussian_mixtures.GaussianMixtureResidual.mix_errors"]], "mix_jacobians() (navlie.batch.gaussian_mixtures.gaussianmixtureresidual method)": [[4, "navlie.batch.gaussian_mixtures.GaussianMixtureResidual.mix_jacobians"]], "sqrt_info_matrix() (navlie.batch.gaussian_mixtures.gaussianmixtureresidual method)": [[4, "navlie.batch.gaussian_mixtures.GaussianMixtureResidual.sqrt_info_matrix"]], "hessiansummixtureresidual (class in navlie.batch.gaussian_mixtures)": [[5, "navlie.batch.gaussian_mixtures.HessianSumMixtureResidual"]], "evaluate() (navlie.batch.gaussian_mixtures.hessiansummixtureresidual method)": [[5, "navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.evaluate"]], "evaluate_component_residuals() (navlie.batch.gaussian_mixtures.hessiansummixtureresidual method)": [[5, "navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.evaluate_component_residuals"]], "jacobian_fd() (navlie.batch.gaussian_mixtures.hessiansummixtureresidual method)": [[5, "navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.jacobian_fd"]], "mix_errors() (navlie.batch.gaussian_mixtures.hessiansummixtureresidual method)": [[5, "navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.mix_errors"]], "mix_jacobians() (navlie.batch.gaussian_mixtures.hessiansummixtureresidual method)": [[5, "navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.mix_jacobians"]], "no_use_complex_numbers (navlie.batch.gaussian_mixtures.hessiansummixtureresidual attribute)": [[5, "navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.no_use_complex_numbers"]], "normalization_constant (navlie.batch.gaussian_mixtures.hessiansummixtureresidual attribute)": [[5, "navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.normalization_constant"]], "sqrt_info_matrix() (navlie.batch.gaussian_mixtures.hessiansummixtureresidual method)": [[5, "navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.sqrt_info_matrix"]], "sum_mixture_residual (navlie.batch.gaussian_mixtures.hessiansummixtureresidual attribute)": [[5, "navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.sum_mixture_residual"]], "maxmixtureresidual (class in navlie.batch.gaussian_mixtures)": [[6, "navlie.batch.gaussian_mixtures.MaxMixtureResidual"]], "evaluate() (navlie.batch.gaussian_mixtures.maxmixtureresidual method)": [[6, "navlie.batch.gaussian_mixtures.MaxMixtureResidual.evaluate"]], "evaluate_component_residuals() (navlie.batch.gaussian_mixtures.maxmixtureresidual method)": [[6, "navlie.batch.gaussian_mixtures.MaxMixtureResidual.evaluate_component_residuals"]], "jacobian_fd() (navlie.batch.gaussian_mixtures.maxmixtureresidual method)": [[6, "navlie.batch.gaussian_mixtures.MaxMixtureResidual.jacobian_fd"]], "mix_errors() (navlie.batch.gaussian_mixtures.maxmixtureresidual method)": [[6, "navlie.batch.gaussian_mixtures.MaxMixtureResidual.mix_errors"]], "mix_jacobians() (navlie.batch.gaussian_mixtures.maxmixtureresidual method)": [[6, "navlie.batch.gaussian_mixtures.MaxMixtureResidual.mix_jacobians"]], "sqrt_info_matrix() (navlie.batch.gaussian_mixtures.maxmixtureresidual method)": [[6, "navlie.batch.gaussian_mixtures.MaxMixtureResidual.sqrt_info_matrix"]], "maxsummixtureresidual (class in navlie.batch.gaussian_mixtures)": [[7, "navlie.batch.gaussian_mixtures.MaxSumMixtureResidual"]], "compute_nonlinear_part() (navlie.batch.gaussian_mixtures.maxsummixtureresidual method)": [[7, "navlie.batch.gaussian_mixtures.MaxSumMixtureResidual.compute_nonlinear_part"]], "damping_const (navlie.batch.gaussian_mixtures.maxsummixtureresidual attribute)": [[7, "navlie.batch.gaussian_mixtures.MaxSumMixtureResidual.damping_const"]], "evaluate() (navlie.batch.gaussian_mixtures.maxsummixtureresidual method)": [[7, "navlie.batch.gaussian_mixtures.MaxSumMixtureResidual.evaluate"]], "evaluate_component_residuals() (navlie.batch.gaussian_mixtures.maxsummixtureresidual method)": [[7, "navlie.batch.gaussian_mixtures.MaxSumMixtureResidual.evaluate_component_residuals"]], "jacobian_fd() (navlie.batch.gaussian_mixtures.maxsummixtureresidual method)": [[7, "navlie.batch.gaussian_mixtures.MaxSumMixtureResidual.jacobian_fd"]], "mix_errors() (navlie.batch.gaussian_mixtures.maxsummixtureresidual method)": [[7, "navlie.batch.gaussian_mixtures.MaxSumMixtureResidual.mix_errors"]], "mix_jacobians() (navlie.batch.gaussian_mixtures.maxsummixtureresidual method)": [[7, "navlie.batch.gaussian_mixtures.MaxSumMixtureResidual.mix_jacobians"]], "sqrt_info_matrix() (navlie.batch.gaussian_mixtures.maxsummixtureresidual method)": [[7, "navlie.batch.gaussian_mixtures.MaxSumMixtureResidual.sqrt_info_matrix"]], "summixtureresidual (class in navlie.batch.gaussian_mixtures)": [[8, "navlie.batch.gaussian_mixtures.SumMixtureResidual"]], "evaluate() (navlie.batch.gaussian_mixtures.summixtureresidual method)": [[8, "navlie.batch.gaussian_mixtures.SumMixtureResidual.evaluate"]], "evaluate_component_residuals() (navlie.batch.gaussian_mixtures.summixtureresidual method)": [[8, "navlie.batch.gaussian_mixtures.SumMixtureResidual.evaluate_component_residuals"]], "jacobian_fd() (navlie.batch.gaussian_mixtures.summixtureresidual method)": [[8, "navlie.batch.gaussian_mixtures.SumMixtureResidual.jacobian_fd"]], "mix_errors() (navlie.batch.gaussian_mixtures.summixtureresidual method)": [[8, "navlie.batch.gaussian_mixtures.SumMixtureResidual.mix_errors"]], "mix_jacobians() (navlie.batch.gaussian_mixtures.summixtureresidual method)": [[8, "navlie.batch.gaussian_mixtures.SumMixtureResidual.mix_jacobians"]], "sqrt_info_matrix() (navlie.batch.gaussian_mixtures.summixtureresidual method)": [[8, "navlie.batch.gaussian_mixtures.SumMixtureResidual.sqrt_info_matrix"]], "navlie.batch.losses": [[9, "module-navlie.batch.losses"]], "cauchyloss (class in navlie.batch.losses)": [[10, "navlie.batch.losses.CauchyLoss"]], "loss() (navlie.batch.losses.cauchyloss method)": [[10, "navlie.batch.losses.CauchyLoss.loss"]], "weight() (navlie.batch.losses.cauchyloss method)": [[10, "navlie.batch.losses.CauchyLoss.weight"]], "l2loss (class in navlie.batch.losses)": [[11, "navlie.batch.losses.L2Loss"]], "loss() (navlie.batch.losses.l2loss method)": [[11, "navlie.batch.losses.L2Loss.loss"]], "weight() (navlie.batch.losses.l2loss method)": [[11, "navlie.batch.losses.L2Loss.weight"]], "lossfunction (class in navlie.batch.losses)": [[12, "navlie.batch.losses.LossFunction"]], "loss() (navlie.batch.losses.lossfunction method)": [[12, "navlie.batch.losses.LossFunction.loss"]], "weight() (navlie.batch.losses.lossfunction method)": [[12, "navlie.batch.losses.LossFunction.weight"]], "navlie.batch.problem": [[13, "module-navlie.batch.problem"]], "optimizationsummary (class in navlie.batch.problem)": [[14, "navlie.batch.problem.OptimizationSummary"]], "problem (class in navlie.batch.problem)": [[15, "navlie.batch.problem.Problem"]], "add_residual() (navlie.batch.problem.problem method)": [[15, "navlie.batch.problem.Problem.add_residual"]], "add_variable() (navlie.batch.problem.problem method)": [[15, "navlie.batch.problem.Problem.add_variable"]], "compute_covariance() (navlie.batch.problem.problem method)": [[15, "navlie.batch.problem.Problem.compute_covariance"]], "compute_error_jac_cost() (navlie.batch.problem.problem method)": [[15, "navlie.batch.problem.Problem.compute_error_jac_cost"]], "get_covariance_block() (navlie.batch.problem.problem method)": [[15, "navlie.batch.problem.Problem.get_covariance_block"]], "is_converged() (navlie.batch.problem.problem method)": [[15, "navlie.batch.problem.Problem.is_converged"]], "set_variables_constant() (navlie.batch.problem.problem method)": [[15, "navlie.batch.problem.Problem.set_variables_constant"]], "solve() (navlie.batch.problem.problem method)": [[15, "navlie.batch.problem.Problem.solve"]], "navlie.batch.residuals": [[16, "module-navlie.batch.residuals"]], "measurementresidual (class in navlie.batch.residuals)": [[17, "navlie.batch.residuals.MeasurementResidual"]], "evaluate() (navlie.batch.residuals.measurementresidual method)": [[17, "navlie.batch.residuals.MeasurementResidual.evaluate"]], "jacobian_fd() (navlie.batch.residuals.measurementresidual method)": [[17, "navlie.batch.residuals.MeasurementResidual.jacobian_fd"]], "sqrt_info_matrix() (navlie.batch.residuals.measurementresidual method)": [[17, "navlie.batch.residuals.MeasurementResidual.sqrt_info_matrix"]], "priorresidual (class in navlie.batch.residuals)": [[18, "navlie.batch.residuals.PriorResidual"]], "evaluate() (navlie.batch.residuals.priorresidual method)": [[18, "navlie.batch.residuals.PriorResidual.evaluate"]], "jacobian_fd() (navlie.batch.residuals.priorresidual method)": [[18, "navlie.batch.residuals.PriorResidual.jacobian_fd"]], "sqrt_info_matrix() (navlie.batch.residuals.priorresidual method)": [[18, "navlie.batch.residuals.PriorResidual.sqrt_info_matrix"]], "processresidual (class in navlie.batch.residuals)": [[19, "navlie.batch.residuals.ProcessResidual"]], "evaluate() (navlie.batch.residuals.processresidual method)": [[19, "navlie.batch.residuals.ProcessResidual.evaluate"]], "jacobian_fd() (navlie.batch.residuals.processresidual method)": [[19, "navlie.batch.residuals.ProcessResidual.jacobian_fd"]], "sqrt_info_matrix() (navlie.batch.residuals.processresidual method)": [[19, "navlie.batch.residuals.ProcessResidual.sqrt_info_matrix"]], "residual (class in navlie.batch.residuals)": [[20, "navlie.batch.residuals.Residual"]], "evaluate() (navlie.batch.residuals.residual method)": [[20, "navlie.batch.residuals.Residual.evaluate"]], "jacobian_fd() (navlie.batch.residuals.residual method)": [[20, "navlie.batch.residuals.Residual.jacobian_fd"]], "sqrt_info_matrix() (navlie.batch.residuals.residual method)": [[20, "navlie.batch.residuals.Residual.sqrt_info_matrix"]], "navlie.composite": [[21, "module-navlie.composite"]], "compositeinput (class in navlie.composite)": [[22, "navlie.composite.CompositeInput"]], "add_input() (navlie.composite.compositeinput method)": [[22, "navlie.composite.CompositeInput.add_input"]], "copy() (navlie.composite.compositeinput method)": [[22, "navlie.composite.CompositeInput.copy"]], "covariance (navlie.composite.compositeinput attribute)": [[22, "navlie.composite.CompositeInput.covariance"]], "dof (navlie.composite.compositeinput attribute)": [[22, "navlie.composite.CompositeInput.dof"]], "get_dof_by_id() (navlie.composite.compositeinput method)": [[22, "navlie.composite.CompositeInput.get_dof_by_id"]], "get_index_by_id() (navlie.composite.compositeinput method)": [[22, "navlie.composite.CompositeInput.get_index_by_id"]], "get_input_by_id() (navlie.composite.compositeinput method)": [[22, "navlie.composite.CompositeInput.get_input_by_id"]], "get_stamp_by_id() (navlie.composite.compositeinput method)": [[22, "navlie.composite.CompositeInput.get_stamp_by_id"]], "plus() (navlie.composite.compositeinput method)": [[22, "navlie.composite.CompositeInput.plus"]], "remove_input_by_id() (navlie.composite.compositeinput method)": [[22, "navlie.composite.CompositeInput.remove_input_by_id"]], "set_input_by_id() (navlie.composite.compositeinput method)": [[22, "navlie.composite.CompositeInput.set_input_by_id"]], "set_stamp_by_id() (navlie.composite.compositeinput method)": [[22, "navlie.composite.CompositeInput.set_stamp_by_id"]], "set_stamp_for_all() (navlie.composite.compositeinput method)": [[22, "navlie.composite.CompositeInput.set_stamp_for_all"]], "stamp (navlie.composite.compositeinput attribute)": [[22, "navlie.composite.CompositeInput.stamp"]], "state_id (navlie.composite.compositeinput attribute)": [[22, "navlie.composite.CompositeInput.state_id"]], "to_list() (navlie.composite.compositeinput method)": [[22, "navlie.composite.CompositeInput.to_list"]], "compositemeasurement (class in navlie.composite)": [[23, "navlie.composite.CompositeMeasurement"]], "minus() (navlie.composite.compositemeasurement method)": [[23, "navlie.composite.CompositeMeasurement.minus"]], "model (navlie.composite.compositemeasurement attribute)": [[23, "navlie.composite.CompositeMeasurement.model"]], "stamp (navlie.composite.compositemeasurement attribute)": [[23, "navlie.composite.CompositeMeasurement.stamp"]], "state_id (navlie.composite.compositemeasurement attribute)": [[23, "navlie.composite.CompositeMeasurement.state_id"]], "value (navlie.composite.compositemeasurement attribute)": [[23, "navlie.composite.CompositeMeasurement.value"]], "compositemeasurementmodel (class in navlie.composite)": [[24, "navlie.composite.CompositeMeasurementModel"]], "covariance() (navlie.composite.compositemeasurementmodel method)": [[24, "navlie.composite.CompositeMeasurementModel.covariance"]], "evaluate() (navlie.composite.compositemeasurementmodel method)": [[24, "navlie.composite.CompositeMeasurementModel.evaluate"]], "evaluate_with_jacobian() (navlie.composite.compositemeasurementmodel method)": [[24, "navlie.composite.CompositeMeasurementModel.evaluate_with_jacobian"]], "jacobian() (navlie.composite.compositemeasurementmodel method)": [[24, "navlie.composite.CompositeMeasurementModel.jacobian"]], "jacobian_fd() (navlie.composite.compositemeasurementmodel method)": [[24, "navlie.composite.CompositeMeasurementModel.jacobian_fd"]], "sqrt_information() (navlie.composite.compositemeasurementmodel method)": [[24, "navlie.composite.CompositeMeasurementModel.sqrt_information"]], "compositeprocessmodel (class in navlie.composite)": [[25, "navlie.composite.CompositeProcessModel"]], "covariance() (navlie.composite.compositeprocessmodel method)": [[25, "navlie.composite.CompositeProcessModel.covariance"]], "evaluate() (navlie.composite.compositeprocessmodel method)": [[25, "navlie.composite.CompositeProcessModel.evaluate"]], "evaluate_with_jacobian() (navlie.composite.compositeprocessmodel method)": [[25, "navlie.composite.CompositeProcessModel.evaluate_with_jacobian"]], "input_covariance() (navlie.composite.compositeprocessmodel method)": [[25, "navlie.composite.CompositeProcessModel.input_covariance"]], "input_jacobian_fd() (navlie.composite.compositeprocessmodel method)": [[25, "navlie.composite.CompositeProcessModel.input_jacobian_fd"]], "jacobian() (navlie.composite.compositeprocessmodel method)": [[25, "navlie.composite.CompositeProcessModel.jacobian"]], "jacobian_fd() (navlie.composite.compositeprocessmodel method)": [[25, "navlie.composite.CompositeProcessModel.jacobian_fd"]], "sqrt_information() (navlie.composite.compositeprocessmodel method)": [[25, "navlie.composite.CompositeProcessModel.sqrt_information"]], "compositestate (class in navlie.composite)": [[26, "navlie.composite.CompositeState"]], "add_state() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.add_state"]], "copy() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.copy"]], "dof (navlie.composite.compositestate attribute)": [[26, "navlie.composite.CompositeState.dof"]], "get_dof_by_id() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.get_dof_by_id"]], "get_index_by_id() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.get_index_by_id"]], "get_matrix_block_by_ids() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.get_matrix_block_by_ids"]], "get_slice_by_id() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.get_slice_by_id"]], "get_slices() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.get_slices"]], "get_stamp_by_id() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.get_stamp_by_id"]], "get_state_by_id() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.get_state_by_id"]], "get_value_by_id() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.get_value_by_id"]], "jacobian_from_blocks() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.jacobian_from_blocks"]], "minus() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.minus"]], "minus_jacobian() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.minus_jacobian"]], "minus_jacobian_fd() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.minus_jacobian_fd"]], "plus() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.plus"]], "plus_by_id() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.plus_by_id"]], "plus_jacobian() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.plus_jacobian"]], "plus_jacobian_fd() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.plus_jacobian_fd"]], "remove_state_by_id() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.remove_state_by_id"]], "set_matrix_block_by_ids() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.set_matrix_block_by_ids"]], "set_stamp_by_id() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.set_stamp_by_id"]], "set_stamp_for_all() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.set_stamp_for_all"]], "set_state_by_id() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.set_state_by_id"]], "set_value_by_id() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.set_value_by_id"]], "stamp (navlie.composite.compositestate attribute)": [[26, "navlie.composite.CompositeState.stamp"]], "state_id (navlie.composite.compositestate attribute)": [[26, "navlie.composite.CompositeState.state_id"]], "to_list() (navlie.composite.compositestate method)": [[26, "navlie.composite.CompositeState.to_list"]], "value (navlie.composite.compositestate attribute)": [[26, "navlie.composite.CompositeState.value"]], "navlie.datagen": [[27, "module-navlie.datagen"]], "datagenerator (class in navlie.datagen)": [[28, "navlie.datagen.DataGenerator"]], "add_measurement_model() (navlie.datagen.datagenerator method)": [[28, "navlie.datagen.DataGenerator.add_measurement_model"]], "generate() (navlie.datagen.datagenerator method)": [[28, "navlie.datagen.DataGenerator.generate"]], "generate_measurement() (in module navlie.datagen)": [[29, "navlie.datagen.generate_measurement"]], "navlie.filters": [[30, "module-navlie.filters"]], "cubaturekalmanfilter (class in navlie.filters)": [[31, "navlie.filters.CubatureKalmanFilter"]], "correct() (navlie.filters.cubaturekalmanfilter method)": [[31, "navlie.filters.CubatureKalmanFilter.correct"]], "iterate_mean (navlie.filters.cubaturekalmanfilter attribute)": [[31, "navlie.filters.CubatureKalmanFilter.iterate_mean"]], "method (navlie.filters.cubaturekalmanfilter attribute)": [[31, "navlie.filters.CubatureKalmanFilter.method"]], "predict() (navlie.filters.cubaturekalmanfilter method)": [[31, "navlie.filters.CubatureKalmanFilter.predict"]], "process_model (navlie.filters.cubaturekalmanfilter attribute)": [[31, "navlie.filters.CubatureKalmanFilter.process_model"]], "reject_outliers (navlie.filters.cubaturekalmanfilter attribute)": [[31, "navlie.filters.CubatureKalmanFilter.reject_outliers"]], "extendedkalmanfilter (class in navlie.filters)": [[32, "navlie.filters.ExtendedKalmanFilter"]], "correct() (navlie.filters.extendedkalmanfilter method)": [[32, "navlie.filters.ExtendedKalmanFilter.correct"]], "predict() (navlie.filters.extendedkalmanfilter method)": [[32, "navlie.filters.ExtendedKalmanFilter.predict"]], "process_model (navlie.filters.extendedkalmanfilter attribute)": [[32, "navlie.filters.ExtendedKalmanFilter.process_model"]], "reject_outliers (navlie.filters.extendedkalmanfilter attribute)": [[32, "navlie.filters.ExtendedKalmanFilter.reject_outliers"]], "gausshermitekalmanfilter (class in navlie.filters)": [[33, "navlie.filters.GaussHermiteKalmanFilter"]], "correct() (navlie.filters.gausshermitekalmanfilter method)": [[33, "navlie.filters.GaussHermiteKalmanFilter.correct"]], "iterate_mean (navlie.filters.gausshermitekalmanfilter attribute)": [[33, "navlie.filters.GaussHermiteKalmanFilter.iterate_mean"]], "method (navlie.filters.gausshermitekalmanfilter attribute)": [[33, "navlie.filters.GaussHermiteKalmanFilter.method"]], "predict() (navlie.filters.gausshermitekalmanfilter method)": [[33, "navlie.filters.GaussHermiteKalmanFilter.predict"]], "process_model (navlie.filters.gausshermitekalmanfilter attribute)": [[33, "navlie.filters.GaussHermiteKalmanFilter.process_model"]], "reject_outliers (navlie.filters.gausshermitekalmanfilter attribute)": [[33, "navlie.filters.GaussHermiteKalmanFilter.reject_outliers"]], "iteratedkalmanfilter (class in navlie.filters)": [[34, "navlie.filters.IteratedKalmanFilter"]], "correct() (navlie.filters.iteratedkalmanfilter method)": [[34, "navlie.filters.IteratedKalmanFilter.correct"]], "line_search (navlie.filters.iteratedkalmanfilter attribute)": [[34, "navlie.filters.IteratedKalmanFilter.line_search"]], "max_iters (navlie.filters.iteratedkalmanfilter attribute)": [[34, "navlie.filters.IteratedKalmanFilter.max_iters"]], "predict() (navlie.filters.iteratedkalmanfilter method)": [[34, "navlie.filters.IteratedKalmanFilter.predict"]], "process_model (navlie.filters.iteratedkalmanfilter attribute)": [[34, "navlie.filters.IteratedKalmanFilter.process_model"]], "reject_outliers (navlie.filters.iteratedkalmanfilter attribute)": [[34, "navlie.filters.IteratedKalmanFilter.reject_outliers"]], "step_tol (navlie.filters.iteratedkalmanfilter attribute)": [[34, "navlie.filters.IteratedKalmanFilter.step_tol"]], "sigmapointkalmanfilter (class in navlie.filters)": [[35, "navlie.filters.SigmaPointKalmanFilter"]], "correct() (navlie.filters.sigmapointkalmanfilter method)": [[35, "navlie.filters.SigmaPointKalmanFilter.correct"]], "iterate_mean (navlie.filters.sigmapointkalmanfilter attribute)": [[35, "navlie.filters.SigmaPointKalmanFilter.iterate_mean"]], "method (navlie.filters.sigmapointkalmanfilter attribute)": [[35, "navlie.filters.SigmaPointKalmanFilter.method"]], "predict() (navlie.filters.sigmapointkalmanfilter method)": [[35, "navlie.filters.SigmaPointKalmanFilter.predict"]], "process_model (navlie.filters.sigmapointkalmanfilter attribute)": [[35, "navlie.filters.SigmaPointKalmanFilter.process_model"]], "reject_outliers (navlie.filters.sigmapointkalmanfilter attribute)": [[35, "navlie.filters.SigmaPointKalmanFilter.reject_outliers"]], "unscentedkalmanfilter (class in navlie.filters)": [[36, "navlie.filters.UnscentedKalmanFilter"]], "correct() (navlie.filters.unscentedkalmanfilter method)": [[36, "navlie.filters.UnscentedKalmanFilter.correct"]], "iterate_mean (navlie.filters.unscentedkalmanfilter attribute)": [[36, "navlie.filters.UnscentedKalmanFilter.iterate_mean"]], "method (navlie.filters.unscentedkalmanfilter attribute)": [[36, "navlie.filters.UnscentedKalmanFilter.method"]], "predict() (navlie.filters.unscentedkalmanfilter method)": [[36, "navlie.filters.UnscentedKalmanFilter.predict"]], "process_model (navlie.filters.unscentedkalmanfilter attribute)": [[36, "navlie.filters.UnscentedKalmanFilter.process_model"]], "reject_outliers (navlie.filters.unscentedkalmanfilter attribute)": [[36, "navlie.filters.UnscentedKalmanFilter.reject_outliers"]], "check_outlier() (in module navlie.filters)": [[37, "navlie.filters.check_outlier"]], "generate_sigmapoints() (in module navlie.filters)": [[38, "navlie.filters.generate_sigmapoints"]], "mean_state() (in module navlie.filters)": [[39, "navlie.filters.mean_state"]], "run_filter() (in module navlie.filters)": [[40, "navlie.filters.run_filter"]], "navlie.imm": [[41, "module-navlie.imm"]], "immresult (class in navlie.imm)": [[42, "navlie.imm.IMMResult"]], "covariance (navlie.imm.immresult attribute)": [[42, "navlie.imm.IMMResult.covariance"]], "ees (navlie.imm.immresult attribute)": [[42, "navlie.imm.IMMResult.ees"]], "error (navlie.imm.immresult attribute)": [[42, "navlie.imm.IMMResult.error"]], "md (navlie.imm.immresult attribute)": [[42, "navlie.imm.IMMResult.md"]], "model_probabilities (navlie.imm.immresult attribute)": [[42, "navlie.imm.IMMResult.model_probabilities"]], "nees (navlie.imm.immresult attribute)": [[42, "navlie.imm.IMMResult.nees"]], "rmse (navlie.imm.immresult attribute)": [[42, "navlie.imm.IMMResult.rmse"]], "stamp (navlie.imm.immresult attribute)": [[42, "navlie.imm.IMMResult.stamp"]], "state (navlie.imm.immresult attribute)": [[42, "navlie.imm.IMMResult.state"]], "state_true (navlie.imm.immresult attribute)": [[42, "navlie.imm.IMMResult.state_true"]], "three_sigma (navlie.imm.immresult attribute)": [[42, "navlie.imm.IMMResult.three_sigma"]], "immresultlist (class in navlie.imm)": [[43, "navlie.imm.IMMResultList"]], "covariance (navlie.imm.immresultlist attribute)": [[43, "navlie.imm.IMMResultList.covariance"]], "dof (navlie.imm.immresultlist attribute)": [[43, "navlie.imm.IMMResultList.dof"]], "ees (navlie.imm.immresultlist attribute)": [[43, "navlie.imm.IMMResultList.ees"]], "error (navlie.imm.immresultlist attribute)": [[43, "navlie.imm.IMMResultList.error"]], "from_estimates() (navlie.imm.immresultlist static method)": [[43, "navlie.imm.IMMResultList.from_estimates"]], "md (navlie.imm.immresultlist attribute)": [[43, "navlie.imm.IMMResultList.md"]], "model_probabilities (navlie.imm.immresultlist attribute)": [[43, "navlie.imm.IMMResultList.model_probabilities"]], "nees (navlie.imm.immresultlist attribute)": [[43, "navlie.imm.IMMResultList.nees"]], "nees_lower_bound() (navlie.imm.immresultlist method)": [[43, "navlie.imm.IMMResultList.nees_lower_bound"]], "nees_upper_bound() (navlie.imm.immresultlist method)": [[43, "navlie.imm.IMMResultList.nees_upper_bound"]], "rmse (navlie.imm.immresultlist attribute)": [[43, "navlie.imm.IMMResultList.rmse"]], "stamp (navlie.imm.immresultlist attribute)": [[43, "navlie.imm.IMMResultList.stamp"]], "state (navlie.imm.immresultlist attribute)": [[43, "navlie.imm.IMMResultList.state"]], "state_true (navlie.imm.immresultlist attribute)": [[43, "navlie.imm.IMMResultList.state_true"]], "three_sigma (navlie.imm.immresultlist attribute)": [[43, "navlie.imm.IMMResultList.three_sigma"]], "value (navlie.imm.immresultlist attribute)": [[43, "navlie.imm.IMMResultList.value"]], "value_true (navlie.imm.immresultlist attribute)": [[43, "navlie.imm.IMMResultList.value_true"]], "immstate (class in navlie.imm)": [[44, "navlie.imm.IMMState"]], "copy() (navlie.imm.immstate method)": [[44, "navlie.imm.IMMState.copy"]], "model_probabilities (navlie.imm.immstate attribute)": [[44, "navlie.imm.IMMState.model_probabilities"]], "model_states (navlie.imm.immstate attribute)": [[44, "navlie.imm.IMMState.model_states"]], "stamp (navlie.imm.immstate property)": [[44, "navlie.imm.IMMState.stamp"]], "interactingmodelfilter (class in navlie.imm)": [[45, "navlie.imm.InteractingModelFilter"]], "correct() (navlie.imm.interactingmodelfilter method)": [[45, "navlie.imm.InteractingModelFilter.correct"]], "interaction() (navlie.imm.interactingmodelfilter method)": [[45, "navlie.imm.InteractingModelFilter.interaction"]], "predict() (navlie.imm.interactingmodelfilter method)": [[45, "navlie.imm.InteractingModelFilter.predict"]], "gaussian_mixing() (in module navlie.imm)": [[46, "navlie.imm.gaussian_mixing"]], "gaussian_mixing_vectorspace() (in module navlie.imm)": [[47, "navlie.imm.gaussian_mixing_vectorspace"]], "reparametrize_gaussians_about_x_par() (in module navlie.imm)": [[48, "navlie.imm.reparametrize_gaussians_about_X_par"]], "run_imm_filter() (in module navlie.imm)": [[49, "navlie.imm.run_imm_filter"]], "update_x() (in module navlie.imm)": [[50, "navlie.imm.update_X"]], "navlie.lib": [[51, "module-navlie.lib"]], "navlie.lib.camera": [[52, "module-navlie.lib.camera"]], "pinholecamera (class in navlie.lib.camera)": [[53, "navlie.lib.camera.PinholeCamera"]], "r_normalized_image_coords (navlie.lib.camera.pinholecamera property)": [[53, "navlie.lib.camera.PinholeCamera.R_normalized_image_coords"]], "copy() (navlie.lib.camera.pinholecamera method)": [[53, "navlie.lib.camera.PinholeCamera.copy"]], "evaluate() (navlie.lib.camera.pinholecamera method)": [[53, "navlie.lib.camera.PinholeCamera.evaluate"]], "get_cam_to_enu() (navlie.lib.camera.pinholecamera static method)": [[53, "navlie.lib.camera.PinholeCamera.get_cam_to_enu"]], "intrinsics (navlie.lib.camera.pinholecamera property)": [[53, "navlie.lib.camera.PinholeCamera.intrinsics"]], "is_landmark_in_front_of_cam() (navlie.lib.camera.pinholecamera method)": [[53, "navlie.lib.camera.PinholeCamera.is_landmark_in_front_of_cam"]], "is_measurement_valid() (navlie.lib.camera.pinholecamera method)": [[53, "navlie.lib.camera.PinholeCamera.is_measurement_valid"]], "project() (navlie.lib.camera.pinholecamera method)": [[53, "navlie.lib.camera.PinholeCamera.project"]], "resolve_landmark_in_cam_frame() (navlie.lib.camera.pinholecamera method)": [[53, "navlie.lib.camera.PinholeCamera.resolve_landmark_in_cam_frame"]], "sigma_normalized_image_coords (navlie.lib.camera.pinholecamera property)": [[53, "navlie.lib.camera.PinholeCamera.sigma_normalized_image_coords"]], "to_normalized_coords() (navlie.lib.camera.pinholecamera method)": [[53, "navlie.lib.camera.PinholeCamera.to_normalized_coords"]], "to_pixel_coors() (navlie.lib.camera.pinholecamera method)": [[53, "navlie.lib.camera.PinholeCamera.to_pixel_coors"]], "posematrix (class in navlie.lib.camera)": [[54, "navlie.lib.camera.PoseMatrix"]], "attitude (navlie.lib.camera.posematrix property)": [[54, "navlie.lib.camera.PoseMatrix.attitude"]], "copy() (navlie.lib.camera.posematrix method)": [[54, "navlie.lib.camera.PoseMatrix.copy"]], "position (navlie.lib.camera.posematrix property)": [[54, "navlie.lib.camera.PoseMatrix.position"]], "navlie.lib.datasets": [[55, "module-navlie.lib.datasets"]], "simulatedinertialgpsdataset (class in navlie.lib.datasets)": [[56, "navlie.lib.datasets.SimulatedInertialGPSDataset"]], "get_ground_truth() (navlie.lib.datasets.simulatedinertialgpsdataset method)": [[56, "navlie.lib.datasets.SimulatedInertialGPSDataset.get_ground_truth"]], "get_input_data() (navlie.lib.datasets.simulatedinertialgpsdataset method)": [[56, "navlie.lib.datasets.SimulatedInertialGPSDataset.get_input_data"]], "get_measurement_data() (navlie.lib.datasets.simulatedinertialgpsdataset method)": [[56, "navlie.lib.datasets.SimulatedInertialGPSDataset.get_measurement_data"]], "simulatedinertiallandmarkdataset (class in navlie.lib.datasets)": [[57, "navlie.lib.datasets.SimulatedInertialLandmarkDataset"]], "get_ground_truth() (navlie.lib.datasets.simulatedinertiallandmarkdataset method)": [[57, "navlie.lib.datasets.SimulatedInertialLandmarkDataset.get_ground_truth"]], "get_groundtruth_landmarks() (navlie.lib.datasets.simulatedinertiallandmarkdataset method)": [[57, "navlie.lib.datasets.SimulatedInertialLandmarkDataset.get_groundtruth_landmarks"]], "get_input_data() (navlie.lib.datasets.simulatedinertiallandmarkdataset method)": [[57, "navlie.lib.datasets.SimulatedInertialLandmarkDataset.get_input_data"]], "get_measurement_data() (navlie.lib.datasets.simulatedinertiallandmarkdataset method)": [[57, "navlie.lib.datasets.SimulatedInertialLandmarkDataset.get_measurement_data"]], "simulatedposerangingdataset (class in navlie.lib.datasets)": [[58, "navlie.lib.datasets.SimulatedPoseRangingDataset"]], "get_ground_truth() (navlie.lib.datasets.simulatedposerangingdataset method)": [[58, "navlie.lib.datasets.SimulatedPoseRangingDataset.get_ground_truth"]], "get_input_data() (navlie.lib.datasets.simulatedposerangingdataset method)": [[58, "navlie.lib.datasets.SimulatedPoseRangingDataset.get_input_data"]], "get_measurement_data() (navlie.lib.datasets.simulatedposerangingdataset method)": [[58, "navlie.lib.datasets.SimulatedPoseRangingDataset.get_measurement_data"]], "generate_landmark_positions() (in module navlie.lib.datasets)": [[59, "navlie.lib.datasets.generate_landmark_positions"]], "navlie.lib.imu": [[60, "module-navlie.lib.imu"]], "g_matrix() (in module navlie.lib.imu)": [[61, "navlie.lib.imu.G_matrix"]], "g_matrix_inv() (in module navlie.lib.imu)": [[62, "navlie.lib.imu.G_matrix_inv"]], "imu (class in navlie.lib.imu)": [[63, "navlie.lib.imu.IMU"]], "accel (navlie.lib.imu.imu attribute)": [[63, "navlie.lib.imu.IMU.accel"]], "bias_accel_walk (navlie.lib.imu.imu attribute)": [[63, "navlie.lib.imu.IMU.bias_accel_walk"]], "bias_gyro_walk (navlie.lib.imu.imu attribute)": [[63, "navlie.lib.imu.IMU.bias_gyro_walk"]], "copy() (navlie.lib.imu.imu method)": [[63, "navlie.lib.imu.IMU.copy"]], "covariance (navlie.lib.imu.imu attribute)": [[63, "navlie.lib.imu.IMU.covariance"]], "dof (navlie.lib.imu.imu attribute)": [[63, "navlie.lib.imu.IMU.dof"]], "gyro (navlie.lib.imu.imu attribute)": [[63, "navlie.lib.imu.IMU.gyro"]], "plus() (navlie.lib.imu.imu method)": [[63, "navlie.lib.imu.IMU.plus"]], "random() (navlie.lib.imu.imu static method)": [[63, "navlie.lib.imu.IMU.random"]], "stamp (navlie.lib.imu.imu attribute)": [[63, "navlie.lib.imu.IMU.stamp"]], "state_id (navlie.lib.imu.imu attribute)": [[63, "navlie.lib.imu.IMU.state_id"]], "imukinematics (class in navlie.lib.imu)": [[64, "navlie.lib.imu.IMUKinematics"]], "covariance() (navlie.lib.imu.imukinematics method)": [[64, "navlie.lib.imu.IMUKinematics.covariance"]], "evaluate() (navlie.lib.imu.imukinematics method)": [[64, "navlie.lib.imu.IMUKinematics.evaluate"]], "evaluate_with_jacobian() (navlie.lib.imu.imukinematics method)": [[64, "navlie.lib.imu.IMUKinematics.evaluate_with_jacobian"]], "input_covariance() (navlie.lib.imu.imukinematics method)": [[64, "navlie.lib.imu.IMUKinematics.input_covariance"]], "input_jacobian_fd() (navlie.lib.imu.imukinematics method)": [[64, "navlie.lib.imu.IMUKinematics.input_jacobian_fd"]], "jacobian() (navlie.lib.imu.imukinematics method)": [[64, "navlie.lib.imu.IMUKinematics.jacobian"]], "jacobian_fd() (navlie.lib.imu.imukinematics method)": [[64, "navlie.lib.imu.IMUKinematics.jacobian_fd"]], "sqrt_information() (navlie.lib.imu.imukinematics method)": [[64, "navlie.lib.imu.IMUKinematics.sqrt_information"]], "imustate (class in navlie.lib.imu)": [[65, "navlie.lib.imu.IMUState"]], "add_state() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.add_state"]], "attitude (navlie.lib.imu.imustate property)": [[65, "navlie.lib.imu.IMUState.attitude"]], "bias (navlie.lib.imu.imustate property)": [[65, "navlie.lib.imu.IMUState.bias"]], "bias_accel (navlie.lib.imu.imustate property)": [[65, "navlie.lib.imu.IMUState.bias_accel"]], "bias_gyro (navlie.lib.imu.imustate property)": [[65, "navlie.lib.imu.IMUState.bias_gyro"]], "copy() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.copy"]], "direction (navlie.lib.imu.imustate property)": [[65, "navlie.lib.imu.IMUState.direction"]], "dof (navlie.lib.imu.imustate attribute)": [[65, "navlie.lib.imu.IMUState.dof"]], "get_dof_by_id() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.get_dof_by_id"]], "get_index_by_id() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.get_index_by_id"]], "get_matrix_block_by_ids() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.get_matrix_block_by_ids"]], "get_slice_by_id() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.get_slice_by_id"]], "get_slices() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.get_slices"]], "get_stamp_by_id() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.get_stamp_by_id"]], "get_state_by_id() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.get_state_by_id"]], "get_value_by_id() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.get_value_by_id"]], "jacobian_from_blocks() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.jacobian_from_blocks"]], "minus() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.minus"]], "minus_jacobian() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.minus_jacobian"]], "minus_jacobian_fd() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.minus_jacobian_fd"]], "nav_state (navlie.lib.imu.imustate property)": [[65, "navlie.lib.imu.IMUState.nav_state"]], "plus() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.plus"]], "plus_by_id() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.plus_by_id"]], "plus_jacobian() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.plus_jacobian"]], "plus_jacobian_fd() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.plus_jacobian_fd"]], "pose (navlie.lib.imu.imustate property)": [[65, "navlie.lib.imu.IMUState.pose"]], "position (navlie.lib.imu.imustate property)": [[65, "navlie.lib.imu.IMUState.position"]], "remove_state_by_id() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.remove_state_by_id"]], "set_matrix_block_by_ids() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.set_matrix_block_by_ids"]], "set_stamp_by_id() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.set_stamp_by_id"]], "set_stamp_for_all() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.set_stamp_for_all"]], "set_state_by_id() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.set_state_by_id"]], "set_value_by_id() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.set_value_by_id"]], "stamp (navlie.lib.imu.imustate attribute)": [[65, "navlie.lib.imu.IMUState.stamp"]], "state_id (navlie.lib.imu.imustate attribute)": [[65, "navlie.lib.imu.IMUState.state_id"]], "to_list() (navlie.lib.imu.imustate method)": [[65, "navlie.lib.imu.IMUState.to_list"]], "value (navlie.lib.imu.imustate attribute)": [[65, "navlie.lib.imu.IMUState.value"]], "velocity (navlie.lib.imu.imustate property)": [[65, "navlie.lib.imu.IMUState.velocity"]], "l_matrix() (in module navlie.lib.imu)": [[66, "navlie.lib.imu.L_matrix"]], "m_matrix() (in module navlie.lib.imu)": [[67, "navlie.lib.imu.M_matrix"]], "n_matrix() (in module navlie.lib.imu)": [[68, "navlie.lib.imu.N_matrix"]], "u_matrix() (in module navlie.lib.imu)": [[69, "navlie.lib.imu.U_matrix"]], "u_matrix_inv() (in module navlie.lib.imu)": [[70, "navlie.lib.imu.U_matrix_inv"]], "u_tilde_matrix() (in module navlie.lib.imu)": [[71, "navlie.lib.imu.U_tilde_matrix"]], "adjoint_ie3() (in module navlie.lib.imu)": [[72, "navlie.lib.imu.adjoint_IE3"]], "delta_matrix() (in module navlie.lib.imu)": [[73, "navlie.lib.imu.delta_matrix"]], "get_unbiased_imu() (in module navlie.lib.imu)": [[74, "navlie.lib.imu.get_unbiased_imu"]], "inverse_ie3() (in module navlie.lib.imu)": [[75, "navlie.lib.imu.inverse_IE3"]], "navlie.lib.models": [[76, "module-navlie.lib.models"]], "absoluteposition (class in navlie.lib.models)": [[77, "navlie.lib.models.AbsolutePosition"]], "covariance() (navlie.lib.models.absoluteposition method)": [[77, "navlie.lib.models.AbsolutePosition.covariance"]], "evaluate() (navlie.lib.models.absoluteposition method)": [[77, "navlie.lib.models.AbsolutePosition.evaluate"]], "evaluate_with_jacobian() (navlie.lib.models.absoluteposition method)": [[77, "navlie.lib.models.AbsolutePosition.evaluate_with_jacobian"]], "jacobian() (navlie.lib.models.absoluteposition method)": [[77, "navlie.lib.models.AbsolutePosition.jacobian"]], "jacobian_fd() (navlie.lib.models.absoluteposition method)": [[77, "navlie.lib.models.AbsolutePosition.jacobian_fd"]], "sqrt_information() (navlie.lib.models.absoluteposition method)": [[77, "navlie.lib.models.AbsolutePosition.sqrt_information"]], "absolutevelocity (class in navlie.lib.models)": [[78, "navlie.lib.models.AbsoluteVelocity"]], "covariance() (navlie.lib.models.absolutevelocity method)": [[78, "navlie.lib.models.AbsoluteVelocity.covariance"]], "evaluate() (navlie.lib.models.absolutevelocity method)": [[78, "navlie.lib.models.AbsoluteVelocity.evaluate"]], "evaluate_with_jacobian() (navlie.lib.models.absolutevelocity method)": [[78, "navlie.lib.models.AbsoluteVelocity.evaluate_with_jacobian"]], "jacobian() (navlie.lib.models.absolutevelocity method)": [[78, "navlie.lib.models.AbsoluteVelocity.jacobian"]], "jacobian_fd() (navlie.lib.models.absolutevelocity method)": [[78, "navlie.lib.models.AbsoluteVelocity.jacobian_fd"]], "sqrt_information() (navlie.lib.models.absolutevelocity method)": [[78, "navlie.lib.models.AbsoluteVelocity.sqrt_information"]], "altitude (class in navlie.lib.models)": [[79, "navlie.lib.models.Altitude"]], "covariance() (navlie.lib.models.altitude method)": [[79, "navlie.lib.models.Altitude.covariance"]], "evaluate() (navlie.lib.models.altitude method)": [[79, "navlie.lib.models.Altitude.evaluate"]], "evaluate_with_jacobian() (navlie.lib.models.altitude method)": [[79, "navlie.lib.models.Altitude.evaluate_with_jacobian"]], "jacobian() (navlie.lib.models.altitude method)": [[79, "navlie.lib.models.Altitude.jacobian"]], "jacobian_fd() (navlie.lib.models.altitude method)": [[79, "navlie.lib.models.Altitude.jacobian_fd"]], "sqrt_information() (navlie.lib.models.altitude method)": [[79, "navlie.lib.models.Altitude.sqrt_information"]], "bodyframevelocity (class in navlie.lib.models)": [[80, "navlie.lib.models.BodyFrameVelocity"]], "covariance() (navlie.lib.models.bodyframevelocity method)": [[80, "navlie.lib.models.BodyFrameVelocity.covariance"]], "evaluate() (navlie.lib.models.bodyframevelocity method)": [[80, "navlie.lib.models.BodyFrameVelocity.evaluate"]], "evaluate_with_jacobian() (navlie.lib.models.bodyframevelocity method)": [[80, "navlie.lib.models.BodyFrameVelocity.evaluate_with_jacobian"]], "input_covariance() (navlie.lib.models.bodyframevelocity method)": [[80, "navlie.lib.models.BodyFrameVelocity.input_covariance"]], "input_jacobian_fd() (navlie.lib.models.bodyframevelocity method)": [[80, "navlie.lib.models.BodyFrameVelocity.input_jacobian_fd"]], "jacobian() (navlie.lib.models.bodyframevelocity method)": [[80, "navlie.lib.models.BodyFrameVelocity.jacobian"]], "jacobian_fd() (navlie.lib.models.bodyframevelocity method)": [[80, "navlie.lib.models.BodyFrameVelocity.jacobian_fd"]], "sqrt_information() (navlie.lib.models.bodyframevelocity method)": [[80, "navlie.lib.models.BodyFrameVelocity.sqrt_information"]], "cameraprojection (class in navlie.lib.models)": [[81, "navlie.lib.models.CameraProjection"]], "covariance() (navlie.lib.models.cameraprojection method)": [[81, "navlie.lib.models.CameraProjection.covariance"]], "evaluate() (navlie.lib.models.cameraprojection method)": [[81, "navlie.lib.models.CameraProjection.evaluate"]], "evaluate_with_jacobian() (navlie.lib.models.cameraprojection method)": [[81, "navlie.lib.models.CameraProjection.evaluate_with_jacobian"]], "jacobian() (navlie.lib.models.cameraprojection method)": [[81, "navlie.lib.models.CameraProjection.jacobian"]], "jacobian_fd() (navlie.lib.models.cameraprojection method)": [[81, "navlie.lib.models.CameraProjection.jacobian_fd"]], "sqrt_information() (navlie.lib.models.cameraprojection method)": [[81, "navlie.lib.models.CameraProjection.sqrt_information"]], "doubleintegrator (class in navlie.lib.models)": [[82, "navlie.lib.models.DoubleIntegrator"]], "covariance() (navlie.lib.models.doubleintegrator method)": [[82, "navlie.lib.models.DoubleIntegrator.covariance"]], "evaluate() (navlie.lib.models.doubleintegrator method)": [[82, "navlie.lib.models.DoubleIntegrator.evaluate"]], "evaluate_with_jacobian() (navlie.lib.models.doubleintegrator method)": [[82, "navlie.lib.models.DoubleIntegrator.evaluate_with_jacobian"]], "input_covariance() (navlie.lib.models.doubleintegrator method)": [[82, "navlie.lib.models.DoubleIntegrator.input_covariance"]], "input_jacobian() (navlie.lib.models.doubleintegrator method)": [[82, "navlie.lib.models.DoubleIntegrator.input_jacobian"]], "input_jacobian_fd() (navlie.lib.models.doubleintegrator method)": [[82, "navlie.lib.models.DoubleIntegrator.input_jacobian_fd"]], "jacobian() (navlie.lib.models.doubleintegrator method)": [[82, "navlie.lib.models.DoubleIntegrator.jacobian"]], "jacobian_fd() (navlie.lib.models.doubleintegrator method)": [[82, "navlie.lib.models.DoubleIntegrator.jacobian_fd"]], "sqrt_information() (navlie.lib.models.doubleintegrator method)": [[82, "navlie.lib.models.DoubleIntegrator.sqrt_information"]], "doubleintegratorwithbias (class in navlie.lib.models)": [[83, "navlie.lib.models.DoubleIntegratorWithBias"]], "covariance() (navlie.lib.models.doubleintegratorwithbias method)": [[83, "navlie.lib.models.DoubleIntegratorWithBias.covariance"]], "evaluate() (navlie.lib.models.doubleintegratorwithbias method)": [[83, "navlie.lib.models.DoubleIntegratorWithBias.evaluate"]], "evaluate_with_jacobian() (navlie.lib.models.doubleintegratorwithbias method)": [[83, "navlie.lib.models.DoubleIntegratorWithBias.evaluate_with_jacobian"]], "input_covariance() (navlie.lib.models.doubleintegratorwithbias method)": [[83, "navlie.lib.models.DoubleIntegratorWithBias.input_covariance"]], "input_jacobian() (navlie.lib.models.doubleintegratorwithbias method)": [[83, "navlie.lib.models.DoubleIntegratorWithBias.input_jacobian"]], "input_jacobian_fd() (navlie.lib.models.doubleintegratorwithbias method)": [[83, "navlie.lib.models.DoubleIntegratorWithBias.input_jacobian_fd"]], "jacobian() (navlie.lib.models.doubleintegratorwithbias method)": [[83, "navlie.lib.models.DoubleIntegratorWithBias.jacobian"]], "jacobian_fd() (navlie.lib.models.doubleintegratorwithbias method)": [[83, "navlie.lib.models.DoubleIntegratorWithBias.jacobian_fd"]], "sqrt_information() (navlie.lib.models.doubleintegratorwithbias method)": [[83, "navlie.lib.models.DoubleIntegratorWithBias.sqrt_information"]], "globalposition (class in navlie.lib.models)": [[84, "navlie.lib.models.GlobalPosition"]], "covariance() (navlie.lib.models.globalposition method)": [[84, "navlie.lib.models.GlobalPosition.covariance"]], "evaluate() (navlie.lib.models.globalposition method)": [[84, "navlie.lib.models.GlobalPosition.evaluate"]], "evaluate_with_jacobian() (navlie.lib.models.globalposition method)": [[84, "navlie.lib.models.GlobalPosition.evaluate_with_jacobian"]], "jacobian() (navlie.lib.models.globalposition method)": [[84, "navlie.lib.models.GlobalPosition.jacobian"]], "jacobian_fd() (navlie.lib.models.globalposition method)": [[84, "navlie.lib.models.GlobalPosition.jacobian_fd"]], "sqrt_information() (navlie.lib.models.globalposition method)": [[84, "navlie.lib.models.GlobalPosition.sqrt_information"]], "gravitometer (class in navlie.lib.models)": [[85, "navlie.lib.models.Gravitometer"]], "covariance() (navlie.lib.models.gravitometer method)": [[85, "navlie.lib.models.Gravitometer.covariance"]], "evaluate() (navlie.lib.models.gravitometer method)": [[85, "navlie.lib.models.Gravitometer.evaluate"]], "evaluate_with_jacobian() (navlie.lib.models.gravitometer method)": [[85, "navlie.lib.models.Gravitometer.evaluate_with_jacobian"]], "jacobian() (navlie.lib.models.gravitometer method)": [[85, "navlie.lib.models.Gravitometer.jacobian"]], "jacobian_fd() (navlie.lib.models.gravitometer method)": [[85, "navlie.lib.models.Gravitometer.jacobian_fd"]], "sqrt_information() (navlie.lib.models.gravitometer method)": [[85, "navlie.lib.models.Gravitometer.sqrt_information"]], "invariantmeasurement (class in navlie.lib.models)": [[86, "navlie.lib.models.InvariantMeasurement"]], "minus() (navlie.lib.models.invariantmeasurement method)": [[86, "navlie.lib.models.InvariantMeasurement.minus"]], "model (navlie.lib.models.invariantmeasurement attribute)": [[86, "navlie.lib.models.InvariantMeasurement.model"]], "stamp (navlie.lib.models.invariantmeasurement attribute)": [[86, "navlie.lib.models.InvariantMeasurement.stamp"]], "state_id (navlie.lib.models.invariantmeasurement attribute)": [[86, "navlie.lib.models.InvariantMeasurement.state_id"]], "value (navlie.lib.models.invariantmeasurement attribute)": [[86, "navlie.lib.models.InvariantMeasurement.value"]], "invariantpointrelativeposition (class in navlie.lib.models)": [[87, "navlie.lib.models.InvariantPointRelativePosition"]], "covariance() (navlie.lib.models.invariantpointrelativeposition method)": [[87, "navlie.lib.models.InvariantPointRelativePosition.covariance"]], "evaluate() (navlie.lib.models.invariantpointrelativeposition method)": [[87, "navlie.lib.models.InvariantPointRelativePosition.evaluate"]], "evaluate_with_jacobian() (navlie.lib.models.invariantpointrelativeposition method)": [[87, "navlie.lib.models.InvariantPointRelativePosition.evaluate_with_jacobian"]], "jacobian() (navlie.lib.models.invariantpointrelativeposition method)": [[87, "navlie.lib.models.InvariantPointRelativePosition.jacobian"]], "jacobian_fd() (navlie.lib.models.invariantpointrelativeposition method)": [[87, "navlie.lib.models.InvariantPointRelativePosition.jacobian_fd"]], "sqrt_information() (navlie.lib.models.invariantpointrelativeposition method)": [[87, "navlie.lib.models.InvariantPointRelativePosition.sqrt_information"]], "linearmeasurement (class in navlie.lib.models)": [[88, "navlie.lib.models.LinearMeasurement"]], "covariance() (navlie.lib.models.linearmeasurement method)": [[88, "navlie.lib.models.LinearMeasurement.covariance"]], "evaluate() (navlie.lib.models.linearmeasurement method)": [[88, "navlie.lib.models.LinearMeasurement.evaluate"]], "evaluate_with_jacobian() (navlie.lib.models.linearmeasurement method)": [[88, "navlie.lib.models.LinearMeasurement.evaluate_with_jacobian"]], "jacobian() (navlie.lib.models.linearmeasurement method)": [[88, "navlie.lib.models.LinearMeasurement.jacobian"]], "jacobian_fd() (navlie.lib.models.linearmeasurement method)": [[88, "navlie.lib.models.LinearMeasurement.jacobian_fd"]], "sqrt_information() (navlie.lib.models.linearmeasurement method)": [[88, "navlie.lib.models.LinearMeasurement.sqrt_information"]], "magnetometer (class in navlie.lib.models)": [[89, "navlie.lib.models.Magnetometer"]], "covariance() (navlie.lib.models.magnetometer method)": [[89, "navlie.lib.models.Magnetometer.covariance"]], "evaluate() (navlie.lib.models.magnetometer method)": [[89, "navlie.lib.models.Magnetometer.evaluate"]], "evaluate_with_jacobian() (navlie.lib.models.magnetometer method)": [[89, "navlie.lib.models.Magnetometer.evaluate_with_jacobian"]], "jacobian() (navlie.lib.models.magnetometer method)": [[89, "navlie.lib.models.Magnetometer.jacobian"]], "jacobian_fd() (navlie.lib.models.magnetometer method)": [[89, "navlie.lib.models.Magnetometer.jacobian_fd"]], "sqrt_information() (navlie.lib.models.magnetometer method)": [[89, "navlie.lib.models.Magnetometer.sqrt_information"]], "onedimensionalpositionvelocityrange (class in navlie.lib.models)": [[90, "navlie.lib.models.OneDimensionalPositionVelocityRange"]], "covariance() (navlie.lib.models.onedimensionalpositionvelocityrange method)": [[90, "navlie.lib.models.OneDimensionalPositionVelocityRange.covariance"]], "evaluate() (navlie.lib.models.onedimensionalpositionvelocityrange method)": [[90, "navlie.lib.models.OneDimensionalPositionVelocityRange.evaluate"]], "evaluate_with_jacobian() (navlie.lib.models.onedimensionalpositionvelocityrange method)": [[90, "navlie.lib.models.OneDimensionalPositionVelocityRange.evaluate_with_jacobian"]], "jacobian() (navlie.lib.models.onedimensionalpositionvelocityrange method)": [[90, "navlie.lib.models.OneDimensionalPositionVelocityRange.jacobian"]], "jacobian_fd() (navlie.lib.models.onedimensionalpositionvelocityrange method)": [[90, "navlie.lib.models.OneDimensionalPositionVelocityRange.jacobian_fd"]], "sqrt_information() (navlie.lib.models.onedimensionalpositionvelocityrange method)": [[90, "navlie.lib.models.OneDimensionalPositionVelocityRange.sqrt_information"]], "pointrelativeposition (class in navlie.lib.models)": [[91, "navlie.lib.models.PointRelativePosition"]], "covariance() (navlie.lib.models.pointrelativeposition method)": [[91, "navlie.lib.models.PointRelativePosition.covariance"]], "evaluate() (navlie.lib.models.pointrelativeposition method)": [[91, "navlie.lib.models.PointRelativePosition.evaluate"]], "evaluate_with_jacobian() (navlie.lib.models.pointrelativeposition method)": [[91, "navlie.lib.models.PointRelativePosition.evaluate_with_jacobian"]], "jacobian() (navlie.lib.models.pointrelativeposition method)": [[91, "navlie.lib.models.PointRelativePosition.jacobian"]], "jacobian_fd() (navlie.lib.models.pointrelativeposition method)": [[91, "navlie.lib.models.PointRelativePosition.jacobian_fd"]], "sqrt_information() (navlie.lib.models.pointrelativeposition method)": [[91, "navlie.lib.models.PointRelativePosition.sqrt_information"]], "pointrelativepositionslam (class in navlie.lib.models)": [[92, "navlie.lib.models.PointRelativePositionSLAM"]], "covariance() (navlie.lib.models.pointrelativepositionslam method)": [[92, "navlie.lib.models.PointRelativePositionSLAM.covariance"]], "evaluate() (navlie.lib.models.pointrelativepositionslam method)": [[92, "navlie.lib.models.PointRelativePositionSLAM.evaluate"]], "evaluate_with_jacobian() (navlie.lib.models.pointrelativepositionslam method)": [[92, "navlie.lib.models.PointRelativePositionSLAM.evaluate_with_jacobian"]], "jacobian() (navlie.lib.models.pointrelativepositionslam method)": [[92, "navlie.lib.models.PointRelativePositionSLAM.jacobian"]], "jacobian_fd() (navlie.lib.models.pointrelativepositionslam method)": [[92, "navlie.lib.models.PointRelativePositionSLAM.jacobian_fd"]], "sqrt_information() (navlie.lib.models.pointrelativepositionslam method)": [[92, "navlie.lib.models.PointRelativePositionSLAM.sqrt_information"]], "rangepointtoanchor (class in navlie.lib.models)": [[93, "navlie.lib.models.RangePointToAnchor"]], "covariance() (navlie.lib.models.rangepointtoanchor method)": [[93, "navlie.lib.models.RangePointToAnchor.covariance"]], "evaluate() (navlie.lib.models.rangepointtoanchor method)": [[93, "navlie.lib.models.RangePointToAnchor.evaluate"]], "evaluate_with_jacobian() (navlie.lib.models.rangepointtoanchor method)": [[93, "navlie.lib.models.RangePointToAnchor.evaluate_with_jacobian"]], "jacobian() (navlie.lib.models.rangepointtoanchor method)": [[93, "navlie.lib.models.RangePointToAnchor.jacobian"]], "jacobian_fd() (navlie.lib.models.rangepointtoanchor method)": [[93, "navlie.lib.models.RangePointToAnchor.jacobian_fd"]], "sqrt_information() (navlie.lib.models.rangepointtoanchor method)": [[93, "navlie.lib.models.RangePointToAnchor.sqrt_information"]], "rangeposetoanchor (class in navlie.lib.models)": [[94, "navlie.lib.models.RangePoseToAnchor"]], "covariance() (navlie.lib.models.rangeposetoanchor method)": [[94, "navlie.lib.models.RangePoseToAnchor.covariance"]], "evaluate() (navlie.lib.models.rangeposetoanchor method)": [[94, "navlie.lib.models.RangePoseToAnchor.evaluate"]], "evaluate_with_jacobian() (navlie.lib.models.rangeposetoanchor method)": [[94, "navlie.lib.models.RangePoseToAnchor.evaluate_with_jacobian"]], "jacobian() (navlie.lib.models.rangeposetoanchor method)": [[94, "navlie.lib.models.RangePoseToAnchor.jacobian"]], "jacobian_fd() (navlie.lib.models.rangeposetoanchor method)": [[94, "navlie.lib.models.RangePoseToAnchor.jacobian_fd"]], "sqrt_information() (navlie.lib.models.rangeposetoanchor method)": [[94, "navlie.lib.models.RangePoseToAnchor.sqrt_information"]], "rangeposetopose (class in navlie.lib.models)": [[95, "navlie.lib.models.RangePoseToPose"]], "covariance() (navlie.lib.models.rangeposetopose method)": [[95, "navlie.lib.models.RangePoseToPose.covariance"]], "evaluate() (navlie.lib.models.rangeposetopose method)": [[95, "navlie.lib.models.RangePoseToPose.evaluate"]], "evaluate_with_jacobian() (navlie.lib.models.rangeposetopose method)": [[95, "navlie.lib.models.RangePoseToPose.evaluate_with_jacobian"]], "jacobian() (navlie.lib.models.rangeposetopose method)": [[95, "navlie.lib.models.RangePoseToPose.jacobian"]], "jacobian_fd() (navlie.lib.models.rangeposetopose method)": [[95, "navlie.lib.models.RangePoseToPose.jacobian_fd"]], "sqrt_information() (navlie.lib.models.rangeposetopose method)": [[95, "navlie.lib.models.RangePoseToPose.sqrt_information"]], "rangerelativepose (class in navlie.lib.models)": [[96, "navlie.lib.models.RangeRelativePose"]], "covariance() (navlie.lib.models.rangerelativepose method)": [[96, "navlie.lib.models.RangeRelativePose.covariance"]], "evaluate() (navlie.lib.models.rangerelativepose method)": [[96, "navlie.lib.models.RangeRelativePose.evaluate"]], "evaluate_with_jacobian() (navlie.lib.models.rangerelativepose method)": [[96, "navlie.lib.models.RangeRelativePose.evaluate_with_jacobian"]], "jacobian() (navlie.lib.models.rangerelativepose method)": [[96, "navlie.lib.models.RangeRelativePose.jacobian"]], "jacobian_fd() (navlie.lib.models.rangerelativepose method)": [[96, "navlie.lib.models.RangeRelativePose.jacobian_fd"]], "sqrt_information() (navlie.lib.models.rangerelativepose method)": [[96, "navlie.lib.models.RangeRelativePose.sqrt_information"]], "relativebodyframevelocity (class in navlie.lib.models)": [[97, "navlie.lib.models.RelativeBodyFrameVelocity"]], "covariance() (navlie.lib.models.relativebodyframevelocity method)": [[97, "navlie.lib.models.RelativeBodyFrameVelocity.covariance"]], "evaluate() (navlie.lib.models.relativebodyframevelocity method)": [[97, "navlie.lib.models.RelativeBodyFrameVelocity.evaluate"]], "evaluate_with_jacobian() (navlie.lib.models.relativebodyframevelocity method)": [[97, "navlie.lib.models.RelativeBodyFrameVelocity.evaluate_with_jacobian"]], "input_covariance() (navlie.lib.models.relativebodyframevelocity method)": [[97, "navlie.lib.models.RelativeBodyFrameVelocity.input_covariance"]], "input_jacobian_fd() (navlie.lib.models.relativebodyframevelocity method)": [[97, "navlie.lib.models.RelativeBodyFrameVelocity.input_jacobian_fd"]], "jacobian() (navlie.lib.models.relativebodyframevelocity method)": [[97, "navlie.lib.models.RelativeBodyFrameVelocity.jacobian"]], "jacobian_fd() (navlie.lib.models.relativebodyframevelocity method)": [[97, "navlie.lib.models.RelativeBodyFrameVelocity.jacobian_fd"]], "sqrt_information() (navlie.lib.models.relativebodyframevelocity method)": [[97, "navlie.lib.models.RelativeBodyFrameVelocity.sqrt_information"]], "singleintegrator (class in navlie.lib.models)": [[98, "navlie.lib.models.SingleIntegrator"]], "covariance() (navlie.lib.models.singleintegrator method)": [[98, "navlie.lib.models.SingleIntegrator.covariance"]], "evaluate() (navlie.lib.models.singleintegrator method)": [[98, "navlie.lib.models.SingleIntegrator.evaluate"]], "evaluate_with_jacobian() (navlie.lib.models.singleintegrator method)": [[98, "navlie.lib.models.SingleIntegrator.evaluate_with_jacobian"]], "input_covariance() (navlie.lib.models.singleintegrator method)": [[98, "navlie.lib.models.SingleIntegrator.input_covariance"]], "input_jacobian_fd() (navlie.lib.models.singleintegrator method)": [[98, "navlie.lib.models.SingleIntegrator.input_jacobian_fd"]], "jacobian() (navlie.lib.models.singleintegrator method)": [[98, "navlie.lib.models.SingleIntegrator.jacobian"]], "jacobian_fd() (navlie.lib.models.singleintegrator method)": [[98, "navlie.lib.models.SingleIntegrator.jacobian_fd"]], "sqrt_information() (navlie.lib.models.singleintegrator method)": [[98, "navlie.lib.models.SingleIntegrator.sqrt_information"]], "navlie.lib.preintegration": [[99, "module-navlie.lib.preintegration"]], "angularvelocityincrement (class in navlie.lib.preintegration)": [[100, "navlie.lib.preintegration.AngularVelocityIncrement"]], "copy() (navlie.lib.preintegration.angularvelocityincrement method)": [[100, "navlie.lib.preintegration.AngularVelocityIncrement.copy"]], "covariance (navlie.lib.preintegration.angularvelocityincrement attribute)": [[100, "navlie.lib.preintegration.AngularVelocityIncrement.covariance"]], "dof (navlie.lib.preintegration.angularvelocityincrement attribute)": [[100, "navlie.lib.preintegration.AngularVelocityIncrement.dof"]], "increment() (navlie.lib.preintegration.angularvelocityincrement method)": [[100, "navlie.lib.preintegration.AngularVelocityIncrement.increment"]], "new() (navlie.lib.preintegration.angularvelocityincrement method)": [[100, "navlie.lib.preintegration.AngularVelocityIncrement.new"]], "plus() (navlie.lib.preintegration.angularvelocityincrement method)": [[100, "navlie.lib.preintegration.AngularVelocityIncrement.plus"]], "stamp (navlie.lib.preintegration.angularvelocityincrement property)": [[100, "navlie.lib.preintegration.AngularVelocityIncrement.stamp"]], "stamps (navlie.lib.preintegration.angularvelocityincrement attribute)": [[100, "navlie.lib.preintegration.AngularVelocityIncrement.stamps"]], "state_id (navlie.lib.preintegration.angularvelocityincrement attribute)": [[100, "navlie.lib.preintegration.AngularVelocityIncrement.state_id"]], "symmetrize() (navlie.lib.preintegration.angularvelocityincrement method)": [[100, "navlie.lib.preintegration.AngularVelocityIncrement.symmetrize"]], "update_bias() (navlie.lib.preintegration.angularvelocityincrement method)": [[100, "navlie.lib.preintegration.AngularVelocityIncrement.update_bias"]], "value (navlie.lib.preintegration.angularvelocityincrement property)": [[100, "navlie.lib.preintegration.AngularVelocityIncrement.value"]], "bodyvelocityincrement (class in navlie.lib.preintegration)": [[101, "navlie.lib.preintegration.BodyVelocityIncrement"]], "copy() (navlie.lib.preintegration.bodyvelocityincrement method)": [[101, "navlie.lib.preintegration.BodyVelocityIncrement.copy"]], "covariance (navlie.lib.preintegration.bodyvelocityincrement attribute)": [[101, "navlie.lib.preintegration.BodyVelocityIncrement.covariance"]], "dof (navlie.lib.preintegration.bodyvelocityincrement attribute)": [[101, "navlie.lib.preintegration.BodyVelocityIncrement.dof"]], "increment() (navlie.lib.preintegration.bodyvelocityincrement method)": [[101, "navlie.lib.preintegration.BodyVelocityIncrement.increment"]], "new() (navlie.lib.preintegration.bodyvelocityincrement method)": [[101, "navlie.lib.preintegration.BodyVelocityIncrement.new"]], "plus() (navlie.lib.preintegration.bodyvelocityincrement method)": [[101, "navlie.lib.preintegration.BodyVelocityIncrement.plus"]], "stamp (navlie.lib.preintegration.bodyvelocityincrement property)": [[101, "navlie.lib.preintegration.BodyVelocityIncrement.stamp"]], "stamps (navlie.lib.preintegration.bodyvelocityincrement attribute)": [[101, "navlie.lib.preintegration.BodyVelocityIncrement.stamps"]], "state_id (navlie.lib.preintegration.bodyvelocityincrement attribute)": [[101, "navlie.lib.preintegration.BodyVelocityIncrement.state_id"]], "symmetrize() (navlie.lib.preintegration.bodyvelocityincrement method)": [[101, "navlie.lib.preintegration.BodyVelocityIncrement.symmetrize"]], "update_bias() (navlie.lib.preintegration.bodyvelocityincrement method)": [[101, "navlie.lib.preintegration.BodyVelocityIncrement.update_bias"]], "value (navlie.lib.preintegration.bodyvelocityincrement property)": [[101, "navlie.lib.preintegration.BodyVelocityIncrement.value"]], "imuincrement (class in navlie.lib.preintegration)": [[102, "navlie.lib.preintegration.IMUIncrement"]], "accel_bias (navlie.lib.preintegration.imuincrement property)": [[102, "navlie.lib.preintegration.IMUIncrement.accel_bias"]], "bias_jacobian (navlie.lib.preintegration.imuincrement attribute)": [[102, "navlie.lib.preintegration.IMUIncrement.bias_jacobian"]], "copy() (navlie.lib.preintegration.imuincrement method)": [[102, "navlie.lib.preintegration.IMUIncrement.copy"]], "covariance (navlie.lib.preintegration.imuincrement attribute)": [[102, "navlie.lib.preintegration.IMUIncrement.covariance"]], "dof (navlie.lib.preintegration.imuincrement attribute)": [[102, "navlie.lib.preintegration.IMUIncrement.dof"]], "gravity (navlie.lib.preintegration.imuincrement attribute)": [[102, "navlie.lib.preintegration.IMUIncrement.gravity"]], "gyro_bias (navlie.lib.preintegration.imuincrement property)": [[102, "navlie.lib.preintegration.IMUIncrement.gyro_bias"]], "increment() (navlie.lib.preintegration.imuincrement method)": [[102, "navlie.lib.preintegration.IMUIncrement.increment"]], "input_covariance (navlie.lib.preintegration.imuincrement attribute)": [[102, "navlie.lib.preintegration.IMUIncrement.input_covariance"]], "new() (navlie.lib.preintegration.imuincrement method)": [[102, "navlie.lib.preintegration.IMUIncrement.new"]], "new_bias (navlie.lib.preintegration.imuincrement attribute)": [[102, "navlie.lib.preintegration.IMUIncrement.new_bias"]], "original_bias (navlie.lib.preintegration.imuincrement attribute)": [[102, "navlie.lib.preintegration.IMUIncrement.original_bias"]], "original_value (navlie.lib.preintegration.imuincrement attribute)": [[102, "navlie.lib.preintegration.IMUIncrement.original_value"]], "plus() (navlie.lib.preintegration.imuincrement method)": [[102, "navlie.lib.preintegration.IMUIncrement.plus"]], "stamp (navlie.lib.preintegration.imuincrement property)": [[102, "navlie.lib.preintegration.IMUIncrement.stamp"]], "stamps (navlie.lib.preintegration.imuincrement attribute)": [[102, "navlie.lib.preintegration.IMUIncrement.stamps"]], "state_id (navlie.lib.preintegration.imuincrement attribute)": [[102, "navlie.lib.preintegration.IMUIncrement.state_id"]], "symmetrize() (navlie.lib.preintegration.imuincrement method)": [[102, "navlie.lib.preintegration.IMUIncrement.symmetrize"]], "update_bias() (navlie.lib.preintegration.imuincrement method)": [[102, "navlie.lib.preintegration.IMUIncrement.update_bias"]], "value (navlie.lib.preintegration.imuincrement property)": [[102, "navlie.lib.preintegration.IMUIncrement.value"]], "linearincrement (class in navlie.lib.preintegration)": [[103, "navlie.lib.preintegration.LinearIncrement"]], "bias_jacobian (navlie.lib.preintegration.linearincrement attribute)": [[103, "navlie.lib.preintegration.LinearIncrement.bias_jacobian"]], "copy() (navlie.lib.preintegration.linearincrement method)": [[103, "navlie.lib.preintegration.LinearIncrement.copy"]], "covariance (navlie.lib.preintegration.linearincrement attribute)": [[103, "navlie.lib.preintegration.LinearIncrement.covariance"]], "dof (navlie.lib.preintegration.linearincrement attribute)": [[103, "navlie.lib.preintegration.LinearIncrement.dof"]], "increment() (navlie.lib.preintegration.linearincrement method)": [[103, "navlie.lib.preintegration.LinearIncrement.increment"]], "new() (navlie.lib.preintegration.linearincrement method)": [[103, "navlie.lib.preintegration.LinearIncrement.new"]], "new_bias (navlie.lib.preintegration.linearincrement attribute)": [[103, "navlie.lib.preintegration.LinearIncrement.new_bias"]], "original_bias (navlie.lib.preintegration.linearincrement attribute)": [[103, "navlie.lib.preintegration.LinearIncrement.original_bias"]], "original_value (navlie.lib.preintegration.linearincrement attribute)": [[103, "navlie.lib.preintegration.LinearIncrement.original_value"]], "plus() (navlie.lib.preintegration.linearincrement method)": [[103, "navlie.lib.preintegration.LinearIncrement.plus"]], "stamp (navlie.lib.preintegration.linearincrement property)": [[103, "navlie.lib.preintegration.LinearIncrement.stamp"]], "stamps (navlie.lib.preintegration.linearincrement attribute)": [[103, "navlie.lib.preintegration.LinearIncrement.stamps"]], "state_id (navlie.lib.preintegration.linearincrement attribute)": [[103, "navlie.lib.preintegration.LinearIncrement.state_id"]], "symmetrize() (navlie.lib.preintegration.linearincrement method)": [[103, "navlie.lib.preintegration.LinearIncrement.symmetrize"]], "update_bias() (navlie.lib.preintegration.linearincrement method)": [[103, "navlie.lib.preintegration.LinearIncrement.update_bias"]], "value (navlie.lib.preintegration.linearincrement property)": [[103, "navlie.lib.preintegration.LinearIncrement.value"]], "preintegratedangularvelocity (class in navlie.lib.preintegration)": [[104, "navlie.lib.preintegration.PreintegratedAngularVelocity"]], "covariance() (navlie.lib.preintegration.preintegratedangularvelocity method)": [[104, "navlie.lib.preintegration.PreintegratedAngularVelocity.covariance"]], "evaluate() (navlie.lib.preintegration.preintegratedangularvelocity method)": [[104, "navlie.lib.preintegration.PreintegratedAngularVelocity.evaluate"]], "evaluate_with_jacobian() (navlie.lib.preintegration.preintegratedangularvelocity method)": [[104, "navlie.lib.preintegration.PreintegratedAngularVelocity.evaluate_with_jacobian"]], "input_covariance() (navlie.lib.preintegration.preintegratedangularvelocity method)": [[104, "navlie.lib.preintegration.PreintegratedAngularVelocity.input_covariance"]], "input_jacobian_fd() (navlie.lib.preintegration.preintegratedangularvelocity method)": [[104, "navlie.lib.preintegration.PreintegratedAngularVelocity.input_jacobian_fd"]], "jacobian() (navlie.lib.preintegration.preintegratedangularvelocity method)": [[104, "navlie.lib.preintegration.PreintegratedAngularVelocity.jacobian"]], "jacobian_fd() (navlie.lib.preintegration.preintegratedangularvelocity method)": [[104, "navlie.lib.preintegration.PreintegratedAngularVelocity.jacobian_fd"]], "sqrt_information() (navlie.lib.preintegration.preintegratedangularvelocity method)": [[104, "navlie.lib.preintegration.PreintegratedAngularVelocity.sqrt_information"]], "preintegratedbodyvelocity (class in navlie.lib.preintegration)": [[105, "navlie.lib.preintegration.PreintegratedBodyVelocity"]], "covariance() (navlie.lib.preintegration.preintegratedbodyvelocity method)": [[105, "navlie.lib.preintegration.PreintegratedBodyVelocity.covariance"]], "evaluate() (navlie.lib.preintegration.preintegratedbodyvelocity method)": [[105, "navlie.lib.preintegration.PreintegratedBodyVelocity.evaluate"]], "evaluate_with_jacobian() (navlie.lib.preintegration.preintegratedbodyvelocity method)": [[105, "navlie.lib.preintegration.PreintegratedBodyVelocity.evaluate_with_jacobian"]], "input_covariance() (navlie.lib.preintegration.preintegratedbodyvelocity method)": [[105, "navlie.lib.preintegration.PreintegratedBodyVelocity.input_covariance"]], "input_jacobian_fd() (navlie.lib.preintegration.preintegratedbodyvelocity method)": [[105, "navlie.lib.preintegration.PreintegratedBodyVelocity.input_jacobian_fd"]], "jacobian() (navlie.lib.preintegration.preintegratedbodyvelocity method)": [[105, "navlie.lib.preintegration.PreintegratedBodyVelocity.jacobian"]], "jacobian_fd() (navlie.lib.preintegration.preintegratedbodyvelocity method)": [[105, "navlie.lib.preintegration.PreintegratedBodyVelocity.jacobian_fd"]], "sqrt_information() (navlie.lib.preintegration.preintegratedbodyvelocity method)": [[105, "navlie.lib.preintegration.PreintegratedBodyVelocity.sqrt_information"]], "preintegratedimukinematics (class in navlie.lib.preintegration)": [[106, "navlie.lib.preintegration.PreintegratedIMUKinematics"]], "covariance() (navlie.lib.preintegration.preintegratedimukinematics method)": [[106, "navlie.lib.preintegration.PreintegratedIMUKinematics.covariance"]], "evaluate() (navlie.lib.preintegration.preintegratedimukinematics method)": [[106, "navlie.lib.preintegration.PreintegratedIMUKinematics.evaluate"]], "evaluate_with_jacobian() (navlie.lib.preintegration.preintegratedimukinematics method)": [[106, "navlie.lib.preintegration.PreintegratedIMUKinematics.evaluate_with_jacobian"]], "input_covariance() (navlie.lib.preintegration.preintegratedimukinematics method)": [[106, "navlie.lib.preintegration.PreintegratedIMUKinematics.input_covariance"]], "input_jacobian_fd() (navlie.lib.preintegration.preintegratedimukinematics method)": [[106, "navlie.lib.preintegration.PreintegratedIMUKinematics.input_jacobian_fd"]], "jacobian() (navlie.lib.preintegration.preintegratedimukinematics method)": [[106, "navlie.lib.preintegration.PreintegratedIMUKinematics.jacobian"]], "jacobian_fd() (navlie.lib.preintegration.preintegratedimukinematics method)": [[106, "navlie.lib.preintegration.PreintegratedIMUKinematics.jacobian_fd"]], "sqrt_information() (navlie.lib.preintegration.preintegratedimukinematics method)": [[106, "navlie.lib.preintegration.PreintegratedIMUKinematics.sqrt_information"]], "preintegratedlinearmodel (class in navlie.lib.preintegration)": [[107, "navlie.lib.preintegration.PreintegratedLinearModel"]], "covariance() (navlie.lib.preintegration.preintegratedlinearmodel method)": [[107, "navlie.lib.preintegration.PreintegratedLinearModel.covariance"]], "evaluate() (navlie.lib.preintegration.preintegratedlinearmodel method)": [[107, "navlie.lib.preintegration.PreintegratedLinearModel.evaluate"]], "evaluate_with_jacobian() (navlie.lib.preintegration.preintegratedlinearmodel method)": [[107, "navlie.lib.preintegration.PreintegratedLinearModel.evaluate_with_jacobian"]], "input_covariance() (navlie.lib.preintegration.preintegratedlinearmodel method)": [[107, "navlie.lib.preintegration.PreintegratedLinearModel.input_covariance"]], "input_jacobian_fd() (navlie.lib.preintegration.preintegratedlinearmodel method)": [[107, "navlie.lib.preintegration.PreintegratedLinearModel.input_jacobian_fd"]], "jacobian() (navlie.lib.preintegration.preintegratedlinearmodel method)": [[107, "navlie.lib.preintegration.PreintegratedLinearModel.jacobian"]], "jacobian_fd() (navlie.lib.preintegration.preintegratedlinearmodel method)": [[107, "navlie.lib.preintegration.PreintegratedLinearModel.jacobian_fd"]], "sqrt_information() (navlie.lib.preintegration.preintegratedlinearmodel method)": [[107, "navlie.lib.preintegration.PreintegratedLinearModel.sqrt_information"]], "preintegratedwheelodometry (class in navlie.lib.preintegration)": [[108, "navlie.lib.preintegration.PreintegratedWheelOdometry"]], "covariance() (navlie.lib.preintegration.preintegratedwheelodometry method)": [[108, "navlie.lib.preintegration.PreintegratedWheelOdometry.covariance"]], "evaluate() (navlie.lib.preintegration.preintegratedwheelodometry method)": [[108, "navlie.lib.preintegration.PreintegratedWheelOdometry.evaluate"]], "evaluate_with_jacobian() (navlie.lib.preintegration.preintegratedwheelodometry method)": [[108, "navlie.lib.preintegration.PreintegratedWheelOdometry.evaluate_with_jacobian"]], "input_covariance() (navlie.lib.preintegration.preintegratedwheelodometry method)": [[108, "navlie.lib.preintegration.PreintegratedWheelOdometry.input_covariance"]], "input_jacobian_fd() (navlie.lib.preintegration.preintegratedwheelodometry method)": [[108, "navlie.lib.preintegration.PreintegratedWheelOdometry.input_jacobian_fd"]], "jacobian() (navlie.lib.preintegration.preintegratedwheelodometry method)": [[108, "navlie.lib.preintegration.PreintegratedWheelOdometry.jacobian"]], "jacobian_fd() (navlie.lib.preintegration.preintegratedwheelodometry method)": [[108, "navlie.lib.preintegration.PreintegratedWheelOdometry.jacobian_fd"]], "sqrt_information() (navlie.lib.preintegration.preintegratedwheelodometry method)": [[108, "navlie.lib.preintegration.PreintegratedWheelOdometry.sqrt_information"]], "relativemotionincrement (class in navlie.lib.preintegration)": [[109, "navlie.lib.preintegration.RelativeMotionIncrement"]], "copy() (navlie.lib.preintegration.relativemotionincrement method)": [[109, "navlie.lib.preintegration.RelativeMotionIncrement.copy"]], "covariance (navlie.lib.preintegration.relativemotionincrement attribute)": [[109, "navlie.lib.preintegration.RelativeMotionIncrement.covariance"]], "dof (navlie.lib.preintegration.relativemotionincrement attribute)": [[109, "navlie.lib.preintegration.RelativeMotionIncrement.dof"]], "increment() (navlie.lib.preintegration.relativemotionincrement method)": [[109, "navlie.lib.preintegration.RelativeMotionIncrement.increment"]], "new() (navlie.lib.preintegration.relativemotionincrement method)": [[109, "navlie.lib.preintegration.RelativeMotionIncrement.new"]], "plus() (navlie.lib.preintegration.relativemotionincrement method)": [[109, "navlie.lib.preintegration.RelativeMotionIncrement.plus"]], "stamp (navlie.lib.preintegration.relativemotionincrement property)": [[109, "navlie.lib.preintegration.RelativeMotionIncrement.stamp"]], "stamps (navlie.lib.preintegration.relativemotionincrement attribute)": [[109, "navlie.lib.preintegration.RelativeMotionIncrement.stamps"]], "state_id (navlie.lib.preintegration.relativemotionincrement attribute)": [[109, "navlie.lib.preintegration.RelativeMotionIncrement.state_id"]], "symmetrize() (navlie.lib.preintegration.relativemotionincrement method)": [[109, "navlie.lib.preintegration.RelativeMotionIncrement.symmetrize"]], "update_bias() (navlie.lib.preintegration.relativemotionincrement method)": [[109, "navlie.lib.preintegration.RelativeMotionIncrement.update_bias"]], "wheelodometryincrement (class in navlie.lib.preintegration)": [[110, "navlie.lib.preintegration.WheelOdometryIncrement"]], "copy() (navlie.lib.preintegration.wheelodometryincrement method)": [[110, "navlie.lib.preintegration.WheelOdometryIncrement.copy"]], "covariance (navlie.lib.preintegration.wheelodometryincrement attribute)": [[110, "navlie.lib.preintegration.WheelOdometryIncrement.covariance"]], "dof (navlie.lib.preintegration.wheelodometryincrement attribute)": [[110, "navlie.lib.preintegration.WheelOdometryIncrement.dof"]], "increment() (navlie.lib.preintegration.wheelodometryincrement method)": [[110, "navlie.lib.preintegration.WheelOdometryIncrement.increment"]], "new() (navlie.lib.preintegration.wheelodometryincrement method)": [[110, "navlie.lib.preintegration.WheelOdometryIncrement.new"]], "original_value (navlie.lib.preintegration.wheelodometryincrement attribute)": [[110, "navlie.lib.preintegration.WheelOdometryIncrement.original_value"]], "plus() (navlie.lib.preintegration.wheelodometryincrement method)": [[110, "navlie.lib.preintegration.WheelOdometryIncrement.plus"]], "stamp (navlie.lib.preintegration.wheelodometryincrement property)": [[110, "navlie.lib.preintegration.WheelOdometryIncrement.stamp"]], "stamps (navlie.lib.preintegration.wheelodometryincrement attribute)": [[110, "navlie.lib.preintegration.WheelOdometryIncrement.stamps"]], "state_id (navlie.lib.preintegration.wheelodometryincrement attribute)": [[110, "navlie.lib.preintegration.WheelOdometryIncrement.state_id"]], "symmetrize() (navlie.lib.preintegration.wheelodometryincrement method)": [[110, "navlie.lib.preintegration.WheelOdometryIncrement.symmetrize"]], "update_bias() (navlie.lib.preintegration.wheelodometryincrement method)": [[110, "navlie.lib.preintegration.WheelOdometryIncrement.update_bias"]], "value (navlie.lib.preintegration.wheelodometryincrement property)": [[110, "navlie.lib.preintegration.WheelOdometryIncrement.value"]], "navlie.lib.states": [[111, "module-navlie.lib.states"]], "matrixliegroupstate (class in navlie.lib.states)": [[112, "navlie.lib.states.MatrixLieGroupState"]], "attitude (navlie.lib.states.matrixliegroupstate property)": [[112, "navlie.lib.states.MatrixLieGroupState.attitude"]], "copy() (navlie.lib.states.matrixliegroupstate method)": [[112, "navlie.lib.states.MatrixLieGroupState.copy"]], "direction (navlie.lib.states.matrixliegroupstate attribute)": [[112, "navlie.lib.states.MatrixLieGroupState.direction"]], "dof (navlie.lib.states.matrixliegroupstate attribute)": [[112, "navlie.lib.states.MatrixLieGroupState.dof"]], "dot() (navlie.lib.states.matrixliegroupstate method)": [[112, "navlie.lib.states.MatrixLieGroupState.dot"]], "group (navlie.lib.states.matrixliegroupstate attribute)": [[112, "navlie.lib.states.MatrixLieGroupState.group"]], "jacobian_from_blocks() (navlie.lib.states.matrixliegroupstate method)": [[112, "navlie.lib.states.MatrixLieGroupState.jacobian_from_blocks"]], "minus() (navlie.lib.states.matrixliegroupstate method)": [[112, "navlie.lib.states.MatrixLieGroupState.minus"]], "minus_jacobian() (navlie.lib.states.matrixliegroupstate method)": [[112, "navlie.lib.states.MatrixLieGroupState.minus_jacobian"]], "minus_jacobian_fd() (navlie.lib.states.matrixliegroupstate method)": [[112, "navlie.lib.states.MatrixLieGroupState.minus_jacobian_fd"]], "plus() (navlie.lib.states.matrixliegroupstate method)": [[112, "navlie.lib.states.MatrixLieGroupState.plus"]], "plus_jacobian() (navlie.lib.states.matrixliegroupstate method)": [[112, "navlie.lib.states.MatrixLieGroupState.plus_jacobian"]], "plus_jacobian_fd() (navlie.lib.states.matrixliegroupstate method)": [[112, "navlie.lib.states.MatrixLieGroupState.plus_jacobian_fd"]], "position (navlie.lib.states.matrixliegroupstate property)": [[112, "navlie.lib.states.MatrixLieGroupState.position"]], "stamp (navlie.lib.states.matrixliegroupstate attribute)": [[112, "navlie.lib.states.MatrixLieGroupState.stamp"]], "state_id (navlie.lib.states.matrixliegroupstate attribute)": [[112, "navlie.lib.states.MatrixLieGroupState.state_id"]], "value (navlie.lib.states.matrixliegroupstate attribute)": [[112, "navlie.lib.states.MatrixLieGroupState.value"]], "velocity (navlie.lib.states.matrixliegroupstate property)": [[112, "navlie.lib.states.MatrixLieGroupState.velocity"]], "se23state (class in navlie.lib.states)": [[113, "navlie.lib.states.SE23State"]], "attitude (navlie.lib.states.se23state property)": [[113, "navlie.lib.states.SE23State.attitude"]], "copy() (navlie.lib.states.se23state method)": [[113, "navlie.lib.states.SE23State.copy"]], "direction (navlie.lib.states.se23state attribute)": [[113, "navlie.lib.states.SE23State.direction"]], "dof (navlie.lib.states.se23state attribute)": [[113, "navlie.lib.states.SE23State.dof"]], "dot() (navlie.lib.states.se23state method)": [[113, "navlie.lib.states.SE23State.dot"]], "group (navlie.lib.states.se23state attribute)": [[113, "navlie.lib.states.SE23State.group"]], "jacobian_from_blocks() (navlie.lib.states.se23state static method)": [[113, "navlie.lib.states.SE23State.jacobian_from_blocks"]], "minus() (navlie.lib.states.se23state method)": [[113, "navlie.lib.states.SE23State.minus"]], "minus_jacobian() (navlie.lib.states.se23state method)": [[113, "navlie.lib.states.SE23State.minus_jacobian"]], "minus_jacobian_fd() (navlie.lib.states.se23state method)": [[113, "navlie.lib.states.SE23State.minus_jacobian_fd"]], "plus() (navlie.lib.states.se23state method)": [[113, "navlie.lib.states.SE23State.plus"]], "plus_jacobian() (navlie.lib.states.se23state method)": [[113, "navlie.lib.states.SE23State.plus_jacobian"]], "plus_jacobian_fd() (navlie.lib.states.se23state method)": [[113, "navlie.lib.states.SE23State.plus_jacobian_fd"]], "pose (navlie.lib.states.se23state property)": [[113, "navlie.lib.states.SE23State.pose"]], "position (navlie.lib.states.se23state property)": [[113, "navlie.lib.states.SE23State.position"]], "random() (navlie.lib.states.se23state static method)": [[113, "navlie.lib.states.SE23State.random"]], "stamp (navlie.lib.states.se23state attribute)": [[113, "navlie.lib.states.SE23State.stamp"]], "state_id (navlie.lib.states.se23state attribute)": [[113, "navlie.lib.states.SE23State.state_id"]], "value (navlie.lib.states.se23state attribute)": [[113, "navlie.lib.states.SE23State.value"]], "velocity (navlie.lib.states.se23state property)": [[113, "navlie.lib.states.SE23State.velocity"]], "se2state (class in navlie.lib.states)": [[114, "navlie.lib.states.SE2State"]], "attitude (navlie.lib.states.se2state property)": [[114, "navlie.lib.states.SE2State.attitude"]], "copy() (navlie.lib.states.se2state method)": [[114, "navlie.lib.states.SE2State.copy"]], "direction (navlie.lib.states.se2state attribute)": [[114, "navlie.lib.states.SE2State.direction"]], "dof (navlie.lib.states.se2state attribute)": [[114, "navlie.lib.states.SE2State.dof"]], "dot() (navlie.lib.states.se2state method)": [[114, "navlie.lib.states.SE2State.dot"]], "group (navlie.lib.states.se2state attribute)": [[114, "navlie.lib.states.SE2State.group"]], "jacobian_from_blocks() (navlie.lib.states.se2state static method)": [[114, "navlie.lib.states.SE2State.jacobian_from_blocks"]], "minus() (navlie.lib.states.se2state method)": [[114, "navlie.lib.states.SE2State.minus"]], "minus_jacobian() (navlie.lib.states.se2state method)": [[114, "navlie.lib.states.SE2State.minus_jacobian"]], "minus_jacobian_fd() (navlie.lib.states.se2state method)": [[114, "navlie.lib.states.SE2State.minus_jacobian_fd"]], "plus() (navlie.lib.states.se2state method)": [[114, "navlie.lib.states.SE2State.plus"]], "plus_jacobian() (navlie.lib.states.se2state method)": [[114, "navlie.lib.states.SE2State.plus_jacobian"]], "plus_jacobian_fd() (navlie.lib.states.se2state method)": [[114, "navlie.lib.states.SE2State.plus_jacobian_fd"]], "pose (navlie.lib.states.se2state property)": [[114, "navlie.lib.states.SE2State.pose"]], "position (navlie.lib.states.se2state property)": [[114, "navlie.lib.states.SE2State.position"]], "random() (navlie.lib.states.se2state static method)": [[114, "navlie.lib.states.SE2State.random"]], "stamp (navlie.lib.states.se2state attribute)": [[114, "navlie.lib.states.SE2State.stamp"]], "state_id (navlie.lib.states.se2state attribute)": [[114, "navlie.lib.states.SE2State.state_id"]], "value (navlie.lib.states.se2state attribute)": [[114, "navlie.lib.states.SE2State.value"]], "velocity (navlie.lib.states.se2state property)": [[114, "navlie.lib.states.SE2State.velocity"]], "se3state (class in navlie.lib.states)": [[115, "navlie.lib.states.SE3State"]], "attitude (navlie.lib.states.se3state property)": [[115, "navlie.lib.states.SE3State.attitude"]], "copy() (navlie.lib.states.se3state method)": [[115, "navlie.lib.states.SE3State.copy"]], "direction (navlie.lib.states.se3state attribute)": [[115, "navlie.lib.states.SE3State.direction"]], "dof (navlie.lib.states.se3state attribute)": [[115, "navlie.lib.states.SE3State.dof"]], "dot() (navlie.lib.states.se3state method)": [[115, "navlie.lib.states.SE3State.dot"]], "from_ros() (navlie.lib.states.se3state static method)": [[115, "navlie.lib.states.SE3State.from_ros"]], "group (navlie.lib.states.se3state attribute)": [[115, "navlie.lib.states.SE3State.group"]], "jacobian_from_blocks() (navlie.lib.states.se3state static method)": [[115, "navlie.lib.states.SE3State.jacobian_from_blocks"]], "minus() (navlie.lib.states.se3state method)": [[115, "navlie.lib.states.SE3State.minus"]], "minus_jacobian() (navlie.lib.states.se3state method)": [[115, "navlie.lib.states.SE3State.minus_jacobian"]], "minus_jacobian_fd() (navlie.lib.states.se3state method)": [[115, "navlie.lib.states.SE3State.minus_jacobian_fd"]], "plus() (navlie.lib.states.se3state method)": [[115, "navlie.lib.states.SE3State.plus"]], "plus_jacobian() (navlie.lib.states.se3state method)": [[115, "navlie.lib.states.SE3State.plus_jacobian"]], "plus_jacobian_fd() (navlie.lib.states.se3state method)": [[115, "navlie.lib.states.SE3State.plus_jacobian_fd"]], "position (navlie.lib.states.se3state property)": [[115, "navlie.lib.states.SE3State.position"]], "random() (navlie.lib.states.se3state static method)": [[115, "navlie.lib.states.SE3State.random"]], "stamp (navlie.lib.states.se3state attribute)": [[115, "navlie.lib.states.SE3State.stamp"]], "state_id (navlie.lib.states.se3state attribute)": [[115, "navlie.lib.states.SE3State.state_id"]], "to_ros() (navlie.lib.states.se3state method)": [[115, "navlie.lib.states.SE3State.to_ros"]], "value (navlie.lib.states.se3state attribute)": [[115, "navlie.lib.states.SE3State.value"]], "velocity (navlie.lib.states.se3state property)": [[115, "navlie.lib.states.SE3State.velocity"]], "sl3state (class in navlie.lib.states)": [[116, "navlie.lib.states.SL3State"]], "attitude (navlie.lib.states.sl3state property)": [[116, "navlie.lib.states.SL3State.attitude"]], "copy() (navlie.lib.states.sl3state method)": [[116, "navlie.lib.states.SL3State.copy"]], "direction (navlie.lib.states.sl3state attribute)": [[116, "navlie.lib.states.SL3State.direction"]], "dof (navlie.lib.states.sl3state attribute)": [[116, "navlie.lib.states.SL3State.dof"]], "dot() (navlie.lib.states.sl3state method)": [[116, "navlie.lib.states.SL3State.dot"]], "group (navlie.lib.states.sl3state attribute)": [[116, "navlie.lib.states.SL3State.group"]], "jacobian_from_blocks() (navlie.lib.states.sl3state method)": [[116, "navlie.lib.states.SL3State.jacobian_from_blocks"]], "minus() (navlie.lib.states.sl3state method)": [[116, "navlie.lib.states.SL3State.minus"]], "minus_jacobian() (navlie.lib.states.sl3state method)": [[116, "navlie.lib.states.SL3State.minus_jacobian"]], "minus_jacobian_fd() (navlie.lib.states.sl3state method)": [[116, "navlie.lib.states.SL3State.minus_jacobian_fd"]], "plus() (navlie.lib.states.sl3state method)": [[116, "navlie.lib.states.SL3State.plus"]], "plus_jacobian() (navlie.lib.states.sl3state method)": [[116, "navlie.lib.states.SL3State.plus_jacobian"]], "plus_jacobian_fd() (navlie.lib.states.sl3state method)": [[116, "navlie.lib.states.SL3State.plus_jacobian_fd"]], "position (navlie.lib.states.sl3state property)": [[116, "navlie.lib.states.SL3State.position"]], "stamp (navlie.lib.states.sl3state attribute)": [[116, "navlie.lib.states.SL3State.stamp"]], "state_id (navlie.lib.states.sl3state attribute)": [[116, "navlie.lib.states.SL3State.state_id"]], "value (navlie.lib.states.sl3state attribute)": [[116, "navlie.lib.states.SL3State.value"]], "velocity (navlie.lib.states.sl3state property)": [[116, "navlie.lib.states.SL3State.velocity"]], "so2state (class in navlie.lib.states)": [[117, "navlie.lib.states.SO2State"]], "attitude (navlie.lib.states.so2state property)": [[117, "navlie.lib.states.SO2State.attitude"]], "copy() (navlie.lib.states.so2state method)": [[117, "navlie.lib.states.SO2State.copy"]], "direction (navlie.lib.states.so2state attribute)": [[117, "navlie.lib.states.SO2State.direction"]], "dof (navlie.lib.states.so2state attribute)": [[117, "navlie.lib.states.SO2State.dof"]], "dot() (navlie.lib.states.so2state method)": [[117, "navlie.lib.states.SO2State.dot"]], "group (navlie.lib.states.so2state attribute)": [[117, "navlie.lib.states.SO2State.group"]], "jacobian_from_blocks() (navlie.lib.states.so2state method)": [[117, "navlie.lib.states.SO2State.jacobian_from_blocks"]], "minus() (navlie.lib.states.so2state method)": [[117, "navlie.lib.states.SO2State.minus"]], "minus_jacobian() (navlie.lib.states.so2state method)": [[117, "navlie.lib.states.SO2State.minus_jacobian"]], "minus_jacobian_fd() (navlie.lib.states.so2state method)": [[117, "navlie.lib.states.SO2State.minus_jacobian_fd"]], "plus() (navlie.lib.states.so2state method)": [[117, "navlie.lib.states.SO2State.plus"]], "plus_jacobian() (navlie.lib.states.so2state method)": [[117, "navlie.lib.states.SO2State.plus_jacobian"]], "plus_jacobian_fd() (navlie.lib.states.so2state method)": [[117, "navlie.lib.states.SO2State.plus_jacobian_fd"]], "position (navlie.lib.states.so2state property)": [[117, "navlie.lib.states.SO2State.position"]], "random() (navlie.lib.states.so2state static method)": [[117, "navlie.lib.states.SO2State.random"]], "stamp (navlie.lib.states.so2state attribute)": [[117, "navlie.lib.states.SO2State.stamp"]], "state_id (navlie.lib.states.so2state attribute)": [[117, "navlie.lib.states.SO2State.state_id"]], "value (navlie.lib.states.so2state attribute)": [[117, "navlie.lib.states.SO2State.value"]], "velocity (navlie.lib.states.so2state property)": [[117, "navlie.lib.states.SO2State.velocity"]], "so3state (class in navlie.lib.states)": [[118, "navlie.lib.states.SO3State"]], "attitude (navlie.lib.states.so3state property)": [[118, "navlie.lib.states.SO3State.attitude"]], "copy() (navlie.lib.states.so3state method)": [[118, "navlie.lib.states.SO3State.copy"]], "direction (navlie.lib.states.so3state attribute)": [[118, "navlie.lib.states.SO3State.direction"]], "dof (navlie.lib.states.so3state attribute)": [[118, "navlie.lib.states.SO3State.dof"]], "dot() (navlie.lib.states.so3state method)": [[118, "navlie.lib.states.SO3State.dot"]], "from_ros() (navlie.lib.states.so3state static method)": [[118, "navlie.lib.states.SO3State.from_ros"]], "group (navlie.lib.states.so3state attribute)": [[118, "navlie.lib.states.SO3State.group"]], "jacobian_from_blocks() (navlie.lib.states.so3state static method)": [[118, "navlie.lib.states.SO3State.jacobian_from_blocks"]], "minus() (navlie.lib.states.so3state method)": [[118, "navlie.lib.states.SO3State.minus"]], "minus_jacobian() (navlie.lib.states.so3state method)": [[118, "navlie.lib.states.SO3State.minus_jacobian"]], "minus_jacobian_fd() (navlie.lib.states.so3state method)": [[118, "navlie.lib.states.SO3State.minus_jacobian_fd"]], "plus() (navlie.lib.states.so3state method)": [[118, "navlie.lib.states.SO3State.plus"]], "plus_jacobian() (navlie.lib.states.so3state method)": [[118, "navlie.lib.states.SO3State.plus_jacobian"]], "plus_jacobian_fd() (navlie.lib.states.so3state method)": [[118, "navlie.lib.states.SO3State.plus_jacobian_fd"]], "position (navlie.lib.states.so3state property)": [[118, "navlie.lib.states.SO3State.position"]], "random() (navlie.lib.states.so3state static method)": [[118, "navlie.lib.states.SO3State.random"]], "stamp (navlie.lib.states.so3state attribute)": [[118, "navlie.lib.states.SO3State.stamp"]], "state_id (navlie.lib.states.so3state attribute)": [[118, "navlie.lib.states.SO3State.state_id"]], "to_ros() (navlie.lib.states.so3state method)": [[118, "navlie.lib.states.SO3State.to_ros"]], "value (navlie.lib.states.so3state attribute)": [[118, "navlie.lib.states.SO3State.value"]], "velocity (navlie.lib.states.so3state property)": [[118, "navlie.lib.states.SO3State.velocity"]], "stampedvalue (class in navlie.lib.states)": [[119, "navlie.lib.states.StampedValue"]], "copy() (navlie.lib.states.stampedvalue method)": [[119, "navlie.lib.states.StampedValue.copy"]], "covariance (navlie.lib.states.stampedvalue attribute)": [[119, "navlie.lib.states.StampedValue.covariance"]], "dof (navlie.lib.states.stampedvalue attribute)": [[119, "navlie.lib.states.StampedValue.dof"]], "plus() (navlie.lib.states.stampedvalue method)": [[119, "navlie.lib.states.StampedValue.plus"]], "stamp (navlie.lib.states.stampedvalue attribute)": [[119, "navlie.lib.states.StampedValue.stamp"]], "state_id (navlie.lib.states.stampedvalue attribute)": [[119, "navlie.lib.states.StampedValue.state_id"]], "value (navlie.lib.states.stampedvalue attribute)": [[119, "navlie.lib.states.StampedValue.value"]], "vectorinput (class in navlie.lib.states)": [[120, "navlie.lib.states.VectorInput"]], "copy() (navlie.lib.states.vectorinput method)": [[120, "navlie.lib.states.VectorInput.copy"]], "covariance (navlie.lib.states.vectorinput attribute)": [[120, "navlie.lib.states.VectorInput.covariance"]], "dof (navlie.lib.states.vectorinput attribute)": [[120, "navlie.lib.states.VectorInput.dof"]], "plus() (navlie.lib.states.vectorinput method)": [[120, "navlie.lib.states.VectorInput.plus"]], "stamp (navlie.lib.states.vectorinput attribute)": [[120, "navlie.lib.states.VectorInput.stamp"]], "state_id (navlie.lib.states.vectorinput attribute)": [[120, "navlie.lib.states.VectorInput.state_id"]], "value (navlie.lib.states.vectorinput attribute)": [[120, "navlie.lib.states.VectorInput.value"]], "vectorstate (class in navlie.lib.states)": [[121, "navlie.lib.states.VectorState"]], "copy() (navlie.lib.states.vectorstate method)": [[121, "navlie.lib.states.VectorState.copy"]], "dof (navlie.lib.states.vectorstate attribute)": [[121, "navlie.lib.states.VectorState.dof"]], "minus() (navlie.lib.states.vectorstate method)": [[121, "navlie.lib.states.VectorState.minus"]], "minus_jacobian() (navlie.lib.states.vectorstate method)": [[121, "navlie.lib.states.VectorState.minus_jacobian"]], "minus_jacobian_fd() (navlie.lib.states.vectorstate method)": [[121, "navlie.lib.states.VectorState.minus_jacobian_fd"]], "plus() (navlie.lib.states.vectorstate method)": [[121, "navlie.lib.states.VectorState.plus"]], "plus_jacobian() (navlie.lib.states.vectorstate method)": [[121, "navlie.lib.states.VectorState.plus_jacobian"]], "plus_jacobian_fd() (navlie.lib.states.vectorstate method)": [[121, "navlie.lib.states.VectorState.plus_jacobian_fd"]], "stamp (navlie.lib.states.vectorstate attribute)": [[121, "navlie.lib.states.VectorState.stamp"]], "state_id (navlie.lib.states.vectorstate attribute)": [[121, "navlie.lib.states.VectorState.state_id"]], "value (navlie.lib.states.vectorstate attribute)": [[121, "navlie.lib.states.VectorState.value"]], "navlie.types": [[122, "module-navlie.types"]], "dataset (class in navlie.types)": [[123, "navlie.types.Dataset"]], "get_ground_truth() (navlie.types.dataset method)": [[123, "navlie.types.Dataset.get_ground_truth"]], "get_input_data() (navlie.types.dataset method)": [[123, "navlie.types.Dataset.get_input_data"]], "get_measurement_data() (navlie.types.dataset method)": [[123, "navlie.types.Dataset.get_measurement_data"]], "input (class in navlie.types)": [[124, "navlie.types.Input"]], "copy() (navlie.types.input method)": [[124, "navlie.types.Input.copy"]], "covariance (navlie.types.input attribute)": [[124, "navlie.types.Input.covariance"]], "dof (navlie.types.input attribute)": [[124, "navlie.types.Input.dof"]], "plus() (navlie.types.input method)": [[124, "navlie.types.Input.plus"]], "stamp (navlie.types.input attribute)": [[124, "navlie.types.Input.stamp"]], "state_id (navlie.types.input attribute)": [[124, "navlie.types.Input.state_id"]], "measurement (class in navlie.types)": [[125, "navlie.types.Measurement"]], "minus() (navlie.types.measurement method)": [[125, "navlie.types.Measurement.minus"]], "model (navlie.types.measurement attribute)": [[125, "navlie.types.Measurement.model"]], "stamp (navlie.types.measurement attribute)": [[125, "navlie.types.Measurement.stamp"]], "state_id (navlie.types.measurement attribute)": [[125, "navlie.types.Measurement.state_id"]], "value (navlie.types.measurement attribute)": [[125, "navlie.types.Measurement.value"]], "measurementmodel (class in navlie.types)": [[126, "navlie.types.MeasurementModel"]], "covariance() (navlie.types.measurementmodel method)": [[126, "navlie.types.MeasurementModel.covariance"]], "evaluate() (navlie.types.measurementmodel method)": [[126, "navlie.types.MeasurementModel.evaluate"]], "evaluate_with_jacobian() (navlie.types.measurementmodel method)": [[126, "navlie.types.MeasurementModel.evaluate_with_jacobian"]], "jacobian() (navlie.types.measurementmodel method)": [[126, "navlie.types.MeasurementModel.jacobian"]], "jacobian_fd() (navlie.types.measurementmodel method)": [[126, "navlie.types.MeasurementModel.jacobian_fd"]], "sqrt_information() (navlie.types.measurementmodel method)": [[126, "navlie.types.MeasurementModel.sqrt_information"]], "processmodel (class in navlie.types)": [[127, "navlie.types.ProcessModel"]], "covariance() (navlie.types.processmodel method)": [[127, "navlie.types.ProcessModel.covariance"]], "evaluate() (navlie.types.processmodel method)": [[127, "navlie.types.ProcessModel.evaluate"]], "evaluate_with_jacobian() (navlie.types.processmodel method)": [[127, "navlie.types.ProcessModel.evaluate_with_jacobian"]], "input_covariance() (navlie.types.processmodel method)": [[127, "navlie.types.ProcessModel.input_covariance"]], "input_jacobian_fd() (navlie.types.processmodel method)": [[127, "navlie.types.ProcessModel.input_jacobian_fd"]], "jacobian() (navlie.types.processmodel method)": [[127, "navlie.types.ProcessModel.jacobian"]], "jacobian_fd() (navlie.types.processmodel method)": [[127, "navlie.types.ProcessModel.jacobian_fd"]], "sqrt_information() (navlie.types.processmodel method)": [[127, "navlie.types.ProcessModel.sqrt_information"]], "state (class in navlie.types)": [[128, "navlie.types.State"]], "copy() (navlie.types.state method)": [[128, "navlie.types.State.copy"]], "dof (navlie.types.state attribute)": [[128, "navlie.types.State.dof"]], "minus() (navlie.types.state method)": [[128, "navlie.types.State.minus"]], "minus_jacobian() (navlie.types.state method)": [[128, "navlie.types.State.minus_jacobian"]], "minus_jacobian_fd() (navlie.types.state method)": [[128, "navlie.types.State.minus_jacobian_fd"]], "plus() (navlie.types.state method)": [[128, "navlie.types.State.plus"]], "plus_jacobian() (navlie.types.state method)": [[128, "navlie.types.State.plus_jacobian"]], "plus_jacobian_fd() (navlie.types.state method)": [[128, "navlie.types.State.plus_jacobian_fd"]], "stamp (navlie.types.state attribute)": [[128, "navlie.types.State.stamp"]], "state_id (navlie.types.state attribute)": [[128, "navlie.types.State.state_id"]], "value (navlie.types.state attribute)": [[128, "navlie.types.State.value"]], "statewithcovariance (class in navlie.types)": [[129, "navlie.types.StateWithCovariance"]], "copy() (navlie.types.statewithcovariance method)": [[129, "navlie.types.StateWithCovariance.copy"]], "covariance (navlie.types.statewithcovariance attribute)": [[129, "navlie.types.StateWithCovariance.covariance"]], "stamp (navlie.types.statewithcovariance property)": [[129, "navlie.types.StateWithCovariance.stamp"]], "state (navlie.types.statewithcovariance attribute)": [[129, "navlie.types.StateWithCovariance.state"]], "symmetrize() (navlie.types.statewithcovariance method)": [[129, "navlie.types.StateWithCovariance.symmetrize"]], "navlie.utils": [[130, "module-navlie.utils"]], "gaussianresult (class in navlie.utils)": [[131, "navlie.utils.GaussianResult"]], "covariance (navlie.utils.gaussianresult attribute)": [[131, "navlie.utils.GaussianResult.covariance"]], "ees (navlie.utils.gaussianresult attribute)": [[131, "navlie.utils.GaussianResult.ees"]], "error (navlie.utils.gaussianresult attribute)": [[131, "navlie.utils.GaussianResult.error"]], "md (navlie.utils.gaussianresult attribute)": [[131, "navlie.utils.GaussianResult.md"]], "nees (navlie.utils.gaussianresult attribute)": [[131, "navlie.utils.GaussianResult.nees"]], "rmse (navlie.utils.gaussianresult attribute)": [[131, "navlie.utils.GaussianResult.rmse"]], "stamp (navlie.utils.gaussianresult attribute)": [[131, "navlie.utils.GaussianResult.stamp"]], "state (navlie.utils.gaussianresult attribute)": [[131, "navlie.utils.GaussianResult.state"]], "state_true (navlie.utils.gaussianresult attribute)": [[131, "navlie.utils.GaussianResult.state_true"]], "three_sigma (navlie.utils.gaussianresult attribute)": [[131, "navlie.utils.GaussianResult.three_sigma"]], "gaussianresultlist (class in navlie.utils)": [[132, "navlie.utils.GaussianResultList"]], "covariance (navlie.utils.gaussianresultlist attribute)": [[132, "navlie.utils.GaussianResultList.covariance"]], "dof (navlie.utils.gaussianresultlist attribute)": [[132, "navlie.utils.GaussianResultList.dof"]], "ees (navlie.utils.gaussianresultlist attribute)": [[132, "navlie.utils.GaussianResultList.ees"]], "error (navlie.utils.gaussianresultlist attribute)": [[132, "navlie.utils.GaussianResultList.error"]], "from_estimates() (navlie.utils.gaussianresultlist static method)": [[132, "navlie.utils.GaussianResultList.from_estimates"]], "md (navlie.utils.gaussianresultlist attribute)": [[132, "navlie.utils.GaussianResultList.md"]], "nees (navlie.utils.gaussianresultlist attribute)": [[132, "navlie.utils.GaussianResultList.nees"]], "nees_lower_bound() (navlie.utils.gaussianresultlist method)": [[132, "navlie.utils.GaussianResultList.nees_lower_bound"]], "nees_upper_bound() (navlie.utils.gaussianresultlist method)": [[132, "navlie.utils.GaussianResultList.nees_upper_bound"]], "rmse (navlie.utils.gaussianresultlist attribute)": [[132, "navlie.utils.GaussianResultList.rmse"]], "stamp (navlie.utils.gaussianresultlist attribute)": [[132, "navlie.utils.GaussianResultList.stamp"]], "state (navlie.utils.gaussianresultlist attribute)": [[132, "navlie.utils.GaussianResultList.state"]], "state_true (navlie.utils.gaussianresultlist attribute)": [[132, "navlie.utils.GaussianResultList.state_true"]], "three_sigma (navlie.utils.gaussianresultlist attribute)": [[132, "navlie.utils.GaussianResultList.three_sigma"]], "value (navlie.utils.gaussianresultlist attribute)": [[132, "navlie.utils.GaussianResultList.value"]], "value_true (navlie.utils.gaussianresultlist attribute)": [[132, "navlie.utils.GaussianResultList.value_true"]], "montecarloresult (class in navlie.utils)": [[133, "navlie.utils.MonteCarloResult"]], "average_ees (navlie.utils.montecarloresult attribute)": [[133, "navlie.utils.MonteCarloResult.average_ees"]], "average_nees (navlie.utils.montecarloresult attribute)": [[133, "navlie.utils.MonteCarloResult.average_nees"]], "dof (navlie.utils.montecarloresult attribute)": [[133, "navlie.utils.MonteCarloResult.dof"]], "expected_nees (navlie.utils.montecarloresult attribute)": [[133, "navlie.utils.MonteCarloResult.expected_nees"]], "nees_lower_bound() (navlie.utils.montecarloresult method)": [[133, "navlie.utils.MonteCarloResult.nees_lower_bound"]], "nees_upper_bound() (navlie.utils.montecarloresult method)": [[133, "navlie.utils.MonteCarloResult.nees_upper_bound"]], "num_trials (navlie.utils.montecarloresult attribute)": [[133, "navlie.utils.MonteCarloResult.num_trials"]], "rmse (navlie.utils.montecarloresult attribute)": [[133, "navlie.utils.MonteCarloResult.rmse"]], "stamp (navlie.utils.montecarloresult attribute)": [[133, "navlie.utils.MonteCarloResult.stamp"]], "total_rmse (navlie.utils.montecarloresult attribute)": [[133, "navlie.utils.MonteCarloResult.total_rmse"]], "trial_results (navlie.utils.montecarloresult attribute)": [[133, "navlie.utils.MonteCarloResult.trial_results"]], "associate_stamps() (in module navlie.utils)": [[134, "navlie.utils.associate_stamps"]], "find_nearest_stamp_idx() (in module navlie.utils)": [[135, "navlie.utils.find_nearest_stamp_idx"]], "jacobian() (in module navlie.utils)": [[136, "navlie.utils.jacobian"]], "monte_carlo() (in module navlie.utils)": [[137, "navlie.utils.monte_carlo"]], "plot_error() (in module navlie.utils)": [[138, "navlie.utils.plot_error"]], "plot_meas() (in module navlie.utils)": [[139, "navlie.utils.plot_meas"]], "plot_meas_by_model() (in module navlie.utils)": [[140, "navlie.utils.plot_meas_by_model"]], "plot_nees() (in module navlie.utils)": [[141, "navlie.utils.plot_nees"]], "plot_poses() (in module navlie.utils)": [[142, "navlie.utils.plot_poses"]], "randvec() (in module navlie.utils)": [[143, "navlie.utils.randvec"]], "schedule_sequential_measurements() (in module navlie.utils)": [[144, "navlie.utils.schedule_sequential_measurements"]], "set_axes_equal() (in module navlie.utils)": [[145, "navlie.utils.set_axes_equal"]], "state_interp() (in module navlie.utils)": [[146, "navlie.utils.state_interp"]], "van_loans() (in module navlie.utils)": [[147, "navlie.utils.van_loans"]]}}) \ No newline at end of file diff --git a/_build/html/tutorial.html b/_build/html/tutorial.html new file mode 100644 index 00000000..1bd776a7 --- /dev/null +++ b/_build/html/tutorial.html @@ -0,0 +1,244 @@ + + + + + + + + Getting Started — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

Getting Started

+

Welcome to the navlie tutorial! The following few pages will go through a toy localization problem, where we will be running state estimation algorithms using navlie’s framework. The first step is to install this package. This should be done by directly cloning the git repo and performing a local pip install:

+
git clone git@github.com:decargroup/navlie.git
+cd navlie && pip install -e .
+
+
+

All the dependencies should get installed by this command and the package should now be ready to use. Use the column on the left to go to next page of the tutorial.

+
+

Note

+

Although this package is currently registed with PyPi, installation via pip install navlie will not work. We’re still figuring out how to set this up properly. Sorry! Feel free to help.

+
+
+
+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/tutorial/composite.html b/_build/html/tutorial/composite.html new file mode 100644 index 00000000..c0e74500 --- /dev/null +++ b/_build/html/tutorial/composite.html @@ -0,0 +1,556 @@ + + + + + + + + Composite States — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

Composite States

+

The CompositeState is a class that allows you to arbitarily combine multiple states, potentially of different types, into a new state that can be used with the navlie framework.

+

Let’s consider the previous example where we used the following \(SE(2)\) pose transformation matrix to represent the state:

+
+\[\begin{split}\mathbf{T} = \begin{bmatrix} \mathbf{C}_{ab} & \mathbf{r}_a \\ \mathbf{0} & 1 \end{bmatrix} \in SE(2).\end{split}\]
+

Suppose we now also want to estimate a wheel odometry bias \(\mathbf{b} \in \mathbb{R}^2\) in addition to the robot’s pose. Our state is now

+
+\[\mathbf{x} = (\mathbf{T}, \mathbf{b}) \in SE(2) \times \mathbb{R}^2.\]
+

This can be implemented easily using the CompositeState class in one of two ways: either directly or by inheritance. We’ll show the former approach first.

+
+
[48]:
+
+
+
import navlie as nav
+import numpy as np
+
+# Define the pose and bias as their own states
+T = nav.lib.SE2State(value = [0.1, 2.0, 3.0], stamp = 0.0, state_id="pose")
+b = nav.lib.VectorState(value = [0.1, 2.0], stamp = 0.0, state_id="bias")
+
+# Combine into a composite state, and its ready to use!
+x = nav.CompositeState([T, b], stamp=0.0)
+
+print(x)
+
+
+
+
+
+
+
+
+CompositeState(stamp=0.0, state_id=None) with substates:
+    SE2State(stamp=0.0, state_id=pose, direction=right)
+        [[ 0.99500417 -0.09983342  1.84679329]
+         [ 0.09983342  0.99500417  3.09491919]
+         [ 0.          0.          1.        ]]
+    VectorState(stamp=0.0, dof=2, state_id=bias)
+        [0.1 2. ]
+
+
+

The CompositeState class is a subclass of the State class, but who’s value is a list of states, referred to as the substates. A convenience of this class is that the composite state’s plus, minus, and copy methods have already been implemented for you based on the implementations in the substates. Note that the order in which the states are listed is important, and will correspond to the order of the components in the vectors involved in the plus and minus +operations. This can be demonstrated with the following example.

+
+
[49]:
+
+
+
# plus() and minus() have been defined for you. Here, the first three elements
+# of the vector to be added correspond to the pose (since it has 3 DOF), and the
+# last two to the bias.
+x_temp = x.plus(np.array([1,2,3,4,5]))
+print("\nResult after plus():")
+print(x_temp)
+
+dx = x_temp.minus(x)
+print("\nResult after minus():")
+print(dx)
+
+
+
+
+
+
+
+
+
+Result after plus():
+CompositeState(stamp=0.0, state_id=None) with substates:
+    SE2State(stamp=0.0, state_id=pose, direction=right)
+        [[ 0.45359612 -0.89120736  1.80531705]
+         [ 0.89120736  0.45359612  6.55185711]
+         [ 0.          0.          1.        ]]
+    VectorState(stamp=0.0, dof=2, state_id=bias)
+        [4.1 7. ]
+
+Result after minus():
+[[1.]
+ [2.]
+ [3.]
+ [4.]
+ [5.]]
+
+
+

Next, we must write a process model that works with this state. We’ll use the same process model as before, but now we’ll also include the wheel odometry bias in the state. The bias process model will be modelled as a random walk of the form

+
+\[\mathbf{b}_{k+1} = \mathbf{b}_k + \Delta t \mathbf{w}^\mathrm{bias}_k,\]
+

where \(\mathbf{w}^{\mathrm{bias}}_k \sim \mathcal{N}(0, \mathbf{Q}^{\mathrm{bias}})\) represents random error associated with this otherwise constant process model, which allows the bias to slowly vary. The process model for the composite state is then

+
+
[50]:
+
+
+
from scipy.linalg import expm
+
+def wedge_se2(x):
+    return np.array([[   0, -x[0], x[1]],
+                     [x[0],     0, x[2]],
+                     [   0,     0,    0]])
+
+class WheeledRobotWithBias(nav.ProcessModel):
+    def __init__(self, input_covariance_matrix):
+        self.Q = input_covariance_matrix
+
+    def evaluate(self, x: nav.CompositeState, u: nav.lib.VectorInput, dt:float):
+        pose = x.value[0]
+        bias = x.value[1]
+        vel = np.array([u.value[0] - bias.value[0], u.value[1] - bias.value[1], 0])
+        x_next = x.copy()
+        x_next.value[0].value = pose.value @ expm(wedge_se2(vel * dt))
+
+        # Largely data generation and jacobian purposes, we also update the bias
+        # state with an input, even if the input here is always zero in the
+        # nominal case.
+        x_next.value[1].value = bias.value + u.value[2:4]*dt
+        return x_next
+
+    def input_covariance(self, x: nav.CompositeState, u: nav.lib.VectorInput, dt:float):
+        return self.Q
+
+Q = np.eye(4) * 0.1**2
+process_model = WheeledRobotWithBias(Q)
+
+
+
+

We’d like to use the same measurement model as before, which was just a series of range measurements to known landmarks:

+
+
[51]:
+
+
+
class RangeToLandmarkSE2(nav.MeasurementModel):
+    def __init__(
+        self,
+        landmark_position: np.ndarray,
+        measurement_covariance: float,
+    ):
+        self.landmark_position = landmark_position
+        self.R = measurement_covariance
+
+    def evaluate(self, x: nav.lib.SE2State):
+        pos = x.value[0:2, 2]
+        return np.linalg.norm(pos - self.landmark_position)
+
+    def covariance(self, x: nav.lib.SE2State):
+        return self.R
+
+R = 0.1**2
+landmarks = np.array([[1, 1], [1, 2], [2, 2], [2, 1]])
+
+
+
+

The problem is that this was made for an SE2State instead of our new composite state, and specifically the line pos = x.value[0:2, 2] is going to throw an error when we feed in a composite state. This is easy to change, but then that means we have to make a similar change for all sorts of different state definitions. An alternative is to use the CompositeMeasurementModel, which is just a lightweight wrapper around one +measurement model that “assigns” the model to a specific substate, referenced to by its state_id field. It is used as follows:

+
+
[52]:
+
+
+
meas_models = []
+for lm in landmarks:
+    meas_models.append(
+        nav.CompositeMeasurementModel(RangeToLandmarkSE2(lm, R), "pose")
+    )
+
+print(meas_models[0])
+print("Jacobian:")
+print(meas_models[0].jacobian(x))
+
+
+
+
+
+
+
+
+RangeToLandmarkSE2(of substate pose)
+Jacobian:
+[[0.         0.46544123 0.88507893 0.         0.        ]]
+
+
+

This does mean that the state_id of each substate must be unique, but this is a good practice anyway. The CompositeMeasurementModel will then automatically handle the extraction of the relevant substate from the composite state and pass it to the measurement model, as well as handle the corresponding Jacobian accordingly. This is a good way to avoid having to write a lot of boilerplate code for different state definitions. Notice in the above example that the Jacobian has two extra zeros +at the end, which correspond to the bias state that has no effect on the measurement. This is automatically handled by the CompositeMeasurementModel.

+

With our problem now set up, we can run a filter on it with the same snippet as usual!

+
+
[53]:
+
+
+
dg = nav.DataGenerator(
+    process_model=process_model,
+    input_func=lambda t, x: np.array([0.5, 0.3, 0.0, 0.0]),
+    input_covariance= Q,
+    input_freq=50,
+    meas_model_list=meas_models,
+    meas_freq_list=[10, 10, 10, 10]
+)
+
+state_data, input_data, meas_data = dg.generate(x, start=0, stop=30, noise=True)
+
+# First, define the filter
+kalman_filter = nav.ExtendedKalmanFilter(process_model)
+P0 = np.diag([0.1**2, 1**2, 1**2, 0.1**2, 0.1**2])  # Initial covariance
+x = nav.StateWithCovariance(x, P0)  # Estimate and covariance in one container
+
+meas_idx = 0
+y = meas_data[meas_idx]
+estimates = []
+for k in range(len(input_data) - 1):
+    u = input_data[k]
+
+    # Fuse any measurements that have occurred.
+    while y.stamp < input_data[k + 1].stamp and meas_idx < len(meas_data):
+        x = kalman_filter.correct(x, y, u)
+
+        # Load the next measurement
+        meas_idx += 1
+        if meas_idx < len(meas_data):
+            y = meas_data[meas_idx]
+
+    # Predict until the next input is available
+    dt = input_data[k + 1].stamp - x.state.stamp
+    x = kalman_filter.predict(x, u, dt)
+
+    estimates.append(x.copy())
+
+
+results = nav.GaussianResultList.from_estimates(estimates, state_data)
+
+import matplotlib.pyplot as plt
+fig, axs = nav.plot_error(results)
+axs[0,0].set_title("Pose Estimation Errors")
+axs[0,0].set_ylabel("theta (rad)")
+axs[1,0].set_ylabel("x (m)")
+axs[2,0].set_ylabel("y (m)")
+axs[2,0].set_xlabel("Time (s)")
+axs[0, 1].set_title("Bias Estimation Errors")
+axs[0, 1].set_ylabel("ang. vel. (rad/s)")
+axs[1, 1].set_ylabel("forward vel. (m/s)")
+axs[1, 1].set_xlabel("Time (s)")
+
+fig, ax = nav.plot_nees(results)
+ax.set_title("NEES")
+ax.set_xlabel("Time (s)")
+plt.show()
+
+
+
+
+
+
+
+../_images/tutorial_composite_11_0.png +
+
+
+
+
+
+../_images/tutorial_composite_11_1.png +
+
+
+

Inheriting from CompositeState

+

The previous example showed how to use the CompositeState class directly, but it’s also possible to inherit from it. This is useful if you want to add some extra methods or attributes to the composite state, or if you are going to frequently be using the same composite state. Here’s an example of how you would do it:

+
+
[55]:
+
+
+
class WheeledRobotState(nav.CompositeState):
+    def __init__(self, pose_values: np.ndarray, bias_values: np.ndarray, stamp: float):
+        pose = nav.lib.SE2State(pose_values, stamp=stamp, state_id="pose")
+        bias = nav.lib.VectorState(bias_values, stamp=stamp, state_id="bias")
+        super().__init__([pose, bias], stamp=stamp)
+
+    # Define any getter that you want for convenience!
+    @property
+    def pose(self):
+        return self.value[0]
+
+    @property
+    def bias(self):
+        return self.value[1]
+
+    def copy(self):
+        return WheeledRobotState(self.pose.copy(), self.bias.copy())
+
+x = WheeledRobotState([0.1, 2.0, 3.0], [0.1, 2.0], stamp = 0.1)
+print(x)
+
+
+
+
+
+
+
+
+WheeledRobotState(stamp=0.1, state_id=None) with substates:
+    SE2State(stamp=0.1, state_id=pose, direction=right)
+        [[ 0.99500417 -0.09983342  1.84679329]
+         [ 0.09983342  0.99500417  3.09491919]
+         [ 0.          0.          1.        ]]
+    VectorState(stamp=0.1, dof=2, state_id=bias)
+        [0.1 2. ]
+SE2State(stamp=0.1, state_id=pose, direction=right)
+    [[ 0.99500417 -0.09983342  1.84679329]
+     [ 0.09983342  0.99500417  3.09491919]
+     [ 0.          0.          1.        ]]
+
+
+

This can end up looking a lot cleaner, and is potentially more flexible to work with since you can add methods and attributes to the composite state. For example, because of the getters we defined above, we can access the pose and bias more ergonomically with x.pose and x.bias.

+
+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/tutorial/composite.ipynb b/_build/html/tutorial/composite.ipynb new file mode 100644 index 00000000..8a00bfdb --- /dev/null +++ b/_build/html/tutorial/composite.ipynb @@ -0,0 +1,406 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Composite States\n", + "\n", + "The [CompositeState](../_autosummary/navlie.composite.CompositeState.rst) is a class that allows you to arbitarily combine multiple states, potentially of different types, into a new state that can be used with the navlie framework.\n", + "\n", + "Let's consider the previous example where we used the following $SE(2)$ pose transformation matrix to represent the state:\n", + "\n", + "$$ \n", + "\\mathbf{T} = \\begin{bmatrix} \\mathbf{C}_{ab} & \\mathbf{r}_a \\\\ \\mathbf{0} & 1 \\end{bmatrix} \\in SE(2).\n", + "$$\n", + "\n", + "Suppose we now also want to estimate a wheel odometry bias $\\mathbf{b} \\in \\mathbb{R}^2$ in addition to the robot's pose. Our state is now \n", + "\n", + "$$\n", + "\\mathbf{x} = (\\mathbf{T}, \\mathbf{b}) \\in SE(2) \\times \\mathbb{R}^2.\n", + "$$\n", + "\n", + "This can be implemented easily using the [CompositeState](../_autosummary/navlie.composite.CompositeState.rst) class in one of two ways: either directly or by inheritance. We'll show the former approach first." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CompositeState(stamp=0.0, state_id=None) with substates:\n", + " SE2State(stamp=0.0, state_id=pose, direction=right)\n", + " [[ 0.99500417 -0.09983342 1.84679329]\n", + " [ 0.09983342 0.99500417 3.09491919]\n", + " [ 0. 0. 1. ]]\n", + " VectorState(stamp=0.0, dof=2, state_id=bias)\n", + " [0.1 2. ]\n" + ] + } + ], + "source": [ + "import navlie as nav \n", + "import numpy as np\n", + "\n", + "# Define the pose and bias as their own states\n", + "T = nav.lib.SE2State(value = [0.1, 2.0, 3.0], stamp = 0.0, state_id=\"pose\")\n", + "b = nav.lib.VectorState(value = [0.1, 2.0], stamp = 0.0, state_id=\"bias\")\n", + "\n", + "# Combine into a composite state, and its ready to use!\n", + "x = nav.CompositeState([T, b], stamp=0.0)\n", + "\n", + "print(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The ``CompositeState`` class is a subclass of the ``State`` class, but who's ``value`` is a list of states, referred to as the *substates*. A convenience of this class is that the composite state's ``plus``, ``minus``, and ``copy`` methods have already been implemented for you based on the implementations in the substates. Note that the order in which the states are listed is important, and will correspond to the order of the components in the vectors involved in the ``plus`` and ``minus`` operations. This can be demonstrated with the following example." + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Result after plus():\n", + "CompositeState(stamp=0.0, state_id=None) with substates:\n", + " SE2State(stamp=0.0, state_id=pose, direction=right)\n", + " [[ 0.45359612 -0.89120736 1.80531705]\n", + " [ 0.89120736 0.45359612 6.55185711]\n", + " [ 0. 0. 1. ]]\n", + " VectorState(stamp=0.0, dof=2, state_id=bias)\n", + " [4.1 7. ]\n", + "\n", + "Result after minus():\n", + "[[1.]\n", + " [2.]\n", + " [3.]\n", + " [4.]\n", + " [5.]]\n" + ] + } + ], + "source": [ + "# plus() and minus() have been defined for you. Here, the first three elements\n", + "# of the vector to be added correspond to the pose (since it has 3 DOF), and the\n", + "# last two to the bias.\n", + "x_temp = x.plus(np.array([1,2,3,4,5]))\n", + "print(\"\\nResult after plus():\")\n", + "print(x_temp)\n", + "\n", + "dx = x_temp.minus(x)\n", + "print(\"\\nResult after minus():\")\n", + "print(dx)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we must write a process model that works with this state. We'll use the same process model as before, but now we'll also include the wheel odometry bias in the state. The bias process model will be modelled as a random walk of the form \n", + "\n", + "$$\n", + "\\mathbf{b}_{k+1} = \\mathbf{b}_k + \\Delta t \\mathbf{w}^\\mathrm{bias}_k,\n", + "$$\n", + "\n", + "where $\\mathbf{w}^{\\mathrm{bias}}_k \\sim \\mathcal{N}(0, \\mathbf{Q}^{\\mathrm{bias}})$ represents random error associated with this otherwise constant process model, which allows the bias to slowly vary. The process model for the composite state is then" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [], + "source": [ + "from scipy.linalg import expm\n", + "\n", + "def wedge_se2(x):\n", + " return np.array([[ 0, -x[0], x[1]],\n", + " [x[0], 0, x[2]], \n", + " [ 0, 0, 0]])\n", + "\n", + "class WheeledRobotWithBias(nav.ProcessModel):\n", + " def __init__(self, input_covariance_matrix):\n", + " self.Q = input_covariance_matrix\n", + "\n", + " def evaluate(self, x: nav.CompositeState, u: nav.lib.VectorInput, dt:float):\n", + " pose = x.value[0]\n", + " bias = x.value[1]\n", + " vel = np.array([u.value[0] - bias.value[0], u.value[1] - bias.value[1], 0])\n", + " x_next = x.copy()\n", + " x_next.value[0].value = pose.value @ expm(wedge_se2(vel * dt))\n", + "\n", + " # Largely data generation and jacobian purposes, we also update the bias\n", + " # state with an input, even if the input here is always zero in the\n", + " # nominal case.\n", + " x_next.value[1].value = bias.value + u.value[2:4]*dt\n", + " return x_next\n", + " \n", + " def input_covariance(self, x: nav.CompositeState, u: nav.lib.VectorInput, dt:float):\n", + " return self.Q\n", + "\n", + "Q = np.eye(4) * 0.1**2\n", + "process_model = WheeledRobotWithBias(Q)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'd like to use the same measurement model as before, which was just a series of range measurements to known landmarks:" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [], + "source": [ + "class RangeToLandmarkSE2(nav.MeasurementModel):\n", + " def __init__(\n", + " self,\n", + " landmark_position: np.ndarray,\n", + " measurement_covariance: float,\n", + " ):\n", + " self.landmark_position = landmark_position\n", + " self.R = measurement_covariance\n", + "\n", + " def evaluate(self, x: nav.lib.SE2State):\n", + " pos = x.value[0:2, 2]\n", + " return np.linalg.norm(pos - self.landmark_position)\n", + "\n", + " def covariance(self, x: nav.lib.SE2State):\n", + " return self.R\n", + " \n", + "R = 0.1**2\n", + "landmarks = np.array([[1, 1], [1, 2], [2, 2], [2, 1]])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The problem is that this was made for an ``SE2State`` instead of our new composite state, and specifically the line `pos = x.value[0:2, 2]` is going to throw an error when we feed in a composite state. This is easy to change, but then that means we have to make a similar change for all sorts of different state definitions. An alternative is to use the [CompositeMeasurementModel](../_autosummary/navlie.composite.CompositeMeasurementModel.rst), which is just a lightweight wrapper around one measurement model that \"assigns\" the model to a specific substate, referenced to by its `state_id` field. It is used as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "RangeToLandmarkSE2(of substate pose)\n", + "Jacobian:\n", + "[[0. 0.46544123 0.88507893 0. 0. ]]\n" + ] + } + ], + "source": [ + "meas_models = []\n", + "for lm in landmarks:\n", + " meas_models.append(\n", + " nav.CompositeMeasurementModel(RangeToLandmarkSE2(lm, R), \"pose\")\n", + " )\n", + "\n", + "print(meas_models[0])\n", + "print(\"Jacobian:\")\n", + "print(meas_models[0].jacobian(x))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This does mean that the `state_id` of each substate must be unique, but this is a good practice anyway. The `CompositeMeasurementModel` will then automatically handle the extraction of the relevant substate from the composite state and pass it to the measurement model, as well as handle the corresponding Jacobian accordingly. This is a good way to avoid having to write a lot of boilerplate code for different state definitions. Notice in the above example that the Jacobian has two extra zeros at the end, which correspond to the bias state that has no effect on the measurement. This is automatically handled by the `CompositeMeasurementModel`.\n", + "\n", + "With our problem now set up, we can run a filter on it with the same snippet as usual!" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "dg = nav.DataGenerator(\n", + " process_model=process_model, \n", + " input_func=lambda t, x: np.array([0.5, 0.3, 0.0, 0.0]), \n", + " input_covariance= Q, \n", + " input_freq=50, \n", + " meas_model_list=meas_models, \n", + " meas_freq_list=[10, 10, 10, 10] \n", + ")\n", + "\n", + "state_data, input_data, meas_data = dg.generate(x, start=0, stop=30, noise=True)\n", + "\n", + "# First, define the filter\n", + "kalman_filter = nav.ExtendedKalmanFilter(process_model)\n", + "P0 = np.diag([0.1**2, 1**2, 1**2, 0.1**2, 0.1**2]) # Initial covariance\n", + "x = nav.StateWithCovariance(x, P0) # Estimate and covariance in one container\n", + "\n", + "meas_idx = 0\n", + "y = meas_data[meas_idx]\n", + "estimates = []\n", + "for k in range(len(input_data) - 1):\n", + " u = input_data[k]\n", + "\n", + " # Fuse any measurements that have occurred.\n", + " while y.stamp < input_data[k + 1].stamp and meas_idx < len(meas_data):\n", + " x = kalman_filter.correct(x, y, u)\n", + "\n", + " # Load the next measurement\n", + " meas_idx += 1\n", + " if meas_idx < len(meas_data):\n", + " y = meas_data[meas_idx]\n", + "\n", + " # Predict until the next input is available\n", + " dt = input_data[k + 1].stamp - x.state.stamp\n", + " x = kalman_filter.predict(x, u, dt)\n", + "\n", + " estimates.append(x.copy())\n", + "\n", + "\n", + "results = nav.GaussianResultList.from_estimates(estimates, state_data)\n", + "\n", + "import matplotlib.pyplot as plt\n", + "fig, axs = nav.plot_error(results)\n", + "axs[0,0].set_title(\"Pose Estimation Errors\")\n", + "axs[0,0].set_ylabel(\"theta (rad)\")\n", + "axs[1,0].set_ylabel(\"x (m)\")\n", + "axs[2,0].set_ylabel(\"y (m)\")\n", + "axs[2,0].set_xlabel(\"Time (s)\")\n", + "axs[0, 1].set_title(\"Bias Estimation Errors\")\n", + "axs[0, 1].set_ylabel(\"ang. vel. (rad/s)\")\n", + "axs[1, 1].set_ylabel(\"forward vel. (m/s)\")\n", + "axs[1, 1].set_xlabel(\"Time (s)\")\n", + "\n", + "fig, ax = nav.plot_nees(results)\n", + "ax.set_title(\"NEES\")\n", + "ax.set_xlabel(\"Time (s)\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inheriting from `CompositeState`\n", + "\n", + "The previous example showed how to use the `CompositeState` class directly, but it's also possible to inherit from it. This is useful if you want to add some extra methods or attributes to the composite state, or if you are going to frequently be using the same composite state. Here's an example of how you would do it:" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WheeledRobotState(stamp=0.1, state_id=None) with substates:\n", + " SE2State(stamp=0.1, state_id=pose, direction=right)\n", + " [[ 0.99500417 -0.09983342 1.84679329]\n", + " [ 0.09983342 0.99500417 3.09491919]\n", + " [ 0. 0. 1. ]]\n", + " VectorState(stamp=0.1, dof=2, state_id=bias)\n", + " [0.1 2. ]\n", + "SE2State(stamp=0.1, state_id=pose, direction=right)\n", + " [[ 0.99500417 -0.09983342 1.84679329]\n", + " [ 0.09983342 0.99500417 3.09491919]\n", + " [ 0. 0. 1. ]]\n" + ] + } + ], + "source": [ + "class WheeledRobotState(nav.CompositeState):\n", + " def __init__(self, pose_values: np.ndarray, bias_values: np.ndarray, stamp: float):\n", + " pose = nav.lib.SE2State(pose_values, stamp=stamp, state_id=\"pose\")\n", + " bias = nav.lib.VectorState(bias_values, stamp=stamp, state_id=\"bias\")\n", + " super().__init__([pose, bias], stamp=stamp)\n", + "\n", + " # Define any getter that you want for convenience! \n", + " @property\n", + " def pose(self):\n", + " return self.value[0]\n", + "\n", + " @property\n", + " def bias(self):\n", + " return self.value[1]\n", + "\n", + " def copy(self):\n", + " return WheeledRobotState(self.pose.copy(), self.bias.copy())\n", + " \n", + "x = WheeledRobotState([0.1, 2.0, 3.0], [0.1, 2.0], stamp = 0.1)\n", + "print(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This can end up looking a lot cleaner, and is potentially more flexible to work with since you can add methods and attributes to the composite state. For example, because of the getters we defined above, we can access the pose and bias more ergonomically with `x.pose` and `x.bias`." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.16" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_build/html/tutorial/jacobians.html b/_build/html/tutorial/jacobians.html new file mode 100644 index 00000000..85718358 --- /dev/null +++ b/_build/html/tutorial/jacobians.html @@ -0,0 +1,485 @@ + + + + + + + + Jacobians in navlie — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + + + +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

Jacobians in navlie

+

As you may know, many state estimation algorithm require access to process model and measurement model Jacobians, with respect to the state and sometimes other inputs. For states belonging to Lie groups, algorithms will require Lie Jacobians, which differ from traditional derivatives as they conform to the constraints of the group. The abstraction provided by the \(\oplus\) and \(\ominus\) operators (implemented with State.plus and State.minus respectively) allow for a generic +definition of a derivative:

+
+\[\left.\frac{D f(\mathcal{X})}{D \mathcal{X}}\right|_{\bar{\mathcal{X}} }\triangleq \left.\frac{\partial f(\bar{\mathcal{X}} \oplus \delta \mathbf{x}) \ominus f(\bar{\mathcal{X}})}{\partial \delta \mathbf{x}}\right|_{\delta \mathbf{x} = \mathbf{0}},\]
+

which can be shown to fall back to a traditional derivatives when \(\oplus\) and \(\ominus\) are defined to be regular addition/subtraction. This derivative definition is used universally throughout navlie, and roughly follows what is done in the Micro Lie Theory paper. In that reference, seperate definitions are given for “left” and “right” derivatives, whereas we have aggregated them into a single definition, with left and right derivatives +naturally arising from the choice of \(\oplus\) and \(\ominus\) operators.

+

If you dont want to worry about this, the good news is that navlie computes Lie Jacobians for you by default using finite difference. However, finite difference can have some drawbacks, such as being computationally expensive and less accurate than analytic derivatives. In this notebook, we will show you how to use analytic derivatives in navlie, which offer the maximum accuracy and speed.

+
+

Jacobians - Traditional Approach

+

Recall the traditional approach to the previous example. We had defined the state to be \(\mathbf{x} = [\theta, x, y]^T\) and the process model to be

+
+\[\begin{split}\begin{aligned} +\theta_{k+1} &= \theta_k + \omega_k \Delta t \\ +x_{k+1} &= x_k + v_k \cos(\theta_k) \Delta t \\ +y_{k+1} &= y_k + v_k \sin(\theta_k) \Delta t +\end{aligned}\end{split}\]
+

where \(\omega_k\) is the angular velocity and \(v_k\) is the linear velocity. Since the state is just a regular vector, Lie Jacobians fall back to regular Jacobians, and standard derivative techniques lead to the following expressions for the process model Jacobian with respect to the state

+
+\[\begin{split}\mathbf{F} := \frac{\partial f(\mathbf{x}_k, \mathbf{u}_k)}{\partial \mathbf{x}_k} = \begin{bmatrix} 1 & 0 & 0 \\ -v_k \sin(\theta_k) \Delta t & 1 & 0 \\ v_k \cos(\theta_k) \Delta t & 0 & 1 \end{bmatrix}\end{split}\]
+

To implement this Jacobian in navlie, all we need to do is override the jacobian() method in our process model, and it will get used automatically by the estimation algorithms. Adding this to our process model from before:

+
+
[2]:
+
+
+
import navlie as nav
+import numpy as np
+
+from navlie.lib import VectorInput, VectorState
+
+Q = np.eye(2) * 0.1**2 # Input noise covariance with 0.1 m/s of standard deviation
+
+class WheeledRobot(nav.ProcessModel):
+    def __init__(self, input_covariance):
+        self.Q = input_covariance
+
+    def evaluate(self, x: VectorState, u: VectorInput, dt: float) -> VectorState:
+        x_next = x.copy()
+        x_next.value[0] += u.value[0] * dt
+        x_next.value[1] += u.value[1] * dt * np.cos(x.value[0])
+        x_next.value[2] += u.value[1] * dt * np.sin(x.value[0])
+        return x_next
+
+    def input_covariance(self, x: VectorState, u: VectorInput, dt: float) -> np.ndarray:
+        return self.Q
+
+    def jacobian(self, x:VectorState, u: VectorInput, dt: float) -> np.ndarray:
+        F = np.eye(3)
+        F[1, 0] = -u.value[1] * dt * np.sin(x.value[0])
+        F[2, 0] = u.value[1] * dt * np.cos(x.value[0])
+        return F
+
+process_model = WheeledRobot(Q) # instantiate it
+
+
+
+

Now, lets just double check that we did everything correctly by comparing with finite difference. All process models inherit the jacobian_fd() method, which computes the Jacobian using finite difference. We can use this to compare with our analytic Jacobian.

+
+
[3]:
+
+
+
x = VectorState([1,2,3])
+u = VectorInput([0.1, 0.2])
+dt = 0.1
+
+print("Analyical:")
+print(process_model.jacobian(x, u, dt))
+
+print("\nFinite difference:")
+print(process_model.jacobian_fd(x, u, dt))
+
+
+
+
+
+
+
+
+Analyical:
+[[ 1.          0.          0.        ]
+ [-0.01682942  1.          0.        ]
+ [ 0.01080605  0.          1.        ]]
+
+Finite difference:
+[[ 1.          0.          0.        ]
+ [-0.01682943  1.          0.        ]
+ [ 0.01080604  0.          1.        ]]
+
+
+

The Jacobians match almost perfectly, but differ slightly due to errors in finite difference. This is expected, as finite difference is only an approximation. Nevertheless, finite difference is generally sufficiently accurate for most applications.

+

Note: The jacobian methods must always return a 2D array.

+

Moving on to the measurement model, which was previously defined to be

+
+\[\mathbf{y}_k = || \mathbf{r}_k - \boldsymbol{\ell}^{(i)} ||\]
+

where \(\mathbf{r}_k\) is the robot’s position and \(\boldsymbol{\ell}^{(i)}\) is the \(i\)th landmark. The measurement model Jacobian with respect to the state is

+
+\[\mathbf{G} := \frac{\partial g(\mathbf{x}_k)}{\partial \mathbf{x}_k} = \begin{bmatrix} 0 & \frac{(\mathbf{r}_k - \boldsymbol{\ell}^{(i)})^T}{||(\mathbf{r}_k - \boldsymbol{\ell}^{(i)})||} \end{bmatrix},\]
+

and we can implement this in navlie by again overriding the jacobian() method in our measurement model. Adding this to our measurement model from before:

+
+
[4]:
+
+
+
class RangeToLandmark(nav.MeasurementModel):
+    def __init__(self, landmark_position: np.ndarray):
+        self.landmark_position = landmark_position
+
+    def evaluate(self, x: VectorState) -> np.ndarray:
+        return np.linalg.norm(x.value[1:] - self.landmark_position)
+
+    def covariance(self, x: VectorState) -> np.ndarray:
+        return 0.1**2
+
+    def jacobian(self, x: VectorState) -> np.ndarray:
+        G = np.zeros((1, 3))
+        r = x.value[1:]
+        G[0,1:] = (r - self.landmark_position) / np.linalg.norm(r - self.landmark_position)
+        return G
+
+meas_model = RangeToLandmark(np.array([1, 2]))
+
+print("\nAnalyical:")
+print(meas_model.jacobian(x))
+
+print("\nFinite difference:")
+print(meas_model.jacobian_fd(x))
+
+
+
+
+
+
+
+
+
+Analyical:
+[[0.         0.70710678 0.70710678]]
+
+Finite difference:
+[[0.         0.70710696 0.70710696]]
+
+
+

We can again see that the results match nicely.

+
+
+

Jacobians - Lie Group Approach

+

Now, lets see how to implement analytical Jacobians when states belong to Lie groups. In the previous example the state was \(\mathbf{T} \in SE(2)\) and the process model was

+
+\[\mathbf{T}_{k+1} = \mathbf{T}_k \exp(\boldsymbol{\varpi}^\wedge_k \Delta t).\]
+

To derive the Jacobian, we can “perturb” both sides of the equation and manipulate. This is a common technique for deriving Lie Jacobians, and for computing matrix-vector derivatives in general. For more details, we recommend reading State Estimation for Robotics by Tim Barfoot.

+
+\[\begin{split}\begin{aligned} +\mathbf{T}_{k+1} &= \mathbf{T}_k \exp(\boldsymbol{\varpi}^\wedge_k \Delta t) \\ +\bar{\mathbf{T}}_{k+1} \exp(\delta \boldsymbol{\xi}_{k+1}^\wedge) &= \bar{\mathbf{T}}_{k} \exp(\delta \boldsymbol{\xi}_{k}^\wedge) \exp(\boldsymbol{\varpi}^\wedge_k \Delta t) \\ + \exp(\delta \boldsymbol{\xi}_{k+1}^\wedge) &= \underbrace{\bar{\mathbf{T}}_{k+1}^{-1} \bar{\mathbf{T}}_{k}}_{\exp(\boldsymbol{\varpi}^\wedge \Delta t)^{-1}} \exp(\delta \boldsymbol{\xi}_{k}^\wedge) \exp(\boldsymbol{\varpi}^\wedge_k \Delta t) \\ + \exp(\delta \boldsymbol{\xi}_{k+1}^\wedge) &= \exp((\mathbf{Ad}(\exp(\boldsymbol{\varpi}^\wedge \Delta t)^{-1}) \delta \boldsymbol{\xi}_{k})^\wedge) \\ + \delta \boldsymbol{\xi}_{k+1} &= \underbrace{\mathbf{Ad}(\exp(\boldsymbol{\varpi}^\wedge \Delta t)^{-1})}_{\mathbf{F}} \delta \boldsymbol{\xi}_{k} +\end{aligned}\end{split}\]
+

There, we used the adjoint matrix \(\mathbf{Ad}(\cdot)\), to invoke the identity \(\mathbf{X}^{-1} \exp(\boldsymbol{\xi}^\wedge) \mathbf{X} = \exp(\mathbf{Ad}(\mathbf{X}) \boldsymbol{\xi}^\wedge)\), which is true for any \(\mathbf{X} \in SE(2)\). The adjoint matrix for \(SE(2)\) is given by

+
+\[\begin{split}\mathbf{Ad}(\mathbf{T}) = \begin{bmatrix} 1 & \mathbf{0} \\ - \boldsymbol{\Omega} \mathbf{r} & \mathbf{C} \end{bmatrix}\end{split}\]
+

where \(\boldsymbol{\Omega} = \begin{bmatrix} 0 & -1 \\ 1 &0 \end{bmatrix}\).

+

Note: in this Jacobian derivation, we perturbed the state \(\mathbf{T} = \bar{\mathbf{T}} \exp(\delta \boldsymbol{\xi}^\wedge)\) “on the right” because that corresponds to what was implemented in the plus() method of our SE2State class. It is important to be consistent here for everything to work.

+

Now, we can implement this Jacobian in navlie by overriding the jacobian() method in our process model. Adding this to our process model from before:

+
+
[6]:
+
+
+
from navlie.lib import SE2State, VectorInput
+from scipy.linalg import expm
+
+
+def wedge_se2(x:np):
+    return np.array([[   0, -x[0], x[1]],
+                     [x[0],     0, x[2]],
+                     [   0,     0,    0]])
+
+def adjoint_se2(T:np.ndarray):
+    C = T[:2, :2]
+    r = T[:2, 2]
+    Omega = np.array([[0, -1], [1, 0]])
+    Ad = np.zeros((3,3))
+    Ad[0,0] = 1
+    Ad[1:,1:] = C
+    Ad[1:,0] = - Omega @ r
+    return Ad
+
+
+class WheeledRobotSE2(nav.ProcessModel):
+    def __init__(self, input_covariance_matrix):
+        self.Q = input_covariance_matrix
+
+    def evaluate(self, x:SE2State, u:VectorInput, dt:float):
+        u = np.array([u.value[0], u.value[1], 0])
+        x_next = x.copy()
+        x_next.value = x.value @ expm(wedge_se2(u * dt))
+        return x_next
+    def input_covariance(self, x:SE2State, u:VectorInput, dt:float):
+        return self.Q
+
+    def jacobian(self, x:SE2State, u:VectorInput, dt:float):
+        u = np.array([u.value[0], u.value[1], 0])
+        return adjoint_se2(expm(-wedge_se2(u * dt)))
+
+Q = np.eye(2) * 0.1**2
+process_model = WheeledRobotSE2(Q)
+x = SE2State(expm(wedge_se2(np.array([1,2,3]))))
+u = VectorInput([4, 2])
+dt = 0.1
+
+print("\nAnalyical:")
+print(process_model.jacobian(x, u, dt))
+
+print("\nFinite difference:")
+print(process_model.jacobian_fd(x, u, dt))
+
+
+
+
+
+
+
+
+
+Analyical:
+[[ 1.          0.          0.        ]
+ [ 0.0394695   0.92106099  0.38941834]
+ [ 0.19470917 -0.38941834  0.92106099]]
+
+Finite difference:
+[[ 1.00000000e+00 -1.10747782e-11 -1.10747782e-11]
+ [ 3.94695038e-02  9.21060995e-01  3.89418343e-01]
+ [ 1.94709171e-01 -3.89418342e-01  9.21060994e-01]]
+
+
+

Note that when using Lie groups, our Jacobian no longer has dependence on the state itself. This can be a tangible advantage when the state estimate has high uncertainty, where using a traditional approach can result in excessive linearization errors when the state estimate is far from the true value.

+
+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/tutorial/jacobians.ipynb b/_build/html/tutorial/jacobians.ipynb new file mode 100644 index 00000000..49b93bd8 --- /dev/null +++ b/_build/html/tutorial/jacobians.ipynb @@ -0,0 +1,340 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Jacobians in navlie\n", + "\n", + "As you may know, many state estimation algorithm require access to process model and measurement model Jacobians, with respect to the state and sometimes other inputs. For states belonging to Lie groups, algorithms will require _Lie Jacobians_, which differ from traditional derivatives as they conform to the constraints of the group. The abstraction provided by the $\\oplus$ and $\\ominus$ operators (implemented with `State.plus` and `State.minus` respectively) allow for a generic definition of a derivative:\n", + "\n", + "$$\n", + "\\left.\\frac{D f(\\mathcal{X})}{D \\mathcal{X}}\\right|_{\\bar{\\mathcal{X}} }\\triangleq \\left.\\frac{\\partial f(\\bar{\\mathcal{X}} \\oplus \\delta \\mathbf{x}) \\ominus f(\\bar{\\mathcal{X}})}{\\partial \\delta \\mathbf{x}}\\right|_{\\delta \\mathbf{x} = \\mathbf{0}},\n", + "$$\n", + "\n", + "which can be shown to fall back to a traditional derivatives when $\\oplus$ and $\\ominus$ are defined to be regular addition/subtraction. This derivative definition is used universally throughout navlie, and roughly follows what is done in the [Micro Lie Theory paper](https://arxiv.org/pdf/1812.01537.pdf). In that reference, seperate definitions are given for \"left\" and \"right\" derivatives, whereas we have aggregated them into a single definition, with left and right derivatives naturally arising from the choice of $\\oplus$ and $\\ominus$ operators.\n", + "\n", + "If you dont want to worry about this, the good news is that navlie computes Lie Jacobians for you by default using finite difference. However, finite difference can have some drawbacks, such as being computationally expensive and less accurate than analytic derivatives. In this notebook, we will show you how to use analytic derivatives in navlie, which offer the maximum accuracy and speed.\n", + "\n", + "## Jacobians - Traditional Approach\n", + "Recall the traditional approach to the previous example. We had defined the state to be $\\mathbf{x} = [\\theta, x, y]^T$ and the process model to be\n", + "\n", + "$$ \n", + "\\begin{aligned}\n", + "\\theta_{k+1} &= \\theta_k + \\omega_k \\Delta t \\\\\n", + "x_{k+1} &= x_k + v_k \\cos(\\theta_k) \\Delta t \\\\\n", + "y_{k+1} &= y_k + v_k \\sin(\\theta_k) \\Delta t\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "where $\\omega_k$ is the angular velocity and $v_k$ is the linear velocity. Since the state is just a regular vector, Lie Jacobians fall back to regular Jacobians, and standard derivative techniques lead to the following expressions for the process model Jacobian with respect to the state\n", + "\n", + "$$\n", + "\\mathbf{F} := \\frac{\\partial f(\\mathbf{x}_k, \\mathbf{u}_k)}{\\partial \\mathbf{x}_k} = \\begin{bmatrix} 1 & 0 & 0 \\\\ -v_k \\sin(\\theta_k) \\Delta t & 1 & 0 \\\\ v_k \\cos(\\theta_k) \\Delta t & 0 & 1 \\end{bmatrix}\n", + "$$\n", + "\n", + "To implement this Jacobian in navlie, all we need to do is override the `jacobian()` method in our process model, and it will get used automatically by the estimation algorithms. Adding this to our process model from before:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import navlie as nav\n", + "import numpy as np\n", + "\n", + "from navlie.lib import VectorInput, VectorState\n", + "\n", + "Q = np.eye(2) * 0.1**2 # Input noise covariance with 0.1 m/s of standard deviation\n", + "\n", + "class WheeledRobot(nav.ProcessModel):\n", + " def __init__(self, input_covariance):\n", + " self.Q = input_covariance\n", + "\n", + " def evaluate(self, x: VectorState, u: VectorInput, dt: float) -> VectorState:\n", + " x_next = x.copy()\n", + " x_next.value[0] += u.value[0] * dt\n", + " x_next.value[1] += u.value[1] * dt * np.cos(x.value[0])\n", + " x_next.value[2] += u.value[1] * dt * np.sin(x.value[0])\n", + " return x_next\n", + "\n", + " def input_covariance(self, x: VectorState, u: VectorInput, dt: float) -> np.ndarray:\n", + " return self.Q\n", + " \n", + " def jacobian(self, x:VectorState, u: VectorInput, dt: float) -> np.ndarray:\n", + " F = np.eye(3)\n", + " F[1, 0] = -u.value[1] * dt * np.sin(x.value[0])\n", + " F[2, 0] = u.value[1] * dt * np.cos(x.value[0])\n", + " return F\n", + "\n", + "process_model = WheeledRobot(Q) # instantiate it" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, lets just double check that we did everything correctly by comparing with finite difference. All process models inherit the `jacobian_fd()` method, which computes the Jacobian using finite difference. We can use this to compare with our analytic Jacobian." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Analyical:\n", + "[[ 1. 0. 0. ]\n", + " [-0.01682942 1. 0. ]\n", + " [ 0.01080605 0. 1. ]]\n", + "\n", + "Finite difference:\n", + "[[ 1. 0. 0. ]\n", + " [-0.01682943 1. 0. ]\n", + " [ 0.01080604 0. 1. ]]\n" + ] + } + ], + "source": [ + "x = VectorState([1,2,3]) \n", + "u = VectorInput([0.1, 0.2]) \n", + "dt = 0.1 \n", + "\n", + "print(\"Analyical:\")\n", + "print(process_model.jacobian(x, u, dt))\n", + "\n", + "print(\"\\nFinite difference:\")\n", + "print(process_model.jacobian_fd(x, u, dt))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The Jacobians match almost perfectly, but differ slightly due to errors in finite difference. This is expected, as finite difference is only an approximation. Nevertheless, finite difference is generally sufficiently accurate for most applications.\n", + "\n", + "
\n", + "Note: The `jacobian` methods must *always* return a 2D array.\n", + "
\n", + "\n", + "\n", + "\n", + "Moving on to the measurement model, which was previously defined to be \n", + "\n", + "$$\n", + "\\mathbf{y}_k = || \\mathbf{r}_k - \\boldsymbol{\\ell}^{(i)} || \n", + "$$ \n", + "\n", + "where $\\mathbf{r}_k$ is the robot's position and $\\boldsymbol{\\ell}^{(i)}$ is the $i$th landmark. The measurement model Jacobian with respect to the state is\n", + "\n", + "$$ \n", + "\\mathbf{G} := \\frac{\\partial g(\\mathbf{x}_k)}{\\partial \\mathbf{x}_k} = \\begin{bmatrix} 0 & \\frac{(\\mathbf{r}_k - \\boldsymbol{\\ell}^{(i)})^T}{||(\\mathbf{r}_k - \\boldsymbol{\\ell}^{(i)})||} \\end{bmatrix},\n", + "$$\n", + "\n", + "and we can implement this in navlie by again overriding the `jacobian()` method in our measurement model. Adding this to our measurement model from before:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Analyical:\n", + "[[0. 0.70710678 0.70710678]]\n", + "\n", + "Finite difference:\n", + "[[0. 0.70710696 0.70710696]]\n" + ] + } + ], + "source": [ + "class RangeToLandmark(nav.MeasurementModel):\n", + " def __init__(self, landmark_position: np.ndarray):\n", + " self.landmark_position = landmark_position\n", + "\n", + " def evaluate(self, x: VectorState) -> np.ndarray:\n", + " return np.linalg.norm(x.value[1:] - self.landmark_position)\n", + " \n", + " def covariance(self, x: VectorState) -> np.ndarray:\n", + " return 0.1**2\n", + " \n", + " def jacobian(self, x: VectorState) -> np.ndarray:\n", + " G = np.zeros((1, 3))\n", + " r = x.value[1:]\n", + " G[0,1:] = (r - self.landmark_position) / np.linalg.norm(r - self.landmark_position)\n", + " return G\n", + " \n", + "meas_model = RangeToLandmark(np.array([1, 2]))\n", + "\n", + "print(\"\\nAnalyical:\")\n", + "print(meas_model.jacobian(x))\n", + "\n", + "print(\"\\nFinite difference:\")\n", + "print(meas_model.jacobian_fd(x))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can again see that the results match nicely." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Jacobians - Lie Group Approach \n", + "\n", + "Now, lets see how to implement analytical Jacobians when states belong to Lie groups. In the previous example the state was $\\mathbf{T} \\in SE(2)$ and the process model was\n", + "\n", + "$$\n", + "\\mathbf{T}_{k+1} = \\mathbf{T}_k \\exp(\\boldsymbol{\\varpi}^\\wedge_k \\Delta t).\n", + "$$\n", + "\n", + "To derive the Jacobian, we can \"perturb\" both sides of the equation and manipulate. This is a common technique for deriving Lie Jacobians, and for computing matrix-vector derivatives in general. For more details, we recommend reading [State Estimation for Robotics by Tim Barfoot](http://asrl.utias.utoronto.ca/~tdb/bib/barfoot_ser17.pdf).\n", + "\n", + "$$ \n", + "\\begin{aligned}\n", + "\\mathbf{T}_{k+1} &= \\mathbf{T}_k \\exp(\\boldsymbol{\\varpi}^\\wedge_k \\Delta t) \\\\\n", + "\\bar{\\mathbf{T}}_{k+1} \\exp(\\delta \\boldsymbol{\\xi}_{k+1}^\\wedge) &= \\bar{\\mathbf{T}}_{k} \\exp(\\delta \\boldsymbol{\\xi}_{k}^\\wedge) \\exp(\\boldsymbol{\\varpi}^\\wedge_k \\Delta t) \\\\\n", + " \\exp(\\delta \\boldsymbol{\\xi}_{k+1}^\\wedge) &= \\underbrace{\\bar{\\mathbf{T}}_{k+1}^{-1} \\bar{\\mathbf{T}}_{k}}_{\\exp(\\boldsymbol{\\varpi}^\\wedge \\Delta t)^{-1}} \\exp(\\delta \\boldsymbol{\\xi}_{k}^\\wedge) \\exp(\\boldsymbol{\\varpi}^\\wedge_k \\Delta t) \\\\\n", + " \\exp(\\delta \\boldsymbol{\\xi}_{k+1}^\\wedge) &= \\exp((\\mathbf{Ad}(\\exp(\\boldsymbol{\\varpi}^\\wedge \\Delta t)^{-1}) \\delta \\boldsymbol{\\xi}_{k})^\\wedge) \\\\\n", + " \\delta \\boldsymbol{\\xi}_{k+1} &= \\underbrace{\\mathbf{Ad}(\\exp(\\boldsymbol{\\varpi}^\\wedge \\Delta t)^{-1})}_{\\mathbf{F}} \\delta \\boldsymbol{\\xi}_{k}\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "There, we used the _adjoint matrix_ $\\mathbf{Ad}(\\cdot)$, to invoke the identity $\\mathbf{X}^{-1} \\exp(\\boldsymbol{\\xi}^\\wedge) \\mathbf{X} = \\exp(\\mathbf{Ad}(\\mathbf{X}) \\boldsymbol{\\xi}^\\wedge)$, which is true for any $\\mathbf{X} \\in SE(2)$. The adjoint matrix for $SE(2)$ is given by \n", + "\n", + "$$ \n", + "\\mathbf{Ad}(\\mathbf{T}) = \\begin{bmatrix} 1 & \\mathbf{0} \\\\ - \\boldsymbol{\\Omega} \\mathbf{r} & \\mathbf{C} \\end{bmatrix}\n", + "$$\n", + "\n", + "where $\\boldsymbol{\\Omega} = \\begin{bmatrix} 0 & -1 \\\\ 1 \n", + "&0 \\end{bmatrix}$.\n", + "\n", + "
\n", + "Note: in this Jacobian derivation, we perturbed the state $\\mathbf{T} = \\bar{\\mathbf{T}} \\exp(\\delta \\boldsymbol{\\xi}^\\wedge)$ \"on the right\" because that corresponds to what was implemented in the `plus()` method of our `SE2State` class. It is important to be consistent here for everything to work.\n", + "
\n", + "\n", + "Now, we can implement this Jacobian in navlie by overriding the `jacobian()` method in our process model. Adding this to our process model from before:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Analyical:\n", + "[[ 1. 0. 0. ]\n", + " [ 0.0394695 0.92106099 0.38941834]\n", + " [ 0.19470917 -0.38941834 0.92106099]]\n", + "\n", + "Finite difference:\n", + "[[ 1.00000000e+00 -1.10747782e-11 -1.10747782e-11]\n", + " [ 3.94695038e-02 9.21060995e-01 3.89418343e-01]\n", + " [ 1.94709171e-01 -3.89418342e-01 9.21060994e-01]]\n" + ] + } + ], + "source": [ + "from navlie.lib import SE2State, VectorInput\n", + "from scipy.linalg import expm\n", + "\n", + "\n", + "def wedge_se2(x:np):\n", + " return np.array([[ 0, -x[0], x[1]],\n", + " [x[0], 0, x[2]], \n", + " [ 0, 0, 0]])\n", + "\n", + "def adjoint_se2(T:np.ndarray):\n", + " C = T[:2, :2]\n", + " r = T[:2, 2]\n", + " Omega = np.array([[0, -1], [1, 0]])\n", + " Ad = np.zeros((3,3))\n", + " Ad[0,0] = 1\n", + " Ad[1:,1:] = C\n", + " Ad[1:,0] = - Omega @ r\n", + " return Ad\n", + "\n", + "\n", + "class WheeledRobotSE2(nav.ProcessModel):\n", + " def __init__(self, input_covariance_matrix):\n", + " self.Q = input_covariance_matrix\n", + "\n", + " def evaluate(self, x:SE2State, u:VectorInput, dt:float):\n", + " u = np.array([u.value[0], u.value[1], 0])\n", + " x_next = x.copy()\n", + " x_next.value = x.value @ expm(wedge_se2(u * dt))\n", + " return x_next\n", + " def input_covariance(self, x:SE2State, u:VectorInput, dt:float):\n", + " return self.Q\n", + "\n", + " def jacobian(self, x:SE2State, u:VectorInput, dt:float):\n", + " u = np.array([u.value[0], u.value[1], 0])\n", + " return adjoint_se2(expm(-wedge_se2(u * dt)))\n", + "\n", + "Q = np.eye(2) * 0.1**2\n", + "process_model = WheeledRobotSE2(Q)\n", + "x = SE2State(expm(wedge_se2(np.array([1,2,3]))))\n", + "u = VectorInput([4, 2])\n", + "dt = 0.1\n", + "\n", + "print(\"\\nAnalyical:\")\n", + "print(process_model.jacobian(x, u, dt))\n", + "\n", + "print(\"\\nFinite difference:\")\n", + "print(process_model.jacobian_fd(x, u, dt))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that when using Lie groups, our Jacobian no longer has dependence on the state itself. This can be a tangible advantage when the state estimate has high uncertainty, where using a traditional approach can result in excessive linearization errors when the state estimate is far from the true value." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.16" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_build/html/tutorial/lie_groups.html b/_build/html/tutorial/lie_groups.html new file mode 100644 index 00000000..69255e94 --- /dev/null +++ b/_build/html/tutorial/lie_groups.html @@ -0,0 +1,566 @@ + + + + + + + + Toy Problem - Lie group approach — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
+ +
+ +
+

Toy Problem - Lie group approach

+

Toy Problem

+

Another way we could approach the same state estimation task is to instead use Lie group theory, which is becoming increasingly common practice in state estimation. Lie group theory can be very abstract, and the main references that navlie refer to are the following:

+
    +
  1. A micro Lie theory for state estimation in robotics

  2. +
  3. T.Barfoot, State Estimation for Robotics

  4. +
+
+

Define the State

+

Instead of representing the state using a vector, we will represent the state using an element of the special Euclidean group \(SE(2)\), sometimes called pose transformation matrices. Elements of this group are 3x3 matrices of the form

+
+\[\begin{split}\mathbf{T} = \begin{bmatrix} \mathbf{C}_{ab}(\theta) & \mathbf{r}_a \\ \mathbf{0} & 1 \end{bmatrix} \in SE(2)\end{split}\]
+

where \(\mathbf{r}_a = [x,y]^T\) again denotes the position of the robot and \(\mathbf{C}_{ab}(\theta) \in SO(2)\) is a rotation matrix (sometimes called a direction cosine matrix) with the form

+
+\[\begin{split}\mathbf{C}_{ab}(\theta) = \begin{bmatrix} \cos \theta & - \sin \theta \\ \sin \theta & \cos \theta \end{bmatrix}.\end{split}\]
+

The rotation matrix transforms vectors resolved in one frame to another frame, i.e. \(\mathbf{r}_a = \mathbf{C}_{ab} \mathbf{r}_b\). Unlike vectors, elements of \(SO(2)\) or \(SE(2)\) cannot be added together to produce another valid element of \(SE(2)\), but they can be multiplied together with the result still having the same form.

+
+\[\mathbf{T}_1 \mathbf{T}_2 \in SE(2)\]
+

To proceed further with our mathematical setup, we need to define a few very common operators seen in Lie group theory. The first two are the “wedge” \((\cdot)^\wedge\) and “vee” \((\cdot)^\vee\) operators, which for this specific group has the form

+
+\[\begin{split}\begin{bmatrix} \theta \\ x \\ y \end{bmatrix}^\wedge = \begin{bmatrix} 0 & -\theta & x \\ \theta & 0 & y \\ 0 & 0 & 0 \end{bmatrix}\end{split}\]
+

and the \((\cdot)^\vee\) operator simply does the exact inverse of \((\cdot)^\wedge\). We can implement them as follows.

+
+
[28]:
+
+
+
%reset -f
+import numpy as np
+
+# Helper functions for SE(2)
+def wedge_se2(x):
+    return np.array([[   0, -x[0], x[1]],
+                     [x[0],     0, x[2]],
+                     [   0,     0,    0]])
+
+def vee_se2(X):
+    return np.array([X[1, 0], X[0, 2], X[1, 2]])
+
+
+
+

Two other fundamental relationships appearing in Lie group theory are the exponential (denoted \(\exp\)) and logarithmic (denoted \(\log\)) maps. While these have a deeper definition, for our case it suffices to think of them as simply the matrix exponential and matrix logarithm. Using the wedge and vee operators for \(SE(2)\) defined above, we can convert a 3x1 vector to +an \(SE(2)\) element and back as follows

+
+
[32]:
+
+
+
from scipy.linalg import expm, logm
+
+T = expm(wedge_se2(np.array([0.1, 0.2, 0.3])))
+print("An element of SE2:")
+print(T)
+
+x = vee_se2(logm(T))
+print("\nThe original vector 'representing' it:")
+print(x)
+
+
+
+
+
+
+
+
+An element of SE2:
+[[ 0.99500417 -0.09983342  0.18467933]
+ [ 0.09983342  0.99500417  0.30949192]
+ [ 0.          0.          1.        ]]
+
+The original vector 'representing' it:
+[0.1 0.2 0.3]
+
+
+

We now have the tools we need to abstract-ify our problem a little bit. As commonly seen in the literature, we can define the so-called “oplus” and “ominus” operators as follows (sometimes called “boxplus” \(\boxplus\) and “boxminus” \(\boxminus\)):

+
+\[\begin{split}\begin{aligned} +\mathbf{T}_2 &= \mathbf{T}_1 \oplus \boldsymbol{\xi} := \mathbf{T}_1 \exp(\boldsymbol{\xi}^\wedge) \\ +\boldsymbol{\varepsilon} &= \mathbf{T}_2 \ominus \mathbf{T}_1 := \log(\mathbf{T}_2^{-1} \mathbf{T}_1)^\vee +\end{aligned}\end{split}\]
+

Here, both \(\boldsymbol{\varepsilon}, \boldsymbol{\xi} \in \mathbb{R}^3\) are 3x1 vectors. The \(\oplus: SE(2) \times \mathbb{R}^3 \to SE(2)\) operator “adds” a vector to an \(SE(2)\) element to produce another \(SE(2)\) element, and the \(\ominus:SE(2) \times SE(2) \to \mathbb{R}^3\) operator “subtracts” two \(SE(2)\) elements to produce a vector that represents the “difference” between them.

+

With this context, lets implement an \(SE(2)\) state inside navlie’s framework. To define a custom state, you must subclass the nav.State abstract class and you must implement the plus, minus, and copy methods. These methods play exactly the role of \(\oplus\) and \(\ominus\) described above, while the copy method is used to create a deep copy of that state object. In addition, state objects must hold an integer property named dof that specifies the degrees +of freedom associated with that state. For \(SE(2)\), this is 3.

+
+
[8]:
+
+
+
import navlie as nav
+
+class SE2State(nav.State):
+    def __init__(self, value :np.ndarray, stamp: float):
+        super().__init__(value=value, dof=3, stamp=stamp)
+
+    def plus(self, dx: np.ndarray):
+        new_value = self.value @ expm(wedge_se2(dx))
+        return SE2State(new_value, self.stamp)
+
+    def minus(self, other: "SE2State"):
+        other_inv = np.linalg.inv(other.value)
+        return vee_se2(logm(other_inv @ self.value))
+
+    def copy(self):
+        return SE2State(self.value.copy(), self.stamp)
+
+x = SE2State(np.eye(3), 0.0)
+print(x)
+
+
+
+
+
+
+
+
+SE2State(stamp=0.0, dof=3, state_id=None)
+    [[1. 0. 0.]
+     [0. 1. 0.]
+     [0. 0. 1.]]
+
+
+
+
+

Define the Process Model

+

Now, we must adapt the process model to work with our new SE2State. It is well known that the rotational kinematics can be written directly in terms of rotation matrices using

+
+\[\begin{split}\dot{\mathbf{C}}_{ab} = \mathbf{C}_{ab}\begin{bmatrix}0 & -\omega \\ \omega & 0 \end{bmatrix}\end{split}\]
+

and that the translational kinematics can be written in vector form using

+
+\[\begin{split}\dot{\mathbf{r}}_a = \mathbf{C}_{ab} \begin{bmatrix} v \\ 0 \end{bmatrix} .\end{split}\]
+

By stacking these into matrices it follows that

+
+\[\dot{\mathbf{T}} = \mathbf{T} \boldsymbol{\varpi}^\wedge\]
+

where \(\boldsymbol{\varpi} = [\omega, v, 0]^T\). This equation is now a linear, matrix-valued ODE, and can be integrated exactly over a short duration \(\Delta t = t_{k+1} - t_k\) using the matrix exponential. This gives us the following discrete-time process model:

+
+\[\mathbf{T}_{k+1} = \mathbf{T}_k \exp(\boldsymbol{\varpi}_k^\wedge \Delta t)\]
+

which we can implement as follows

+
+
[9]:
+
+
+
class WheeledRobotSE2(nav.ProcessModel):
+    def __init__(self, input_covariance_matrix):
+        self.Q = input_covariance_matrix
+
+    def evaluate(self, x:SE2State, u:nav.lib.VectorInput, dt:float):
+        vel = np.array([u.value[0], u.value[1], 0])
+        x_next = x.copy()
+        x_next.value = x.value @ expm(wedge_se2(vel * dt))
+        return x_next
+
+    def input_covariance(self, x:SE2State, u:nav.lib.VectorInput, dt:float):
+        return self.Q
+
+Q = np.eye(2) * 0.1**2
+process_model = WheeledRobotSE2(Q)
+
+
+
+
+
+

Define the Measurement Model

+

Finally, our measurement model remains largely unchanged. We just need to extract the position from an SE2State object now, as done below.

+
+
[10]:
+
+
+
class RangeToLandmarkSE2(nav.MeasurementModel):
+    def __init__(
+        self,
+        landmark_position: np.ndarray,
+        measurement_covariance: float,
+    ):
+        self.landmark_position = landmark_position
+        self.R = measurement_covariance
+
+    def evaluate(self, x: SE2State):
+        pos = x.value[0:2, 2]
+        return np.linalg.norm(pos - self.landmark_position)
+
+    def covariance(self, x: SE2State):
+        return self.R
+
+
+landmarks = np.array([[1, 1], [1, 2], [2, 2], [2, 1]])
+meas_models = [RangeToLandmarkSE2(landmark,  0.1**2) for landmark in landmarks]
+
+
+
+
+
+

Run the Filter!

+

And that’s it! All remaining snippets are now literally copy-pasted from our previous approach with zero modifications. Using the abstraction framework in navlie, we can easily switch between different state representations and process/measurement models without having to change any of data generation or filtering code.

+
+
[ ]:
+
+
+
dg = nav.DataGenerator(
+    process_model=process_model,                  # process model to use
+    input_func=lambda t, x: np.array([0.5, 0.3]), # a callable that specifies the input values over time
+    input_covariance= Q,                          # numpy array or callable that specifies the input covariance over time
+    input_freq=50,                                # the frequency (Hz) at which the input is sampled (and the process model integrated)
+    meas_model_list=meas_models,                  # a list of measurement models to use
+    meas_freq_list=[10, 10, 10, 10]               # corresponding measurement frequencies (Hz)
+)
+
+state_data, input_data, meas_data = dg.generate(x, start=0, stop=30, noise=True)
+
+print(state_data[1])
+print(input_data[2])
+print(meas_data[3])
+
+
+
+
+
+
+
+
+SE2State(stamp=0.02, dof=3, state_id=None)
+    [[ 9.99950000e-01 -9.99983333e-03  5.99990000e-03]
+     [ 9.99983333e-03  9.99950000e-01  2.99997500e-05]
+     [ 0.00000000e+00  0.00000000e+00  1.00000000e+00]]
+VectorInput(stamp=0.04, state_id=None)
+    [0.52438924 0.40056502]
+Measurement(stamp=0.0, state_id=None) of PoseRangeToLandMark
+    2.299276237837416
+
+
+
+
[12]:
+
+
+
# First, define the filter
+kalman_filter = nav.ExtendedKalmanFilter(process_model)
+P0 = np.diag([0.1**2, 1**2, 1**2])  # Initial covariance
+x = nav.StateWithCovariance(x, P0)  # Estimate and covariance in one container
+
+meas_idx = 0
+y = meas_data[meas_idx]
+estimates = []
+for k in range(len(input_data) - 1):
+    u = input_data[k]
+
+    # Fuse any measurements that have occurred.
+    while y.stamp < input_data[k + 1].stamp and meas_idx < len(meas_data):
+        x = kalman_filter.correct(x, y, u)
+
+        # Load the next measurement
+        meas_idx += 1
+        if meas_idx < len(meas_data):
+            y = meas_data[meas_idx]
+
+    # Predict until the next input is available
+    dt = input_data[k + 1].stamp - x.state.stamp
+    x = kalman_filter.predict(x, u, dt)
+
+    estimates.append(x.copy())
+
+
+results = nav.GaussianResultList.from_estimates(estimates, state_data)
+
+import matplotlib.pyplot as plt
+fig, axs = nav.plot_error(results)
+axs[0].set_title("Estimation Errors")
+axs[0].set_ylabel("theta (rad)")
+axs[1].set_ylabel("x (m)")
+axs[2].set_ylabel("y (m)")
+axs[2].set_xlabel("Time (s)")
+
+fig, ax = nav.plot_nees(results)
+ax.set_title("NEES")
+ax.set_xlabel("Time (s)")
+plt.show()
+
+
+
+
+
+
+
+../_images/tutorial_lie_groups_12_0.png +
+
+
+
+
+
+../_images/tutorial_lie_groups_12_1.png +
+
+
+
+

Built-in Lie group states

+

While we implemented our own SE2State from scratch here for pedagogical purposes, navlie comes with many built-in Lie group states that you can use out of the box. Some of the built-in Lie group states include:

+
    +
  • nav.lib.SO2State: representing 2D rotations using, beloning to the group \(SO(2)\)

  • +
  • nav.lib.SO3State: representing 3D rotations using, beloning to the group \(SO(3)\)

  • +
  • nav.lib.SE2State: representing 2D poses using, beloning to the group \(SE(2)\)

  • +
  • nav.lib.SE3State: representing 3D poses using, beloning to the group \(SE(3)\)

  • +
  • nav.lib.SE23State: representing “extended” poses that also contain velocity information, belonging to the group \(SE_2(3)\)

  • +
  • nav.lib.SL3State: representing 3D homographies, belonging to the group \(SL(3)\)

  • +
+

Each of these classes stores the value as a square numpy array in the x.value property. Moreover, closed-form formulas for the exponential and logarithmic maps have been implemented for each of these states, which is faster than using scipy.linalg.expm and scipy.linalg.logm. These underlying operations have even been implemented in C++ for maximum speed.

+
+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/tutorial/lie_groups.ipynb b/_build/html/tutorial/lie_groups.ipynb new file mode 100644 index 00000000..75ce7373 --- /dev/null +++ b/_build/html/tutorial/lie_groups.ipynb @@ -0,0 +1,424 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Toy Problem - Lie group approach\n", + "\n", + "![Toy Problem](../toy_problem.png)\n", + "\n", + "Another way we could approach the same state estimation task is to instead use Lie group theory, which is becoming increasingly common practice in state estimation. Lie group theory can be very abstract, and the main references that navlie refer to are the following:\n", + "\n", + "1. [A micro Lie theory for state estimation in robotics](https://arxiv.org/abs/1812.01537)\n", + "2. [T.Barfoot, State Estimation for Robotics](http://asrl.utias.utoronto.ca/~tdb/bib/barfoot_ser17.pdf)\n", + "\n", + "\n", + "## Define the State\n", + "Instead of representing the state using a vector, we will represent the state using an element of the *special Euclidean group* $SE(2)$, sometimes called *pose transformation matrices*. Elements of this group are 3x3 matrices of the form \n", + "\n", + "$$ \n", + "\\mathbf{T} = \\begin{bmatrix} \\mathbf{C}_{ab}(\\theta) & \\mathbf{r}_a \\\\ \\mathbf{0} & 1 \\end{bmatrix} \\in SE(2)\n", + "$$\n", + "\n", + "where $\\mathbf{r}_a = [x,y]^T$ again denotes the position of the robot and $\\mathbf{C}_{ab}(\\theta) \\in SO(2)$ is a rotation matrix (sometimes called a direction cosine matrix) with the form \n", + "\n", + "$$ \n", + "\\mathbf{C}_{ab}(\\theta) = \\begin{bmatrix} \\cos \\theta & - \\sin \\theta \\\\ \\sin \\theta & \\cos \\theta \\end{bmatrix}.\n", + "$$\n", + "\n", + "The rotation matrix transforms vectors resolved in one frame to another frame, i.e. $\\mathbf{r}_a = \\mathbf{C}_{ab} \\mathbf{r}_b$. Unlike vectors, elements of $SO(2)$ or $SE(2)$ cannot be added together to produce another valid element of $SE(2)$, but they can be multiplied together with the result still having the same form.\n", + "\n", + "$$\n", + "\\mathbf{T}_1 \\mathbf{T}_2 \\in SE(2)\n", + "$$\n", + "\n", + " To proceed further with our mathematical setup, we need to define a few very common operators seen in Lie group theory. The first two are the \"wedge\" $(\\cdot)^\\wedge$ and \"vee\" $(\\cdot)^\\vee$ operators, which for this specific group has the form\n", + "\n", + "$$ \n", + "\\begin{bmatrix} \\theta \\\\ x \\\\ y \\end{bmatrix}^\\wedge = \\begin{bmatrix} 0 & -\\theta & x \\\\ \\theta & 0 & y \\\\ 0 & 0 & 0 \\end{bmatrix}\n", + "$$\n", + "\n", + "and the $(\\cdot)^\\vee$ operator simply does the exact inverse of $(\\cdot)^\\wedge$. We can implement them as follows.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "%reset -f\n", + "import numpy as np\n", + "\n", + "# Helper functions for SE(2)\n", + "def wedge_se2(x):\n", + " return np.array([[ 0, -x[0], x[1]],\n", + " [x[0], 0, x[2]], \n", + " [ 0, 0, 0]])\n", + "\n", + "def vee_se2(X):\n", + " return np.array([X[1, 0], X[0, 2], X[1, 2]])\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Two other fundamental relationships appearing in Lie group theory are the exponential (denoted $\\exp$) and logarithmic (denoted $\\log$) maps. While these have a deeper definition, for our case it suffices to think of them as simply the [matrix exponential](https://en.wikipedia.org/wiki/Matrix_exponential) and [matrix logarithm](https://en.wikipedia.org/wiki/Logarithm_of_a_matrix). Using the wedge and vee operators for $SE(2)$ defined above, we can convert a 3x1 vector to an $SE(2)$ element and back as follows" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "An element of SE2:\n", + "[[ 0.99500417 -0.09983342 0.18467933]\n", + " [ 0.09983342 0.99500417 0.30949192]\n", + " [ 0. 0. 1. ]]\n", + "\n", + "The original vector 'representing' it:\n", + "[0.1 0.2 0.3]\n" + ] + } + ], + "source": [ + "from scipy.linalg import expm, logm\n", + "\n", + "T = expm(wedge_se2(np.array([0.1, 0.2, 0.3])))\n", + "print(\"An element of SE2:\")\n", + "print(T)\n", + "\n", + "x = vee_se2(logm(T))\n", + "print(\"\\nThe original vector 'representing' it:\")\n", + "print(x)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now have the tools we need to abstract-ify our problem a little bit. As commonly seen in the literature, we can define the so-called \"oplus\" and \"ominus\" operators as follows (sometimes called \"boxplus\" $\\boxplus$ and \"boxminus\" $\\boxminus$):\n", + "\n", + "$$\n", + "\\begin{aligned}\n", + "\\mathbf{T}_2 &= \\mathbf{T}_1 \\oplus \\boldsymbol{\\xi} := \\mathbf{T}_1 \\exp(\\boldsymbol{\\xi}^\\wedge) \\\\\n", + "\\boldsymbol{\\varepsilon} &= \\mathbf{T}_2 \\ominus \\mathbf{T}_1 := \\log(\\mathbf{T}_2^{-1} \\mathbf{T}_1)^\\vee\n", + "\\end{aligned}\n", + "$$ \n", + "\n", + "Here, both $\\boldsymbol{\\varepsilon}, \\boldsymbol{\\xi} \\in \\mathbb{R}^3$ are 3x1 vectors. The $\\oplus: SE(2) \\times \\mathbb{R}^3 \\to SE(2)$ operator \"adds\" a vector to an $SE(2)$ element to produce another $SE(2)$ element, and the $\\ominus:SE(2) \\times SE(2) \\to \\mathbb{R}^3$ operator \"subtracts\" two $SE(2)$ elements to produce a vector that represents the \"difference\" between them. \n", + "\n", + "\n", + "With this context, lets implement an $SE(2)$ state inside navlie's framework. To define a custom state, you must subclass the `nav.State` abstract class and you *must* implement the `plus`, `minus`, and `copy` methods. These methods play exactly the role of $\\oplus$ and $\\ominus$ described above, while the `copy` method is used to create a deep copy of that state object. In addition, state objects must hold an integer property named `dof` that specifies the *degrees of freedom* associated with that state. For $SE(2)$, this is 3." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "SE2State(stamp=0.0, dof=3, state_id=None)\n", + " [[1. 0. 0.]\n", + " [0. 1. 0.]\n", + " [0. 0. 1.]]\n" + ] + } + ], + "source": [ + "import navlie as nav\n", + "\n", + "class SE2State(nav.State):\n", + " def __init__(self, value :np.ndarray, stamp: float):\n", + " super().__init__(value=value, dof=3, stamp=stamp)\n", + "\n", + " def plus(self, dx: np.ndarray):\n", + " new_value = self.value @ expm(wedge_se2(dx))\n", + " return SE2State(new_value, self.stamp)\n", + "\n", + " def minus(self, other: \"SE2State\"):\n", + " other_inv = np.linalg.inv(other.value)\n", + " return vee_se2(logm(other_inv @ self.value))\n", + " \n", + " def copy(self):\n", + " return SE2State(self.value.copy(), self.stamp)\n", + "\n", + "x = SE2State(np.eye(3), 0.0)\n", + "print(x)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Define the Process Model\n", + "\n", + "Now, we must adapt the process model to work with our new `SE2State`. It is well known that the rotational kinematics can be written directly in terms of rotation matrices using \n", + "\n", + "$$ \n", + "\\dot{\\mathbf{C}}_{ab} = \\mathbf{C}_{ab}\\begin{bmatrix}0 & -\\omega \\\\ \\omega & 0 \\end{bmatrix} \n", + "$$\n", + "\n", + "and that the translational kinematics can be written in vector form using \n", + "\n", + "$$ \n", + "\\dot{\\mathbf{r}}_a = \\mathbf{C}_{ab} \\begin{bmatrix} v \\\\ 0 \\end{bmatrix} .\n", + "$$\n", + "\n", + "By stacking these into matrices it follows that \n", + "$$ \n", + "\\dot{\\mathbf{T}} = \\mathbf{T} \\boldsymbol{\\varpi}^\\wedge\n", + "$$\n", + "\n", + "where $\\boldsymbol{\\varpi} = [\\omega, v, 0]^T$. This equation is now a linear, matrix-valued ODE, and can be integrated exactly over a short duration $\\Delta t = t_{k+1} - t_k$ using the matrix exponential. This gives us the following discrete-time process model:\n", + "\n", + "$$\n", + "\\mathbf{T}_{k+1} = \\mathbf{T}_k \\exp(\\boldsymbol{\\varpi}_k^\\wedge \\Delta t)\n", + "$$\n", + "\n", + "which we can implement as follows" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "class WheeledRobotSE2(nav.ProcessModel):\n", + " def __init__(self, input_covariance_matrix):\n", + " self.Q = input_covariance_matrix\n", + "\n", + " def evaluate(self, x:SE2State, u:nav.lib.VectorInput, dt:float):\n", + " vel = np.array([u.value[0], u.value[1], 0])\n", + " x_next = x.copy()\n", + " x_next.value = x.value @ expm(wedge_se2(vel * dt))\n", + " return x_next\n", + " \n", + " def input_covariance(self, x:SE2State, u:nav.lib.VectorInput, dt:float):\n", + " return self.Q\n", + "\n", + "Q = np.eye(2) * 0.1**2\n", + "process_model = WheeledRobotSE2(Q)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Define the Measurement Model\n", + "\n", + "Finally, our measurement model remains largely unchanged. We just need to extract the position from an `SE2State` object now, as done below." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "class RangeToLandmarkSE2(nav.MeasurementModel):\n", + " def __init__(\n", + " self,\n", + " landmark_position: np.ndarray,\n", + " measurement_covariance: float,\n", + " ):\n", + " self.landmark_position = landmark_position\n", + " self.R = measurement_covariance\n", + "\n", + " def evaluate(self, x: SE2State):\n", + " pos = x.value[0:2, 2]\n", + " return np.linalg.norm(pos - self.landmark_position)\n", + "\n", + " def covariance(self, x: SE2State):\n", + " return self.R\n", + " \n", + "\n", + "landmarks = np.array([[1, 1], [1, 2], [2, 2], [2, 1]])\n", + "meas_models = [RangeToLandmarkSE2(landmark, 0.1**2) for landmark in landmarks]" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run the Filter!\n", + "\n", + "And that's it! All remaining snippets are now _literally_ copy-pasted from our previous approach with zero modifications. Using the abstraction framework in navlie, we can easily switch between different state representations and process/measurement models without having to change any of data generation or filtering code. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "SE2State(stamp=0.02, dof=3, state_id=None)\n", + " [[ 9.99950000e-01 -9.99983333e-03 5.99990000e-03]\n", + " [ 9.99983333e-03 9.99950000e-01 2.99997500e-05]\n", + " [ 0.00000000e+00 0.00000000e+00 1.00000000e+00]]\n", + "VectorInput(stamp=0.04, state_id=None)\n", + " [0.52438924 0.40056502]\n", + "Measurement(stamp=0.0, state_id=None) of PoseRangeToLandMark\n", + " 2.299276237837416\n" + ] + } + ], + "source": [ + "dg = nav.DataGenerator(\n", + " process_model=process_model, # process model to use\n", + " input_func=lambda t, x: np.array([0.5, 0.3]), # a callable that specifies the input values over time\n", + " input_covariance= Q, # numpy array or callable that specifies the input covariance over time\n", + " input_freq=50, # the frequency (Hz) at which the input is sampled (and the process model integrated)\n", + " meas_model_list=meas_models, # a list of measurement models to use\n", + " meas_freq_list=[10, 10, 10, 10] # corresponding measurement frequencies (Hz)\n", + ")\n", + "\n", + "state_data, input_data, meas_data = dg.generate(x, start=0, stop=30, noise=True)\n", + "\n", + "print(state_data[1])\n", + "print(input_data[2])\n", + "print(meas_data[3])" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# First, define the filter\n", + "kalman_filter = nav.ExtendedKalmanFilter(process_model)\n", + "P0 = np.diag([0.1**2, 1**2, 1**2]) # Initial covariance\n", + "x = nav.StateWithCovariance(x, P0) # Estimate and covariance in one container\n", + "\n", + "meas_idx = 0\n", + "y = meas_data[meas_idx]\n", + "estimates = []\n", + "for k in range(len(input_data) - 1):\n", + " u = input_data[k]\n", + "\n", + " # Fuse any measurements that have occurred.\n", + " while y.stamp < input_data[k + 1].stamp and meas_idx < len(meas_data):\n", + " x = kalman_filter.correct(x, y, u)\n", + "\n", + " # Load the next measurement\n", + " meas_idx += 1\n", + " if meas_idx < len(meas_data):\n", + " y = meas_data[meas_idx]\n", + "\n", + " # Predict until the next input is available\n", + " dt = input_data[k + 1].stamp - x.state.stamp\n", + " x = kalman_filter.predict(x, u, dt)\n", + "\n", + " estimates.append(x.copy())\n", + "\n", + "\n", + "results = nav.GaussianResultList.from_estimates(estimates, state_data)\n", + "\n", + "import matplotlib.pyplot as plt\n", + "fig, axs = nav.plot_error(results)\n", + "axs[0].set_title(\"Estimation Errors\")\n", + "axs[0].set_ylabel(\"theta (rad)\")\n", + "axs[1].set_ylabel(\"x (m)\")\n", + "axs[2].set_ylabel(\"y (m)\")\n", + "axs[2].set_xlabel(\"Time (s)\")\n", + "\n", + "fig, ax = nav.plot_nees(results)\n", + "ax.set_title(\"NEES\")\n", + "ax.set_xlabel(\"Time (s)\")\n", + "plt.show()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Built-in Lie group states \n", + "While we implemented our own `SE2State` from scratch here for pedagogical purposes, navlie comes with many built-in Lie group states that you can use out of the box. Some of the built-in Lie group states include:\n", + "\n", + "- `nav.lib.SO2State`: representing 2D rotations using, beloning to the group $SO(2)$\n", + "- `nav.lib.SO3State`: representing 3D rotations using, beloning to the group $SO(3)$\n", + "- `nav.lib.SE2State`: representing 2D poses using, beloning to the group $SE(2)$\n", + "- `nav.lib.SE3State`: representing 3D poses using, beloning to the group $SE(3)$\n", + "- `nav.lib.SE23State`: representing \"extended\" poses that also contain velocity information, belonging to the group $SE_2(3)$\n", + "- `nav.lib.SL3State`: representing 3D homographies, belonging to the group $SL(3)$\n", + "\n", + "Each of these classes stores the value as a square numpy array in the `x.value` property. Moreover, closed-form formulas for the exponential and logarithmic maps have been implemented for each of these states, which is faster than using `scipy.linalg.expm` and `scipy.linalg.logm`. These underlying operations have even been implemented in C++ for maximum speed. " + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.16" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_build/html/tutorial/traditional.html b/_build/html/tutorial/traditional.html new file mode 100644 index 00000000..2b3da45c --- /dev/null +++ b/_build/html/tutorial/traditional.html @@ -0,0 +1,537 @@ + + + + + + + + Toy Problem - Traditional Approach — navlie 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
+ +
+ +
+

Toy Problem - Traditional Approach

+

In this tutorial, we’ll simulate a simple 2D localization problem as per the figure below. We’ll assume that we have a robot following a simple body-frame-velocity model, which has access to noisy measurements of its forward velocity \(v\) and angular velocity \(\omega\). In addition, this robot will have a time-of-flight sensor that gives it range measurements to a few known landmarks in the environment.

+

Toy Problem

+
+

Define the State

+

The first step is to define the state of the robot. We’ll start with a more traditional approach and define the state of the robot to be a vector of the form \(\mathbf{x} = [\theta, x, y ]^T\), where \(x\) and \(y\) are the robot’s position in the world and \(\theta\) is its orientation. We’ll also define the control inputs to be \(\mathbf{u} = [\omega, v]^T\), the robot’s forward and angular velocity. The process (motion) model of the robot is then given by:

+
+\[\begin{split}\begin{aligned} + \dot{\theta} &= \omega,\\ + \dot{x} &= v \cos(\theta), \\ + \dot{y} &= v \sin(\theta). +\end{aligned}\end{split}\]
+

However, this is in continuous time, and we need to discretize it to use it in a filter. For now, we’ll use the simple Euler discretization method, which gives us the following discrete-time process model:

+
+\[\begin{split}\begin{aligned} + \theta_{k+1} &= \theta_k + \omega_k \Delta t, \\ + x_{k+1} &= x_k + v_k \cos(\theta_k) \Delta t, \\ + y_{k+1} &= y_k + v_k \sin(\theta_k) \Delta t. +\end{aligned}\end{split}\]
+

Lets now code up our state and process model using navlie’s framework. Since our state is just a regular 3x1 vector, we can use a standard type from the built-in library: navlie.lib.VectorState

+
+
[2]:
+
+
+
import numpy as np
+np.random.seed(0)
+import navlie as nav
+from navlie.lib import VectorState
+
+x = VectorState([0, 0, 0], stamp=0.0)
+print(x)
+
+
+
+
+
+
+
+
+VectorState(stamp=0.0, dof=3, state_id=None)
+    [0. 0. 0.]
+
+
+

The VectorState is a subclass of the abstract State class in navlie, which is one of the core primitive types. The value of the state is stored as a numpy array, and can be accessed directly through x.value.

+
+
+

Define the Process Model

+

For the process model, we’ll choose to define our own from scratch here. Process models in navlie must inherit from the abstract navlie.ProcessModel class and implement the evaluate and either the input_covariance or covariance methods.

+
+
[3]:
+
+
+
from navlie.lib import VectorInput
+
+Q = np.eye(2) * 0.1**2 # Input noise covariance with 0.1 m/s of standard deviation
+
+class WheeledRobot(nav.ProcessModel):
+    def __init__(self, input_covariance):
+        self.Q = input_covariance
+
+    def evaluate(self, x: VectorState, u: VectorInput, dt: float) -> VectorState:
+        x_next = x.copy()
+        x_next.value[0] += u.value[0] * dt
+        x_next.value[1] += u.value[1] * dt * np.cos(x.value[0])
+        x_next.value[2] += u.value[1] * dt * np.sin(x.value[0])
+        return x_next
+
+    def input_covariance(self, x: VectorState, u: VectorInput, dt: float) -> np.ndarray:
+        return self.Q
+
+process_model = WheeledRobot(Q) # instantiate it
+
+
+
+

The methods in navlie process models must always accept the arguments shown above: a State object, an Input object, and a float dt. The evaluate method must always return a valid (i.e. subclass of a) State object, and the input_covariance method must always return a square numpy array. There are more optional methods that can be implemented for performance reasons, but we will cover those later.

+
+
+

Define the Measurement Model(s)

+

Moving on to the measurement model, if \(\mathbf{r}_a = [x,y]^T\) denotes the position vector of the robot resolved in the world frame, and \(\mathbf{\ell}^{(i)}_{a} \in \mathbb{R}^2\) is the 2 x 1 position vector of landmark \(i\), then the measurement model for each landmark is simply

+
+\[y_i = ||\mathbf{r}_a - \mathbf{\ell}^{(i)}_{a}||\]
+

In navlie, measurement models must be implemented in a similar way to process models: inherit from the navlie.MeasurementModel abstract class, and then implement the evaluate and covariance methods. Here’s an example for this problem:

+
+
[23]:
+
+
+
class RangeToLandmark(nav.MeasurementModel):
+    def __init__(self, landmark_position: np.ndarray):
+        self.landmark_position = landmark_position
+
+    def evaluate(self, x: VectorState) -> np.ndarray:
+        return np.linalg.norm(x.value[1:] - self.landmark_position)
+
+    def covariance(self, x: VectorState) -> np.ndarray:
+        return 0.1**2
+
+landmarks = np.array([[1, 1], [1, 2], [2, 2], [2, 1]])
+meas_models = [RangeToLandmark(landmark) for landmark in landmarks]
+
+
+
+
+
+

(Simulation only) Generate fake data

+

The next step is to generate some fake data for our simulation (although navlie is also compatible with real data). To do this, we will use the DataGenerator class which is used as follows

+
+
[24]:
+
+
+
dg = nav.DataGenerator(
+    process_model=process_model,                  # process model to use
+    input_func=lambda t, x: np.array([0.3, 0.5]), # a callable that specifies the input values over time
+    input_covariance= Q,                          # numpy array or callable that specifies the input covariance over time
+    input_freq=50,                                # the frequency (Hz) at which the input is sampled (and the process model integrated)
+    meas_model_list=meas_models,                  # a list of measurement models to use
+    meas_freq_list=[10, 10, 10, 10]               # corresponding measurement frequencies (Hz)
+)
+
+state_data, input_data, meas_data = dg.generate(x, start=0, stop=30, noise=True)
+
+print(state_data[0])
+print(input_data[0])
+print(meas_data[0])
+
+
+
+
+
+
+
+
+VectorState(stamp=0.0, dof=3, state_id=None)
+    [0. 0. 0.]
+VectorInput(stamp=0.0, state_id=None)
+    [0.4867558  0.40227221]
+Measurement(stamp=0.0, state_id=None) of RangeToLandmark
+    1.5906187969698615
+
+
+

The output of the DataGenerator.generate method is three lists: a list of ground-truth State objects, a list of Input objects, and a list of Measurement objects, with the input/measurement lists possibly being corrupted by random noise if the noise=True flag is set. Each item in these lists correspond to different points in time. We can plot the trajectory as follows

+
+
[25]:
+
+
+
import matplotlib.pyplot as plt
+
+# Plot the state trajectory
+pos = np.array([state.value[1:] for state in state_data])
+plt.plot(pos[:, 0], pos[:, 1])
+plt.scatter(landmarks[:, 0], landmarks[:, 1])
+# add labels
+for i, landmark in enumerate(landmarks):
+    plt.annotate(f"Landmark {i}", landmark)
+plt.xlabel("x")
+plt.ylabel("y")
+plt.title("Simulated Trajectory")
+plt.axis("equal")
+
+
+# Plot the input data
+plt.figure()
+u_array = np.array([u.value for u in input_data])
+u_stamps = np.array([u.stamp for u in input_data])
+plt.plot(u_stamps, u_array[:, 0], label="omega")
+plt.plot(u_stamps, u_array[:, 1], label="v")
+plt.xlabel("Time (s)")
+plt.ylabel("Input")
+plt.title("Input Data")
+plt.legend()
+plt.show()
+
+
+
+
+
+
+
+../_images/tutorial_traditional_9_0.png +
+
+
+
+
+
+../_images/tutorial_traditional_9_1.png +
+
+
+
+

Run a filter!

+

Finally, lets run an extended Kalman filter on this data to get a state estimate that uses only the noisy measurements. In the below filter, we instantiate the ExtendedKalmanFilter to use on our data, and looping over the input measurements while also calling the correction step whenever a measurement occurs.

+
+
[26]:
+
+
+
# First, define the filter
+kalman_filter = nav.ExtendedKalmanFilter(process_model)
+
+# You can try other filters too!
+# kalman_filter = nav.UnscentedKalmanFilter(process_model)
+# kalman_filter = nav.IteratedKalmanFIlter(process_model)
+
+P0 = np.diag([0.1**2, 1**2, 1**2])  # Initial covariance
+x = nav.StateWithCovariance(x, P0)  # Estimate and covariance in one container
+
+meas_idx = 0
+y = meas_data[meas_idx]
+estimates = []
+for k in range(len(input_data) - 1):
+    u = input_data[k]
+
+    # Fuse any measurements that have occurred.
+    while y.stamp < input_data[k + 1].stamp and meas_idx < len(meas_data):
+        x = kalman_filter.correct(x, y, u)
+
+        # Load the next measurement
+        meas_idx += 1
+        if meas_idx < len(meas_data):
+            y = meas_data[meas_idx]
+
+    # Predict until the next input is available
+    dt = input_data[k + 1].stamp - x.state.stamp
+    x = kalman_filter.predict(x, u, dt)
+
+    estimates.append(x.copy())
+
+
+
+

The filters in navlie are all designed to be stateless: this means that the actual state estimate is stored externally to the filter objects, in this case in a container called StateWithCovariance. Although this adds a slight burden on the user, it has the advantage of being more transparent, and also providing the ability to combine different filters in the same loop! For example, you could use an EKF for the prediction, but a UKF for +the correction, or even to use different filters for different measurement models!

+

Once estimates have been obtained, we will often be interested in evaluating the performance. The GaussianResultList object is a useful container for evaluating the quality of the state estimates when ground truth data is available. It calculates useful metrics such as raw error, Mahalanobis distance, and normalized estimation error squared (NEES).

+
+
[27]:
+
+
+
results = nav.GaussianResultList.from_estimates(estimates, state_data)
+# results.nees
+# results.three_sigma
+# results.error
+# results.md # mahalanobis distance
+# # and more...
+
+# Some plotting functions that work directly with GaussianResultList
+fig, axs = nav.plot_error(results)
+axs[0].set_title("Estimation Errors")
+axs[0].set_ylabel("theta (rad)")
+axs[1].set_ylabel("x (m)")
+axs[2].set_ylabel("y (m)")
+axs[2].set_xlabel("Time (s)")
+
+fig, ax = nav.plot_nees(results)
+ax.set_title("NEES")
+ax.set_xlabel("Time (s)")
+plt.show()
+
+
+
+
+
+
+
+../_images/tutorial_traditional_13_0.png +
+
+
+
+
+
+../_images/tutorial_traditional_13_1.png +
+
+

As a final note, GaussianResultList will invoke the State.minus method of the state objects to calculate the error. As we will see next, this allows us to implement a custom measure of error, when it might not make sense to directly subtract two of our state objects.

+
+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/tutorial/traditional.ipynb b/_build/html/tutorial/traditional.ipynb new file mode 100644 index 00000000..4db74a60 --- /dev/null +++ b/_build/html/tutorial/traditional.ipynb @@ -0,0 +1,392 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Toy Problem - Traditional Approach\n", + "\n", + "In this tutorial, we'll simulate a simple 2D localization problem as per the figure below. We'll assume that we have a robot following a simple body-frame-velocity model, which has access to noisy measurements of its forward velocity $v$ and angular velocity $\\omega$. In addition, this robot will have a time-of-flight sensor that gives it range measurements to a few known landmarks in the environment. \n", + "\n", + "![Toy Problem](../toy_problem.png)\n", + "\n", + "\n", + "## Define the State\n", + "The first step is to define the state of the robot. We'll start with a more traditional approach and define the state of the robot to be a vector of the form $\\mathbf{x} = [\\theta, x, y ]^T$, where $x$ and $y$ are the robot's position in the world and $\\theta$ is its orientation. We'll also define the control inputs to be $\\mathbf{u} = [\\omega, v]^T$, the robot's forward and angular velocity. The process (motion) model of the robot is then given by:\n", + "\n", + "$$\n", + "\\begin{aligned}\n", + " \\dot{\\theta} &= \\omega,\\\\\n", + " \\dot{x} &= v \\cos(\\theta), \\\\\n", + " \\dot{y} &= v \\sin(\\theta). \n", + "\\end{aligned}\n", + "$$\n", + "\n", + "However, this is in continuous time, and we need to discretize it to use it in a filter. For now, we'll use the simple Euler discretization method, which gives us the following discrete-time process model:\n", + "\n", + "$$\n", + "\\begin{aligned}\n", + " \\theta_{k+1} &= \\theta_k + \\omega_k \\Delta t, \\\\\n", + " x_{k+1} &= x_k + v_k \\cos(\\theta_k) \\Delta t, \\\\\n", + " y_{k+1} &= y_k + v_k \\sin(\\theta_k) \\Delta t.\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "Lets now code up our state and process model using navlie's framework. Since our state is just a regular 3x1 vector, we can use a standard type from the built-in library: [navlie.lib.VectorState](../_autosummary/navlie.lib.states.VectorState.rst)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "VectorState(stamp=0.0, dof=3, state_id=None)\n", + " [0. 0. 0.]\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "np.random.seed(0)\n", + "import navlie as nav\n", + "from navlie.lib import VectorState\n", + "\n", + "x = VectorState([0, 0, 0], stamp=0.0)\n", + "print(x)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `VectorState` is a subclass of the abstract [State](../_autosummary/navlie.types.State.rst) class in navlie, which is one of the core primitive types. The value of the state is stored as a numpy array, and can be accessed directly through `x.value`. \n", + "\n", + "\n", + "## Define the Process Model\n", + "For the process model, we'll choose to define our own from scratch here. Process models in navlie *must* inherit from the abstract [navlie.ProcessModel](../_autosummary/navlie.types.ProcessModel.rst) class and implement the `evaluate` and either the `input_covariance` or `covariance` methods." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from navlie.lib import VectorInput\n", + "\n", + "Q = np.eye(2) * 0.1**2 # Input noise covariance with 0.1 m/s of standard deviation\n", + "\n", + "class WheeledRobot(nav.ProcessModel):\n", + " def __init__(self, input_covariance):\n", + " self.Q = input_covariance\n", + "\n", + " def evaluate(self, x: VectorState, u: VectorInput, dt: float) -> VectorState:\n", + " x_next = x.copy()\n", + " x_next.value[0] += u.value[0] * dt\n", + " x_next.value[1] += u.value[1] * dt * np.cos(x.value[0])\n", + " x_next.value[2] += u.value[1] * dt * np.sin(x.value[0])\n", + " return x_next\n", + "\n", + " def input_covariance(self, x: VectorState, u: VectorInput, dt: float) -> np.ndarray:\n", + " return self.Q\n", + " \n", + "process_model = WheeledRobot(Q) # instantiate it" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The methods in navlie process models must always accept the arguments shown above: a `State` object, an `Input` object, and a float `dt`. The `evaluate` method must always return a valid (i.e. subclass of a) `State` object, and the `input_covariance` method must always return a square numpy array. There are more optional methods that can be implemented for performance reasons, but we will cover those later.\n", + "\n", + "## Define the Measurement Model(s)\n", + "Moving on to the measurement model, if $\\mathbf{r}_a = [x,y]^T$ denotes the position vector of the robot resolved in the world frame, and $\\mathbf{\\ell}^{(i)}_{a} \\in \\mathbb{R}^2$ is the 2 x 1 position vector of landmark $i$, then the measurement model for each landmark is simply \n", + "\n", + "$$ \n", + "y_i = ||\\mathbf{r}_a - \\mathbf{\\ell}^{(i)}_{a}||\n", + "$$\n", + "\n", + "In navlie, measurement models must be implemented in a similar way to process models: inherit from the [navlie.MeasurementModel](../_autosummary/navlie.types.MeasurementModel.rst) abstract class, and then implement the `evaluate` and `covariance` methods. Here's an example for this problem:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "class RangeToLandmark(nav.MeasurementModel):\n", + " def __init__(self, landmark_position: np.ndarray):\n", + " self.landmark_position = landmark_position\n", + "\n", + " def evaluate(self, x: VectorState) -> np.ndarray:\n", + " return np.linalg.norm(x.value[1:] - self.landmark_position)\n", + " \n", + " def covariance(self, x: VectorState) -> np.ndarray:\n", + " return 0.1**2\n", + " \n", + "landmarks = np.array([[1, 1], [1, 2], [2, 2], [2, 1]])\n", + "meas_models = [RangeToLandmark(landmark) for landmark in landmarks]" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## (Simulation only) Generate fake data\n", + "\n", + "The next step is to generate some fake data for our simulation (although navlie is also compatible with real data). To do this, we will use the [DataGenerator](../_autosummary/navlie.datagen.DataGenerator.rst) class which is used as follows" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "VectorState(stamp=0.0, dof=3, state_id=None)\n", + " [0. 0. 0.]\n", + "VectorInput(stamp=0.0, state_id=None)\n", + " [0.4867558 0.40227221]\n", + "Measurement(stamp=0.0, state_id=None) of RangeToLandmark\n", + " 1.5906187969698615\n" + ] + } + ], + "source": [ + "dg = nav.DataGenerator(\n", + " process_model=process_model, # process model to use\n", + " input_func=lambda t, x: np.array([0.3, 0.5]), # a callable that specifies the input values over time\n", + " input_covariance= Q, # numpy array or callable that specifies the input covariance over time\n", + " input_freq=50, # the frequency (Hz) at which the input is sampled (and the process model integrated)\n", + " meas_model_list=meas_models, # a list of measurement models to use\n", + " meas_freq_list=[10, 10, 10, 10] # corresponding measurement frequencies (Hz)\n", + ")\n", + "\n", + "state_data, input_data, meas_data = dg.generate(x, start=0, stop=30, noise=True)\n", + "\n", + "print(state_data[0])\n", + "print(input_data[0])\n", + "print(meas_data[0])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The output of the `DataGenerator.generate` method is three lists: a list of ground-truth `State` objects, a list of `Input` objects, and a list of [Measurement](../_autosummary/navlie.types.Measurement.rst) objects, with the input/measurement lists possibly being corrupted by random noise if the `noise=True` flag is set. Each item in these lists correspond to different points in time. We can plot the trajectory as follows" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAA440lEQVR4nO3deXhU5dnH8e+dPSGEEJKwhEBYBQKyhR0FxQVKBdyKS1W01bqgrVqRVl+lvqW11dcqtbaKWneLK4oguFBUBJSw74JsSQiQBEhCFrLd7x8zxAAhAcnkzHJ/rmuua84yZ34Py9znnOec84iqYowxJnAFOR3AGGOMs6wQGGNMgLNCYIwxAc4KgTHGBDgrBMYYE+CsEBhjTICzQmAanYhcKyKfeGjbL4nIHz2x7Vq+a5KILG6E7zksIh09/T0mcFkhMB4hIsNFZImI5IvIARH5WkQGAKjq66p6kRdkXCQiv/TAds9x/3gfFpEiEdEa04dFpN3pbE9Vo1V1+xlm8khbjX8IcTqA8T8iEgN8BNwGvAWEAecAR5zM1VhU9SsgGkBEUoAdQKyqVhy/roiE1Dbfm4iIAKKqVU5nMZ5hRwTGE7oCqOqbqlqpqiWq+omqroUTT6m495hvF5GtIlIoIv8rIp3cRxQFIvKWiITV9tkan+98fAgRaS4iH4lIjogcdL9v6142HVdxetq9l/60e343EfnUfRSzRUR+VmN7LUTkQ3emb4FOp/sHIyLTROQdEXlNRAqASSIyUESWisghEckWkaePtvf49olIuIg8LiK7RWSfiPxLRCJrrDteRFa7M34vIqPraOtQEVnuPmpbLiJDa2xnkYhMF5GvgWLgXhFZcVxb7hGRD073z8B4IVW1l70a9AXEAHnAy8AYoPlxyycBi2tMK/CB+3OpuI4cPgc6As2AjcANtX22xuc7u9+/BPzR/b4FcDkQBTQF3gZm1/jcIuCXNaabABnAjbiOlvsCuUAP9/L/4DrCaQL0BLKOz1LLn0WKO1+Ie3oaUA5MwLUjFgn0Bwa7vzMF2AT85iTt+xvwIRDnbtMc4M/uZQOBfOBC97aTgG4naWsccBC4zv29V7unW9RYf7f77yMECAcOAN1rbGMVcLnT/97sdeYvOyIwDU5VC4DhuH7AZgI57j3plnV87K+qWqCqG4D1wCequl1V84GPcf0on26OPFV9V1WLVbUQmA6MqOMjPwV2quq/VbVCVVcB7wJXikgwrqLykKoWqep6XIXux1iqqrNVtUpdR0srVHWZ+zt3As/WltN9iuYW4G5VPeBu05+Aq9yr/AJ4UVU/dW87S1U3nyTDWGCrqr7q/t43gc3AJTXWeUlVN7iXHwFmAT93Z0nFVbQ++pF/BsaLWCEwHqGqm1R1kqq2xbX33AZ4so6P7KvxvqSW6ejTzSAiUSLyrIjscp+G+RKIdf+o16Y9MMh9iuaQiBwCrgVaAQm49owzaqy/63QzudXcBiLS1X3aaq8755+A+Fo+l4Dr6GZFjXzz3fMBkoHvTzFDG07MvwvXUUStOXEVvmvcBek64C13gTA+zgqB8Tj3XulLuArCmSrC9WMIgIi0qmPde4GzgEGqGgOce/RjR6Mdt34G8IWqxtZ4RavqbUAOUIHrx/ao07r6p4bjv/efuPbGu7hz/r5GxppycRXF1Br5mqnq0SKZwcn7LY7/zj24Cl9N7XCd7qr1M6q6DCjD1d9wDfDqSb7L+BgrBKbBuTtc763RMZuM6xz0sgbY/BogVUT6iEgErnPuJ9MU1w/nIRGJAx4+bvk+XP0QR30EdBWR60Qk1P0aICLdVbUSeA+Y5j7S6AHc0ADtOZqzADgsIt1wXW11AnVdtTMT+JuIJAKISJKIXOxe5QXgRhEZJSJB7mXdTtLWee62XiMiISIyEehB/ad6XgGeBspV1eP3UJjGYYXAeEIhMAj4RkSKcBWA9bj20M+Iqn4HPAJ8BmwF6voxehJXZ2yuO8P845Y/BVzhvqJohvuc+0W4zrnvAfYCf8HVUQowGdcpqr24jnD+fabtcfstrj3sQlw/9LPqWPd+YBuwzH0a6TNcRz2o6re4Orr/hqvT+At+2Os/vq15uPpE7sXVsT8F+Kmq5taT9VVcR3avnW4jjfcSVRuYxhhvJSJBQCXQXlV3e0GeSGA/0E9VtzqdxzQMOyIwxrv1BEpxHYV4g9uA5VYE/IvdWWyMlxKRy4HngPtVtcwL8uzE1Yk9wdkkpqHZqSFjjAlwdmrIGGMCnM+dGoqPj9eUlBSnYxhjjE9ZsWJFrqom1LbM5wpBSkoK6enpTscwxhifIiInvRPeTg0ZY0yAs0JgjDEBzgqBMcYEOCsExhgT4KwQGGNMgLNCYIwxAc4KgTHGBDifu4/AmIZUUlbJ/sJScgqPUFBaTtGRSorLKig6UklJeSXHP4IlKEhoEhZCVFgw0eEhRIWH0CwylMSm4SQ0DSc02PatjO+xQmD8WmWVsiuviB25rtfOvCJ25RWTdbCE/YVHOHykokG/L65JGIlNw2nbPIoO8VF0iI8mJT6KTgnRJDYNxzXKozHexQqB8RuVVcrmvQWsz8pnfVYBG/bksym7kJLyyup1YiJC6BDfhO5tYhjh3otPbBpBQtNwmkWG0iQsmKjwEJqEBRMZFkzQcT/cFZVafcRQVFZB0ZEKDhaXVx9V7C88wv6CUnYfKOLLrTmUVVRVf7ZFkzBSk5qR2iaGnm2a0Tu5GW2bR2GM06wQGJ9VUVnF+j0FfLM9j292HGD5zgMUlrr28KPDQ+jRJoarB7aje+umdEyIpkN8E5pHhZ7RXnloMESGBdMiuv51q6qU7IJSduYWsW3/YTbuKWD9nnye/2o75ZWuU05JsZEM6hDHwA5xDOrYgpQWUXbUYBqdFQLjUw4WlfHFdzl8vnk/X2zZT4H7h79jfBN+enZrBnaIo09yc9rHRREU5OwPalCQkBQbSVJsJMM6x1fPP1JRyXd7D7Ny90G+2ZHHl1tzeG+Va8z45LhIRnVryfndEhnUMY7wkGCn4psA4nPjEaSlpak9dC6w5BQeYe7aPcxdl82KXQepUoiPDmPkWYmM6JrAoI5xJDaNcDrmj6aqfJ9TxNLteSzavJ/F23I5UlFFVFgwI7omcEnvNpzfLZGIUCsK5scTkRWqmlbrMisExhsVlpbz8fq9zFmzh6+35VKl0K1VUy7q0ZLzu7fk7KRmju/xe0pJWSVLt+eycPN+FmzYR07hEaLDQ7gotSXj+yQxrFMLQuzqJHOarBAYn7E28xCvL9vNh2v2UFJeSXJcJON7JzGuTxu6tmzqdLxGV1mlLNuex4er9zBvfTaFpRW0iongqoHJTByQTOtmkU5HND7CCoHxaqXllcxelcVr3+xifVYBkaHBjOvdhokDk+mbHGudp25HKir57+b9vPltBl9uzUGAUd1b8vPB7Tm3S7z9OZk6WSEwXulQcRmvLdvFS0t2knu4jG6tmnLNoHZM6JtETESo0/G82u68Yt5cvpu30zPIPVxGUmwk7eKieGFSGlFhdg2IOZEVAuNV9hWU8uwX2/nP8t0Ul1Uy8qwEbjm3I0M6trC92tNUVlHFB6uzuO+dtdXz2sVFMWfycJpFWTE1P7BCYLzCgaIy/rloG68s3UVllTKudxtuPrcj3VvHOB3N51VVKY98tJGXluysntejdQzv3DbEjhAMYIXAOKygtJznv9zOC4t3UFJeyaV92/KbC7qQHGd31XrCE59+x4zPt1ZPD+8cz0s3DrArjQKcFQLjiKoq5e0VGTy2YAu5h8sY26s1d1/Yhc6JgXf1T2NTVaZ9uIGXl/4wXvnvxnTjVyM6OZjKOMkKgWl0K3YdYNqHG1mXlU//9s2Zdkkqvdo2czpWwKmsUm5+JZ2Fm/dXz3v/9qH0bdfcwVTGCVYITKM5VFzGH+du4p0VmbSMCef3P+nOuN5trBPYYbmHj5D2x8+qp1vFRPDllPMIC7HTRYHCCoFpFPPWZfPQB+s5VFzOzed2ZPJ5nWkSbh2V3mTJ97lcM/Ob6ukZV/dlXO82DiYyjcUKgfGo/YWlPDR7A/M37KVnUgx/ufxsUtvYaSBvparc8uoKPt24r3rexkcutquL/FxdhcBjx4UiEiEi34rIGhHZICJ/qGWdcBGZJSLbROQbEUnxVB7jGZ9t3MfoJ7/iv1v2M3VMN2bfPsyKgJcTEWZen8bn946ontfjoQUs3Lyvjk8Zf+bJE4RHgPNVtTfQBxgtIoOPW+cXwEFV7Qz8DfiLB/OYBlRaXslDH6znl6+k0yomgrl3ncOtIzrZJYo+pFNCNDsfHctlfZMAuOmldC7/55IThuc0/s9j/2vV5bB7MtT9Ov5f2HjgZff7d4BRYr2KXu+7fYWMe3oxryzdxc3ndOD9O4bSOfEURmoxXumJiX2YfccwAFbsOkiH381jz6ESh1OZxuTR3TcRCRaR1cB+4FNV/ea4VZKADABVrQDygRa1bOcWEUkXkfScnBxPRjb1mLcumwn/+JoDReW8fNNAHhjbwwZP8QN9kmPZOn0MMRGufoKhjy5k/vpsh1OZxuLRQqCqlaraB2gLDBSRnj9yO8+papqqpiUkJDRoRnNqKquURz/ezO2vr6Rbq6bMvWs4I7ra34U/CQ0OYu20i7nnwq4A3PraSu6etdrZUKZRNMoJXVU9BPwXGH3coiwgGUBEQoBmQF5jZDKnLr+4nEn//pZ/ffE91w5qx5u3DKZljO+OCGbqdteoLrx3+1AA3l+VRcrUuVRWWb+BP/PkVUMJIhLrfh8JXAhsPm61D4Eb3O+vABaq9VR5lcyDxVzxryUs257HXy7vxfRLe9mpoADQr11z1k27qHq60+/nUVha7mAi40mePCJoDfxXRNYCy3H1EXwkIo+IyDj3Oi8ALURkG3APMNWDecxpWp+Vz6XPLGFvQSmv3DSIiQPaOR3JNKKmEaHs+PNPaBbpepx1r2mfsCuvyOFUxhPshjJTq0Vb9nP76ytpHhXGv28cEJDDRJof/PLldD7b5LrP4K1fDWFghziHE5nT5cgNZcZ3zV+fzc2vpJPSognv3T7UioDh+RvSuNfdifyzZ5fy3y376/mE8SVWCMwxPlidxR1vrOLstrH851fWKWx+cOeoLjx2xdkA3Pjv5Xy8zi4v9RdWCEy1t5Zn8JtZqxmQ0pxXbhpo4wabE1yZlswz1/YD4LbXV/LOikyHE5mGYIXAAPB2egZT3l3LOV0SeOnGgfbUUHNSP+nVmn/fOACA3769hjlr9jicyJwpKwSGeeuyuf/dtZzTJZ6Z1/cnItQuDzV1O++sRF77xSAA7nxzFV98Z3f8+zIrBAFu0Zb9/Po/q+jXrjnPXtff7hEwp2x4l/jq00Q3vPgtK3cfdDiR+bGsEASwFbsOcOtrK+iS2JQXJg2w59Gb0/aTXq3506W9ALjsmSXsyLX7DHyRFYIAtSuviJtfWUHrZpG88ouB1TcNGXO6rhnUrvrS0vMeX8ThIxUOJzKnywpBAMovLufGl5ZTpcqLkwYQHx3udCTj4+4c1YULuicC0PPhBVTZs4l8ihWCAFNWUcWvXksn80AJz12XRof4Jk5HMn7i+RsGEOYemKjzA/McTmNOhxWCADNtzgaWbT/AX67oZY8JMA1uyx9dDxiuUvj1f1Y5nMacKisEAeSdFZm88c1ubh3RiUv7tnU6jvFDIlL91NIPVu/h0402DrIvsEIQIDbuKeCB99cxpGMLfntRV6fjGD/WNCKUd28bAsDNr6STU3jE4USmPlYIAkB+STm3vb6C2KhQZlzd1waYNx7Xv30ct43sBMCA6Z/ha085DjT2i+DnVJUH3l9H1sESnrm2HwlN7Qoh0zjuH92NSPdd6j97dqnDaUxdrBD4uQ9W7+GjtdncfWFX+re3zmHTuI72FyzfeZCvttpjKLyVFQI/lnmwmP+ZvZ609s25dUQnp+OYABQSHMQ7t7r6C6574VuOVFQ6nMjUxgqBn6qsUu55aw0K/G1iH4KDxOlIJkClpcRxQfeWAPR6+BOH05jaWCHwU69/s4tvdxzgoUt6kBwX5XQcE+Cev8E1QmJZZRVz19qANt7GCoEfys4v4a/zt3BOl3iu7G/3Cxjv8Nk95wJwxxsrqaiscjiNqckKgR96+IMNVFRVMX1CL0TslJDxDp0TmzK0UwsALnn6a4fTmJo8VghEJFlE/isiG0Vkg4j8upZ1RopIvoisdr8e8lSeQLFgw14+2biP31zQlXYt7JSQ8S5HB7PZlF3Ausx8h9OYozx5RFAB3KuqPYDBwB0i0qOW9b5S1T7u1yMezOP3SssreWTORrq1asovhndwOo4xJwgKEl6+aSAAlzy92OE05iiPFQJVzVbVle73hcAmIMlT32fghcU7yDpUwsOXpBJqdw8bLzWia0L1+1eX7XIwiTmqUX4tRCQF6At8U8viISKyRkQ+FpHUk3z+FhFJF5H0nBy7KaU2+wtLeea/27ioR0uGuM/DGuOtlv1uFAD/M3u9jV3gBTxeCEQkGngX+I2qFhy3eCXQXlV7A38HZte2DVV9TlXTVDUtISGhtlUC3hOffEdZZRW//0l3p6MYU69WzSLonRwLwOQ3Vzobxni2EIhIKK4i8Lqqvnf8clUtUNXD7vfzgFARifdkJn+0bX8hs9IzuH5ICik20IzxEW//ynXH8bx1eykttzuOneTJq4YEeAHYpKpPnGSdVu71EJGB7jx5nsrkr576fBtRocHccV5np6MYc8rCQoL4WZrrPpcbXvzW4TSBzZNHBMOA64Dza1we+hMRuVVEbnWvcwWwXkTWADOAq9SeV3tavttXyEdr93DD0BTimoQ5HceY0/LoZWcD8M2OA5SU2VGBU0I8tWFVXQzUeTeTqj4NPO2pDIHgqc+20iQshJvP6eh0FGNOW1CQ8PPB7Xht2W6ueX4Z798+zOlIAcmuMfRhW/cVMnddNpOGptDcjgaMj/rf8T0BWLX7kD2d1CFWCHzYC4t3EB4SxE1285jxYSLCZX1dtxj99u21DqcJTFYIfFTu4SO8tyqLy/u3tb4B4/P+coWrr2DOmj0OJwlMVgh81GvLdlFWUcVNw+xowPi+0OAgOia4Ln1+/qvtDqcJPFYIfFBpeSWvLt3F+d0S6ZwY7XQcYxrErFtc9xX8ce4mh5MEHisEPuiTjfvIKypj0tAUp6MY02ASmoZXv9+UffxDCIwnWSHwQbOW7yYpNpLhne0mbONfnruuPwDXPl/bY8mMp1gh8DG784r5elseEwckE2TjEBs/c1FqKwAOFJXZw+gakRUCH/P2igyCBK6wISiNnxrS0fX03GcWbXM4SeCwQuBDVJX3VmZxTpcE2sRGOh3HGI94+pq+ADz+yXcOJwkcVgh8yKqMQ2QdKmF8nzZORzHGY1pE/9BpbM8fahxWCHzI3LXZhAUHcUGPlk5HMcajrhqQDMBjC7Y4nCQwWCHwEVVVyrx12ZzbNYGYiFCn4xjjUQ+MdQ2w9OLXOxxOEhisEPiIVRkHyc4vZezZrZyOYozHNa2xs2OD1nieFQIfsXDzfoKDhPO72WkhExgmuPvCZn5pj5zwNCsEPuKL73Lo3645zSLttJAJDPeP6QbA/31qVw95mhUCH5BTeIT1WQWMOCvB6SgmQERHN/wzrKZNm8bjjz9+yuu3bnbql0inpKSQm5tb5zoPPPAAycnJJ7TNG9p6Oupra3FxMWPHjqVbt26kpqYyderUerdphcAHfLU1B4ARXa0QmMASE+EaRHFdZv5J16msPLU+hEsuuYRvv/XtsZFPta2//e1v2bx5M6tWreLrr7/m448/rnN9KwQ+YPHWXFo0CaNH6xino5gANmfOHAYNGkTfvn254IIL2LdvH+Da+73pppsYOXIkHTt2ZMaMGdWfmT59Ol27dmX48OFs2fLDpaAjR47k7rvvJi0tje7du7N8+XIuu+wyunTpwoMPPli9XviiJ8h+6decM6gvzz33XPX86Oho7r33Xnr37s3SpUur55eUlDBmzBhmzpx5Qv7BgwfTunVrr23rhAkT6N+/P6mpqWfU1qioKM477zwAwsLC6NevH5mZmXU3WFV96tW/f38NNMP/8rne+mq60zFMAGnSpMkJ8w4cOKBVVVWqqjpz5ky95557VFX14Ycf1iFDhmhpaanm5ORoXFyclpWVaXp6uvbs2VOLioo0Pz9fO3XqpI899piqqo4YMUKnTJmiqqpPPvmktm7dWvfs2aOlpaWalJSkubm5qqq6d3+Otr//I02+511NTU2tng/orFmzqrO1b99ed+zYoaNGjdKXX375tNrmLW3Ny8tTVdXi4uIGa+vBgwe1Q4cO+v333yuQrif5XfXY4PUikgy8ArQEFHhOVZ86bh0BngJ+AhQDk1R1pacy+aJ9BaVkHCjhhiEpTkcxfm72qiweW7CFPYdKKCmvZPaqLCa4h5AEyMzMZOLEiWRnZ1NWVkaHDj8MijR27FjCw8MJDw8nMTGRffv28dVXX3HppZcSFRUFwLhx4475vqPTvXr1IjU1tXpvvWPHjmRkZNCiRQv++Y+n2fPiywDkHznA1q1badGiBcHBwVx++eXHbG/8+PFMmTKFa6+91ifbOmPGDN5//30AMjIyzritFRUVXH311dx111107Nixzj8PT54aqgDuVdUewGDgDhHpcdw6Y4Au7tctwD89mMcnpe88CEBaSpzDSYw/m70qi9+9t46sQyUooAq/e28ds1dlVa9z5513MnnyZNatW8ezzz5LaWlp9bLw8B8eCxEcHExFRUW933n0M0FBQcd8PigoiIqKChYtWsRnn31G+xufoM1NT9O959nV3xkREUFwcPAx2xs2bBjz58/HtRN9cpVV6rVtXbp0KWvWrKFv375n3NZbbrmFLl268Jvf/KbefB4rBKqafXTvXlULgU1A0nGrjQdecR/FLANiReTUTuIFiPRdB4gIDSK1jfUPGM95bMEWSo67caukvPKYRzzk5+eTlOT6L/zyyy/Xu81zzz2X2bNnU1JSQmFhIXPmzDmtTPn5+TRv3pzbL0ilPC+D9OV1d/Q+8sgjNG/enDvuuKPO9coqq7y2rVFRUWzevJlly5bVuX59bX3wwQfJz8/nySefPKXvb5TOYhFJAfoCx482kQRk1JjO5MRigYjcIiLpIpKek5PjsZzeaG1mPr2SmhEabP36xnP2HCo5ZlrLj5D5jxv4ZvrPaNu2LU888QTTpk3jyiuvpH///sTH1z8oUr9+/Zg4cSK9e/dmzJgxDBgw4LQyjR49moqKCv45eRwHv3iZ0NZn1fuZp556ipKSEqZMmXLCsilTptC2bVuqylxtO7T4da9ra/fu3Zk6dSqDBw/+0W3NzMxk+vTpbNy4kX79+tGnTx+ef/75Orcl9R1GnSkRiQa+AKar6nvHLfsIeFRVF7unPwfuV9X0k20vLS1N09NPutivVFUpZ//hEy7rl8Qj43s6Hcf4sWGPLiTruGIAkBQbyddTz3cg0bFSps4FYOejY894W97eVk8RkRWqmlbbMo/uZopIKPAu8PrxRcAtC0iuMd3WPc8AmQdLOHykgu522ajxsPsuPovI0GPPQ0eGBnPfxfXvhfuaQGrrqfJYIXBfEfQCsElVnzjJah8C14vLYCBfVbM9lcnXbNrrGsC7W6umDicx/m5C3yT+fFkvkmIjEVx7x3++rNcxV9I4KSzE9VO1v7C0njXr5+1tdYLHLh8FhgHXAetEZLV73u+BdgCq+i9gHq5LR7fhunz0Rg/m8TmbswsRgbOsEJhGMKFvktf+GF7aJ4lZ6Rl8tCabm4Z3qP8D9fDmtjrBY4XAfd6/ztHV3TdL1N3FH8B25hXRplkkUWGerNfGeL/zuycyKz2DL77LaZBCYI5ll6J4sYwDxSTH2djExgzp5BrQfvG2uh8sZ34cKwRebPeBYpKbRzkdwxjHHR2Vr7LKs1c5BiorBF6qpKyS/YVHaBdnhcAY41lWCLzU0euc29qpIWOMh1kh8FJ5h48AkBAd4XASY7yLp2+CDURWCLxUXlEZAHFNwhxOYox3iI92/V/YV3DE4ST+xwqBlzpaCI7+4zcm0HVJdN1P892+QoeT+B8rBF7qwGFXIWhuRwTGAD/cWGmFoOFZIfBSh0rKaBIWbE8dNcYt2X0FXebBEx8YZ86M/cp4qdLyKiLDgutf0ZgA0TzKdS/BoeIyh5P4HysEXupIeSURoVYIjDmqeZTrNOnB4nKHk/gfKwReqrTCCoExNTWzIwKPsULgpUrLq4gItb8eY446ekRwqMSOCBpavb80InKniDRvjDDmB1WqBEmdD281JqAEu/8/2POGGt6p7HK2BJaLyFsiMto94IzxsGAR+wdvTA1llVUAhNmVdA2u3j9RVX0Q6IJrtLFJwFYR+ZOIdPJwtoAWFGSFwJiaKqpchcAuqW54p/Qn6h5AZq/7VQE0B94Rkb96MFtACxahyp6pYky18grX/4fQEDsp0dDqHfpKRH4NXA/kAs8D96lquYgEAVuBKZ6NGJiCg4UKOyIwplppRSUA4SF2NV1DO5UxEOOAy1R1V82ZqlolIj/1TCzTJCyYoiMVTscwxmvsK3ANXN8yJtzhJP6n3kKgqg/XsWxTw8YxR8VEhFJYaoXAmKOy3I+WaNPMxuhoaNbr4qWaRoRSXFZJuftKCWMC3dHBmtrEWiFoaB4rBCLyoojsF5H1J1k+UkTyRWS1+/WQp7L4ophI18HaYTsqMAaAPe5CkNTcCkFD8+QRwUvA6HrW+UpV+7hfj3gwi89pFum6nf6g3U5vDADbc4sAaN/CxvFuaB4rBKr6JXDAU9v3d61iXENU2mhMxrhsz3EVgs4J0Q4n8T9O9xEMEZE1IvKxiKSebCURuUVE0kUkPScnpzHzOaZVM1ch2Ftgz143pqYQu6GswTn5J7oSaK+qvYG/A7NPtqKqPqeqaaqalpCQ0Fj5HHW0EGTnlzqcxBjj7xwrBKpaoKqH3e/nAaEiEu9UHm8TFRZCs8hQ9lohMMZ4mGOFQERaHX2AnYgMdGfJcyqPN0qKjWT3gWKnYxjjuCPuu4qNZ5zKncU/ioi8CYwE4kUkE3gYCAVQ1X8BVwC3iUgFUAJc5X6mkXHrlBjN6oyDTscwxnFLvnftIw7sEOdwEv/ksUKgqlfXs/xp4GlPfb8/6JTQhI/W7qHUhq00Ae6TDfsAuKhHS4eT+CfrfvdinROjUf3hsjljAtWnG/cCcHFqK4eT+CcrBF6sk/t66a37Cx1OYoyzcg+7bqxMjrObyTzBCoEX65QQTVhwEBv3FDgdxRjjx6wQeLGwkCC6t27K6oxDTkcxxjEHi+wxK55mhcDLnd02lvVZ+TZspQlYb6/IAGBiWrLDSfyXFQIvd3bbZhSVVbI957DTUYxxxKvLXGNi/Xxwe4eT+C8rBF6uT3IsAKt2H3I0hzFOyTjget5Wr7bNHE7iv6wQeLnOidG0aBLG0u1207UJPFV2SrRRWCHwciLCkE4tWPJ9LnbjtQk089ZnAzAgpbnDSfybFQIfMLRTPPsKjlQPzGFMoHjik+8AuOfCsxxO4t+sEPiAoZ1aALBkW67DSYxpXEd3foa4/w8Yz7BC4APat4giOS6S/24JjEF5jAEoKC13OkLAsELgA0SEC7q3ZPG2XIqO2GD2JjAcPS00aWiKs0ECgBUCH3FRj1aUVVTx5Xd2VGACw0tLdgJw70VdnQ0SAKwQ+IgBKc2JjQrl0437nI5ijMfVvJO+aUSog0kCgxUCHxESHMT53RL5bNM+G63J+L3nv9oOwMizAmOMcqdZIfAhl/RuQ0FpBYus09h4WHR0dINvc9q0aTz++OOntO6fP94MwF8vP/uU1k9JSSE3t+6r6lasWEGvXr3o3Lkzd911V/V9OU639XSdSltHjx5N7969SU1N5dZbb6Wysu6dRysEPuSczvHER4fz/sosp6MY4zGHa1wQkRgTUe/69f3IHXXbbbcxc+ZMtm7dytatW5k/f/6PzuiUU23rW2+9xZo1a1i/fj05OTm8/fbbda5vhcCHhAQHMa53GxZu3k9+sV1aZxrXnDlzGDRoEH379uWCCy5g3z5Xf9W0adO46aabGDlyJB07dmTGjBnVn5k+fTpdu3Zl+PDhbNmypXr+yJEjufvuu0lLS6N79+4sX76cyy67jC5dunDB1bcBrquFJkyYQP/+/UlNTeW5556r/nx0dDT33nsvvXv3ZunSpdXzS0pKGDNmDDNnzjwme3Z2NgUFBQwePBgR4frrr2f27NmOt/XBBx+sXq+h2goQExMDQEVFBWVlZYjISdsKgKr61Kt///4ayNZlHtL293+kry7d6XQU48eaNGlywrwDBw5oVVWVqqrOnDlT77nnHlVVffjhh3XIkCFaWlqqOTk5GhcXp2VlZZqenq49e/bUoqIizc/P106dOuljjz2mqqojRozQKVOmqKrqk08+qa1bt9Y9e/ZoaWmpBke30LZ3vaElZRWal5enqqrFxcWampqqubm5qqoK6KxZs6qztW/fXnfs2KGjRo3Sl19++YTsy5cv11GjRlVPf/nllzp27FjH25qUlFTdpoZq61EXXXSRxsbG6tVXX60VFRUKpOtJflc9Nni9iLwI/BTYr6o9a1kuwFPAT4BiYJKqrvRUHn+R2iaGbq2a8sY3u7l2ULv6K70xDSQzM5OJEyeSnZ1NWVkZHTp0qF42duxYwsPDCQ8PJzExkX379vHVV19x6aWXEhXlGl5y3Lhxx2zv6HSvXr1ITU2ldevWrM08REhsKyoLcokIDebRGTN4//33AcjIyGDr1q20aNGC4OBgLr/88mO2N378eKZMmcK1117rE20F6NixIxkZGbRo0YIZDdzWBQsWUFpayrXXXsvChQvrbK8nTw29BIyuY/kYoIv7dQvwTw9m8RsiwnVD2rMxu4CVuw86Hcf4kdmrshj26EI6TJ1LSXkls1cd2xd15513MnnyZNatW8ezzz5LaWlp9bLw8PDq98HBwVRU1H/j49HPBAUFVb8f9/TXIMK0n3Zj0aJFfPbZZyxdupQ1a9bQt2/f6u+MiIggODj4mO0NGzaM+fPn1/pwxqSkJDIzM39o6+K1pOfgaFuPTldUVDRoW2uKiIhg/PjxfPDBB3Wu57FCoKpfAgfqWGU88Ir7KGYZECsirT2Vx59M6JNE0/AQXlm6y+koxk/MXpXF795bR9ahEhRQhd+9t+6YH8j8/HySkpIAePnll+vd5rnnnsvs2bMpKSmhsLCQOXPm1Ll+SdkPHaH92jcnPz+f5s2bExUVxebNm1m2bFmdn3/kkUdo3rw5d9xxxwnLWrduTUxMDMuWLeP9lZk8+8JLaLs0x9p6vIZs6+HDh8nOdj21taKigrlz59KtW7c6t+dkZ3ESkFFjOtM9z9SjSXgIl/dvy7x12eQUHnE6jvEDjy3YQkn5Dz/EWn6ErU/+nIkj+9C2bVueeOIJpk2bxpVXXkn//v2Jj4+vd5v9+vVj4sSJ9O7dmzFjxjBgwIA617/37dUAtHRfKTR69GgqKiro3r07U6dOZfDgwfV+51NPPUVJSQlTpkw5YdkzzzzDL3/5S66+cCBBzVoS0THNsbYeryHbWlRUxLhx4zj77LPp06cPiYmJ3HrrrXVuS+o7tDgTIpICfHSSPoKPgEdVdbF7+nPgflVNr2XdW3CdPqJdu3b9d+2yPeHvcw4z6v++4K7zO3PPRfaIXnNmOkydS22/BALseHSsx79fVenwu3kAbJ0+htBgz+2jOt1Wp4jIClVNq22Zk0cEWUDN0ajbuuedQFWfU9U0VU1LSLA7DQE6JURzUY+WvLRk5zHXXRvzY7SJjTyt+Q3tb5+6HjDXrVVTjxYBcL6t3sjJQvAhcL24DAbyVTXbwTw+5/bzOlNQWsHry+wIyZyZ+y4+i8jQYzskI0ODue/ixjnanLFwGwCzfjXE49/ldFu9kScvH30TGAnEi0gm8DAQCqCq/wLm4bp0dBuuy0dv9FQWf9UnOZbhneN5fvEObhiaQsRx/7iNOVUT+rq65x5bsIU9h0poExvJfRefVT3fk15duhOAuCZhNIv0/APmnGyrt/JoH4EnpKWlaXr6Cd0IAWvJ97lcM/Mb/jAulRvsue3GB6VMnQvAst+NolWz+h8pYX4cb+0jMA1gSMcWDOoQx98XbrVBa4zP+dcX3wMQFRZsRcBBVgh8nIhw/5hu5B4u44XFO5yOY8wpU1UedT9l9Ksp5zmcJrBZIfAD/do15+LUljz7xffkHbb7Coxv+P376wHo0TqGFtHh9axtPMkKgZ+47+JulJRX8nf31RfGeLPS8kre/HY3AO/dPtThNMYKgZ/onBjN1QPb8eqyXWzKLnA6jjF1GvV/XwBwRf+2drWbF7BC4Efuu/gsYiJCeOiD9fU+jMoYp2zYk0/WoRIAHrvi1EYgM55lhcCPxEaFcf/obizfeZDZq20UM+Odxs5YDMC/Jw2wx6h7CSsEfuZnacn0To5l+tzNNoqZ8TpPfba1+v153RIdTGJqskLgZ4KChOkTenKwuIxHPtrodBxjquUdPsLfPnM9U2jl/1zocBpTkxUCP9QzqRm3j+zEuyszWbh5n9NxjAGg/x8/A+CeC7sS1yTM4TSmJisEfmry+Z05q2VTpr67zk4RGcf9/fMfTgndNaqLg0lMbawQ+KnwkGAev7I3eUVlPPzheqfjmAC2N7+U/3M/Zjr9wQscTmNqY4XAj/Vq24w7z+/M7NV7eGdFZv0fMKaBqSqD//w5APeP7ka83UHslawQ+Lk7z+/CoA5x/M/s9Wzbf9jpOCbA/OzZpQCEhQRx28hODqcxJ2OFwM8FBwlPXdWXyLBgJr+xktIa49Ia40nz12ezfOdBADb84WKH05i6WCEIAK2aRfB/P+vN5r2FPPzBBrvr2HjcvoJSbn1tJQAf3Tnc48NPmjNjfzsB4ryzEpl8XmdmpWfwylIb2tJ4TkVlFYP+5OoXuPP8zvRMauZwIlMfKwQB5J4Lu3JB90Qe+WgjS7blOh3H+KnOD3wMQIf4Jtx7UeCOA+xLrBAEkKAg4W8T+9Axvgm3v7GS3XnFTkcyfuaO11dWv1947wgHk5jTYYUgwDSNCGXm9WmowqSXvuVAUZnTkYyf+Oei75m7LhuAddMusgfK+RArBAEoJb4JM69PI/NgCTe9tJziMhvr2JyZeeuy+ct817CTn90zgqYRoQ4nMqfDo4VAREaLyBYR2SYiU2tZPklEckRktfv1S0/mMT8Y2CGOGVf1ZW3mISa/sYqKyiqnIxkftXL3QW53nxJ64+ZBdE6MdjiROV0eKwQiEgz8AxgD9ACuFpEetaw6S1X7uF/PeyqPOdHonq343wk9Wbh5P/e/u46qKrus1JyerfsKueyZJYBrkJmhneIdTmR+jBAPbnsgsE1VtwOIyH+A8YA9G9mLXDuoPXmHy3ji0+8ICRL+fFkvgoLs3K6p3/c5h7nwb18C8OtRXbgyLdnhRObH8mQhSAIyakxnAoNqWe9yETkX+A64W1Uzjl9BRG4BbgFo166dB6IGtrtGdaGisooZC7cRFATTJ1gxMHXbkVtUPe7wrSM6cfeFXR1OZM6E053Fc4AUVT0b+BR4ubaVVPU5VU1T1bSEhIRGDRgo7r6wK5PP68yb32bw4Afr7TSROakduUWc9/giAG4+pwNTx3RzNpA5Y548IsgCah4rtnXPq6aqeTUmnwf+6sE8pg4iwr0XdaVKlWcWfU/xkQoeu7K3PRrAHGPV7oNc6u4TmDQ0hQfG1tbtZ3yNJwvBcqCLiHTAVQCuAq6puYKItFbVbPfkOGCTB/OYeogI9118Fk3CQ3hswRYOlZTzzLX9iArz5D8T4ys+27iPX76SDrj6BOx0kP/w2O6eqlYAk4EFuH7g31LVDSLyiIiMc692l4hsEJE1wF3AJE/lMadGRLjjvM48elkvvvwuh2uf/4ZDxXbTWaB7/Ztd1UXgL5f3siLgZ8TXnkSZlpam6enpTscICPPXZ3PXm6tJah7J8zek0SnBrg8PRHfPWs37q1xndV+clMb53Vo6nMj8GCKyQlXTaltmJ4DNSY3u2ZrXbx5Efkk5l/7ja77amuN0JNOIqqqUHg/Nry4Cc+8abkXAT1khMHUakBLHB3cMo3WzSCb9ezmvLN1p4xkEgPzicjr+fh7FZa6BjNY8fBGpbexx0v7KCoGpV3JcFO/ePpTzzkrgoQ82cO9ba+z5RH7si+9y6P3IJwBEhgaz/U8/oVmkPTvIn1khMKckOjyEZ69L49ejuvD+6izGP/01W/cVOh3LNLA731zFDS9+C8C1g9qx6X9H282FAcAKgTllwUHC3Rd25dWbBnGwuIxxT3/NOysy7VSRHygoLSdl6lzmrNkDwFu/GsL0S3s5nMo0FisE5rQN7xLPvLvO4ey2zfjt22u4/fWV5B0+4nQs8yP959vdnD3tk+rpjY9czMAOcQ4mMo3N7hQyP0piTARv3DyY577czt8+/Y7lO7/kT5f24qLUVk5HM6eotLyS1IcXUOl+nMiNw1J4+JJUh1MZJ9gRgfnRgoOE20Z24sM7h5HYNIJbXl3BPbNW29GBD3grPYNu/zO/ugh8cd9IKwIBzI4IzBnr1iqG2XcM4+mFW3lm0fcs3LKf+0d3Y2JasnU0epm9+aUM/vPn1dOX9G7D36/u62Ai4w3szmLToLbuK+SB2ev5dscB+rWL5Y8TetGjTYzTsQKeqjL5jVXVYwoDfDXlPJLjohxMZRpTXXcWWyEwDU5VeW9lFtPnbeJQcRlX9k/m7gu70qpZhNPRAtK/v97BH+b8MB7UH8alcsPQFOcCGUfUVQjs1JBpcCLC5f3bMqp7In9fuI1Xlu7kgzVZ3HxOR341ohPR4fbPrjEs3prLz1/4pnq6V1Iz3rltCOEhwQ6mMt7IjgiMx2UcKOavC7YwZ80eWjQJ4+ZzO/Lzwe2tIHjIku9zuWbmN8fM+/aBUSQ2tSOyQGanhoxXWJNxiMc/2cJXW3OJjQrlF8M6cMOwFGIi7PEFDWHRlv1M+vfyY+Z9dOdweibZM4KMFQLjZVZnHOLvn2/l8837aRoRwjUD23HdkPa0bW4dl6dLVXnuy+38+ePNx8yffccw+iTHOhPKeCUrBMYrrc/K55+Lvmf+hr2oKhf2aMmkoR0Y3DEOEbvstC6Hj1Rw22sr+Gpr7jHz5911jl2lZWplhcB4tT2HSnht2S7e/HY3B4vL6ZIYzRX923Jp3yQSY+y8dk3vrMjkt2+vOWZe99YxvPqLgcRHhzuUyvgCKwTGJ5SWV/Lh6j3MSs9gxa6DBAmc2zWBy/u5rkAK1LGT12Ye4rbXVpJ1qOSY+bec25Gpo7vZTXvmlFghMD5ne85h3l2ZyXsrs8jOLyU8JIgRXRMY3bMVo7q1pFmUf3cwL9mWy69nrSan8NjHdXRKaMLzNwygQ3wTh5IZX2WFwPisyirlmx15LFi/lwUb9rG3oJSQIGFAShzDu8RzTpd4Uts0I9jH94oPFpXxj/9u4/nFO05YFhYSxIyr+jC6Z2sHkhl/YYXA+IWqKmVN5iHmb9jLF1ty2LzXNTBObFQowzrF0799c/q0iyW1TYzX3zS1O6+Yl5bs5MWvT/zhB2gZE84TP+vDsM7xjZzM+CvHCoGIjAaeAoKB51X10eOWhwOvAP2BPGCiqu6sa5tWCMxR+wtLWbItj8XbclmyLZc9+aUAhAUH0b1NDL3bNqNLy6Z0TYyma8umNG8S1ugZq6qUFbsPMndtNh+t3UPu4bKTrnvTsA5MPr8zcQ7kNP7PkUdMiEgw8A/gQiATWC4iH6rqxhqr/QI4qKqdReQq4C/ARE9lMv4lsWkEE/omMaFvEgD7CkpZtfsQqzIOsmr3Id5bmcXhIz+MrRwfHU6H+CjaxEbSJjaSpNhI2sRGENcknNjIUGKjQmkaEXrKp5lKyirZmVfErrwiduYVs2VvIct3HiDzYEm9n40KC+amYR24bkh7WtqVUcZhnrwMYyCwTVW3A4jIf4DxQM1CMB6Y5n7/DvC0iIj62vkq4xVaxkQwumcrRvd0DY6jquzJL2XrvkK27jvMd/sK2X2gmJXuPfSKqhP/mYlAdFgIYSFBhAYHsbeg9IxzdW8dw0/Pbs3YXq1JsU5e44U8WQiSgIwa05nAoJOto6oVIpIPtACOuUtGRG4BbgFo166dp/IaPyMiJLn3/EeelXjMssoqJafwCFmHSjhUXMah4nIOlZSTX1xGQWkF5ZVVVFQqO/KK+HbHgVq3HxospLRoQvsWTUhpEUWXltGkpcTRMb6J3RBnfIpPXJitqs8Bz4Grj8DhOMYPBAcJrZpF2KOxjcGzQ1VmAck1ptu659W6joiEAM1wdRobY4xpJJ4sBMuBLiLSQUTCgKuAD49b50PgBvf7K4CF1j9gjDGNy2Onhtzn/CcDC3BdPvqiqm4QkUeAdFX9EHgBeFVEtgEHcBULY4wxjcijfQSqOg+Yd9y8h2q8LwWu9GQGY4wxdfPkqSFjjDE+wAqBMcYEOCsExhgT4KwQGGNMgPO5p4+KSA6wy+kcJxHPcXdF+7FAaisEVnutrf6pvaom1LbA5wqBNxOR9JM93c/fBFJbIbDaa20NPHZqyBhjApwVAmOMCXBWCBrWc04HaESB1FYIrPZaWwOM9REYY0yAsyMCY4wJcFYIjDEmwFkhaGAi8piIbBaRtSLyvojEOp3JU0TkShHZICJVIuKXl+CJyGgR2SIi20RkqtN5PElEXhSR/SKy3uksniYiySLyXxHZ6P43/GunMznJCkHD+xToqapnA98Bv3M4jyetBy4DvnQ6iCeISDDwD2AM0AO4WkR6OJvKo14CRjsdopFUAPeqag9gMHCHn//d1skKQQNT1U9UtcI9uQzXyGx+SVU3qeoWp3N40EBgm6puV9Uy4D/AeIczeYyqfolrXBC/p6rZqrrS/b4Q2IRrDPWAZIXAs24CPnY6hPnRkoCMGtOZBPCPhb8SkRSgL/CNw1Ec4xOD13sbEfkMaFXLogdU9QP3Og/gOvx8vTGzNbRTaasxvkpEooF3gd+oaoHTeZxiheBHUNUL6louIpOAnwKjfH0M5vra6ueygOQa023d84wfEJFQXEXgdVV9z+k8TrJTQw1MREYDU4BxqlrsdB5zRpYDXUSkg4iE4RpT+0OHM5kGICKCa8z0Tar6hNN5nGaFoOE9DTQFPhWR1SLyL6cDeYqIXCoimcAQYK6ILHA6U0Nyd/pPBhbg6kx8S1U3OJvKc0TkTWApcJaIZIrIL5zO5EHDgOuA893/T1eLyE+cDuUUe8SEMcYEODsiMMaYAGeFwBhjApwVAmOMCXBWCIwxJsBZITDGmABnhcAYYwKcFQJjjAlwVgiMOUMiMsA9/kSEiDRxP9++p9O5jDlVdkOZMQ1ARP4IRACRQKaq/tnhSMacMisExjQA97OIlgOlwFBVrXQ4kjGnzE4NGdMwWgDRuJ4zFeFwFmNOix0RGNMARORDXCOYdQBaq+pkhyMZc8psPAJjzpCIXA+Uq+ob7nGOl4jI+aq60OlsxpwKOyIwxpgAZ30ExhgT4KwQGGNMgLNCYIwxAc4KgTHGBDgrBMYYE+CsEBhjTICzQmCMMQHu/wGAM5bvW0+i9wAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "# Plot the state trajectory\n", + "pos = np.array([state.value[1:] for state in state_data])\n", + "plt.plot(pos[:, 0], pos[:, 1])\n", + "plt.scatter(landmarks[:, 0], landmarks[:, 1])\n", + "# add labels\n", + "for i, landmark in enumerate(landmarks):\n", + " plt.annotate(f\"Landmark {i}\", landmark)\n", + "plt.xlabel(\"x\")\n", + "plt.ylabel(\"y\")\n", + "plt.title(\"Simulated Trajectory\")\n", + "plt.axis(\"equal\")\n", + "\n", + "\n", + "# Plot the input data\n", + "plt.figure()\n", + "u_array = np.array([u.value for u in input_data])\n", + "u_stamps = np.array([u.stamp for u in input_data])\n", + "plt.plot(u_stamps, u_array[:, 0], label=\"omega\")\n", + "plt.plot(u_stamps, u_array[:, 1], label=\"v\")\n", + "plt.xlabel(\"Time (s)\")\n", + "plt.ylabel(\"Input\")\n", + "plt.title(\"Input Data\")\n", + "plt.legend()\n", + "plt.show()\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run a filter!\n", + "\n", + "Finally, lets run an extended Kalman filter on this data to get a state estimate that uses only the noisy measurements. In the below filter, we instantiate the [ExtendedKalmanFilter](../_autosummary/navlie.filters.ExtendedKalmanFilter.rst) to use on our data, and looping over the input measurements while also calling the correction step whenever a measurement occurs." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "# First, define the filter\n", + "kalman_filter = nav.ExtendedKalmanFilter(process_model)\n", + "\n", + "# You can try other filters too!\n", + "# kalman_filter = nav.UnscentedKalmanFilter(process_model)\n", + "# kalman_filter = nav.IteratedKalmanFIlter(process_model)\n", + "\n", + "P0 = np.diag([0.1**2, 1**2, 1**2]) # Initial covariance\n", + "x = nav.StateWithCovariance(x, P0) # Estimate and covariance in one container\n", + "\n", + "meas_idx = 0\n", + "y = meas_data[meas_idx]\n", + "estimates = []\n", + "for k in range(len(input_data) - 1):\n", + " u = input_data[k]\n", + "\n", + " # Fuse any measurements that have occurred.\n", + " while y.stamp < input_data[k + 1].stamp and meas_idx < len(meas_data):\n", + " x = kalman_filter.correct(x, y, u)\n", + "\n", + " # Load the next measurement\n", + " meas_idx += 1\n", + " if meas_idx < len(meas_data):\n", + " y = meas_data[meas_idx]\n", + "\n", + " # Predict until the next input is available\n", + " dt = input_data[k + 1].stamp - x.state.stamp\n", + " x = kalman_filter.predict(x, u, dt)\n", + "\n", + " estimates.append(x.copy())" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The filters in navlie are all designed to be *stateless*: this means that the actual state estimate is stored externally to the filter objects, in this case in a container called [StateWithCovariance](../_autosummary/navlie.types.StateWithCovariance.rst). Although this adds a slight burden on the user, it has the advantage of being more transparent, and also providing the ability to combine different filters in the same loop! For example, you could use an EKF for the prediction, but a UKF for the correction, or even to use different filters for different measurement models!\n", + "\n", + "\n", + "Once estimates have been obtained, we will often be interested in evaluating the performance. The [GaussianResultList](../_autosummary/navlie.utils.GaussianResultList.rst) object is a useful container for evaluating the quality of the state estimates when ground truth data is available. It calculates useful metrics such as raw error, Mahalanobis distance, and normalized estimation error squared (NEES). " + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "results = nav.GaussianResultList.from_estimates(estimates, state_data)\n", + "# results.nees \n", + "# results.three_sigma\n", + "# results.error\n", + "# results.md # mahalanobis distance\n", + "# # and more...\n", + "\n", + "# Some plotting functions that work directly with GaussianResultList\n", + "fig, axs = nav.plot_error(results)\n", + "axs[0].set_title(\"Estimation Errors\")\n", + "axs[0].set_ylabel(\"theta (rad)\")\n", + "axs[1].set_ylabel(\"x (m)\")\n", + "axs[2].set_ylabel(\"y (m)\")\n", + "axs[2].set_xlabel(\"Time (s)\")\n", + "\n", + "fig, ax = nav.plot_nees(results)\n", + "ax.set_title(\"NEES\")\n", + "ax.set_xlabel(\"Time (s)\")\n", + "plt.show()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As a final note, `GaussianResultList` will invoke the `State.minus` method of the state objects to calculate the error. As we will see next, this allows us to implement a custom measure of error, when it might not make sense to directly subtract two of our state objects." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.16" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/index.html b/index.html new file mode 100644 index 00000000..0f0d91ff --- /dev/null +++ b/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/make.bat b/make.bat new file mode 100644 index 00000000..6247f7e2 --- /dev/null +++ b/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..6d9dc705 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +sphinx==7.1.2 +pandoc +nbsphinx +ipykernel +pydata-sphinx-theme==0.7.2 diff --git a/source/_autosummary/navlie.batch.estimator.BatchEstimator.rst b/source/_autosummary/navlie.batch.estimator.BatchEstimator.rst new file mode 100644 index 00000000..b4222adc --- /dev/null +++ b/source/_autosummary/navlie.batch.estimator.BatchEstimator.rst @@ -0,0 +1,10 @@ +navlie.batch.estimator.BatchEstimator +===================================== + +.. currentmodule:: navlie.batch.estimator + +.. autoclass:: BatchEstimator + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.batch.estimator.rst b/source/_autosummary/navlie.batch.estimator.rst new file mode 100644 index 00000000..29b2582d --- /dev/null +++ b/source/_autosummary/navlie.batch.estimator.rst @@ -0,0 +1,31 @@ +navlie.batch.estimator +====================== + +.. automodule:: navlie.batch.estimator + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + BatchEstimator + + + + + + + + + diff --git a/source/_autosummary/navlie.batch.gaussian_mixtures.GaussianMixtureResidual.rst b/source/_autosummary/navlie.batch.gaussian_mixtures.GaussianMixtureResidual.rst new file mode 100644 index 00000000..4cf8538f --- /dev/null +++ b/source/_autosummary/navlie.batch.gaussian_mixtures.GaussianMixtureResidual.rst @@ -0,0 +1,10 @@ +navlie.batch.gaussian\_mixtures.GaussianMixtureResidual +======================================================= + +.. currentmodule:: navlie.batch.gaussian_mixtures + +.. autoclass:: GaussianMixtureResidual + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.rst b/source/_autosummary/navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.rst new file mode 100644 index 00000000..dacea608 --- /dev/null +++ b/source/_autosummary/navlie.batch.gaussian_mixtures.HessianSumMixtureResidual.rst @@ -0,0 +1,10 @@ +navlie.batch.gaussian\_mixtures.HessianSumMixtureResidual +========================================================= + +.. currentmodule:: navlie.batch.gaussian_mixtures + +.. autoclass:: HessianSumMixtureResidual + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.batch.gaussian_mixtures.MaxMixtureResidual.rst b/source/_autosummary/navlie.batch.gaussian_mixtures.MaxMixtureResidual.rst new file mode 100644 index 00000000..feb7ccc0 --- /dev/null +++ b/source/_autosummary/navlie.batch.gaussian_mixtures.MaxMixtureResidual.rst @@ -0,0 +1,10 @@ +navlie.batch.gaussian\_mixtures.MaxMixtureResidual +================================================== + +.. currentmodule:: navlie.batch.gaussian_mixtures + +.. autoclass:: MaxMixtureResidual + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.batch.gaussian_mixtures.MaxSumMixtureResidual.rst b/source/_autosummary/navlie.batch.gaussian_mixtures.MaxSumMixtureResidual.rst new file mode 100644 index 00000000..49b7a8d7 --- /dev/null +++ b/source/_autosummary/navlie.batch.gaussian_mixtures.MaxSumMixtureResidual.rst @@ -0,0 +1,10 @@ +navlie.batch.gaussian\_mixtures.MaxSumMixtureResidual +===================================================== + +.. currentmodule:: navlie.batch.gaussian_mixtures + +.. autoclass:: MaxSumMixtureResidual + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.batch.gaussian_mixtures.SumMixtureResidual.rst b/source/_autosummary/navlie.batch.gaussian_mixtures.SumMixtureResidual.rst new file mode 100644 index 00000000..be782443 --- /dev/null +++ b/source/_autosummary/navlie.batch.gaussian_mixtures.SumMixtureResidual.rst @@ -0,0 +1,10 @@ +navlie.batch.gaussian\_mixtures.SumMixtureResidual +================================================== + +.. currentmodule:: navlie.batch.gaussian_mixtures + +.. autoclass:: SumMixtureResidual + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.batch.gaussian_mixtures.rst b/source/_autosummary/navlie.batch.gaussian_mixtures.rst new file mode 100644 index 00000000..91df23dd --- /dev/null +++ b/source/_autosummary/navlie.batch.gaussian_mixtures.rst @@ -0,0 +1,35 @@ +navlie.batch.gaussian\_mixtures +=============================== + +.. automodule:: navlie.batch.gaussian_mixtures + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + GaussianMixtureResidual + HessianSumMixtureResidual + MaxMixtureResidual + MaxSumMixtureResidual + SumMixtureResidual + + + + + + + + + diff --git a/source/_autosummary/navlie.batch.losses.CauchyLoss.rst b/source/_autosummary/navlie.batch.losses.CauchyLoss.rst new file mode 100644 index 00000000..8a2b1e42 --- /dev/null +++ b/source/_autosummary/navlie.batch.losses.CauchyLoss.rst @@ -0,0 +1,10 @@ +navlie.batch.losses.CauchyLoss +============================== + +.. currentmodule:: navlie.batch.losses + +.. autoclass:: CauchyLoss + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.batch.losses.L2Loss.rst b/source/_autosummary/navlie.batch.losses.L2Loss.rst new file mode 100644 index 00000000..dbe005c2 --- /dev/null +++ b/source/_autosummary/navlie.batch.losses.L2Loss.rst @@ -0,0 +1,10 @@ +navlie.batch.losses.L2Loss +========================== + +.. currentmodule:: navlie.batch.losses + +.. autoclass:: L2Loss + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.batch.losses.LossFunction.rst b/source/_autosummary/navlie.batch.losses.LossFunction.rst new file mode 100644 index 00000000..b275f496 --- /dev/null +++ b/source/_autosummary/navlie.batch.losses.LossFunction.rst @@ -0,0 +1,10 @@ +navlie.batch.losses.LossFunction +================================ + +.. currentmodule:: navlie.batch.losses + +.. autoclass:: LossFunction + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.batch.losses.rst b/source/_autosummary/navlie.batch.losses.rst new file mode 100644 index 00000000..fc889ee2 --- /dev/null +++ b/source/_autosummary/navlie.batch.losses.rst @@ -0,0 +1,33 @@ +navlie.batch.losses +=================== + +.. automodule:: navlie.batch.losses + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + CauchyLoss + L2Loss + LossFunction + + + + + + + + + diff --git a/source/_autosummary/navlie.batch.problem.OptimizationSummary.rst b/source/_autosummary/navlie.batch.problem.OptimizationSummary.rst new file mode 100644 index 00000000..bcb8ee19 --- /dev/null +++ b/source/_autosummary/navlie.batch.problem.OptimizationSummary.rst @@ -0,0 +1,10 @@ +navlie.batch.problem.OptimizationSummary +======================================== + +.. currentmodule:: navlie.batch.problem + +.. autoclass:: OptimizationSummary + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.batch.problem.Problem.rst b/source/_autosummary/navlie.batch.problem.Problem.rst new file mode 100644 index 00000000..40846284 --- /dev/null +++ b/source/_autosummary/navlie.batch.problem.Problem.rst @@ -0,0 +1,10 @@ +navlie.batch.problem.Problem +============================ + +.. currentmodule:: navlie.batch.problem + +.. autoclass:: Problem + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.batch.problem.rst b/source/_autosummary/navlie.batch.problem.rst new file mode 100644 index 00000000..c85847bb --- /dev/null +++ b/source/_autosummary/navlie.batch.problem.rst @@ -0,0 +1,32 @@ +navlie.batch.problem +==================== + +.. automodule:: navlie.batch.problem + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + OptimizationSummary + Problem + + + + + + + + + diff --git a/source/_autosummary/navlie.batch.residuals.MeasurementResidual.rst b/source/_autosummary/navlie.batch.residuals.MeasurementResidual.rst new file mode 100644 index 00000000..b288b24c --- /dev/null +++ b/source/_autosummary/navlie.batch.residuals.MeasurementResidual.rst @@ -0,0 +1,10 @@ +navlie.batch.residuals.MeasurementResidual +========================================== + +.. currentmodule:: navlie.batch.residuals + +.. autoclass:: MeasurementResidual + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.batch.residuals.PriorResidual.rst b/source/_autosummary/navlie.batch.residuals.PriorResidual.rst new file mode 100644 index 00000000..4976a042 --- /dev/null +++ b/source/_autosummary/navlie.batch.residuals.PriorResidual.rst @@ -0,0 +1,10 @@ +navlie.batch.residuals.PriorResidual +==================================== + +.. currentmodule:: navlie.batch.residuals + +.. autoclass:: PriorResidual + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.batch.residuals.ProcessResidual.rst b/source/_autosummary/navlie.batch.residuals.ProcessResidual.rst new file mode 100644 index 00000000..33b29685 --- /dev/null +++ b/source/_autosummary/navlie.batch.residuals.ProcessResidual.rst @@ -0,0 +1,10 @@ +navlie.batch.residuals.ProcessResidual +====================================== + +.. currentmodule:: navlie.batch.residuals + +.. autoclass:: ProcessResidual + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.batch.residuals.Residual.rst b/source/_autosummary/navlie.batch.residuals.Residual.rst new file mode 100644 index 00000000..2752872c --- /dev/null +++ b/source/_autosummary/navlie.batch.residuals.Residual.rst @@ -0,0 +1,10 @@ +navlie.batch.residuals.Residual +=============================== + +.. currentmodule:: navlie.batch.residuals + +.. autoclass:: Residual + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.batch.residuals.rst b/source/_autosummary/navlie.batch.residuals.rst new file mode 100644 index 00000000..d9198a9f --- /dev/null +++ b/source/_autosummary/navlie.batch.residuals.rst @@ -0,0 +1,34 @@ +navlie.batch.residuals +====================== + +.. automodule:: navlie.batch.residuals + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + MeasurementResidual + PriorResidual + ProcessResidual + Residual + + + + + + + + + diff --git a/source/_autosummary/navlie.batch.rst b/source/_autosummary/navlie.batch.rst new file mode 100644 index 00000000..d327bc0e --- /dev/null +++ b/source/_autosummary/navlie.batch.rst @@ -0,0 +1,36 @@ +navlie.batch +============ + +.. automodule:: navlie.batch + + + + + + + + + + + + + + + + + + + +.. rubric:: Modules + +.. autosummary:: + :toctree: + :template: custom-module-template.rst + :recursive: + + navlie.batch.estimator + navlie.batch.gaussian_mixtures + navlie.batch.losses + navlie.batch.problem + navlie.batch.residuals + diff --git a/source/_autosummary/navlie.composite.CompositeInput.rst b/source/_autosummary/navlie.composite.CompositeInput.rst new file mode 100644 index 00000000..49444858 --- /dev/null +++ b/source/_autosummary/navlie.composite.CompositeInput.rst @@ -0,0 +1,10 @@ +navlie.composite.CompositeInput +=============================== + +.. currentmodule:: navlie.composite + +.. autoclass:: CompositeInput + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.composite.CompositeMeasurement.rst b/source/_autosummary/navlie.composite.CompositeMeasurement.rst new file mode 100644 index 00000000..3aa7b2c7 --- /dev/null +++ b/source/_autosummary/navlie.composite.CompositeMeasurement.rst @@ -0,0 +1,10 @@ +navlie.composite.CompositeMeasurement +===================================== + +.. currentmodule:: navlie.composite + +.. autoclass:: CompositeMeasurement + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.composite.CompositeMeasurementModel.rst b/source/_autosummary/navlie.composite.CompositeMeasurementModel.rst new file mode 100644 index 00000000..3d086bbb --- /dev/null +++ b/source/_autosummary/navlie.composite.CompositeMeasurementModel.rst @@ -0,0 +1,10 @@ +navlie.composite.CompositeMeasurementModel +========================================== + +.. currentmodule:: navlie.composite + +.. autoclass:: CompositeMeasurementModel + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.composite.CompositeProcessModel.rst b/source/_autosummary/navlie.composite.CompositeProcessModel.rst new file mode 100644 index 00000000..8ba205b7 --- /dev/null +++ b/source/_autosummary/navlie.composite.CompositeProcessModel.rst @@ -0,0 +1,10 @@ +navlie.composite.CompositeProcessModel +====================================== + +.. currentmodule:: navlie.composite + +.. autoclass:: CompositeProcessModel + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.composite.CompositeState.rst b/source/_autosummary/navlie.composite.CompositeState.rst new file mode 100644 index 00000000..a2124b82 --- /dev/null +++ b/source/_autosummary/navlie.composite.CompositeState.rst @@ -0,0 +1,10 @@ +navlie.composite.CompositeState +=============================== + +.. currentmodule:: navlie.composite + +.. autoclass:: CompositeState + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.composite.rst b/source/_autosummary/navlie.composite.rst new file mode 100644 index 00000000..6d49c4aa --- /dev/null +++ b/source/_autosummary/navlie.composite.rst @@ -0,0 +1,35 @@ +navlie.composite +================ + +.. automodule:: navlie.composite + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + CompositeInput + CompositeMeasurement + CompositeMeasurementModel + CompositeProcessModel + CompositeState + + + + + + + + + diff --git a/source/_autosummary/navlie.datagen.DataGenerator.rst b/source/_autosummary/navlie.datagen.DataGenerator.rst new file mode 100644 index 00000000..0d12bc00 --- /dev/null +++ b/source/_autosummary/navlie.datagen.DataGenerator.rst @@ -0,0 +1,10 @@ +navlie.datagen.DataGenerator +============================ + +.. currentmodule:: navlie.datagen + +.. autoclass:: DataGenerator + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.datagen.generate_measurement.rst b/source/_autosummary/navlie.datagen.generate_measurement.rst new file mode 100644 index 00000000..ed9151b3 --- /dev/null +++ b/source/_autosummary/navlie.datagen.generate_measurement.rst @@ -0,0 +1,6 @@ +navlie.datagen.generate\_measurement +==================================== + +.. currentmodule:: navlie.datagen + +.. autofunction:: generate_measurement \ No newline at end of file diff --git a/source/_autosummary/navlie.datagen.rst b/source/_autosummary/navlie.datagen.rst new file mode 100644 index 00000000..0fadd626 --- /dev/null +++ b/source/_autosummary/navlie.datagen.rst @@ -0,0 +1,38 @@ +navlie.datagen +============== + +.. automodule:: navlie.datagen + + + + + + + + .. rubric:: Functions + + .. autosummary:: + :toctree: + + generate_measurement + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + DataGenerator + + + + + + + + + diff --git a/source/_autosummary/navlie.filters.CubatureKalmanFilter.rst b/source/_autosummary/navlie.filters.CubatureKalmanFilter.rst new file mode 100644 index 00000000..0e4deac2 --- /dev/null +++ b/source/_autosummary/navlie.filters.CubatureKalmanFilter.rst @@ -0,0 +1,10 @@ +navlie.filters.CubatureKalmanFilter +=================================== + +.. currentmodule:: navlie.filters + +.. autoclass:: CubatureKalmanFilter + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.filters.ExtendedKalmanFilter.rst b/source/_autosummary/navlie.filters.ExtendedKalmanFilter.rst new file mode 100644 index 00000000..04abc897 --- /dev/null +++ b/source/_autosummary/navlie.filters.ExtendedKalmanFilter.rst @@ -0,0 +1,10 @@ +navlie.filters.ExtendedKalmanFilter +=================================== + +.. currentmodule:: navlie.filters + +.. autoclass:: ExtendedKalmanFilter + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.filters.GaussHermiteKalmanFilter.rst b/source/_autosummary/navlie.filters.GaussHermiteKalmanFilter.rst new file mode 100644 index 00000000..5a7fbbb5 --- /dev/null +++ b/source/_autosummary/navlie.filters.GaussHermiteKalmanFilter.rst @@ -0,0 +1,10 @@ +navlie.filters.GaussHermiteKalmanFilter +======================================= + +.. currentmodule:: navlie.filters + +.. autoclass:: GaussHermiteKalmanFilter + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.filters.IteratedKalmanFilter.rst b/source/_autosummary/navlie.filters.IteratedKalmanFilter.rst new file mode 100644 index 00000000..7f5c0fae --- /dev/null +++ b/source/_autosummary/navlie.filters.IteratedKalmanFilter.rst @@ -0,0 +1,10 @@ +navlie.filters.IteratedKalmanFilter +=================================== + +.. currentmodule:: navlie.filters + +.. autoclass:: IteratedKalmanFilter + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.filters.SigmaPointKalmanFilter.rst b/source/_autosummary/navlie.filters.SigmaPointKalmanFilter.rst new file mode 100644 index 00000000..b5561363 --- /dev/null +++ b/source/_autosummary/navlie.filters.SigmaPointKalmanFilter.rst @@ -0,0 +1,10 @@ +navlie.filters.SigmaPointKalmanFilter +===================================== + +.. currentmodule:: navlie.filters + +.. autoclass:: SigmaPointKalmanFilter + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.filters.UnscentedKalmanFilter.rst b/source/_autosummary/navlie.filters.UnscentedKalmanFilter.rst new file mode 100644 index 00000000..48cfcfd7 --- /dev/null +++ b/source/_autosummary/navlie.filters.UnscentedKalmanFilter.rst @@ -0,0 +1,10 @@ +navlie.filters.UnscentedKalmanFilter +==================================== + +.. currentmodule:: navlie.filters + +.. autoclass:: UnscentedKalmanFilter + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.filters.check_outlier.rst b/source/_autosummary/navlie.filters.check_outlier.rst new file mode 100644 index 00000000..8c57017a --- /dev/null +++ b/source/_autosummary/navlie.filters.check_outlier.rst @@ -0,0 +1,6 @@ +navlie.filters.check\_outlier +============================= + +.. currentmodule:: navlie.filters + +.. autofunction:: check_outlier \ No newline at end of file diff --git a/source/_autosummary/navlie.filters.generate_sigmapoints.rst b/source/_autosummary/navlie.filters.generate_sigmapoints.rst new file mode 100644 index 00000000..0e3d73b3 --- /dev/null +++ b/source/_autosummary/navlie.filters.generate_sigmapoints.rst @@ -0,0 +1,6 @@ +navlie.filters.generate\_sigmapoints +==================================== + +.. currentmodule:: navlie.filters + +.. autofunction:: generate_sigmapoints \ No newline at end of file diff --git a/source/_autosummary/navlie.filters.mean_state.rst b/source/_autosummary/navlie.filters.mean_state.rst new file mode 100644 index 00000000..768de0f1 --- /dev/null +++ b/source/_autosummary/navlie.filters.mean_state.rst @@ -0,0 +1,6 @@ +navlie.filters.mean\_state +========================== + +.. currentmodule:: navlie.filters + +.. autofunction:: mean_state \ No newline at end of file diff --git a/source/_autosummary/navlie.filters.rst b/source/_autosummary/navlie.filters.rst new file mode 100644 index 00000000..31deba7f --- /dev/null +++ b/source/_autosummary/navlie.filters.rst @@ -0,0 +1,46 @@ +navlie.filters +============== + +.. automodule:: navlie.filters + + + + + + + + .. rubric:: Functions + + .. autosummary:: + :toctree: + + check_outlier + generate_sigmapoints + mean_state + run_filter + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + CubatureKalmanFilter + ExtendedKalmanFilter + GaussHermiteKalmanFilter + IteratedKalmanFilter + SigmaPointKalmanFilter + UnscentedKalmanFilter + + + + + + + + + diff --git a/source/_autosummary/navlie.filters.run_filter.rst b/source/_autosummary/navlie.filters.run_filter.rst new file mode 100644 index 00000000..3f92b237 --- /dev/null +++ b/source/_autosummary/navlie.filters.run_filter.rst @@ -0,0 +1,6 @@ +navlie.filters.run\_filter +========================== + +.. currentmodule:: navlie.filters + +.. autofunction:: run_filter \ No newline at end of file diff --git a/source/_autosummary/navlie.imm.IMMResult.rst b/source/_autosummary/navlie.imm.IMMResult.rst new file mode 100644 index 00000000..c73bc08b --- /dev/null +++ b/source/_autosummary/navlie.imm.IMMResult.rst @@ -0,0 +1,10 @@ +navlie.imm.IMMResult +==================== + +.. currentmodule:: navlie.imm + +.. autoclass:: IMMResult + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.imm.IMMResultList.rst b/source/_autosummary/navlie.imm.IMMResultList.rst new file mode 100644 index 00000000..bfc03531 --- /dev/null +++ b/source/_autosummary/navlie.imm.IMMResultList.rst @@ -0,0 +1,10 @@ +navlie.imm.IMMResultList +======================== + +.. currentmodule:: navlie.imm + +.. autoclass:: IMMResultList + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.imm.IMMState.rst b/source/_autosummary/navlie.imm.IMMState.rst new file mode 100644 index 00000000..31721ab9 --- /dev/null +++ b/source/_autosummary/navlie.imm.IMMState.rst @@ -0,0 +1,10 @@ +navlie.imm.IMMState +=================== + +.. currentmodule:: navlie.imm + +.. autoclass:: IMMState + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.imm.InteractingModelFilter.rst b/source/_autosummary/navlie.imm.InteractingModelFilter.rst new file mode 100644 index 00000000..d60023ce --- /dev/null +++ b/source/_autosummary/navlie.imm.InteractingModelFilter.rst @@ -0,0 +1,10 @@ +navlie.imm.InteractingModelFilter +================================= + +.. currentmodule:: navlie.imm + +.. autoclass:: InteractingModelFilter + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.imm.gaussian_mixing.rst b/source/_autosummary/navlie.imm.gaussian_mixing.rst new file mode 100644 index 00000000..ceab06be --- /dev/null +++ b/source/_autosummary/navlie.imm.gaussian_mixing.rst @@ -0,0 +1,6 @@ +navlie.imm.gaussian\_mixing +=========================== + +.. currentmodule:: navlie.imm + +.. autofunction:: gaussian_mixing \ No newline at end of file diff --git a/source/_autosummary/navlie.imm.gaussian_mixing_vectorspace.rst b/source/_autosummary/navlie.imm.gaussian_mixing_vectorspace.rst new file mode 100644 index 00000000..ae5a3089 --- /dev/null +++ b/source/_autosummary/navlie.imm.gaussian_mixing_vectorspace.rst @@ -0,0 +1,6 @@ +navlie.imm.gaussian\_mixing\_vectorspace +======================================== + +.. currentmodule:: navlie.imm + +.. autofunction:: gaussian_mixing_vectorspace \ No newline at end of file diff --git a/source/_autosummary/navlie.imm.reparametrize_gaussians_about_X_par.rst b/source/_autosummary/navlie.imm.reparametrize_gaussians_about_X_par.rst new file mode 100644 index 00000000..d41719d5 --- /dev/null +++ b/source/_autosummary/navlie.imm.reparametrize_gaussians_about_X_par.rst @@ -0,0 +1,6 @@ +navlie.imm.reparametrize\_gaussians\_about\_X\_par +================================================== + +.. currentmodule:: navlie.imm + +.. autofunction:: reparametrize_gaussians_about_X_par \ No newline at end of file diff --git a/source/_autosummary/navlie.imm.rst b/source/_autosummary/navlie.imm.rst new file mode 100644 index 00000000..c7b7615e --- /dev/null +++ b/source/_autosummary/navlie.imm.rst @@ -0,0 +1,45 @@ +navlie.imm +========== + +.. automodule:: navlie.imm + + + + + + + + .. rubric:: Functions + + .. autosummary:: + :toctree: + + gaussian_mixing + gaussian_mixing_vectorspace + reparametrize_gaussians_about_X_par + run_imm_filter + update_X + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + IMMResult + IMMResultList + IMMState + InteractingModelFilter + + + + + + + + + diff --git a/source/_autosummary/navlie.imm.run_imm_filter.rst b/source/_autosummary/navlie.imm.run_imm_filter.rst new file mode 100644 index 00000000..664f1bb1 --- /dev/null +++ b/source/_autosummary/navlie.imm.run_imm_filter.rst @@ -0,0 +1,6 @@ +navlie.imm.run\_imm\_filter +=========================== + +.. currentmodule:: navlie.imm + +.. autofunction:: run_imm_filter \ No newline at end of file diff --git a/source/_autosummary/navlie.imm.update_X.rst b/source/_autosummary/navlie.imm.update_X.rst new file mode 100644 index 00000000..a3430fed --- /dev/null +++ b/source/_autosummary/navlie.imm.update_X.rst @@ -0,0 +1,6 @@ +navlie.imm.update\_X +==================== + +.. currentmodule:: navlie.imm + +.. autofunction:: update_X \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.camera.PinholeCamera.rst b/source/_autosummary/navlie.lib.camera.PinholeCamera.rst new file mode 100644 index 00000000..f6f84b08 --- /dev/null +++ b/source/_autosummary/navlie.lib.camera.PinholeCamera.rst @@ -0,0 +1,10 @@ +navlie.lib.camera.PinholeCamera +=============================== + +.. currentmodule:: navlie.lib.camera + +.. autoclass:: PinholeCamera + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.camera.PoseMatrix.rst b/source/_autosummary/navlie.lib.camera.PoseMatrix.rst new file mode 100644 index 00000000..24f8028b --- /dev/null +++ b/source/_autosummary/navlie.lib.camera.PoseMatrix.rst @@ -0,0 +1,10 @@ +navlie.lib.camera.PoseMatrix +============================ + +.. currentmodule:: navlie.lib.camera + +.. autoclass:: PoseMatrix + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.camera.rst b/source/_autosummary/navlie.lib.camera.rst new file mode 100644 index 00000000..1c25fb39 --- /dev/null +++ b/source/_autosummary/navlie.lib.camera.rst @@ -0,0 +1,32 @@ +navlie.lib.camera +================= + +.. automodule:: navlie.lib.camera + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + PinholeCamera + PoseMatrix + + + + + + + + + diff --git a/source/_autosummary/navlie.lib.datasets.SimulatedInertialGPSDataset.rst b/source/_autosummary/navlie.lib.datasets.SimulatedInertialGPSDataset.rst new file mode 100644 index 00000000..08f43c62 --- /dev/null +++ b/source/_autosummary/navlie.lib.datasets.SimulatedInertialGPSDataset.rst @@ -0,0 +1,10 @@ +navlie.lib.datasets.SimulatedInertialGPSDataset +=============================================== + +.. currentmodule:: navlie.lib.datasets + +.. autoclass:: SimulatedInertialGPSDataset + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.datasets.SimulatedInertialLandmarkDataset.rst b/source/_autosummary/navlie.lib.datasets.SimulatedInertialLandmarkDataset.rst new file mode 100644 index 00000000..3b935bb7 --- /dev/null +++ b/source/_autosummary/navlie.lib.datasets.SimulatedInertialLandmarkDataset.rst @@ -0,0 +1,10 @@ +navlie.lib.datasets.SimulatedInertialLandmarkDataset +==================================================== + +.. currentmodule:: navlie.lib.datasets + +.. autoclass:: SimulatedInertialLandmarkDataset + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.datasets.SimulatedPoseRangingDataset.rst b/source/_autosummary/navlie.lib.datasets.SimulatedPoseRangingDataset.rst new file mode 100644 index 00000000..621f9f1c --- /dev/null +++ b/source/_autosummary/navlie.lib.datasets.SimulatedPoseRangingDataset.rst @@ -0,0 +1,10 @@ +navlie.lib.datasets.SimulatedPoseRangingDataset +=============================================== + +.. currentmodule:: navlie.lib.datasets + +.. autoclass:: SimulatedPoseRangingDataset + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.datasets.generate_landmark_positions.rst b/source/_autosummary/navlie.lib.datasets.generate_landmark_positions.rst new file mode 100644 index 00000000..2538be3a --- /dev/null +++ b/source/_autosummary/navlie.lib.datasets.generate_landmark_positions.rst @@ -0,0 +1,6 @@ +navlie.lib.datasets.generate\_landmark\_positions +================================================= + +.. currentmodule:: navlie.lib.datasets + +.. autofunction:: generate_landmark_positions \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.datasets.rst b/source/_autosummary/navlie.lib.datasets.rst new file mode 100644 index 00000000..cbfb9b06 --- /dev/null +++ b/source/_autosummary/navlie.lib.datasets.rst @@ -0,0 +1,40 @@ +navlie.lib.datasets +=================== + +.. automodule:: navlie.lib.datasets + + + + + + + + .. rubric:: Functions + + .. autosummary:: + :toctree: + + generate_landmark_positions + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + SimulatedInertialGPSDataset + SimulatedInertialLandmarkDataset + SimulatedPoseRangingDataset + + + + + + + + + diff --git a/source/_autosummary/navlie.lib.imu.G_matrix.rst b/source/_autosummary/navlie.lib.imu.G_matrix.rst new file mode 100644 index 00000000..23ce529c --- /dev/null +++ b/source/_autosummary/navlie.lib.imu.G_matrix.rst @@ -0,0 +1,6 @@ +navlie.lib.imu.G\_matrix +======================== + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: G_matrix \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.imu.G_matrix_inv.rst b/source/_autosummary/navlie.lib.imu.G_matrix_inv.rst new file mode 100644 index 00000000..83190a0e --- /dev/null +++ b/source/_autosummary/navlie.lib.imu.G_matrix_inv.rst @@ -0,0 +1,6 @@ +navlie.lib.imu.G\_matrix\_inv +============================= + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: G_matrix_inv \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.imu.IMU.rst b/source/_autosummary/navlie.lib.imu.IMU.rst new file mode 100644 index 00000000..dd7e48d0 --- /dev/null +++ b/source/_autosummary/navlie.lib.imu.IMU.rst @@ -0,0 +1,10 @@ +navlie.lib.imu.IMU +================== + +.. currentmodule:: navlie.lib.imu + +.. autoclass:: IMU + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.imu.IMUKinematics.rst b/source/_autosummary/navlie.lib.imu.IMUKinematics.rst new file mode 100644 index 00000000..aab31572 --- /dev/null +++ b/source/_autosummary/navlie.lib.imu.IMUKinematics.rst @@ -0,0 +1,10 @@ +navlie.lib.imu.IMUKinematics +============================ + +.. currentmodule:: navlie.lib.imu + +.. autoclass:: IMUKinematics + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.imu.IMUState.rst b/source/_autosummary/navlie.lib.imu.IMUState.rst new file mode 100644 index 00000000..fde4052b --- /dev/null +++ b/source/_autosummary/navlie.lib.imu.IMUState.rst @@ -0,0 +1,10 @@ +navlie.lib.imu.IMUState +======================= + +.. currentmodule:: navlie.lib.imu + +.. autoclass:: IMUState + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.imu.L_matrix.rst b/source/_autosummary/navlie.lib.imu.L_matrix.rst new file mode 100644 index 00000000..b1acfeb2 --- /dev/null +++ b/source/_autosummary/navlie.lib.imu.L_matrix.rst @@ -0,0 +1,6 @@ +navlie.lib.imu.L\_matrix +======================== + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: L_matrix \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.imu.M_matrix.rst b/source/_autosummary/navlie.lib.imu.M_matrix.rst new file mode 100644 index 00000000..e6339ca9 --- /dev/null +++ b/source/_autosummary/navlie.lib.imu.M_matrix.rst @@ -0,0 +1,6 @@ +navlie.lib.imu.M\_matrix +======================== + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: M_matrix \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.imu.N_matrix.rst b/source/_autosummary/navlie.lib.imu.N_matrix.rst new file mode 100644 index 00000000..ebecf6b7 --- /dev/null +++ b/source/_autosummary/navlie.lib.imu.N_matrix.rst @@ -0,0 +1,6 @@ +navlie.lib.imu.N\_matrix +======================== + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: N_matrix \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.imu.U_matrix.rst b/source/_autosummary/navlie.lib.imu.U_matrix.rst new file mode 100644 index 00000000..6c6c3737 --- /dev/null +++ b/source/_autosummary/navlie.lib.imu.U_matrix.rst @@ -0,0 +1,6 @@ +navlie.lib.imu.U\_matrix +======================== + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: U_matrix \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.imu.U_matrix_inv.rst b/source/_autosummary/navlie.lib.imu.U_matrix_inv.rst new file mode 100644 index 00000000..28d7140c --- /dev/null +++ b/source/_autosummary/navlie.lib.imu.U_matrix_inv.rst @@ -0,0 +1,6 @@ +navlie.lib.imu.U\_matrix\_inv +============================= + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: U_matrix_inv \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.imu.U_tilde_matrix.rst b/source/_autosummary/navlie.lib.imu.U_tilde_matrix.rst new file mode 100644 index 00000000..58b61c9f --- /dev/null +++ b/source/_autosummary/navlie.lib.imu.U_tilde_matrix.rst @@ -0,0 +1,6 @@ +navlie.lib.imu.U\_tilde\_matrix +=============================== + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: U_tilde_matrix \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.imu.adjoint_IE3.rst b/source/_autosummary/navlie.lib.imu.adjoint_IE3.rst new file mode 100644 index 00000000..4b0bff12 --- /dev/null +++ b/source/_autosummary/navlie.lib.imu.adjoint_IE3.rst @@ -0,0 +1,6 @@ +navlie.lib.imu.adjoint\_IE3 +=========================== + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: adjoint_IE3 \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.imu.delta_matrix.rst b/source/_autosummary/navlie.lib.imu.delta_matrix.rst new file mode 100644 index 00000000..b91120ac --- /dev/null +++ b/source/_autosummary/navlie.lib.imu.delta_matrix.rst @@ -0,0 +1,6 @@ +navlie.lib.imu.delta\_matrix +============================ + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: delta_matrix \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.imu.get_unbiased_imu.rst b/source/_autosummary/navlie.lib.imu.get_unbiased_imu.rst new file mode 100644 index 00000000..9b35ce2f --- /dev/null +++ b/source/_autosummary/navlie.lib.imu.get_unbiased_imu.rst @@ -0,0 +1,6 @@ +navlie.lib.imu.get\_unbiased\_imu +================================= + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: get_unbiased_imu \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.imu.inverse_IE3.rst b/source/_autosummary/navlie.lib.imu.inverse_IE3.rst new file mode 100644 index 00000000..e1857eca --- /dev/null +++ b/source/_autosummary/navlie.lib.imu.inverse_IE3.rst @@ -0,0 +1,6 @@ +navlie.lib.imu.inverse\_IE3 +=========================== + +.. currentmodule:: navlie.lib.imu + +.. autofunction:: inverse_IE3 \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.imu.rst b/source/_autosummary/navlie.lib.imu.rst new file mode 100644 index 00000000..7ded5990 --- /dev/null +++ b/source/_autosummary/navlie.lib.imu.rst @@ -0,0 +1,51 @@ +navlie.lib.imu +============== + +.. automodule:: navlie.lib.imu + + + + + + + + .. rubric:: Functions + + .. autosummary:: + :toctree: + + G_matrix + G_matrix_inv + L_matrix + M_matrix + N_matrix + U_matrix + U_matrix_inv + U_tilde_matrix + adjoint_IE3 + delta_matrix + get_unbiased_imu + inverse_IE3 + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + IMU + IMUKinematics + IMUState + + + + + + + + + diff --git a/source/_autosummary/navlie.lib.models.AbsolutePosition.rst b/source/_autosummary/navlie.lib.models.AbsolutePosition.rst new file mode 100644 index 00000000..071b4177 --- /dev/null +++ b/source/_autosummary/navlie.lib.models.AbsolutePosition.rst @@ -0,0 +1,10 @@ +navlie.lib.models.AbsolutePosition +================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: AbsolutePosition + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.AbsoluteVelocity.rst b/source/_autosummary/navlie.lib.models.AbsoluteVelocity.rst new file mode 100644 index 00000000..a7dd329f --- /dev/null +++ b/source/_autosummary/navlie.lib.models.AbsoluteVelocity.rst @@ -0,0 +1,10 @@ +navlie.lib.models.AbsoluteVelocity +================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: AbsoluteVelocity + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.Altitude.rst b/source/_autosummary/navlie.lib.models.Altitude.rst new file mode 100644 index 00000000..fa3777b6 --- /dev/null +++ b/source/_autosummary/navlie.lib.models.Altitude.rst @@ -0,0 +1,10 @@ +navlie.lib.models.Altitude +========================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: Altitude + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.BodyFrameVelocity.rst b/source/_autosummary/navlie.lib.models.BodyFrameVelocity.rst new file mode 100644 index 00000000..2938a897 --- /dev/null +++ b/source/_autosummary/navlie.lib.models.BodyFrameVelocity.rst @@ -0,0 +1,10 @@ +navlie.lib.models.BodyFrameVelocity +=================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: BodyFrameVelocity + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.CameraProjection.rst b/source/_autosummary/navlie.lib.models.CameraProjection.rst new file mode 100644 index 00000000..b157a313 --- /dev/null +++ b/source/_autosummary/navlie.lib.models.CameraProjection.rst @@ -0,0 +1,10 @@ +navlie.lib.models.CameraProjection +================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: CameraProjection + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.DoubleIntegrator.rst b/source/_autosummary/navlie.lib.models.DoubleIntegrator.rst new file mode 100644 index 00000000..04e207b3 --- /dev/null +++ b/source/_autosummary/navlie.lib.models.DoubleIntegrator.rst @@ -0,0 +1,10 @@ +navlie.lib.models.DoubleIntegrator +================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: DoubleIntegrator + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.DoubleIntegratorWithBias.rst b/source/_autosummary/navlie.lib.models.DoubleIntegratorWithBias.rst new file mode 100644 index 00000000..613e08bc --- /dev/null +++ b/source/_autosummary/navlie.lib.models.DoubleIntegratorWithBias.rst @@ -0,0 +1,10 @@ +navlie.lib.models.DoubleIntegratorWithBias +========================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: DoubleIntegratorWithBias + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.GlobalPosition.rst b/source/_autosummary/navlie.lib.models.GlobalPosition.rst new file mode 100644 index 00000000..2a84bea5 --- /dev/null +++ b/source/_autosummary/navlie.lib.models.GlobalPosition.rst @@ -0,0 +1,10 @@ +navlie.lib.models.GlobalPosition +================================ + +.. currentmodule:: navlie.lib.models + +.. autoclass:: GlobalPosition + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.Gravitometer.rst b/source/_autosummary/navlie.lib.models.Gravitometer.rst new file mode 100644 index 00000000..85266c50 --- /dev/null +++ b/source/_autosummary/navlie.lib.models.Gravitometer.rst @@ -0,0 +1,10 @@ +navlie.lib.models.Gravitometer +============================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: Gravitometer + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.InvariantMeasurement.rst b/source/_autosummary/navlie.lib.models.InvariantMeasurement.rst new file mode 100644 index 00000000..8636519d --- /dev/null +++ b/source/_autosummary/navlie.lib.models.InvariantMeasurement.rst @@ -0,0 +1,10 @@ +navlie.lib.models.InvariantMeasurement +====================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: InvariantMeasurement + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.InvariantPointRelativePosition.rst b/source/_autosummary/navlie.lib.models.InvariantPointRelativePosition.rst new file mode 100644 index 00000000..4b018ecc --- /dev/null +++ b/source/_autosummary/navlie.lib.models.InvariantPointRelativePosition.rst @@ -0,0 +1,10 @@ +navlie.lib.models.InvariantPointRelativePosition +================================================ + +.. currentmodule:: navlie.lib.models + +.. autoclass:: InvariantPointRelativePosition + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.LinearMeasurement.rst b/source/_autosummary/navlie.lib.models.LinearMeasurement.rst new file mode 100644 index 00000000..5ad7f33b --- /dev/null +++ b/source/_autosummary/navlie.lib.models.LinearMeasurement.rst @@ -0,0 +1,10 @@ +navlie.lib.models.LinearMeasurement +=================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: LinearMeasurement + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.Magnetometer.rst b/source/_autosummary/navlie.lib.models.Magnetometer.rst new file mode 100644 index 00000000..3217a8ea --- /dev/null +++ b/source/_autosummary/navlie.lib.models.Magnetometer.rst @@ -0,0 +1,10 @@ +navlie.lib.models.Magnetometer +============================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: Magnetometer + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.OneDimensionalPositionVelocityRange.rst b/source/_autosummary/navlie.lib.models.OneDimensionalPositionVelocityRange.rst new file mode 100644 index 00000000..cb6007ef --- /dev/null +++ b/source/_autosummary/navlie.lib.models.OneDimensionalPositionVelocityRange.rst @@ -0,0 +1,10 @@ +navlie.lib.models.OneDimensionalPositionVelocityRange +===================================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: OneDimensionalPositionVelocityRange + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.PointRelativePosition.rst b/source/_autosummary/navlie.lib.models.PointRelativePosition.rst new file mode 100644 index 00000000..ae77f493 --- /dev/null +++ b/source/_autosummary/navlie.lib.models.PointRelativePosition.rst @@ -0,0 +1,10 @@ +navlie.lib.models.PointRelativePosition +======================================= + +.. currentmodule:: navlie.lib.models + +.. autoclass:: PointRelativePosition + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.PointRelativePositionSLAM.rst b/source/_autosummary/navlie.lib.models.PointRelativePositionSLAM.rst new file mode 100644 index 00000000..35be905e --- /dev/null +++ b/source/_autosummary/navlie.lib.models.PointRelativePositionSLAM.rst @@ -0,0 +1,10 @@ +navlie.lib.models.PointRelativePositionSLAM +=========================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: PointRelativePositionSLAM + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.RangePointToAnchor.rst b/source/_autosummary/navlie.lib.models.RangePointToAnchor.rst new file mode 100644 index 00000000..f2862bcd --- /dev/null +++ b/source/_autosummary/navlie.lib.models.RangePointToAnchor.rst @@ -0,0 +1,10 @@ +navlie.lib.models.RangePointToAnchor +==================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: RangePointToAnchor + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.RangePoseToAnchor.rst b/source/_autosummary/navlie.lib.models.RangePoseToAnchor.rst new file mode 100644 index 00000000..96f5b7e9 --- /dev/null +++ b/source/_autosummary/navlie.lib.models.RangePoseToAnchor.rst @@ -0,0 +1,10 @@ +navlie.lib.models.RangePoseToAnchor +=================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: RangePoseToAnchor + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.RangePoseToPose.rst b/source/_autosummary/navlie.lib.models.RangePoseToPose.rst new file mode 100644 index 00000000..e23e49f4 --- /dev/null +++ b/source/_autosummary/navlie.lib.models.RangePoseToPose.rst @@ -0,0 +1,10 @@ +navlie.lib.models.RangePoseToPose +================================= + +.. currentmodule:: navlie.lib.models + +.. autoclass:: RangePoseToPose + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.RangeRelativePose.rst b/source/_autosummary/navlie.lib.models.RangeRelativePose.rst new file mode 100644 index 00000000..ddc3abf1 --- /dev/null +++ b/source/_autosummary/navlie.lib.models.RangeRelativePose.rst @@ -0,0 +1,10 @@ +navlie.lib.models.RangeRelativePose +=================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: RangeRelativePose + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.RelativeBodyFrameVelocity.rst b/source/_autosummary/navlie.lib.models.RelativeBodyFrameVelocity.rst new file mode 100644 index 00000000..47176d46 --- /dev/null +++ b/source/_autosummary/navlie.lib.models.RelativeBodyFrameVelocity.rst @@ -0,0 +1,10 @@ +navlie.lib.models.RelativeBodyFrameVelocity +=========================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: RelativeBodyFrameVelocity + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.SingleIntegrator.rst b/source/_autosummary/navlie.lib.models.SingleIntegrator.rst new file mode 100644 index 00000000..2a62fd56 --- /dev/null +++ b/source/_autosummary/navlie.lib.models.SingleIntegrator.rst @@ -0,0 +1,10 @@ +navlie.lib.models.SingleIntegrator +================================== + +.. currentmodule:: navlie.lib.models + +.. autoclass:: SingleIntegrator + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.models.rst b/source/_autosummary/navlie.lib.models.rst new file mode 100644 index 00000000..a4499773 --- /dev/null +++ b/source/_autosummary/navlie.lib.models.rst @@ -0,0 +1,52 @@ +navlie.lib.models +================= + +.. automodule:: navlie.lib.models + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + AbsolutePosition + AbsoluteVelocity + Altitude + BodyFrameVelocity + CameraProjection + DoubleIntegrator + DoubleIntegratorWithBias + GlobalPosition + Gravitometer + InvariantMeasurement + InvariantPointRelativePosition + LinearMeasurement + Magnetometer + OneDimensionalPositionVelocityRange + PointRelativePosition + PointRelativePositionSLAM + RangePointToAnchor + RangePoseToAnchor + RangePoseToPose + RangeRelativePose + RelativeBodyFrameVelocity + SingleIntegrator + + + + + + + + + diff --git a/source/_autosummary/navlie.lib.preintegration.AngularVelocityIncrement.rst b/source/_autosummary/navlie.lib.preintegration.AngularVelocityIncrement.rst new file mode 100644 index 00000000..ed38e157 --- /dev/null +++ b/source/_autosummary/navlie.lib.preintegration.AngularVelocityIncrement.rst @@ -0,0 +1,10 @@ +navlie.lib.preintegration.AngularVelocityIncrement +================================================== + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: AngularVelocityIncrement + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.preintegration.BodyVelocityIncrement.rst b/source/_autosummary/navlie.lib.preintegration.BodyVelocityIncrement.rst new file mode 100644 index 00000000..4e80763d --- /dev/null +++ b/source/_autosummary/navlie.lib.preintegration.BodyVelocityIncrement.rst @@ -0,0 +1,10 @@ +navlie.lib.preintegration.BodyVelocityIncrement +=============================================== + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: BodyVelocityIncrement + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.preintegration.IMUIncrement.rst b/source/_autosummary/navlie.lib.preintegration.IMUIncrement.rst new file mode 100644 index 00000000..3981994d --- /dev/null +++ b/source/_autosummary/navlie.lib.preintegration.IMUIncrement.rst @@ -0,0 +1,10 @@ +navlie.lib.preintegration.IMUIncrement +====================================== + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: IMUIncrement + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.preintegration.LinearIncrement.rst b/source/_autosummary/navlie.lib.preintegration.LinearIncrement.rst new file mode 100644 index 00000000..c5da1061 --- /dev/null +++ b/source/_autosummary/navlie.lib.preintegration.LinearIncrement.rst @@ -0,0 +1,10 @@ +navlie.lib.preintegration.LinearIncrement +========================================= + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: LinearIncrement + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.preintegration.PreintegratedAngularVelocity.rst b/source/_autosummary/navlie.lib.preintegration.PreintegratedAngularVelocity.rst new file mode 100644 index 00000000..fb60ace4 --- /dev/null +++ b/source/_autosummary/navlie.lib.preintegration.PreintegratedAngularVelocity.rst @@ -0,0 +1,10 @@ +navlie.lib.preintegration.PreintegratedAngularVelocity +====================================================== + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: PreintegratedAngularVelocity + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.preintegration.PreintegratedBodyVelocity.rst b/source/_autosummary/navlie.lib.preintegration.PreintegratedBodyVelocity.rst new file mode 100644 index 00000000..894991a5 --- /dev/null +++ b/source/_autosummary/navlie.lib.preintegration.PreintegratedBodyVelocity.rst @@ -0,0 +1,10 @@ +navlie.lib.preintegration.PreintegratedBodyVelocity +=================================================== + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: PreintegratedBodyVelocity + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.preintegration.PreintegratedIMUKinematics.rst b/source/_autosummary/navlie.lib.preintegration.PreintegratedIMUKinematics.rst new file mode 100644 index 00000000..1a954882 --- /dev/null +++ b/source/_autosummary/navlie.lib.preintegration.PreintegratedIMUKinematics.rst @@ -0,0 +1,10 @@ +navlie.lib.preintegration.PreintegratedIMUKinematics +==================================================== + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: PreintegratedIMUKinematics + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.preintegration.PreintegratedLinearModel.rst b/source/_autosummary/navlie.lib.preintegration.PreintegratedLinearModel.rst new file mode 100644 index 00000000..082f830d --- /dev/null +++ b/source/_autosummary/navlie.lib.preintegration.PreintegratedLinearModel.rst @@ -0,0 +1,10 @@ +navlie.lib.preintegration.PreintegratedLinearModel +================================================== + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: PreintegratedLinearModel + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.preintegration.PreintegratedWheelOdometry.rst b/source/_autosummary/navlie.lib.preintegration.PreintegratedWheelOdometry.rst new file mode 100644 index 00000000..71d21557 --- /dev/null +++ b/source/_autosummary/navlie.lib.preintegration.PreintegratedWheelOdometry.rst @@ -0,0 +1,10 @@ +navlie.lib.preintegration.PreintegratedWheelOdometry +==================================================== + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: PreintegratedWheelOdometry + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.preintegration.RelativeMotionIncrement.rst b/source/_autosummary/navlie.lib.preintegration.RelativeMotionIncrement.rst new file mode 100644 index 00000000..f8d40c93 --- /dev/null +++ b/source/_autosummary/navlie.lib.preintegration.RelativeMotionIncrement.rst @@ -0,0 +1,10 @@ +navlie.lib.preintegration.RelativeMotionIncrement +================================================= + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: RelativeMotionIncrement + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.preintegration.WheelOdometryIncrement.rst b/source/_autosummary/navlie.lib.preintegration.WheelOdometryIncrement.rst new file mode 100644 index 00000000..5eaa4b5d --- /dev/null +++ b/source/_autosummary/navlie.lib.preintegration.WheelOdometryIncrement.rst @@ -0,0 +1,10 @@ +navlie.lib.preintegration.WheelOdometryIncrement +================================================ + +.. currentmodule:: navlie.lib.preintegration + +.. autoclass:: WheelOdometryIncrement + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.preintegration.rst b/source/_autosummary/navlie.lib.preintegration.rst new file mode 100644 index 00000000..90c46d0c --- /dev/null +++ b/source/_autosummary/navlie.lib.preintegration.rst @@ -0,0 +1,41 @@ +navlie.lib.preintegration +========================= + +.. automodule:: navlie.lib.preintegration + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + AngularVelocityIncrement + BodyVelocityIncrement + IMUIncrement + LinearIncrement + PreintegratedAngularVelocity + PreintegratedBodyVelocity + PreintegratedIMUKinematics + PreintegratedLinearModel + PreintegratedWheelOdometry + RelativeMotionIncrement + WheelOdometryIncrement + + + + + + + + + diff --git a/source/_autosummary/navlie.lib.rst b/source/_autosummary/navlie.lib.rst new file mode 100644 index 00000000..33cf70de --- /dev/null +++ b/source/_autosummary/navlie.lib.rst @@ -0,0 +1,37 @@ +navlie.lib +========== + +.. automodule:: navlie.lib + + + + + + + + + + + + + + + + + + + +.. rubric:: Modules + +.. autosummary:: + :toctree: + :template: custom-module-template.rst + :recursive: + + navlie.lib.camera + navlie.lib.datasets + navlie.lib.imu + navlie.lib.models + navlie.lib.preintegration + navlie.lib.states + diff --git a/source/_autosummary/navlie.lib.states.MatrixLieGroupState.rst b/source/_autosummary/navlie.lib.states.MatrixLieGroupState.rst new file mode 100644 index 00000000..b7bd6ed7 --- /dev/null +++ b/source/_autosummary/navlie.lib.states.MatrixLieGroupState.rst @@ -0,0 +1,10 @@ +navlie.lib.states.MatrixLieGroupState +===================================== + +.. currentmodule:: navlie.lib.states + +.. autoclass:: MatrixLieGroupState + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.states.SE23State.rst b/source/_autosummary/navlie.lib.states.SE23State.rst new file mode 100644 index 00000000..3a2acab9 --- /dev/null +++ b/source/_autosummary/navlie.lib.states.SE23State.rst @@ -0,0 +1,10 @@ +navlie.lib.states.SE23State +=========================== + +.. currentmodule:: navlie.lib.states + +.. autoclass:: SE23State + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.states.SE2State.rst b/source/_autosummary/navlie.lib.states.SE2State.rst new file mode 100644 index 00000000..26d31deb --- /dev/null +++ b/source/_autosummary/navlie.lib.states.SE2State.rst @@ -0,0 +1,10 @@ +navlie.lib.states.SE2State +========================== + +.. currentmodule:: navlie.lib.states + +.. autoclass:: SE2State + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.states.SE3State.rst b/source/_autosummary/navlie.lib.states.SE3State.rst new file mode 100644 index 00000000..928977a9 --- /dev/null +++ b/source/_autosummary/navlie.lib.states.SE3State.rst @@ -0,0 +1,10 @@ +navlie.lib.states.SE3State +========================== + +.. currentmodule:: navlie.lib.states + +.. autoclass:: SE3State + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.states.SL3State.rst b/source/_autosummary/navlie.lib.states.SL3State.rst new file mode 100644 index 00000000..dfe1fc10 --- /dev/null +++ b/source/_autosummary/navlie.lib.states.SL3State.rst @@ -0,0 +1,10 @@ +navlie.lib.states.SL3State +========================== + +.. currentmodule:: navlie.lib.states + +.. autoclass:: SL3State + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.states.SO2State.rst b/source/_autosummary/navlie.lib.states.SO2State.rst new file mode 100644 index 00000000..9f2678f9 --- /dev/null +++ b/source/_autosummary/navlie.lib.states.SO2State.rst @@ -0,0 +1,10 @@ +navlie.lib.states.SO2State +========================== + +.. currentmodule:: navlie.lib.states + +.. autoclass:: SO2State + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.states.SO3State.rst b/source/_autosummary/navlie.lib.states.SO3State.rst new file mode 100644 index 00000000..c5fd87ce --- /dev/null +++ b/source/_autosummary/navlie.lib.states.SO3State.rst @@ -0,0 +1,10 @@ +navlie.lib.states.SO3State +========================== + +.. currentmodule:: navlie.lib.states + +.. autoclass:: SO3State + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.states.StampedValue.rst b/source/_autosummary/navlie.lib.states.StampedValue.rst new file mode 100644 index 00000000..83bad4eb --- /dev/null +++ b/source/_autosummary/navlie.lib.states.StampedValue.rst @@ -0,0 +1,10 @@ +navlie.lib.states.StampedValue +============================== + +.. currentmodule:: navlie.lib.states + +.. autoclass:: StampedValue + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.states.VectorInput.rst b/source/_autosummary/navlie.lib.states.VectorInput.rst new file mode 100644 index 00000000..0023f248 --- /dev/null +++ b/source/_autosummary/navlie.lib.states.VectorInput.rst @@ -0,0 +1,10 @@ +navlie.lib.states.VectorInput +============================= + +.. currentmodule:: navlie.lib.states + +.. autoclass:: VectorInput + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.states.VectorState.rst b/source/_autosummary/navlie.lib.states.VectorState.rst new file mode 100644 index 00000000..e91253a0 --- /dev/null +++ b/source/_autosummary/navlie.lib.states.VectorState.rst @@ -0,0 +1,10 @@ +navlie.lib.states.VectorState +============================= + +.. currentmodule:: navlie.lib.states + +.. autoclass:: VectorState + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.lib.states.rst b/source/_autosummary/navlie.lib.states.rst new file mode 100644 index 00000000..24b7ca9b --- /dev/null +++ b/source/_autosummary/navlie.lib.states.rst @@ -0,0 +1,40 @@ +navlie.lib.states +================= + +.. automodule:: navlie.lib.states + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + MatrixLieGroupState + SE23State + SE2State + SE3State + SL3State + SO2State + SO3State + StampedValue + VectorInput + VectorState + + + + + + + + + diff --git a/source/_autosummary/navlie.types.Dataset.rst b/source/_autosummary/navlie.types.Dataset.rst new file mode 100644 index 00000000..d691044d --- /dev/null +++ b/source/_autosummary/navlie.types.Dataset.rst @@ -0,0 +1,10 @@ +navlie.types.Dataset +==================== + +.. currentmodule:: navlie.types + +.. autoclass:: Dataset + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.types.Input.rst b/source/_autosummary/navlie.types.Input.rst new file mode 100644 index 00000000..e1cd1004 --- /dev/null +++ b/source/_autosummary/navlie.types.Input.rst @@ -0,0 +1,10 @@ +navlie.types.Input +================== + +.. currentmodule:: navlie.types + +.. autoclass:: Input + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.types.Measurement.rst b/source/_autosummary/navlie.types.Measurement.rst new file mode 100644 index 00000000..327432f7 --- /dev/null +++ b/source/_autosummary/navlie.types.Measurement.rst @@ -0,0 +1,10 @@ +navlie.types.Measurement +======================== + +.. currentmodule:: navlie.types + +.. autoclass:: Measurement + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.types.MeasurementModel.rst b/source/_autosummary/navlie.types.MeasurementModel.rst new file mode 100644 index 00000000..f90ca7b8 --- /dev/null +++ b/source/_autosummary/navlie.types.MeasurementModel.rst @@ -0,0 +1,10 @@ +navlie.types.MeasurementModel +============================= + +.. currentmodule:: navlie.types + +.. autoclass:: MeasurementModel + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.types.ProcessModel.rst b/source/_autosummary/navlie.types.ProcessModel.rst new file mode 100644 index 00000000..9619b0e5 --- /dev/null +++ b/source/_autosummary/navlie.types.ProcessModel.rst @@ -0,0 +1,10 @@ +navlie.types.ProcessModel +========================= + +.. currentmodule:: navlie.types + +.. autoclass:: ProcessModel + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.types.State.rst b/source/_autosummary/navlie.types.State.rst new file mode 100644 index 00000000..81afa6ff --- /dev/null +++ b/source/_autosummary/navlie.types.State.rst @@ -0,0 +1,10 @@ +navlie.types.State +================== + +.. currentmodule:: navlie.types + +.. autoclass:: State + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.types.StateWithCovariance.rst b/source/_autosummary/navlie.types.StateWithCovariance.rst new file mode 100644 index 00000000..c0f962b0 --- /dev/null +++ b/source/_autosummary/navlie.types.StateWithCovariance.rst @@ -0,0 +1,10 @@ +navlie.types.StateWithCovariance +================================ + +.. currentmodule:: navlie.types + +.. autoclass:: StateWithCovariance + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.types.rst b/source/_autosummary/navlie.types.rst new file mode 100644 index 00000000..da1b20d1 --- /dev/null +++ b/source/_autosummary/navlie.types.rst @@ -0,0 +1,37 @@ +navlie.types +============ + +.. automodule:: navlie.types + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + Dataset + Input + Measurement + MeasurementModel + ProcessModel + State + StateWithCovariance + + + + + + + + + diff --git a/source/_autosummary/navlie.utils.GaussianResult.rst b/source/_autosummary/navlie.utils.GaussianResult.rst new file mode 100644 index 00000000..a920d1d2 --- /dev/null +++ b/source/_autosummary/navlie.utils.GaussianResult.rst @@ -0,0 +1,10 @@ +navlie.utils.GaussianResult +=========================== + +.. currentmodule:: navlie.utils + +.. autoclass:: GaussianResult + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.utils.GaussianResultList.rst b/source/_autosummary/navlie.utils.GaussianResultList.rst new file mode 100644 index 00000000..2aee2fed --- /dev/null +++ b/source/_autosummary/navlie.utils.GaussianResultList.rst @@ -0,0 +1,10 @@ +navlie.utils.GaussianResultList +=============================== + +.. currentmodule:: navlie.utils + +.. autoclass:: GaussianResultList + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.utils.MonteCarloResult.rst b/source/_autosummary/navlie.utils.MonteCarloResult.rst new file mode 100644 index 00000000..81755eb5 --- /dev/null +++ b/source/_autosummary/navlie.utils.MonteCarloResult.rst @@ -0,0 +1,10 @@ +navlie.utils.MonteCarloResult +============================= + +.. currentmodule:: navlie.utils + +.. autoclass:: MonteCarloResult + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_autosummary/navlie.utils.associate_stamps.rst b/source/_autosummary/navlie.utils.associate_stamps.rst new file mode 100644 index 00000000..2174fc69 --- /dev/null +++ b/source/_autosummary/navlie.utils.associate_stamps.rst @@ -0,0 +1,6 @@ +navlie.utils.associate\_stamps +============================== + +.. currentmodule:: navlie.utils + +.. autofunction:: associate_stamps \ No newline at end of file diff --git a/source/_autosummary/navlie.utils.find_nearest_stamp_idx.rst b/source/_autosummary/navlie.utils.find_nearest_stamp_idx.rst new file mode 100644 index 00000000..1615cc7f --- /dev/null +++ b/source/_autosummary/navlie.utils.find_nearest_stamp_idx.rst @@ -0,0 +1,6 @@ +navlie.utils.find\_nearest\_stamp\_idx +====================================== + +.. currentmodule:: navlie.utils + +.. autofunction:: find_nearest_stamp_idx \ No newline at end of file diff --git a/source/_autosummary/navlie.utils.jacobian.rst b/source/_autosummary/navlie.utils.jacobian.rst new file mode 100644 index 00000000..1b02c953 --- /dev/null +++ b/source/_autosummary/navlie.utils.jacobian.rst @@ -0,0 +1,6 @@ +navlie.utils.jacobian +===================== + +.. currentmodule:: navlie.utils + +.. autofunction:: jacobian \ No newline at end of file diff --git a/source/_autosummary/navlie.utils.monte_carlo.rst b/source/_autosummary/navlie.utils.monte_carlo.rst new file mode 100644 index 00000000..17886c27 --- /dev/null +++ b/source/_autosummary/navlie.utils.monte_carlo.rst @@ -0,0 +1,6 @@ +navlie.utils.monte\_carlo +========================= + +.. currentmodule:: navlie.utils + +.. autofunction:: monte_carlo \ No newline at end of file diff --git a/source/_autosummary/navlie.utils.plot_error.rst b/source/_autosummary/navlie.utils.plot_error.rst new file mode 100644 index 00000000..da67b0b7 --- /dev/null +++ b/source/_autosummary/navlie.utils.plot_error.rst @@ -0,0 +1,6 @@ +navlie.utils.plot\_error +======================== + +.. currentmodule:: navlie.utils + +.. autofunction:: plot_error \ No newline at end of file diff --git a/source/_autosummary/navlie.utils.plot_meas.rst b/source/_autosummary/navlie.utils.plot_meas.rst new file mode 100644 index 00000000..7a2608b1 --- /dev/null +++ b/source/_autosummary/navlie.utils.plot_meas.rst @@ -0,0 +1,6 @@ +navlie.utils.plot\_meas +======================= + +.. currentmodule:: navlie.utils + +.. autofunction:: plot_meas \ No newline at end of file diff --git a/source/_autosummary/navlie.utils.plot_meas_by_model.rst b/source/_autosummary/navlie.utils.plot_meas_by_model.rst new file mode 100644 index 00000000..57a6b919 --- /dev/null +++ b/source/_autosummary/navlie.utils.plot_meas_by_model.rst @@ -0,0 +1,6 @@ +navlie.utils.plot\_meas\_by\_model +================================== + +.. currentmodule:: navlie.utils + +.. autofunction:: plot_meas_by_model \ No newline at end of file diff --git a/source/_autosummary/navlie.utils.plot_nees.rst b/source/_autosummary/navlie.utils.plot_nees.rst new file mode 100644 index 00000000..5ca9c13a --- /dev/null +++ b/source/_autosummary/navlie.utils.plot_nees.rst @@ -0,0 +1,6 @@ +navlie.utils.plot\_nees +======================= + +.. currentmodule:: navlie.utils + +.. autofunction:: plot_nees \ No newline at end of file diff --git a/source/_autosummary/navlie.utils.plot_poses.rst b/source/_autosummary/navlie.utils.plot_poses.rst new file mode 100644 index 00000000..b7ae0d81 --- /dev/null +++ b/source/_autosummary/navlie.utils.plot_poses.rst @@ -0,0 +1,6 @@ +navlie.utils.plot\_poses +======================== + +.. currentmodule:: navlie.utils + +.. autofunction:: plot_poses \ No newline at end of file diff --git a/source/_autosummary/navlie.utils.randvec.rst b/source/_autosummary/navlie.utils.randvec.rst new file mode 100644 index 00000000..37d661e7 --- /dev/null +++ b/source/_autosummary/navlie.utils.randvec.rst @@ -0,0 +1,6 @@ +navlie.utils.randvec +==================== + +.. currentmodule:: navlie.utils + +.. autofunction:: randvec \ No newline at end of file diff --git a/source/_autosummary/navlie.utils.rst b/source/_autosummary/navlie.utils.rst new file mode 100644 index 00000000..d1c57608 --- /dev/null +++ b/source/_autosummary/navlie.utils.rst @@ -0,0 +1,53 @@ +navlie.utils +============ + +.. automodule:: navlie.utils + + + + + + + + .. rubric:: Functions + + .. autosummary:: + :toctree: + + associate_stamps + find_nearest_stamp_idx + jacobian + monte_carlo + plot_error + plot_meas + plot_meas_by_model + plot_nees + plot_poses + randvec + schedule_sequential_measurements + set_axes_equal + state_interp + van_loans + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + + GaussianResult + GaussianResultList + MonteCarloResult + + + + + + + + + diff --git a/source/_autosummary/navlie.utils.schedule_sequential_measurements.rst b/source/_autosummary/navlie.utils.schedule_sequential_measurements.rst new file mode 100644 index 00000000..1e2d5b81 --- /dev/null +++ b/source/_autosummary/navlie.utils.schedule_sequential_measurements.rst @@ -0,0 +1,6 @@ +navlie.utils.schedule\_sequential\_measurements +=============================================== + +.. currentmodule:: navlie.utils + +.. autofunction:: schedule_sequential_measurements \ No newline at end of file diff --git a/source/_autosummary/navlie.utils.set_axes_equal.rst b/source/_autosummary/navlie.utils.set_axes_equal.rst new file mode 100644 index 00000000..1c458ce9 --- /dev/null +++ b/source/_autosummary/navlie.utils.set_axes_equal.rst @@ -0,0 +1,6 @@ +navlie.utils.set\_axes\_equal +============================= + +.. currentmodule:: navlie.utils + +.. autofunction:: set_axes_equal \ No newline at end of file diff --git a/source/_autosummary/navlie.utils.state_interp.rst b/source/_autosummary/navlie.utils.state_interp.rst new file mode 100644 index 00000000..6cdbdbe2 --- /dev/null +++ b/source/_autosummary/navlie.utils.state_interp.rst @@ -0,0 +1,6 @@ +navlie.utils.state\_interp +========================== + +.. currentmodule:: navlie.utils + +.. autofunction:: state_interp \ No newline at end of file diff --git a/source/_autosummary/navlie.utils.van_loans.rst b/source/_autosummary/navlie.utils.van_loans.rst new file mode 100644 index 00000000..2538562c --- /dev/null +++ b/source/_autosummary/navlie.utils.van_loans.rst @@ -0,0 +1,6 @@ +navlie.utils.van\_loans +======================= + +.. currentmodule:: navlie.utils + +.. autofunction:: van_loans \ No newline at end of file diff --git a/source/_static/imu.pdf b/source/_static/imu.pdf new file mode 100644 index 00000000..ed99dc63 Binary files /dev/null and b/source/_static/imu.pdf differ diff --git a/source/_templates/custom-class-template.rst b/source/_templates/custom-class-template.rst new file mode 100644 index 00000000..a6a62727 --- /dev/null +++ b/source/_templates/custom-class-template.rst @@ -0,0 +1,9 @@ +{{ fullname | escape | underline}} + +.. currentmodule:: {{ module }} + +.. autoclass:: {{ objname }} + :members: + :show-inheritance: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/source/_templates/custom-module-template.rst b/source/_templates/custom-module-template.rst new file mode 100644 index 00000000..66b15cd1 --- /dev/null +++ b/source/_templates/custom-module-template.rst @@ -0,0 +1,66 @@ +{{ fullname | escape | underline}} + +.. automodule:: {{ fullname }} + + {% block attributes %} + {% if attributes %} + .. rubric:: Module Attributes + + .. autosummary:: + :toctree: + {% for item in attributes %} + {{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + + {% block functions %} + {% if functions %} + .. rubric:: {{ _('Functions') }} + + .. autosummary:: + :toctree: + {% for item in functions %} + {{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + + {% block classes %} + {% if classes %} + .. rubric:: {{ _('Classes') }} + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + {% for item in classes %} + {{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + + {% block exceptions %} + {% if exceptions %} + .. rubric:: {{ _('Exceptions') }} + + .. autosummary:: + :toctree: + {% for item in exceptions %} + {{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + +{% block modules %} +{% if modules %} +.. rubric:: Modules + +.. autosummary:: + :toctree: + :template: custom-module-template.rst + :recursive: +{% for item in modules %} + {{ item }} +{%- endfor %} +{% endif %} +{% endblock %} \ No newline at end of file diff --git a/source/_templates/package.rst b/source/_templates/package.rst new file mode 100644 index 00000000..eef128ef --- /dev/null +++ b/source/_templates/package.rst @@ -0,0 +1,15 @@ +{{ name | escape | underline}} + +{% block modules %} +{% if modules %} +.. rubric:: Modules + +.. autosummary:: + :toctree: + :template: custom-module-template.rst + :recursive: +{% for item in modules %} + {{ item }} +{%- endfor %} +{% endif %} +{% endblock %} \ No newline at end of file diff --git a/source/api.rst b/source/api.rst new file mode 100644 index 00000000..4870a37d --- /dev/null +++ b/source/api.rst @@ -0,0 +1,17 @@ +API Documentation +------------------ +Below is a list of all the modules in the navlie package. Click on any of the links to see the documentation for that module. Alternatively, you can use the search box at the top of the page to search for a particular class/function/module. + +.. autosummary:: + :toctree: _autosummary + :recursive: + :template: custom-module-template.rst + + navlie.composite + navlie.datagen + navlie.filters + navlie.imm + navlie.types + navlie.utils + navlie.batch + navlie.lib \ No newline at end of file diff --git a/source/conf.py b/source/conf.py new file mode 100644 index 00000000..d6321eaa --- /dev/null +++ b/source/conf.py @@ -0,0 +1,75 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- Project information ----------------------------------------------------- + +project = "navlie" +copyright = "2022" +author = "Charles C. Cossette" + +# The full version, including alpha/beta/rc tags +release = "0.1.0" + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + "sphinx.ext.autodoc", + "sphinx.ext.napoleon", + "sphinx.ext.mathjax", + "sphinx.ext.autosummary", + "sphinx.ext.intersphinx", + "sphinx.ext.githubpages", + "nbsphinx", +] +autodoc_default_options = { + "member-order": "bysource", + "exclude-members": "__weakref__", +} +autosummary_generate = True +autoclass_content = "both" + +intersphinx_mapping = { + "python": ("https://docs.python.org/3/", None), + "numpy": ("https://numpy.org/doc/stable/", None), + "scipy": ("https://docs.scipy.org/doc/scipy/", None), + "matplotlib": ("https://matplotlib.org/stable/", None), +} + +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = "pydata_sphinx_theme" + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +# html_static_path = ['_static'] diff --git a/source/figs.pptx b/source/figs.pptx new file mode 100644 index 00000000..699b6041 Binary files /dev/null and b/source/figs.pptx differ diff --git a/source/fun_figs.png b/source/fun_figs.png new file mode 100644 index 00000000..b351c5aa Binary files /dev/null and b/source/fun_figs.png differ diff --git a/source/fun_figs.py b/source/fun_figs.py new file mode 100644 index 00000000..55099f02 --- /dev/null +++ b/source/fun_figs.py @@ -0,0 +1,177 @@ +# %% +import navlie as nav +import numpy as np +import matplotlib.pyplot as plt +import seaborn as sns + +sns.set_style("whitegrid") + + +# %% Banana distribution plot +def banana_plot(ax=None): + N = 500 + x0 = nav.lib.SE2State([0.3, 3, 4], direction="right") + covariance = np.diag([0.2**2, 0.05**2, 0.05**2]) + process_model = nav.lib.BodyFrameVelocity(np.zeros(3)) + + dx_samples = nav.randvec(covariance, N).T + x0_samples = [x0.plus(dx) for dx in dx_samples] + + # Monte-carlo the trajectory forward in time + dt = 0.1 + T = 10 + stamps = np.arange(0, T, dt) + + if ax is None: + fig, ax = plt.subplots(figsize=(8, 8)) + + final_states = [] + for sample in x0_samples: + x_traj = [sample.copy()] + u = nav.lib.VectorInput([0.1, 0.3, 0]) + x = sample + for _ in stamps: + x = process_model.evaluate(x, u, dt) + x_traj.append(x.copy()) + + # plot the trajectory + traj_pos = np.array([x.position for x in x_traj]) + + # random greyscale color + color = np.random.uniform(0.3, 0.9) + ax.plot( + traj_pos[:, 0], + traj_pos[:, 1], + color=(color, color, color), + zorder=1, + ) + + # save the final state + final_states.append(x_traj[-1]) + + final_positions = np.array([x.position for x in final_states]) + ax.scatter( + final_positions[:, 0], final_positions[:, 1], color="C0", zorder=2 + ) + + # Propagate the mean with EKF + kf = nav.ExtendedKalmanFilter(process_model) + x0_hat = nav.StateWithCovariance(x0, covariance) + + x_hat_traj = [x0_hat] + for t in stamps: + u.stamp = t + x_hat_traj.append(kf.predict(x_hat_traj[-1], u, dt)) + + mean_traj = np.array([x.state.position for x in x_hat_traj]) + ax.plot(mean_traj[:, 0], mean_traj[:, 1], color="r", zorder=3, linewidth=3) + ax.set_aspect("equal") + + +# banana_plot() + + +# %% +def pose3d_plot(ax=None): + N = 500 + x0 = nav.lib.SE3State([0.3, 3, 4, 0, 0, 0], direction="right") + process_model = nav.lib.BodyFrameVelocity(np.zeros(6)) + + dt = 0.1 + T = 20 + stamps = np.arange(0, T, dt) + + x_traj = [x0.copy()] + u = nav.lib.VectorInput([0.1, 0.3, 0, 1, 0, 0]) + x = x0.copy() + for _ in stamps: + x = process_model.evaluate(x, u, dt) + x_traj.append(x.copy()) + + fig, ax = nav.plot_poses(x_traj, ax=ax) + + +# pose3d_plot() + + +# %% +def three_sigma_plot(axs=None): + dataset = nav.lib.datasets.SimulatedPoseRangingDataset() + + estimates = nav.run_filter( + nav.ExtendedKalmanFilter(dataset.process_model), + dataset.get_ground_truth()[0], + np.diag([0.1**2, 0.1**2, 0.1**2, 0.1**2, 0.1**2, 0.1**2]), + dataset.get_input_data(), + dataset.get_measurement_data(), + ) + + results = nav.GaussianResultList.from_estimates( + estimates, dataset.get_ground_truth() + ) + + fig, axs = nav.plot_error(results[:, :3], axs=axs) + axs[2].set_xlabel("Time (s)") + + +# three_sigma_plot() + + +if __name__ == "__main__": + # Make one large figure which has all the plots. This will be a 1x3 grid, with the + # last plot itself being a three vertically stacked plots. + + # The following values where chosen by trial and error + # top=0.975, + # bottom=0.097, + # left=0.025, + # right=0.992, + # hspace=0.2, + # wspace=0.117 + + # which will be used here: + + fig = plt.figure(figsize=(20, 6)) + gs = fig.add_gridspec(1, 3, width_ratios=[1, 1, 1]) + ax1 = fig.add_subplot(gs[0]) + ax2 = fig.add_subplot(gs[1], projection="3d") + + # The last plot is a 3x1 grid + gs2 = gs[2].subgridspec(3, 1, hspace=0.1) + ax3 = fig.add_subplot(gs2[0]) + ax4 = fig.add_subplot(gs2[1]) + ax5 = fig.add_subplot(gs2[2]) + + # Remove tick labels for ax3 and ax4 + ax3.set_xticklabels([]) + ax4.set_xticklabels([]) + + # Remove all tick labels for ax2 + ax2.set_xticklabels([]) + ax2.set_yticklabels([]) + ax2.set_zticklabels([]) + + banana_plot(ax1) + pose3d_plot(ax2) + three_sigma_plot(np.array([ax3, ax4, ax5])) + + # Set spacing to the above values + fig.subplots_adjust( + top=0.975, + bottom=0.097, + left=0.025, + right=0.992, + hspace=0.2, + wspace=0.117, + ) + + # Save the figure with transparent background, next to this file + import os + + fig.savefig( + os.path.join(os.path.dirname(__file__), "fun_figs.png"), + transparent=True, + ) + + plt.show() +# %% diff --git a/source/index.rst b/source/index.rst new file mode 100644 index 00000000..fbb725ee --- /dev/null +++ b/source/index.rst @@ -0,0 +1,62 @@ +.. navlie documentation master file, created by + sphinx-quickstart on Wed Aug 24 15:11:06 2022. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. toctree:: + :maxdepth: 1 + :hidden: + + Home + Tutorial + API + + +Welcome to navlie! +------------------ + +.. make a row of three figures stacked side by side +.. image:: ./fun_figs.png + :width: 100% + :align: center + +navlie is a state estimation package specifically designed for both traditional and Lie-group-based estimation problems! + +The core idea behind this project is to use abstraction in such a way that both traditional and Lie-group-based problems fall under the exact same interface. Using this, a single estimator implementation can operate on a variety of state definitions, such as the usual vector space, and any Lie group. We allow the user to define their custom state, process model, and measurement models, after which they will have a variety of algorithms available to them, including: + +- Extended Kalman Filter +- Iterated Extended Kalman Filter +- Sigmapoint Kalman Filters (Unscented, Spherical Cubature, Gauss-Hermite) +- Interacting Multiple Model Filter +- Batch MAP Estimation + +In addition, navlie contains + +- A large collection of common process and measurement models +- Out-of-the-box on-manifold numerical Jacobians using finite differencing +- Various utils for plotting, error, and consistency evaluation +- Monte Carlo experiment executor with result aggregation +- A preintegration module for linear, wheel odometry, and IMU process models + +By implementing a few classes, the user can model a large variety of problems. The following diagram summarizes the abstraction + +.. image:: ./system_diagram.png + :width: 100% + :align: center + + +Installation +^^^^^^^^^^^^ + +Clone this repo, change to its directory, and execute + +.. code-block:: bash + + git clone git@github.com:decargroup/navlie.git + cd navlie && pip install -e . + +This command should automatically install all dependencies, including our package `pymlg `_ for back-end Lie group mathematical operations. + +Examples +^^^^^^^^ +A more in-depth `tutorial `_ can be found on this website, but there are also many examples found in the `examples/` folder. Simply run these as python3 scripts. \ No newline at end of file diff --git a/source/system_diagram.png b/source/system_diagram.png new file mode 100644 index 00000000..022d65dd Binary files /dev/null and b/source/system_diagram.png differ diff --git a/source/toy_problem.png b/source/toy_problem.png new file mode 100644 index 00000000..3fec2618 Binary files /dev/null and b/source/toy_problem.png differ diff --git a/source/tutorial.rst b/source/tutorial.rst new file mode 100644 index 00000000..bdcf0772 --- /dev/null +++ b/source/tutorial.rst @@ -0,0 +1,27 @@ + +Getting Started +--------------- + +Welcome to the navlie tutorial! The following few pages will go through a toy localization problem, where we will be running state estimation algorithms using navlie's framework. The first step is to install this package. This should be done by directly cloning the git repo and performing a local pip install: + +.. code-block:: bash + + git clone git@github.com:decargroup/navlie.git + cd navlie && pip install -e . + +All the dependencies should get installed by this command and the package should now be ready to use. Use the column on the left to go to next page of the tutorial. + + +.. note:: + + Although this package is currently registed with PyPi, installation via ``pip install navlie`` will not work. We're still figuring out how to set this up properly. Sorry! Feel free to help. + + +.. toctree:: + :hidden: + + 1. Getting Started + 2. Toy Problem - Traditional <./tutorial/traditional.ipynb> + 3. Toy Problem - Lie groups <./tutorial/lie_groups.ipynb> + 4. Specifying Jacobians <./tutorial/jacobians.ipynb> + 4. Composite States <./tutorial/composite.ipynb> \ No newline at end of file diff --git a/source/tutorial/composite.ipynb b/source/tutorial/composite.ipynb new file mode 100644 index 00000000..8a00bfdb --- /dev/null +++ b/source/tutorial/composite.ipynb @@ -0,0 +1,406 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Composite States\n", + "\n", + "The [CompositeState](../_autosummary/navlie.composite.CompositeState.rst) is a class that allows you to arbitarily combine multiple states, potentially of different types, into a new state that can be used with the navlie framework.\n", + "\n", + "Let's consider the previous example where we used the following $SE(2)$ pose transformation matrix to represent the state:\n", + "\n", + "$$ \n", + "\\mathbf{T} = \\begin{bmatrix} \\mathbf{C}_{ab} & \\mathbf{r}_a \\\\ \\mathbf{0} & 1 \\end{bmatrix} \\in SE(2).\n", + "$$\n", + "\n", + "Suppose we now also want to estimate a wheel odometry bias $\\mathbf{b} \\in \\mathbb{R}^2$ in addition to the robot's pose. Our state is now \n", + "\n", + "$$\n", + "\\mathbf{x} = (\\mathbf{T}, \\mathbf{b}) \\in SE(2) \\times \\mathbb{R}^2.\n", + "$$\n", + "\n", + "This can be implemented easily using the [CompositeState](../_autosummary/navlie.composite.CompositeState.rst) class in one of two ways: either directly or by inheritance. We'll show the former approach first." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CompositeState(stamp=0.0, state_id=None) with substates:\n", + " SE2State(stamp=0.0, state_id=pose, direction=right)\n", + " [[ 0.99500417 -0.09983342 1.84679329]\n", + " [ 0.09983342 0.99500417 3.09491919]\n", + " [ 0. 0. 1. ]]\n", + " VectorState(stamp=0.0, dof=2, state_id=bias)\n", + " [0.1 2. ]\n" + ] + } + ], + "source": [ + "import navlie as nav \n", + "import numpy as np\n", + "\n", + "# Define the pose and bias as their own states\n", + "T = nav.lib.SE2State(value = [0.1, 2.0, 3.0], stamp = 0.0, state_id=\"pose\")\n", + "b = nav.lib.VectorState(value = [0.1, 2.0], stamp = 0.0, state_id=\"bias\")\n", + "\n", + "# Combine into a composite state, and its ready to use!\n", + "x = nav.CompositeState([T, b], stamp=0.0)\n", + "\n", + "print(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The ``CompositeState`` class is a subclass of the ``State`` class, but who's ``value`` is a list of states, referred to as the *substates*. A convenience of this class is that the composite state's ``plus``, ``minus``, and ``copy`` methods have already been implemented for you based on the implementations in the substates. Note that the order in which the states are listed is important, and will correspond to the order of the components in the vectors involved in the ``plus`` and ``minus`` operations. This can be demonstrated with the following example." + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Result after plus():\n", + "CompositeState(stamp=0.0, state_id=None) with substates:\n", + " SE2State(stamp=0.0, state_id=pose, direction=right)\n", + " [[ 0.45359612 -0.89120736 1.80531705]\n", + " [ 0.89120736 0.45359612 6.55185711]\n", + " [ 0. 0. 1. ]]\n", + " VectorState(stamp=0.0, dof=2, state_id=bias)\n", + " [4.1 7. ]\n", + "\n", + "Result after minus():\n", + "[[1.]\n", + " [2.]\n", + " [3.]\n", + " [4.]\n", + " [5.]]\n" + ] + } + ], + "source": [ + "# plus() and minus() have been defined for you. Here, the first three elements\n", + "# of the vector to be added correspond to the pose (since it has 3 DOF), and the\n", + "# last two to the bias.\n", + "x_temp = x.plus(np.array([1,2,3,4,5]))\n", + "print(\"\\nResult after plus():\")\n", + "print(x_temp)\n", + "\n", + "dx = x_temp.minus(x)\n", + "print(\"\\nResult after minus():\")\n", + "print(dx)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we must write a process model that works with this state. We'll use the same process model as before, but now we'll also include the wheel odometry bias in the state. The bias process model will be modelled as a random walk of the form \n", + "\n", + "$$\n", + "\\mathbf{b}_{k+1} = \\mathbf{b}_k + \\Delta t \\mathbf{w}^\\mathrm{bias}_k,\n", + "$$\n", + "\n", + "where $\\mathbf{w}^{\\mathrm{bias}}_k \\sim \\mathcal{N}(0, \\mathbf{Q}^{\\mathrm{bias}})$ represents random error associated with this otherwise constant process model, which allows the bias to slowly vary. The process model for the composite state is then" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [], + "source": [ + "from scipy.linalg import expm\n", + "\n", + "def wedge_se2(x):\n", + " return np.array([[ 0, -x[0], x[1]],\n", + " [x[0], 0, x[2]], \n", + " [ 0, 0, 0]])\n", + "\n", + "class WheeledRobotWithBias(nav.ProcessModel):\n", + " def __init__(self, input_covariance_matrix):\n", + " self.Q = input_covariance_matrix\n", + "\n", + " def evaluate(self, x: nav.CompositeState, u: nav.lib.VectorInput, dt:float):\n", + " pose = x.value[0]\n", + " bias = x.value[1]\n", + " vel = np.array([u.value[0] - bias.value[0], u.value[1] - bias.value[1], 0])\n", + " x_next = x.copy()\n", + " x_next.value[0].value = pose.value @ expm(wedge_se2(vel * dt))\n", + "\n", + " # Largely data generation and jacobian purposes, we also update the bias\n", + " # state with an input, even if the input here is always zero in the\n", + " # nominal case.\n", + " x_next.value[1].value = bias.value + u.value[2:4]*dt\n", + " return x_next\n", + " \n", + " def input_covariance(self, x: nav.CompositeState, u: nav.lib.VectorInput, dt:float):\n", + " return self.Q\n", + "\n", + "Q = np.eye(4) * 0.1**2\n", + "process_model = WheeledRobotWithBias(Q)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'd like to use the same measurement model as before, which was just a series of range measurements to known landmarks:" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [], + "source": [ + "class RangeToLandmarkSE2(nav.MeasurementModel):\n", + " def __init__(\n", + " self,\n", + " landmark_position: np.ndarray,\n", + " measurement_covariance: float,\n", + " ):\n", + " self.landmark_position = landmark_position\n", + " self.R = measurement_covariance\n", + "\n", + " def evaluate(self, x: nav.lib.SE2State):\n", + " pos = x.value[0:2, 2]\n", + " return np.linalg.norm(pos - self.landmark_position)\n", + "\n", + " def covariance(self, x: nav.lib.SE2State):\n", + " return self.R\n", + " \n", + "R = 0.1**2\n", + "landmarks = np.array([[1, 1], [1, 2], [2, 2], [2, 1]])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The problem is that this was made for an ``SE2State`` instead of our new composite state, and specifically the line `pos = x.value[0:2, 2]` is going to throw an error when we feed in a composite state. This is easy to change, but then that means we have to make a similar change for all sorts of different state definitions. An alternative is to use the [CompositeMeasurementModel](../_autosummary/navlie.composite.CompositeMeasurementModel.rst), which is just a lightweight wrapper around one measurement model that \"assigns\" the model to a specific substate, referenced to by its `state_id` field. It is used as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "RangeToLandmarkSE2(of substate pose)\n", + "Jacobian:\n", + "[[0. 0.46544123 0.88507893 0. 0. ]]\n" + ] + } + ], + "source": [ + "meas_models = []\n", + "for lm in landmarks:\n", + " meas_models.append(\n", + " nav.CompositeMeasurementModel(RangeToLandmarkSE2(lm, R), \"pose\")\n", + " )\n", + "\n", + "print(meas_models[0])\n", + "print(\"Jacobian:\")\n", + "print(meas_models[0].jacobian(x))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This does mean that the `state_id` of each substate must be unique, but this is a good practice anyway. The `CompositeMeasurementModel` will then automatically handle the extraction of the relevant substate from the composite state and pass it to the measurement model, as well as handle the corresponding Jacobian accordingly. This is a good way to avoid having to write a lot of boilerplate code for different state definitions. Notice in the above example that the Jacobian has two extra zeros at the end, which correspond to the bias state that has no effect on the measurement. This is automatically handled by the `CompositeMeasurementModel`.\n", + "\n", + "With our problem now set up, we can run a filter on it with the same snippet as usual!" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "dg = nav.DataGenerator(\n", + " process_model=process_model, \n", + " input_func=lambda t, x: np.array([0.5, 0.3, 0.0, 0.0]), \n", + " input_covariance= Q, \n", + " input_freq=50, \n", + " meas_model_list=meas_models, \n", + " meas_freq_list=[10, 10, 10, 10] \n", + ")\n", + "\n", + "state_data, input_data, meas_data = dg.generate(x, start=0, stop=30, noise=True)\n", + "\n", + "# First, define the filter\n", + "kalman_filter = nav.ExtendedKalmanFilter(process_model)\n", + "P0 = np.diag([0.1**2, 1**2, 1**2, 0.1**2, 0.1**2]) # Initial covariance\n", + "x = nav.StateWithCovariance(x, P0) # Estimate and covariance in one container\n", + "\n", + "meas_idx = 0\n", + "y = meas_data[meas_idx]\n", + "estimates = []\n", + "for k in range(len(input_data) - 1):\n", + " u = input_data[k]\n", + "\n", + " # Fuse any measurements that have occurred.\n", + " while y.stamp < input_data[k + 1].stamp and meas_idx < len(meas_data):\n", + " x = kalman_filter.correct(x, y, u)\n", + "\n", + " # Load the next measurement\n", + " meas_idx += 1\n", + " if meas_idx < len(meas_data):\n", + " y = meas_data[meas_idx]\n", + "\n", + " # Predict until the next input is available\n", + " dt = input_data[k + 1].stamp - x.state.stamp\n", + " x = kalman_filter.predict(x, u, dt)\n", + "\n", + " estimates.append(x.copy())\n", + "\n", + "\n", + "results = nav.GaussianResultList.from_estimates(estimates, state_data)\n", + "\n", + "import matplotlib.pyplot as plt\n", + "fig, axs = nav.plot_error(results)\n", + "axs[0,0].set_title(\"Pose Estimation Errors\")\n", + "axs[0,0].set_ylabel(\"theta (rad)\")\n", + "axs[1,0].set_ylabel(\"x (m)\")\n", + "axs[2,0].set_ylabel(\"y (m)\")\n", + "axs[2,0].set_xlabel(\"Time (s)\")\n", + "axs[0, 1].set_title(\"Bias Estimation Errors\")\n", + "axs[0, 1].set_ylabel(\"ang. vel. (rad/s)\")\n", + "axs[1, 1].set_ylabel(\"forward vel. (m/s)\")\n", + "axs[1, 1].set_xlabel(\"Time (s)\")\n", + "\n", + "fig, ax = nav.plot_nees(results)\n", + "ax.set_title(\"NEES\")\n", + "ax.set_xlabel(\"Time (s)\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inheriting from `CompositeState`\n", + "\n", + "The previous example showed how to use the `CompositeState` class directly, but it's also possible to inherit from it. This is useful if you want to add some extra methods or attributes to the composite state, or if you are going to frequently be using the same composite state. Here's an example of how you would do it:" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WheeledRobotState(stamp=0.1, state_id=None) with substates:\n", + " SE2State(stamp=0.1, state_id=pose, direction=right)\n", + " [[ 0.99500417 -0.09983342 1.84679329]\n", + " [ 0.09983342 0.99500417 3.09491919]\n", + " [ 0. 0. 1. ]]\n", + " VectorState(stamp=0.1, dof=2, state_id=bias)\n", + " [0.1 2. ]\n", + "SE2State(stamp=0.1, state_id=pose, direction=right)\n", + " [[ 0.99500417 -0.09983342 1.84679329]\n", + " [ 0.09983342 0.99500417 3.09491919]\n", + " [ 0. 0. 1. ]]\n" + ] + } + ], + "source": [ + "class WheeledRobotState(nav.CompositeState):\n", + " def __init__(self, pose_values: np.ndarray, bias_values: np.ndarray, stamp: float):\n", + " pose = nav.lib.SE2State(pose_values, stamp=stamp, state_id=\"pose\")\n", + " bias = nav.lib.VectorState(bias_values, stamp=stamp, state_id=\"bias\")\n", + " super().__init__([pose, bias], stamp=stamp)\n", + "\n", + " # Define any getter that you want for convenience! \n", + " @property\n", + " def pose(self):\n", + " return self.value[0]\n", + "\n", + " @property\n", + " def bias(self):\n", + " return self.value[1]\n", + "\n", + " def copy(self):\n", + " return WheeledRobotState(self.pose.copy(), self.bias.copy())\n", + " \n", + "x = WheeledRobotState([0.1, 2.0, 3.0], [0.1, 2.0], stamp = 0.1)\n", + "print(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This can end up looking a lot cleaner, and is potentially more flexible to work with since you can add methods and attributes to the composite state. For example, because of the getters we defined above, we can access the pose and bias more ergonomically with `x.pose` and `x.bias`." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.16" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/source/tutorial/jacobians.ipynb b/source/tutorial/jacobians.ipynb new file mode 100644 index 00000000..ce634985 --- /dev/null +++ b/source/tutorial/jacobians.ipynb @@ -0,0 +1,341 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Jacobians in navlie\n", + "\n", + "As you may know, many state estimation algorithm require access to process model and measurement model Jacobians, with respect to the state and sometimes other inputs. For states belonging to Lie groups, algorithms will require _Lie Jacobians_, which differ from traditional derivatives as they conform to the constraints of the group. The abstraction provided by the $\\oplus$ and $\\ominus$ operators (implemented with `State.plus` and `State.minus` respectively) allow for a generic definition of a derivative:\n", + "\n", + "$$\n", + "\\left.\\frac{D f(\\mathcal{X})}{D \\mathcal{X}}\\right|_{\\bar{\\mathcal{X}} }\\triangleq \\left.\\frac{\\partial f(\\bar{\\mathcal{X}} \\oplus \\delta \\mathbf{x}) \\ominus f(\\bar{\\mathcal{X}})}{\\partial \\delta \\mathbf{x}}\\right|_{\\delta \\mathbf{x} = \\mathbf{0}},\n", + "$$\n", + "\n", + "which can be shown to fall back to a traditional derivatives when $\\oplus$ and $\\ominus$ are defined to be regular addition/subtraction. This derivative definition is used universally throughout navlie, and roughly follows what is done in the [Micro Lie Theory paper](https://arxiv.org/pdf/1812.01537.pdf). In that reference, seperate definitions are given for \"left\" and \"right\" derivatives, whereas we have aggregated them into a single definition, with left and right derivatives naturally arising from the choice of $\\oplus$ and $\\ominus$ operators.\n", + "\n", + "If you dont want to worry about this, the good news is that navlie computes Lie Jacobians for you by default using finite difference. However, finite difference can have some drawbacks, such as being computationally expensive and less accurate than analytic derivatives. In this notebook, we will show you how to use analytic derivatives in navlie, which offer the maximum accuracy and speed.\n", + "\n", + "## Jacobians - Traditional Approach\n", + "Recall the traditional approach to the previous example. We had defined the state to be $\\mathbf{x} = [\\theta, x, y]^T$ and the process model to be\n", + "\n", + "$$ \n", + "\\begin{aligned}\n", + "\\theta_{k+1} &= \\theta_k + \\omega_k \\Delta t \\\\\n", + "x_{k+1} &= x_k + v_k \\cos(\\theta_k) \\Delta t \\\\\n", + "y_{k+1} &= y_k + v_k \\sin(\\theta_k) \\Delta t\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "where $\\omega_k$ is the angular velocity and $v_k$ is the linear velocity. Since the state is just a regular vector, Lie Jacobians fall back to regular Jacobians, and standard derivative techniques lead to the following expressions for the process model Jacobian with respect to the state\n", + "\n", + "$$\n", + "\\mathbf{F} := \\frac{\\partial f(\\mathbf{x}_k, \\mathbf{u}_k)}{\\partial \\mathbf{x}_k} = \\begin{bmatrix} 1 & 0 & 0 \\\\ -v_k \\sin(\\theta_k) \\Delta t & 1 & 0 \\\\ v_k \\cos(\\theta_k) \\Delta t & 0 & 1 \\end{bmatrix}\n", + "$$\n", + "\n", + "To implement this Jacobian in navlie, all we need to do is override the `jacobian()` method in our process model, and it will get used automatically by the estimation algorithms. Adding this to our process model from before:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import navlie as nav\n", + "import numpy as np\n", + "\n", + "from navlie.lib import VectorInput, VectorState\n", + "\n", + "Q = np.eye(2) * 0.1**2 # Input noise covariance with 0.1 m/s of standard deviation\n", + "\n", + "class WheeledRobot(nav.ProcessModel):\n", + " def __init__(self, input_covariance):\n", + " self.Q = input_covariance\n", + "\n", + " def evaluate(self, x: VectorState, u: VectorInput, dt: float) -> VectorState:\n", + " x_next = x.copy()\n", + " x_next.value[0] += u.value[0] * dt\n", + " x_next.value[1] += u.value[1] * dt * np.cos(x.value[0])\n", + " x_next.value[2] += u.value[1] * dt * np.sin(x.value[0])\n", + " return x_next\n", + "\n", + " def input_covariance(self, x: VectorState, u: VectorInput, dt: float) -> np.ndarray:\n", + " return self.Q\n", + " \n", + " def jacobian(self, x:VectorState, u: VectorInput, dt: float) -> np.ndarray:\n", + " F = np.eye(3)\n", + " F[1, 0] = -u.value[1] * dt * np.sin(x.value[0])\n", + " F[2, 0] = u.value[1] * dt * np.cos(x.value[0])\n", + " return F\n", + "\n", + "process_model = WheeledRobot(Q) # instantiate it" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, lets just double check that we did everything correctly by comparing with finite difference. All process models inherit the `jacobian_fd()` method, which computes the Jacobian using finite difference. We can use this to compare with our analytic Jacobian." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Analyical:\n", + "[[ 1. 0. 0. ]\n", + " [-0.01682942 1. 0. ]\n", + " [ 0.01080605 0. 1. ]]\n", + "\n", + "Finite difference:\n", + "[[ 1. 0. 0. ]\n", + " [-0.01682943 1. 0. ]\n", + " [ 0.01080604 0. 1. ]]\n" + ] + } + ], + "source": [ + "x = VectorState([1,2,3]) \n", + "u = VectorInput([0.1, 0.2]) \n", + "dt = 0.1 \n", + "\n", + "print(\"Analyical:\")\n", + "print(process_model.jacobian(x, u, dt))\n", + "\n", + "print(\"\\nFinite difference:\")\n", + "print(process_model.jacobian_fd(x, u, dt))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The Jacobians match almost perfectly, but differ slightly due to errors in finite difference. This is expected, as finite difference is only an approximation. Nevertheless, finite difference is generally sufficiently accurate for most applications.\n", + "\n", + "
\n", + "Note: The `jacobian` methods must *always* return a 2D array.\n", + "
\n", + "\n", + "\n", + "\n", + "Moving on to the measurement model, which was previously defined to be \n", + "\n", + "$$\n", + "\\mathbf{y}_k = || \\mathbf{r}_k - \\boldsymbol{\\ell}^{(i)} || \n", + "$$ \n", + "\n", + "where $\\mathbf{r}_k$ is the robot's position and $\\boldsymbol{\\ell}^{(i)}$ is the $i$th landmark. The measurement model Jacobian with respect to the state is\n", + "\n", + "$$ \n", + "\\mathbf{G} := \\frac{\\partial g(\\mathbf{x}_k)}{\\partial \\mathbf{x}_k} = \\begin{bmatrix} 0 & \\frac{(\\mathbf{r}_k - \\boldsymbol{\\ell}^{(i)})^T}{||(\\mathbf{r}_k - \\boldsymbol{\\ell}^{(i)})||} \\end{bmatrix},\n", + "$$\n", + "\n", + "and we can implement this in navlie by again overriding the `jacobian()` method in our measurement model. Adding this to our measurement model from before:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Analyical:\n", + "[[0. 0.70710678 0.70710678]]\n", + "\n", + "Finite difference:\n", + "[[0. 0.70710696 0.70710696]]\n" + ] + } + ], + "source": [ + "class RangeToLandmark(nav.MeasurementModel):\n", + " def __init__(self, landmark_position: np.ndarray):\n", + " self.landmark_position = landmark_position\n", + "\n", + " def evaluate(self, x: VectorState) -> np.ndarray:\n", + " return np.linalg.norm(x.value[1:] - self.landmark_position)\n", + " \n", + " def covariance(self, x: VectorState) -> np.ndarray:\n", + " return 0.1**2\n", + " \n", + " def jacobian(self, x: VectorState) -> np.ndarray:\n", + " G = np.zeros((1, 3))\n", + " r = x.value[1:]\n", + " G[0,1:] = (r - self.landmark_position) / np.linalg.norm(r - self.landmark_position)\n", + " return G\n", + " \n", + "meas_model = RangeToLandmark(np.array([1, 2]))\n", + "\n", + "print(\"\\nAnalyical:\")\n", + "print(meas_model.jacobian(x))\n", + "\n", + "print(\"\\nFinite difference:\")\n", + "print(meas_model.jacobian_fd(x))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can again see that the results match nicely." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Jacobians - Lie Group Approach \n", + "\n", + "Now, lets see how to implement analytical Jacobians when states belong to Lie groups. In the previous example the state was $\\mathbf{T} \\in SE(2)$ and the process model was\n", + "\n", + "$$\n", + "\\mathbf{T}_{k+1} = \\mathbf{T}_k \\exp(\\boldsymbol{\\varpi}^\\wedge_k \\Delta t).\n", + "$$\n", + "\n", + "To derive the Jacobian, we can \"perturb\" both sides of the equation and manipulate. This is a common technique for deriving Lie Jacobians, and for computing matrix-vector derivatives in general. For more details, we recommend reading [State Estimation for Robotics by Tim Barfoot](http://asrl.utias.utoronto.ca/~tdb/bib/barfoot_ser17.pdf).\n", + "\n", + "$$ \n", + "\\begin{aligned}\n", + "\\mathbf{T}_{k+1} &= \\mathbf{T}_k \\exp(\\boldsymbol{\\varpi}^\\wedge_k \\Delta t) \\\\\n", + "\\bar{\\mathbf{T}}_{k+1} \\exp(\\delta \\boldsymbol{\\xi}_{k+1}^\\wedge) &= \\bar{\\mathbf{T}}_{k} \\exp(\\delta \\boldsymbol{\\xi}_{k}^\\wedge) \\exp(\\boldsymbol{\\varpi}^\\wedge_k \\Delta t) \\\\\n", + " \\exp(\\delta \\boldsymbol{\\xi}_{k+1}^\\wedge) &= \\underbrace{\\bar{\\mathbf{T}}_{k+1}^{-1} \\bar{\\mathbf{T}}_{k}}_{\\exp(\\boldsymbol{\\varpi}^\\wedge \\Delta t)^{-1}} \\exp(\\delta \\boldsymbol{\\xi}_{k}^\\wedge) \\exp(\\boldsymbol{\\varpi}^\\wedge_k \\Delta t) \\\\\n", + " \\exp(\\delta \\boldsymbol{\\xi}_{k+1}^\\wedge) &= \\exp((\\mathbf{Ad}(\\exp(\\boldsymbol{\\varpi}^\\wedge \\Delta t)^{-1}) \\delta \\boldsymbol{\\xi}_{k})^\\wedge) \\\\\n", + " \\delta \\boldsymbol{\\xi}_{k+1} &= \\underbrace{\\mathbf{Ad}(\\exp(\\boldsymbol{\\varpi}^\\wedge \\Delta t)^{-1})}_{\\mathbf{F}} \\delta \\boldsymbol{\\xi}_{k}\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "There, we used the _adjoint matrix_ $\\mathbf{Ad}(\\cdot)$, to invoke the identity $\\mathbf{X}^{-1} \\exp(\\boldsymbol{\\xi}^\\wedge) \\mathbf{X} = \\exp(\\mathbf{Ad}(\\mathbf{X}) \\boldsymbol{\\xi}^\\wedge)$, which is true for any $\\mathbf{X} \\in SE(2)$. The adjoint matrix for $SE(2)$ is given by \n", + "\n", + "$$ \n", + "\\mathbf{Ad}(\\mathbf{T}) = \\begin{bmatrix} 1 & \\mathbf{0} \\\\ - \\boldsymbol{\\Omega} \\mathbf{r} & \\mathbf{C} \\end{bmatrix}\n", + "$$\n", + "\n", + "where $\\boldsymbol{\\Omega} = \\begin{bmatrix} 0 & -1 \\\\ 1 \n", + "&0 \\end{bmatrix}$.\n", + "\n", + "
\n", + "Note: in this Jacobian derivation, we perturbed the state $\\mathbf{T} = \\bar{\\mathbf{T}} \\exp(\\delta \\boldsymbol{\\xi}^\\wedge)$ \"on the right\" because that corresponds to what was implemented in the `plus()` method of our `SE2State` class. It is important to be consistent here for everything to work.\n", + "
\n", + "\n", + "Now, we can implement this Jacobian in navlie by overriding the `jacobian()` method in our process model. Adding this to our process model from before:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Analyical:\n", + "[[ 1. 0. 0. ]\n", + " [ 0.0394695 0.92106099 0.38941834]\n", + " [ 0.19470917 -0.38941834 0.92106099]]\n", + "\n", + "Finite difference:\n", + "[[ 1.00000000e+00 -1.10747782e-11 -1.10747782e-11]\n", + " [ 3.94695038e-02 9.21060995e-01 3.89418343e-01]\n", + " [ 1.94709171e-01 -3.89418342e-01 9.21060994e-01]]\n" + ] + } + ], + "source": [ + "from navlie.lib import SE2State, VectorInput\n", + "from scipy.linalg import expm\n", + "\n", + "\n", + "def wedge_se2(x:np):\n", + " return np.array([[ 0, -x[0], x[1]],\n", + " [x[0], 0, x[2]], \n", + " [ 0, 0, 0]])\n", + "\n", + "def adjoint_se2(T:np.ndarray):\n", + " C = T[:2, :2]\n", + " r = T[:2, 2]\n", + " Omega = np.array([[0, -1], [1, 0]])\n", + " Ad = np.zeros((3,3))\n", + " Ad[0,0] = 1\n", + " Ad[1:,1:] = C\n", + " Ad[1:,0] = - Omega @ r\n", + " return Ad\n", + "\n", + "\n", + "class WheeledRobotSE2(nav.ProcessModel):\n", + " def __init__(self, input_covariance_matrix):\n", + " self.Q = input_covariance_matrix\n", + "\n", + " def evaluate(self, x:SE2State, u:VectorInput, dt:float):\n", + " u = np.array([u.value[0], u.value[1], 0])\n", + " x_next = x.copy()\n", + " x_next.value = x.value @ expm(wedge_se2(u * dt))\n", + " return x_next\n", + " def input_covariance(self, x:SE2State, u:VectorInput, dt:float):\n", + " return self.Q\n", + "\n", + " def jacobian(self, x:SE2State, u:VectorInput, dt:float):\n", + " u = np.array([u.value[0], u.value[1], 0])\n", + " return adjoint_se2(expm(-wedge_se2(u * dt)))\n", + "\n", + "Q = np.eye(2) * 0.1**2\n", + "process_model = WheeledRobotSE2(Q)\n", + "x = SE2State(expm(wedge_se2(np.array([1,2,3]))))\n", + "u = VectorInput([4, 2])\n", + "dt = 0.1\n", + "\n", + "print(\"\\nAnalyical:\")\n", + "print(process_model.jacobian(x, u, dt))\n", + "\n", + "print(\"\\nFinite difference:\")\n", + "print(process_model.jacobian_fd(x, u, dt))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that when using Lie groups, our Jacobian no longer has dependence on the state itself. This can be a tangible advantage when the state estimate has high uncertainty, where using a traditional approach can result in excessive linearization errors when the state estimate is far from the true value." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.16" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/source/tutorial/lie_groups.ipynb b/source/tutorial/lie_groups.ipynb new file mode 100644 index 00000000..fd96344d --- /dev/null +++ b/source/tutorial/lie_groups.ipynb @@ -0,0 +1,425 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Toy Problem - Lie group approach\n", + "\n", + "![Toy Problem](../toy_problem.png)\n", + "\n", + "Another way we could approach the same state estimation task is to instead use Lie group theory, which is becoming increasingly common practice in state estimation. Lie group theory can be very abstract, and the main references that navlie refer to are the following:\n", + "\n", + "1. [A micro Lie theory for state estimation in robotics](https://arxiv.org/abs/1812.01537)\n", + "2. [T.Barfoot, State Estimation for Robotics](http://asrl.utias.utoronto.ca/~tdb/bib/barfoot_ser17.pdf)\n", + "\n", + "\n", + "## Define the State\n", + "Instead of representing the state using a vector, we will represent the state using an element of the *special Euclidean group* $SE(2)$, sometimes called *pose transformation matrices*. Elements of this group are 3x3 matrices of the form \n", + "\n", + "$$ \n", + "\\mathbf{T} = \\begin{bmatrix} \\mathbf{C}_{ab}(\\theta) & \\mathbf{r}_a \\\\ \\mathbf{0} & 1 \\end{bmatrix} \\in SE(2)\n", + "$$\n", + "\n", + "where $\\mathbf{r}_a = [x,y]^T$ again denotes the position of the robot and $\\mathbf{C}_{ab}(\\theta) \\in SO(2)$ is a rotation matrix (sometimes called a direction cosine matrix) with the form \n", + "\n", + "$$ \n", + "\\mathbf{C}_{ab}(\\theta) = \\begin{bmatrix} \\cos \\theta & - \\sin \\theta \\\\ \\sin \\theta & \\cos \\theta \\end{bmatrix}.\n", + "$$\n", + "\n", + "The rotation matrix transforms vectors resolved in one frame to another frame, i.e. $\\mathbf{r}_a = \\mathbf{C}_{ab} \\mathbf{r}_b$. Unlike vectors, elements of $SO(2)$ or $SE(2)$ cannot be added together to produce another valid element of $SE(2)$, but they can be multiplied together with the result still having the same form.\n", + "\n", + "$$\n", + "\\mathbf{T}_1 \\mathbf{T}_2 \\in SE(2)\n", + "$$\n", + "\n", + " To proceed further with our mathematical setup, we need to define a few very common operators seen in Lie group theory. The first two are the \"wedge\" $(\\cdot)^\\wedge$ and \"vee\" $(\\cdot)^\\vee$ operators, which for this specific group has the form\n", + "\n", + "$$ \n", + "\\begin{bmatrix} \\theta \\\\ x \\\\ y \\end{bmatrix}^\\wedge = \\begin{bmatrix} 0 & -\\theta & x \\\\ \\theta & 0 & y \\\\ 0 & 0 & 0 \\end{bmatrix}\n", + "$$\n", + "\n", + "and the $(\\cdot)^\\vee$ operator simply does the exact inverse of $(\\cdot)^\\wedge$. We can implement them as follows.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "%reset -f\n", + "import numpy as np\n", + "\n", + "# Helper functions for SE(2)\n", + "def wedge_se2(x):\n", + " return np.array([[ 0, -x[0], x[1]],\n", + " [x[0], 0, x[2]], \n", + " [ 0, 0, 0]])\n", + "\n", + "def vee_se2(X):\n", + " return np.array([X[1, 0], X[0, 2], X[1, 2]])\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Two other fundamental relationships appearing in Lie group theory are the exponential (denoted $\\exp$) and logarithmic (denoted $\\log$) maps. While these have a deeper definition, for our case it suffices to think of them as simply the [matrix exponential](https://en.wikipedia.org/wiki/Matrix_exponential) and [matrix logarithm](https://en.wikipedia.org/wiki/Logarithm_of_a_matrix). Using the wedge and vee operators for $SE(2)$ defined above, we can convert a 3x1 vector to an $SE(2)$ element and back as follows" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "An element of SE2:\n", + "[[ 0.99500417 -0.09983342 0.18467933]\n", + " [ 0.09983342 0.99500417 0.30949192]\n", + " [ 0. 0. 1. ]]\n", + "\n", + "The original vector 'representing' it:\n", + "[0.1 0.2 0.3]\n" + ] + } + ], + "source": [ + "from scipy.linalg import expm, logm\n", + "\n", + "T = expm(wedge_se2(np.array([0.1, 0.2, 0.3])))\n", + "print(\"An element of SE2:\")\n", + "print(T)\n", + "\n", + "x = vee_se2(logm(T))\n", + "print(\"\\nThe original vector 'representing' it:\")\n", + "print(x)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now have the tools we need to abstract-ify our problem a little bit. As commonly seen in the literature, we can define the so-called \"oplus\" and \"ominus\" operators as follows (sometimes called \"boxplus\" $\\boxplus$ and \"boxminus\" $\\boxminus$):\n", + "\n", + "$$\n", + "\\begin{aligned}\n", + "\\mathbf{T}_2 &= \\mathbf{T}_1 \\oplus \\boldsymbol{\\xi} := \\mathbf{T}_1 \\exp(\\boldsymbol{\\xi}^\\wedge) \\\\\n", + "\\boldsymbol{\\varepsilon} &= \\mathbf{T}_2 \\ominus \\mathbf{T}_1 := \\log(\\mathbf{T}_2^{-1} \\mathbf{T}_1)^\\vee\n", + "\\end{aligned}\n", + "$$ \n", + "\n", + "Here, both $\\boldsymbol{\\varepsilon}, \\boldsymbol{\\xi} \\in \\mathbb{R}^3$ are 3x1 vectors. The $\\oplus: SE(2) \\times \\mathbb{R}^3 \\to SE(2)$ operator \"adds\" a vector to an $SE(2)$ element to produce another $SE(2)$ element, and the $\\ominus:SE(2) \\times SE(2) \\to \\mathbb{R}^3$ operator \"subtracts\" two $SE(2)$ elements to produce a vector that represents the \"difference\" between them. \n", + "\n", + "\n", + "With this context, lets implement an $SE(2)$ state inside navlie's framework. To define a custom state, you must subclass the `nav.State` abstract class and you *must* implement the `plus`, `minus`, and `copy` methods. These methods play exactly the role of $\\oplus$ and $\\ominus$ described above, while the `copy` method is used to create a deep copy of that state object. In addition, state objects must hold an integer property named `dof` that specifies the *degrees of freedom* associated with that state. For $SE(2)$, this is 3." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "SE2State(stamp=0.0, dof=3, state_id=None)\n", + " [[1. 0. 0.]\n", + " [0. 1. 0.]\n", + " [0. 0. 1.]]\n" + ] + } + ], + "source": [ + "import navlie as nav\n", + "\n", + "class SE2State(nav.State):\n", + " def __init__(self, value :np.ndarray, stamp: float):\n", + " super().__init__(value=value, dof=3, stamp=stamp)\n", + "\n", + " def plus(self, dx: np.ndarray):\n", + " new_value = self.value @ expm(wedge_se2(dx))\n", + " return SE2State(new_value, self.stamp)\n", + "\n", + " def minus(self, other: \"SE2State\"):\n", + " other_inv = np.linalg.inv(other.value)\n", + " return vee_se2(logm(other_inv @ self.value))\n", + " \n", + " def copy(self):\n", + " return SE2State(self.value.copy(), self.stamp)\n", + "\n", + "x = SE2State(np.eye(3), 0.0)\n", + "print(x)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Define the Process Model\n", + "\n", + "Now, we must adapt the process model to work with our new `SE2State`. It is well known that the rotational kinematics can be written directly in terms of rotation matrices using \n", + "\n", + "$$ \n", + "\\dot{\\mathbf{C}}_{ab} = \\mathbf{C}_{ab}\\begin{bmatrix}0 & -\\omega \\\\ \\omega & 0 \\end{bmatrix} \n", + "$$\n", + "\n", + "and that the translational kinematics can be written in vector form using \n", + "\n", + "$$ \n", + "\\dot{\\mathbf{r}}_a = \\mathbf{C}_{ab} \\begin{bmatrix} v \\\\ 0 \\end{bmatrix} .\n", + "$$\n", + "\n", + "By stacking these into matrices it follows that \n", + "$$ \n", + "\\dot{\\mathbf{T}} = \\mathbf{T} \\boldsymbol{\\varpi}^\\wedge\n", + "$$\n", + "\n", + "where $\\boldsymbol{\\varpi} = [\\omega, v, 0]^T$. This equation is now a linear, matrix-valued ODE, and can be integrated exactly over a short duration $\\Delta t = t_{k+1} - t_k$ using the matrix exponential. This gives us the following discrete-time process model:\n", + "\n", + "$$\n", + "\\mathbf{T}_{k+1} = \\mathbf{T}_k \\exp(\\boldsymbol{\\varpi}_k^\\wedge \\Delta t)\n", + "$$\n", + "\n", + "which we can implement as follows" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "class WheeledRobotSE2(nav.ProcessModel):\n", + " def __init__(self, input_covariance_matrix):\n", + " self.Q = input_covariance_matrix\n", + "\n", + " def evaluate(self, x:SE2State, u:nav.lib.VectorInput, dt:float):\n", + " vel = np.array([u.value[0], u.value[1], 0])\n", + " x_next = x.copy()\n", + " x_next.value = x.value @ expm(wedge_se2(vel * dt))\n", + " return x_next\n", + " \n", + " def input_covariance(self, x:SE2State, u:nav.lib.VectorInput, dt:float):\n", + " return self.Q\n", + "\n", + "Q = np.eye(2) * 0.1**2\n", + "process_model = WheeledRobotSE2(Q)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Define the Measurement Model\n", + "\n", + "Finally, our measurement model remains largely unchanged. We just need to extract the position from an `SE2State` object now, as done below." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "class RangeToLandmarkSE2(nav.MeasurementModel):\n", + " def __init__(\n", + " self,\n", + " landmark_position: np.ndarray,\n", + " measurement_covariance: float,\n", + " ):\n", + " self.landmark_position = landmark_position\n", + " self.R = measurement_covariance\n", + "\n", + " def evaluate(self, x: SE2State):\n", + " pos = x.value[0:2, 2]\n", + " return np.linalg.norm(pos - self.landmark_position)\n", + "\n", + " def covariance(self, x: SE2State):\n", + " return self.R\n", + " \n", + "\n", + "landmarks = np.array([[1, 1], [1, 2], [2, 2], [2, 1]])\n", + "meas_models = [RangeToLandmarkSE2(landmark, 0.1**2) for landmark in landmarks]" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run the Filter!\n", + "\n", + "And that's it! All remaining snippets are now _literally_ copy-pasted from our previous approach with zero modifications. Using the abstraction framework in navlie, we can easily switch between different state representations and process/measurement models without having to change any of data generation or filtering code. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "SE2State(stamp=0.02, dof=3, state_id=None)\n", + " [[ 9.99950000e-01 -9.99983333e-03 5.99990000e-03]\n", + " [ 9.99983333e-03 9.99950000e-01 2.99997500e-05]\n", + " [ 0.00000000e+00 0.00000000e+00 1.00000000e+00]]\n", + "VectorInput(stamp=0.04, state_id=None)\n", + " [0.52438924 0.40056502]\n", + "Measurement(stamp=0.0, state_id=None) of PoseRangeToLandMark\n", + " 2.299276237837416\n" + ] + } + ], + "source": [ + "dg = nav.DataGenerator(\n", + " process_model=process_model, # process model to use\n", + " input_func=lambda t, x: np.array([0.5, 0.3]), # a callable that specifies the input values over time\n", + " input_covariance= Q, # numpy array or callable that specifies the input covariance over time\n", + " input_freq=50, # the frequency (Hz) at which the input is sampled (and the process model integrated)\n", + " meas_model_list=meas_models, # a list of measurement models to use\n", + " meas_freq_list=[10, 10, 10, 10] # corresponding measurement frequencies (Hz)\n", + ")\n", + "\n", + "state_data, input_data, meas_data = dg.generate(x, start=0, stop=30, noise=True)\n", + "\n", + "print(state_data[1])\n", + "print(input_data[2])\n", + "print(meas_data[3])" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# First, define the filter\n", + "kalman_filter = nav.ExtendedKalmanFilter(process_model)\n", + "P0 = np.diag([0.1**2, 1**2, 1**2]) # Initial covariance\n", + "x = nav.StateWithCovariance(x, P0) # Estimate and covariance in one container\n", + "\n", + "meas_idx = 0\n", + "y = meas_data[meas_idx]\n", + "estimates = []\n", + "for k in range(len(input_data) - 1):\n", + " u = input_data[k]\n", + "\n", + " # Fuse any measurements that have occurred.\n", + " while y.stamp < input_data[k + 1].stamp and meas_idx < len(meas_data):\n", + " x = kalman_filter.correct(x, y, u)\n", + "\n", + " # Load the next measurement\n", + " meas_idx += 1\n", + " if meas_idx < len(meas_data):\n", + " y = meas_data[meas_idx]\n", + "\n", + " # Predict until the next input is available\n", + " dt = input_data[k + 1].stamp - x.state.stamp\n", + " x = kalman_filter.predict(x, u, dt)\n", + "\n", + " estimates.append(x.copy())\n", + "\n", + "\n", + "results = nav.GaussianResultList.from_estimates(estimates, state_data)\n", + "\n", + "import matplotlib.pyplot as plt\n", + "fig, axs = nav.plot_error(results)\n", + "axs[0].set_title(\"Estimation Errors\")\n", + "axs[0].set_ylabel(\"theta (rad)\")\n", + "axs[1].set_ylabel(\"x (m)\")\n", + "axs[2].set_ylabel(\"y (m)\")\n", + "axs[2].set_xlabel(\"Time (s)\")\n", + "\n", + "fig, ax = nav.plot_nees(results)\n", + "ax.set_title(\"NEES\")\n", + "ax.set_xlabel(\"Time (s)\")\n", + "plt.show()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Built-in Lie group states \n", + "While we implemented our own `SE2State` from scratch here for pedagogical purposes, navlie comes with many built-in Lie group states that you can use out of the box. Some of the built-in Lie group states include:\n", + "\n", + "- `nav.lib.SO2State`: representing 2D rotations using, beloning to the group $SO(2)$\n", + "- `nav.lib.SO3State`: representing 3D rotations using, beloning to the group $SO(3)$\n", + "- `nav.lib.SE2State`: representing 2D poses using, beloning to the group $SE(2)$\n", + "- `nav.lib.SE3State`: representing 3D poses using, beloning to the group $SE(3)$\n", + "- `nav.lib.SE23State`: representing \"extended\" poses that also contain velocity information, belonging to the group $SE_2(3)$\n", + "- `nav.lib.SL3State`: representing 3D homographies, belonging to the group $SL(3)$\n", + "\n", + "Each of these classes stores the value as a square numpy array in the `x.value` property. Moreover, closed-form formulas for the exponential and logarithmic maps have been implemented for each of these states, which is faster than using `scipy.linalg.expm` and `scipy.linalg.logm`. These underlying operations have even been implemented in C++ for maximum speed. " + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.16" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/source/tutorial/traditional.ipynb b/source/tutorial/traditional.ipynb new file mode 100644 index 00000000..f18bd608 --- /dev/null +++ b/source/tutorial/traditional.ipynb @@ -0,0 +1,393 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Toy Problem - Traditional Approach\n", + "\n", + "In this tutorial, we'll simulate a simple 2D localization problem as per the figure below. We'll assume that we have a robot following a simple body-frame-velocity model, which has access to noisy measurements of its forward velocity $v$ and angular velocity $\\omega$. In addition, this robot will have a time-of-flight sensor that gives it range measurements to a few known landmarks in the environment. \n", + "\n", + "![Toy Problem](../toy_problem.png)\n", + "\n", + "\n", + "## Define the State\n", + "The first step is to define the state of the robot. We'll start with a more traditional approach and define the state of the robot to be a vector of the form $\\mathbf{x} = [\\theta, x, y ]^T$, where $x$ and $y$ are the robot's position in the world and $\\theta$ is its orientation. We'll also define the control inputs to be $\\mathbf{u} = [\\omega, v]^T$, the robot's forward and angular velocity. The process (motion) model of the robot is then given by:\n", + "\n", + "$$\n", + "\\begin{aligned}\n", + " \\dot{\\theta} &= \\omega,\\\\\n", + " \\dot{x} &= v \\cos(\\theta), \\\\\n", + " \\dot{y} &= v \\sin(\\theta). \n", + "\\end{aligned}\n", + "$$\n", + "\n", + "However, this is in continuous time, and we need to discretize it to use it in a filter. For now, we'll use the simple Euler discretization method, which gives us the following discrete-time process model:\n", + "\n", + "$$\n", + "\\begin{aligned}\n", + " \\theta_{k+1} &= \\theta_k + \\omega_k \\Delta t, \\\\\n", + " x_{k+1} &= x_k + v_k \\cos(\\theta_k) \\Delta t, \\\\\n", + " y_{k+1} &= y_k + v_k \\sin(\\theta_k) \\Delta t.\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "Lets now code up our state and process model using navlie's framework. Since our state is just a regular 3x1 vector, we can use a standard type from the built-in library: [navlie.lib.VectorState](../_autosummary/navlie.lib.states.VectorState.rst)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "VectorState(stamp=0.0, dof=3, state_id=None)\n", + " [0. 0. 0.]\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "np.random.seed(0)\n", + "import navlie as nav\n", + "from navlie.lib import VectorState\n", + "\n", + "x = VectorState([0, 0, 0], stamp=0.0)\n", + "print(x)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `VectorState` is a subclass of the abstract [State](../_autosummary/navlie.types.State.rst) class in navlie, which is one of the core primitive types. The value of the state is stored as a numpy array, and can be accessed directly through `x.value`. \n", + "\n", + "\n", + "## Define the Process Model\n", + "For the process model, we'll choose to define our own from scratch here. Process models in navlie *must* inherit from the abstract [navlie.ProcessModel](../_autosummary/navlie.types.ProcessModel.rst) class and implement the `evaluate` and either the `input_covariance` or `covariance` methods." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from navlie.lib import VectorInput\n", + "\n", + "Q = np.eye(2) * 0.1**2 # Input noise covariance with 0.1 m/s of standard deviation\n", + "\n", + "class WheeledRobot(nav.ProcessModel):\n", + " def __init__(self, input_covariance):\n", + " self.Q = input_covariance\n", + "\n", + " def evaluate(self, x: VectorState, u: VectorInput, dt: float) -> VectorState:\n", + " x_next = x.copy()\n", + " x_next.value[0] += u.value[0] * dt\n", + " x_next.value[1] += u.value[1] * dt * np.cos(x.value[0])\n", + " x_next.value[2] += u.value[1] * dt * np.sin(x.value[0])\n", + " return x_next\n", + "\n", + " def input_covariance(self, x: VectorState, u: VectorInput, dt: float) -> np.ndarray:\n", + " return self.Q\n", + " \n", + "process_model = WheeledRobot(Q) # instantiate it" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The methods in navlie process models must always accept the arguments shown above: a `State` object, an `Input` object, and a float `dt`. The `evaluate` method must always return a valid (i.e. subclass of a) `State` object, and the `input_covariance` method must always return a square numpy array. There are more optional methods that can be implemented for performance reasons, but we will cover those later.\n", + "\n", + "## Define the Measurement Model(s)\n", + "Moving on to the measurement model, if $\\mathbf{r}_a = [x,y]^T$ denotes the position vector of the robot resolved in the world frame, and $\\mathbf{\\ell}^{(i)}_{a} \\in \\mathbb{R}^2$ is the 2 x 1 position vector of landmark $i$, then the measurement model for each landmark is simply \n", + "\n", + "$$ \n", + "y_i = ||\\mathbf{r}_a - \\mathbf{\\ell}^{(i)}_{a}||\n", + "$$\n", + "\n", + "In navlie, measurement models must be implemented in a similar way to process models: inherit from the [navlie.MeasurementModel](../_autosummary/navlie.types.MeasurementModel.rst) abstract class, and then implement the `evaluate` and `covariance` methods. Here's an example for this problem:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "class RangeToLandmark(nav.MeasurementModel):\n", + " def __init__(self, landmark_position: np.ndarray):\n", + " self.landmark_position = landmark_position\n", + "\n", + " def evaluate(self, x: VectorState) -> np.ndarray:\n", + " return np.linalg.norm(x.value[1:] - self.landmark_position)\n", + " \n", + " def covariance(self, x: VectorState) -> np.ndarray:\n", + " return 0.1**2\n", + " \n", + "landmarks = np.array([[1, 1], [1, 2], [2, 2], [2, 1]])\n", + "meas_models = [RangeToLandmark(landmark) for landmark in landmarks]" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## (Simulation only) Generate fake data\n", + "\n", + "The next step is to generate some fake data for our simulation (although navlie is also compatible with real data). To do this, we will use the [DataGenerator](../_autosummary/navlie.datagen.DataGenerator.rst) class which is used as follows" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "VectorState(stamp=0.0, dof=3, state_id=None)\n", + " [0. 0. 0.]\n", + "VectorInput(stamp=0.0, state_id=None)\n", + " [0.4867558 0.40227221]\n", + "Measurement(stamp=0.0, state_id=None) of RangeToLandmark\n", + " 1.5906187969698615\n" + ] + } + ], + "source": [ + "dg = nav.DataGenerator(\n", + " process_model=process_model, # process model to use\n", + " input_func=lambda t, x: np.array([0.3, 0.5]), # a callable that specifies the input values over time\n", + " input_covariance= Q, # numpy array or callable that specifies the input covariance over time\n", + " input_freq=50, # the frequency (Hz) at which the input is sampled (and the process model integrated)\n", + " meas_model_list=meas_models, # a list of measurement models to use\n", + " meas_freq_list=[10, 10, 10, 10] # corresponding measurement frequencies (Hz)\n", + ")\n", + "\n", + "state_data, input_data, meas_data = dg.generate(x, start=0, stop=30, noise=True)\n", + "\n", + "print(state_data[0])\n", + "print(input_data[0])\n", + "print(meas_data[0])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The output of the `DataGenerator.generate` method is three lists: a list of ground-truth `State` objects, a list of `Input` objects, and a list of [Measurement](../_autosummary/navlie.types.Measurement.rst) objects, with the input/measurement lists possibly being corrupted by random noise if the `noise=True` flag is set. Each item in these lists correspond to different points in time. We can plot the trajectory as follows" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "# Plot the state trajectory\n", + "pos = np.array([state.value[1:] for state in state_data])\n", + "plt.plot(pos[:, 0], pos[:, 1])\n", + "plt.scatter(landmarks[:, 0], landmarks[:, 1])\n", + "# add labels\n", + "for i, landmark in enumerate(landmarks):\n", + " plt.annotate(f\"Landmark {i}\", landmark)\n", + "plt.xlabel(\"x\")\n", + "plt.ylabel(\"y\")\n", + "plt.title(\"Simulated Trajectory\")\n", + "plt.axis(\"equal\")\n", + "\n", + "\n", + "# Plot the input data\n", + "plt.figure()\n", + "u_array = np.array([u.value for u in input_data])\n", + "u_stamps = np.array([u.stamp for u in input_data])\n", + "plt.plot(u_stamps, u_array[:, 0], label=\"omega\")\n", + "plt.plot(u_stamps, u_array[:, 1], label=\"v\")\n", + "plt.xlabel(\"Time (s)\")\n", + "plt.ylabel(\"Input\")\n", + "plt.title(\"Input Data\")\n", + "plt.legend()\n", + "plt.show()\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run a filter!\n", + "\n", + "Finally, lets run an extended Kalman filter on this data to get a state estimate that uses only the noisy measurements. In the below filter, we instantiate the [ExtendedKalmanFilter](../_autosummary/navlie.filters.ExtendedKalmanFilter.rst) to use on our data, and looping over the input measurements while also calling the correction step whenever a measurement occurs." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "# First, define the filter\n", + "kalman_filter = nav.ExtendedKalmanFilter(process_model)\n", + "\n", + "# You can try other filters too!\n", + "# kalman_filter = nav.UnscentedKalmanFilter(process_model)\n", + "# kalman_filter = nav.IteratedKalmanFIlter(process_model)\n", + "\n", + "P0 = np.diag([0.1**2, 1**2, 1**2]) # Initial covariance\n", + "x = nav.StateWithCovariance(x, P0) # Estimate and covariance in one container\n", + "\n", + "meas_idx = 0\n", + "y = meas_data[meas_idx]\n", + "estimates = []\n", + "for k in range(len(input_data) - 1):\n", + " u = input_data[k]\n", + "\n", + " # Fuse any measurements that have occurred.\n", + " while y.stamp < input_data[k + 1].stamp and meas_idx < len(meas_data):\n", + " x = kalman_filter.correct(x, y, u)\n", + "\n", + " # Load the next measurement\n", + " meas_idx += 1\n", + " if meas_idx < len(meas_data):\n", + " y = meas_data[meas_idx]\n", + "\n", + " # Predict until the next input is available\n", + " dt = input_data[k + 1].stamp - x.state.stamp\n", + " x = kalman_filter.predict(x, u, dt)\n", + "\n", + " estimates.append(x.copy())" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The filters in navlie are all designed to be *stateless*: this means that the actual state estimate is stored externally to the filter objects, in this case in a container called [StateWithCovariance](../_autosummary/navlie.types.StateWithCovariance.rst). Although this adds a slight burden on the user, it has the advantage of being more transparent, and also providing the ability to combine different filters in the same loop! For example, you could use an EKF for the prediction, but a UKF for the correction, or even to use different filters for different measurement models!\n", + "\n", + "\n", + "Once estimates have been obtained, we will often be interested in evaluating the performance. The [GaussianResultList](../_autosummary/navlie.utils.GaussianResultList.rst) object is a useful container for evaluating the quality of the state estimates when ground truth data is available. It calculates useful metrics such as raw error, Mahalanobis distance, and normalized estimation error squared (NEES). " + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "results = nav.GaussianResultList.from_estimates(estimates, state_data)\n", + "# results.nees \n", + "# results.three_sigma\n", + "# results.error\n", + "# results.md # mahalanobis distance\n", + "# # and more...\n", + "\n", + "# Some plotting functions that work directly with GaussianResultList\n", + "fig, axs = nav.plot_error(results)\n", + "axs[0].set_title(\"Estimation Errors\")\n", + "axs[0].set_ylabel(\"theta (rad)\")\n", + "axs[1].set_ylabel(\"x (m)\")\n", + "axs[2].set_ylabel(\"y (m)\")\n", + "axs[2].set_xlabel(\"Time (s)\")\n", + "\n", + "fig, ax = nav.plot_nees(results)\n", + "ax.set_title(\"NEES\")\n", + "ax.set_xlabel(\"Time (s)\")\n", + "plt.show()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As a final note, `GaussianResultList` will invoke the `State.minus` method of the state objects to calculate the error. As we will see next, this allows us to implement a custom measure of error, when it might not make sense to directly subtract two of our state objects." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.16" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +}