diff --git a/examples/Makefile.am b/examples/Makefile.am new file mode 100644 index 000000000..53ead268e --- /dev/null +++ b/examples/Makefile.am @@ -0,0 +1,31 @@ +#---------------------------------------------------------------------------------------------------- +# GTSAM Examples +#---------------------------------------------------------------------------------------------------- + +# use nostdinc to turn off -I. and -I.., we do not need them because +# header files are qualified so they can be included in external projects. +AUTOMAKE_OPTIONS = nostdinc + +headers = +sources = +check_PROGRAMS = +noinst_PROGRAMS = + +# Examples +noinst_PROGRAMS = SimpleRotation # Optimizes a single nonlinear rotation variable + +#---------------------------------------------------------------------------------------------------- +# rules to build local programs +#---------------------------------------------------------------------------------------------------- +AM_LDFLAGS = $(BOOST_LDFLAGS) +LDADD = ../libgtsam.la +AM_DEFAULT_SOURCE_EXT = .cpp +if USE_LDL +LDADD += libldl.la +endif + +# rule to run an executable +%.run: % $(LDADD) + ./$^ + +#---------------------------------------------------------------------------------------------------- diff --git a/examples/SimpleRotation.cpp b/examples/SimpleRotation.cpp new file mode 100644 index 000000000..983d63e10 --- /dev/null +++ b/examples/SimpleRotation.cpp @@ -0,0 +1,63 @@ +/* + * SimpleRotation.cpp + * + * This is a super-simple example of optimizing a single rotation according to a single prior + * yet it is quite painful (took 1.5 hours to code from scratch) and is overly complex + * An example like this should be very easy to do, so let's work at it. + * + * Created on: Jul 1, 2010 + * @Author: Frank Dellaert + * @Author: Alex Cunningham + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * TODO: make factors independent of Config + * TODO: get rid of excessive shared pointer stuff: mostly gone + * TODO: make toplevel documentation + * TODO: investigate whether we can just use ints as keys + */ + +using namespace std; +using namespace gtsam; + +typedef TypedSymbol Key; +typedef LieConfig Config; +typedef NonlinearFactorGraph Graph; +typedef Factorization Solver; +typedef NonlinearOptimizer Optimizer; + +const double degree = M_PI / 180; + +int main() { + + // optimize a unary factor on rotation 1 + + // Create a factor + Rot2 prior1 = Rot2::fromAngle(30 * degree); + SharedDiagonal model1 = noiseModel::Isotropic::Sigma(1, 1 * degree); + Key key1(1); + PriorFactor factor1(key1, prior1, model1); + + // Create a factor graph + Graph graph; + graph.add(factor1); + + // and an initial estimate + Config initialEstimate; + initialEstimate.insert(1, Rot2::fromAngle(20 * degree)); + + // create an ordering + Optimizer::shared_config result = Optimizer::optimizeLM(graph, initialEstimate, Optimizer::LAMBDA); + GTSAM_PRINT(*result); + + return 0; +}