Skip to content


Switch branches/tags

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time
Max-Mixture is licensed under the BSD license.


I. Dependency:

max-mixture only depends on g2o. You should be fine if g2o compiles. 
the version of g2o we support is the current master branch at github/g2o
(not the svn version).


II. format for datasets:

The vertices remain unchanged 

EDGE_TYPE_MIXTURE va vb n EDGE_TAG w_1 edge_1 EDGE_TAG w_2 edge_2 ..
va, vb = vertices the edge currently connects. This will be constantly
            updated during each iteration.
n      = number of components this edge represents. If used only for the outlier
            rejection case n=2             
w_i    = weight used for ith edge
edge_i = standard g2o edge data of type = TYPE

III. Compiling:

we recommend the "out of core" build.

cd max-mixture
mkdir build 
cmake ..

NOTE: set environment variable "G2O_ROOT" in case find_package(G2O) fails


IV. Unimodal vs multi-modal:

Max-Mixture by formulation allows handling multi-modal edges.
It handles this by finding the most feasible mode/edge at every
iteration. Though simple to implement this changes the memory allocation
structure of the Jacobian at every iteration. 

1. Hence the solver.intialize() method must be called if multi-modal
formulation is used. Basically the user cannot call solve for more than
a single iteration since the underlying memory structure would change.
The compute error method for each mixture edge must be called (which updates the belief) before
building the structure. 

2. If using max-mixture only for outlier rejection the memory allocation
pattern does not change hence nothing needs to be done.


V. Datasets:

Few example datasets are available inside max-mixtures/datasets


VI Example:

~/g2o_viewer -typeslib path-to-max-mixture/lib/ dataset.g2o


VII Known issue:

"Cholesky Decomposition is invalid". When using the landmark edges the
cholesky solver may return invalid results. Though not thoroughly
examined a plausible explanation is the following: If all the edges for
a particular landmark are rejected (uses the scaled down information
                                    matrix) the final weight
for the landmark nodes is very very small and the hessian graph may
become "numerically" disconnected. This can also happen for non-landmark
pose graph cases if all edges (loop+odometry) are max-mixture edges.


VIII Bibtex:

    AUTHOR    = {Edwin Olson AND Pratik Agarwal}, 
    TITLE     = {Inference on networks of mixtures for robust robot mapping}, 
    BOOKTITLE = {Proceedings of Robotics: Science and Systems}, 
    YEAR      = {2012}, 
    ADDRESS   = {Sydney, Australia}, 
    MONTH     = {July} 

    author = "Pratik Agarwal and Edwin Olson and Wolfram Burgard",
    title = "Max-mixture - open source implementation with g2o",
    howpublished = "\url{}",
    year = {2012},



No description, website, or topics provided.






No releases published


No packages published