Shonan Rotation Averaging. 199 commit messages below, many are obsolete as design has changed quite a bit over time, especially from the earlier period where I thought we only needed SO(4). * prototyping weighted sampler * Moved WeightedSampler into its own header * Random now uses std header <random>. * Removed boost/random usage from linear and discrete directories * Made into class * Now using new WeightedSampler class * Inlined random direction generation * eradicated last vestiges of boost/random in gtsam_unstable * Added 3D example g2o file * Added Frobenius norm factors * Shonan averaging algorithm, using SOn class * Wrapping Frobenius and Shonan * Fixed issues with << * Use Builder parameters * Refactored Shonan interface * Fixed << issues as well as MATLAB segfault, using eval(), as discussed in issue #451 * ShonanAveragingParameters * New factor FrobeniusWormholeFactorP computes |Rj*P - Ri*P*Rij| * Fixed broken GetDimension for Lie groups with variable dimension. * Removed all but Shonan averaging factor and made everything work with new SOn * Just a single WormholeFactor, wrapped noise model * Use std <random> * comments/todos * added timing script * add script to process ShonanAveraging timing results * Now producing a CSV file * Parse csv file and make combined plot * Fixed range * change p value and set two flags on * input file path, all the csv files proceeses at the same time * add check convergence rate part * csv file have name according to input data name * correct one mistake in initialization * generate the convergence rate for each p value * add yticks for the bar plot * add noises to the measurements * test add noise * Basic structure for checkOptimalityAt * change optimizer method to cholesky * buildQ now working. Tests should be better but visually inspected. * multiple test with cholesky * back * computeLambda now works * make combined plots while make bar plot * Calculate minimum eigenvalue - the very expensive version * Exposed computeMinEigenValue * make plots and bar togenter * method change to jacobi * add time for check optimality, min_eigen_value, sub_bound * updated plot min_eigen value and subounds * Adding Spectra headers * David's min eigenvalue code inserted and made to compile. * Made it work * Made "run" method work. * add rim.g2o name * Fixed bug in shifting eigenvalues * roundSolution which replaces projectFrom * removed extra arguments * Added to wrapper * Add SOn to template lists * roundSolution delete the extra arguement p * only calculate p=5 and change to the correct way computing f_R * Fixed conflict and made Google-style name changes * prototype descent code and unit test for initializeWithDescent * add averaging cost/time part in processing data * initializewithDescent success in test * Formatting and find example rather than hardcode * Removed accidentally checked in cmake files * give value to xi by block * correct gradient descent * correct xi * } * Fix wrapper * Make Hat/Vee have alternating signs * MakeATangentVector helpder function * Fixed cmake files * changed sign * add line search * unit test for line search * test real data with line search * correct comment * Fix boost::uniform_real * add save .dat file * correct test case * add explanation * delete redundant cout * add name to .dat output file * correct checkR * add get poses_ in shonan * add Vector Point type for savig data * Remove cmake file which magically re-appeared?? * Switched to std random library. * Prepare Klaus test * Add klaus3.g2o data. * fix comment * Fix derivatives * Fixed broken GetDimension for Lie groups with variable dimension. * Fix SOn tests to report correct dimension * Added tests for Klaus3 data * Add runWithRandomKlaus test for shonan. * Finish runWithRandomKlaus unittest. * Correct datafile. * Correct the format. * Added measured and keys methods * Shonan works on Klaus data * Create dense versions for wrappers, for testing * Now store D, Q, and L * Remove another cmake file incorrectly checked in. * Found and fixed the bug in ComputeLambda ! * Now using Q in Lambdas calculation, so Lambdas agree with Eriksson18cvpr. * Make FrobeniusFactor not use deprecated methods * FrobeniusWormholeFactor takes Rot3 as argument * Wrapped some more methods. * Wrapped more methods * Allow creating and populating BetweenFactorPose3s in python * New constructors for ShonanAveraging * add function of get measurements number * Remove option not to use noise model * wrap Use nrMeasurements * Made Logmap a bit more tolerant of slightly degenerate rotations (with trace < -1) * Allow for Anchor index * Fix anchor bug * Change outside view to Rot3 rather than SO3 * Add Lift in SOn class * Make comet working * Small fixes * Delete extra function * Add SOn::Lift * Removed hardcoded flag * Moved Frobenius factor to gtsam from unstable * Added new tests and made an old regression pass again * Cleaned up formatting and some comments, added EXPORT directives * Throw exception if wrongly dimensioned values are given * static_cast and other throw * Fixed run-time dimension * Added gauge-constraining factor * LM parameters now passed in, added Gauge fixing * 2D test scaffold * Comments * Pre-allocated generators * Document API * Add optional weight * New prior weeights infrastructure * Made d a template parameter * Recursive Hat and RetractJacobian test * Added Spectra 0.9.0 to 3rdparty * Enabling 2D averaging * Templatized Wormhole factor * ignore xcode folder * Fixed vec and VectorizedGenerators templates for fixed N!=3 or 4 * Simplifying constructors Moved file loading to tests (for now) All unit tests pass for d==3! * Templated some methods internally * Very generic parseToVector * refactored load2d * Very much improved FrobeniusWormholeFactor (Shonan) Jacobians * SO(2) averaging works ! * Templated parse methods * Switched to new Dataset paradigm * Moved Shonan to gtsam * Checked noise model is correctly gotten from file * Fixed covariance bug * Making Shonan wrapper work * Renamed FrobeniusWormholeFactor to ShonanFactor and moved into its own compilation unit in gtsam/sfm * Fixed wrong include * Simplified interface (removed irrelevant random inits) and fixed eigenvector test * Removed stray boost::none * Added citation as suggested by Jose * Made descent test deterministic * Fixed some comments, commented out flaky test Co-authored-by: Jing Wu <jingwu@gatech.edu> Co-authored-by: jingwuOUO <wujing2951@gmail.com> Co-authored-by: swang <swang736@gatech.edu> Co-authored-by: ss <ss> Co-authored-by: Fan Jiang <prof.fan@foxmail.com> |
||
---|---|---|
.. | ||
Data | ||
CMakeLists.txt | ||
CameraResectioning.cpp | ||
CreateSFMExampleData.cpp | ||
DiscreteBayesNetExample.cpp | ||
DiscreteBayesNet_FG.cpp | ||
FisheyeExample.cpp | ||
HMMExample.cpp | ||
IMUKittiExampleGPS.cpp | ||
ISAM2Example_SmartFactor.cpp | ||
ISAM2_SmartFactorStereo_IMU.cpp | ||
ImuFactorExample2.cpp | ||
ImuFactorsExample.cpp | ||
InverseKinematicsExampleExpressions.cpp | ||
LocalizationExample.cpp | ||
METISOrderingExample.cpp | ||
OdometryExample.cpp | ||
PlanarSLAMExample.cpp | ||
Pose2SLAMExample.cpp | ||
Pose2SLAMExampleExpressions.cpp | ||
Pose2SLAMExample_g2o.cpp | ||
Pose2SLAMExample_graph.cpp | ||
Pose2SLAMExample_graphviz.cpp | ||
Pose2SLAMExample_lago.cpp | ||
Pose2SLAMStressTest.cpp | ||
Pose2SLAMwSPCG.cpp | ||
Pose3Localization.cpp | ||
Pose3SLAMExampleExpressions_BearingRangeWithTransform.cpp | ||
Pose3SLAMExample_changeKeys.cpp | ||
Pose3SLAMExample_g2o.cpp | ||
Pose3SLAMExample_initializePose3Chordal.cpp | ||
Pose3SLAMExample_initializePose3Gradient.cpp | ||
README.md | ||
RangeISAMExample_plaza2.cpp | ||
SFMExample.cpp | ||
SFMExampleExpressions.cpp | ||
SFMExampleExpressions_bal.cpp | ||
SFMExample_SmartFactor.cpp | ||
SFMExample_SmartFactorPCG.cpp | ||
SFMExample_bal.cpp | ||
SFMExample_bal_COLAMD_METIS.cpp | ||
SFMdata.h | ||
SelfCalibrationExample.cpp | ||
SimpleRotation.cpp | ||
SolverComparer.cpp | ||
StereoVOExample.cpp | ||
StereoVOExample_large.cpp | ||
TimeTBB.cpp | ||
UGM_chain.cpp | ||
UGM_small.cpp | ||
VisualISAM2Example.cpp | ||
VisualISAMExample.cpp | ||
easyPoint2KalmanFilter.cpp | ||
elaboratePoint2KalmanFilter.cpp |
README.md
GTSAM Examples
This directory contains all GTSAM C++ examples GTSAM pertaining to SFM
Basic Examples:
- SimpleRotation: a simple example of optimizing a single rotation according to a single prior
- CameraResectioning: resection camera from some known points
- SFMExample: basic structure from motion
- SFMExample_bal: same, but read data from read from BAL file
- SelfCalibrationExample: Do SFM while also optimizing for calibration
Stereo Visual Odometry Examples
Visual odometry using a stereo rig:
- StereoVOExample: basic example of stereo VO
- StereoVOExample_large: larger, with a snippet of Kitti data
More Advanced Examples
The following examples illustrate some concepts from Georgia Tech's research papers, listed in the references section at the end:
- VisualISAMExample: uses iSAM [TRO08]
- VisualISAM2Example: uses iSAM2 [IJRR12]
- SFMExample_SmartFactor: uses smartFactors [ICRA14]
Kalman Filter Examples
- elaboratePoint2KalmanFilter: simple linear Kalman filter on a moving 2D point, but done using factor graphs
- easyPoint2KalmanFilter: uses the generic templated Kalman filter class to do the same
- fullStateKalmanFilter: simple 1D example with a full-state filter
- errorStateKalmanFilter: simple 1D example of a moving target measured by a accelerometer, incl. drift-rate bias
2D Pose SLAM
- LocalizationExample.cpp: modeling robot motion
- LocalizationExample2.cpp: example with GPS like measurements
- Pose2SLAMExample: A 2D Pose SLAM example using the predefined typedefs in gtsam/slam/pose2SLAM.h
- Pose2SLAMExample_advanced: same, but uses an Optimizer object
- Pose2SLAMwSPCG: solve a simple 3 by 3 grid of Pose2 SLAM problem by using easy SPCG interface
Planar SLAM with landmarks
- PlanarSLAMExample: simple robotics example using the pre-built planar SLAM domain
- PlanarSLAMExample_selfcontained: simple robotics example with all typedefs internal to this script.
Visual SLAM
The directory vSLAMexample includes 2 simple examples using GTSAM:
- vSFMexample using visual SLAM for structure-from-motion (SFM)
- vISAMexample using visual SLAM and ISAM for incremental SLAM updates
See the separate README file there.
##Undirected Graphical Models (UGM) The best representation for a Markov Random Field is a factor graph :-) This is illustrated with some discrete examples from the UGM MATLAB toolbox, which can be found at http://www.di.ens.fr/~mschmidt/Software/UGM
##Building and Running To build, cd into the directory and do:
mkdir build
cd build
cmake ..
For each .cpp file in this directory two make targets are created, one to build the executable, and one to build and run it. For example, the file CameraResectioning.cpp
contains simple example to resection a camera from 4 known points. You can build it using
make CameraResectioning
or build and run it immediately with
make CameraResectioning.run
which should output:
Final result:
Values with 1 values:
Value x1: R:
[
1, 0.0, 0.0,
0.0, -1, 0.0,
0.0, 0.0, -1,
];
t: [0, 0, 2]';
References
- [TRO08]: iSAM: Incremental Smoothing and Mapping, Michael Kaess, Michael Kaess, Ananth Ranganathan, and Frank Dellaert, IEEE Transactions on Robotics, 2008
- [IJRR12]: iSAM2: Incremental Smoothing and Mapping Using the Bayes Tree, Michael Kaess, Hordur Johannsson, Richard Roberts, Viorela Ila, John Leonard, and Frank Dellaert, International Journal of Robotics Research, 2012
- [ICRA14]: Eliminating Conditionally Independent Sets in Factor Graphs: A Unifying Perspective based on Smart Factors, Luca Carlone, Zsolt Kira, Chris Beall, Vadim Indelman, and Frank Dellaert, IEEE International Conference on Robotics and Automation (ICRA), 2014