| .. _chapter-building: |
| |
| ======== |
| Building |
| ======== |
| |
| Ceres source code and documentation are hosted at |
| http://code.google.com/p/ceres-solver/ . |
| |
| .. _section-dependencies: |
| |
| Dependencies |
| ============ |
| |
| Ceres relies on a number of open source libraries, some of which are |
| optional. For details on customizing the build process, see |
| :ref:`section-customizing` . |
| |
| 1. `CMake <http://www.cmake.org>`_ is a cross platform build |
| system. Ceres needs a relatively recent version of CMake (version |
| 2.8.0 or better). |
| |
| 2. `eigen3 <http://eigen.tuxfamily.org/index.php?title=Main_Page>`_ is |
| used for doing all the low level matrix and linear algebra operations. |
| |
| 3. `google-glog <http://http://code.google.com/p/google-glog>`_ is |
| used for error checking and logging. Ceres needs glog version 0.3.1 or |
| later. Version 0.3 (which ships with Fedora 16) has a namespace bug |
| which prevents Ceres from building. |
| |
| 4. `gflags <http://code.google.com/p/gflags>`_ is a library for |
| processing command line flags. It is used by some of the examples and |
| tests. While it is not strictly necessary to build the library, we |
| strongly recommend building the library with gflags. |
| |
| |
| 5. `SuiteSparse |
| <http://www.cise.ufl.edu/research/sparse/SuiteSparse/>`_ is used for |
| sparse matrix analysis, ordering and factorization. In particular |
| Ceres uses the AMD, COLAMD and CHOLMOD libraries. This is an optional |
| dependency. |
| |
| 6. `CXSparse <http://www.cise.ufl.edu/research/sparse/CXSparse/>`_ is |
| used for sparse matrix analysis, ordering and factorization. While it |
| is similar to SuiteSparse in scope, its performance is a bit worse but |
| is a much simpler library to build and does not have any other |
| dependencies. This is an optional dependency. |
| |
| 7. `BLAS <http://www.netlib.org/blas/>`_ and `LAPACK |
| <http://www.netlib.org/lapack/>`_ routines are needed by |
| SuiteSparse. We recommend either `GotoBlas2 |
| <http://www.tacc.utexas.edu/tacc- projects/gotoblas2>`_ or `ATLAS |
| <http://math- atlas.sourceforge.net/>`_ , both of which ship with BLAS |
| and LAPACK routines. |
| |
| 8. `protobuf <http://code.google.com/p/protobuf/>`_ is used for |
| serializing and deserializing linear least squares problems to |
| disk. This is useful for debugging and testing. It is an optional |
| depdendency and without it some of the tests will be disabled. |
| |
| .. _section-linux: |
| |
| Building on Linux |
| ================= |
| We will use `Ubuntu <http://www.ubuntu.com>`_ as our example platform. |
| |
| #. ``CMake`` |
| |
| .. code-block:: bash |
| |
| sudo apt-get install cmake |
| |
| #. ``gflags`` can either be installed from source via the ``autoconf`` |
| invocation |
| |
| .. code-block:: bash |
| |
| tar -xvzf gflags-2.0.tar.gz |
| cd gflags-2.0 |
| ./configure --prefix=/usr/local |
| make |
| sudo make install. |
| |
| |
| or via the ``deb`` or ``rpm`` packages available on the ``gflags`` website. |
| |
| #. ``google-glog`` must be configured to use the previously installed |
| ``gflags``, rather than the stripped down version that is bundled |
| with ``google-glog``. Assuming you have it installed in ``/usr/local`` the |
| following ``autoconf`` invocation installs it. |
| |
| .. code-block:: bash |
| |
| tar -xvzf glog-0.3.2.tar.gz |
| cd glog-0.3.2 |
| ./configure --with-gflags=/usr/local/ |
| make |
| sudo make install |
| |
| #. ``Eigen`` |
| |
| .. code-block:: bash |
| |
| sudo apt-get install libeigen3-dev |
| |
| #. ``SuiteSparse`` and ``CXSparse`` |
| |
| .. code-block:: bash |
| |
| sudo apt-get install libsuitesparse-dev |
| |
| This should automatically bring in the necessary ``BLAS`` and |
| ``LAPACK`` dependencies. By co-incidence on Ubuntu, this also |
| installs ``CXSparse``. |
| |
| #. ``protobuf`` |
| |
| .. code-block:: bash |
| |
| sudo apt-get install libprotobuf-dev |
| |
| |
| We are now ready to build and test Ceres. Note that ``CMake`` requires |
| the exact path to the ``libglog.a`` and ``libgflag.a``. |
| |
| .. code-block:: bash |
| |
| tar zxf ceres-solver-1.2.1.tar.gz |
| mkdir ceres-bin |
| cd ceres-bin |
| cmake ../ceres-solver-1.2.1 |
| make -j3 |
| make test |
| |
| You can also try running the command line bundling application with one of the |
| included problems, which comes from the University of Washington's BAL |
| dataset [Agarwal]_. |
| |
| .. code-block:: bash |
| |
| bin/simple_bundle_adjuster \ |
| ../ceres-solver-1.2.1/data/problem-16-22106-pre.txt \ |
| |
| This runs Ceres for a maximum of 10 iterations using the |
| ``DENSE_SCHUR`` linear solver. The output should look something like |
| this. |
| |
| .. code-block:: bash |
| |
| 0: f: 4.185660e+06 d: 0.00e+00 g: 1.09e+08 h: 0.00e+00 rho: 0.00e+00 mu: 1.00e+04 li: 0 it: 1.16e-01 tt: 3.39e-01 |
| 1: f: 1.062590e+05 d: 4.08e+06 g: 8.99e+06 h: 5.36e+02 rho: 9.82e-01 mu: 3.00e+04 li: 1 it: 3.90e-01 tt: 7.29e-01 |
| 2: f: 4.992817e+04 d: 5.63e+04 g: 8.32e+06 h: 3.19e+02 rho: 6.52e-01 mu: 3.09e+04 li: 1 it: 3.52e-01 tt: 1.08e+00 |
| 3: f: 1.899774e+04 d: 3.09e+04 g: 1.60e+06 h: 1.24e+02 rho: 9.77e-01 mu: 9.26e+04 li: 1 it: 3.60e-01 tt: 1.44e+00 |
| 4: f: 1.808729e+04 d: 9.10e+02 g: 3.97e+05 h: 6.39e+01 rho: 9.51e-01 mu: 2.78e+05 li: 1 it: 3.62e-01 tt: 1.80e+00 |
| 5: f: 1.803399e+04 d: 5.33e+01 g: 1.48e+04 h: 1.23e+01 rho: 9.99e-01 mu: 8.33e+05 li: 1 it: 3.54e-01 tt: 2.16e+00 |
| 6: f: 1.803390e+04 d: 9.02e-02 g: 6.35e+01 h: 8.00e-01 rho: 1.00e+00 mu: 2.50e+06 li: 1 it: 3.59e-01 tt: 2.52e+00 |
| |
| Ceres Solver Report |
| ------------------- |
| Original Reduced |
| Parameter blocks 22122 22122 |
| Parameters 66462 66462 |
| Residual blocks 83718 83718 |
| Residual 167436 167436 |
| Trust Region Strategy LEVENBERG_MARQUARDT |
| |
| Given Used |
| Linear solver DENSE_SCHUR DENSE_SCHUR |
| Preconditioner N/A N/A |
| Threads: 1 1 |
| Linear solver threads 1 1 |
| Linear solver ordering AUTOMATIC 22106,16 |
| |
| Cost: |
| Initial 4.185660e+06 |
| Final 1.803390e+04 |
| Change 4.167626e+06 |
| |
| Number of iterations: |
| Successful 6 |
| Unsuccessful 0 |
| Total 6 |
| |
| Time (in seconds): |
| Preprocessor 2.229e-01 |
| |
| Evaluator::Residuals 7.438e-02 |
| Evaluator::Jacobians 6.790e-01 |
| Linear Solver 1.681e+00 |
| Minimizer 2.547e+00 |
| |
| Postprocessor 1.920e-02 |
| Total 2.823e+00 |
| |
| Termination: FUNCTION_TOLERANCE |
| |
| .. section-osx: |
| |
| Building on Mac OS X |
| ==================== |
| |
| On OS X, we recommend using the `homebrew |
| <http://mxcl.github.com/homebrew/>`_ package manager. |
| |
| |
| #. ``CMake`` |
| |
| .. code-block:: bash |
| |
| brew install cmake |
| |
| #. ``google-glog`` and ``gflags`` |
| |
| Installing ``google-glog`` takes also brings in ``gflags`` as a dependency. |
| |
| .. code-block:: bash |
| |
| brew install glog |
| |
| #. ``Eigen3`` |
| |
| .. code-block:: bash |
| |
| brew install eigen |
| |
| #. ``SuiteSparse`` and ``CXSparse`` |
| |
| .. code-block:: bash |
| |
| brew install suite-sparse |
| |
| #. ``protobuf`` |
| |
| .. code-block:: bash |
| |
| brew install protobuf |
| |
| |
| We are now ready to build and test Ceres. |
| |
| .. code-block:: bash |
| |
| tar zxf ceres-solver-1.2.1.tar.gz |
| mkdir ceres-bin |
| cd ceres-bin |
| cmake ../ceres-solver-1.2.1 |
| make -j3 |
| make test |
| |
| |
| Like the Linux build, you should now be able to run |
| ``bin/simple_bundle_adjuster``. |
| |
| .. _section-windows: |
| |
| Building on Windows with Visual Studio |
| ====================================== |
| |
| On Windows, we support building with Visual Studio 2010 or newer. Note |
| that the Windows port is less featureful and less tested than the |
| Linux or Mac OS X versions due to the unavaliability of SuiteSparse |
| and ``CXSparse``. Building is also more involved since there is no |
| automated way to install the dependencies. |
| |
| #. Make a toplevel directory for deps & build & src somewhere: ``ceres/`` |
| #. Get dependencies; unpack them as subdirectories in ``ceres/`` |
| (``ceres/eigen``, ``ceres/glog``, etc) |
| |
| #. ``Eigen`` 3.1 (needed on Windows; 3.0.x will not work). There is |
| no need to build anything; just unpack the source tarball. |
| |
| #. ``google-glog`` Open up the Visual Studio solution and build it. |
| #. ``gflags`` Open up the Visual Studio solution and build it. |
| |
| #. Unpack the Ceres tarball into ``ceres``. For the tarball, you |
| should get a directory inside ``ceres`` similar to |
| ``ceres-solver-1.3.0``. Alternately, checkout Ceres via ``git`` to |
| get ``ceres-solver.git`` inside ``ceres``. |
| |
| #. Install ``CMake``, |
| |
| #. Make a dir ``ceres/ceres-bin`` (for an out-of-tree build) |
| |
| #. Run ``CMake``; select the ``ceres-solver-X.Y.Z`` or |
| ``ceres-solver.git`` directory for the CMake file. Then select the |
| ``ceres-bin`` for the build dir. |
| |
| #. Try running "Configure". It won't work. It'll show a bunch of options. |
| You'll need to set: |
| |
| #. ``GLOG_INCLUDE`` |
| #. ``GLOG_LIB`` |
| #. ``GFLAGS_LIB`` |
| #. ``GFLAGS_INCLUDE`` |
| |
| to the appropriate place where you unpacked/built them. |
| |
| #. You may have to tweak some more settings to generate a MSVC |
| project. After each adjustment, try pressing Configure & Generate |
| until it generates successfully. |
| |
| #. Open the solution and build it in MSVC |
| |
| |
| To run the tests, select the ``RUN_TESTS`` target and hit **Build |
| RUN_TESTS** from the build menu. |
| |
| Like the Linux build, you should now be able to run ``bin/simple_bundle_adjuster``. |
| |
| Notes: |
| |
| #. The default build is Debug; consider switching it to release mode. |
| #. Currently ``system_test`` is not working properly. |
| #. Building Ceres as a DLL is not supported; patches welcome. |
| #. CMake puts the resulting test binaries in ``ceres-bin/examples/Debug`` |
| by default. |
| #. The solvers supported on Windows are ``DENSE_QR``, ``DENSE_SCHUR``, |
| ``CGNR``, and ``ITERATIVE_SCHUR``. |
| #. We're looking for someone to work with upstream ``SuiteSparse`` to |
| port their build system to something sane like ``CMake``, and get a |
| supported Windows port. |
| |
| |
| .. _section-android: |
| |
| Building on Android |
| =================== |
| |
| |
| Download the ``Android NDK``. Run ``ndk-build`` from inside the |
| ``jni`` directory. Use the ``libceres.a`` that gets created. |
| |
| .. _section-customizing: |
| |
| Customizing the build |
| ===================== |
| |
| It is possible to reduce the libraries needed to build Ceres and |
| customize the build process by passing appropriate flags to |
| ``CMake``. Use these flags only if you really know what you are doing. |
| |
| #. ``-DPROTOBUF=OFF`` : ``protobuf`` is a big dependency and if you do not |
| care for the tests that depend on it and the logging support it |
| enables, you can use this flag to turn it off. |
| |
| #. ``-DSUITESPARSE=OFF`` : By default, Ceres will link to |
| ``SuiteSparse`` if all its dependencies are present. Use this flag |
| to buils Ceres without ``SuiteSparse``. This will also disable |
| dependency checking for ``LAPACK`` and ``BLAS`` This saves on |
| binary size, but the resulting version of Ceres is not suited to |
| large scale problems due to the lack of a sparse Cholesky solver. |
| This will reduce Ceres' dependencies down to ``Eigen``, ``gflags`` |
| and ``google-glog``. |
| |
| #. ``-DCXSPARSE=OFF`` : By default, Ceres will link to ``CXSparse`` if all |
| its dependencies are present. Use this flag to buils Ceres without |
| ``CXSparse``. This saves on binary size, but the resulting version |
| of Ceres is not suited to large scale problems due to the lack of a |
| sparse Cholesky solver. This will reduce Ceres' dependencies down |
| to ``Eigen``, ``gflags`` and ``google-glog``. |
| |
| #. ``-DGFLAGS=OFF`` : Use this flag to build Ceres without |
| ``gflags``. This will also prevent some of the example code from |
| building. |
| |
| #. ``-DSCHUR_SPECIALIZATIONS=OFF`` : If you are concerned about binary |
| size/compilation time over some small (10-20%) performance gains in |
| the ``SPARSE_SCHUR`` solver, you can disable some of the template |
| specializations by using this flag. |
| |
| #. ``-DOPENMP=OFF`` : On certain platforms like Android, |
| multithreading with ``OpenMP`` is not supported. Use this flag to |
| disable multithreading. |
| |