mirror of
https://github.com/ceres-solver/ceres-solver.git
synced 2026-08-30 00:50:37 +08:00
7ef4a12218
Change-Id: I0e6c7d2850a33d03aa629579f049ad44a7618621
89 lines
3.4 KiB
ReStructuredText
89 lines
3.4 KiB
ReStructuredText
.. _chapter-modeling_faqs:
|
|
|
|
.. default-domain:: cpp
|
|
|
|
.. cpp:namespace:: ceres
|
|
|
|
========
|
|
Modeling
|
|
========
|
|
|
|
#. Use analytical/automatic derivatives.
|
|
|
|
This is the single most important piece of advice we can give to
|
|
you. It is tempting to take the easy way out and use numeric
|
|
differentiation. This is a bad idea. Numeric differentiation is
|
|
slow, ill-behaved, hard to get right, and results in poor
|
|
convergence behaviour.
|
|
|
|
Ceres allows the user to define templated functors which will
|
|
be automatically differentiated. For most situations this is enough
|
|
and we recommend using this facility. In some cases the derivatives
|
|
are simple enough or the performance considerations are such that
|
|
the overhead of automatic differentiation is too much. In such
|
|
cases, analytic derivatives are recommended.
|
|
|
|
The use of numerical derivatives should be a measure of last
|
|
resort, where it is simply not possible to write a templated
|
|
implementation of the cost function.
|
|
|
|
In many cases it is not possible to do analytic or automatic
|
|
differentiation of the entire cost function, but it is generally
|
|
the case that it is possible to decompose the cost function into
|
|
parts that need to be numerically differentiated and parts that can
|
|
be automatically or analytically differentiated.
|
|
|
|
To this end, Ceres has extensive support for mixing analytic,
|
|
automatic and numeric differentiation. See
|
|
:class:`CostFunctionToFunctor`.
|
|
|
|
#. When using Quaternions, consider using :class:`QuaternionParameterization`.
|
|
|
|
`Quaternions <https://en.wikipedia.org/wiki/Quaternion>`_ are a
|
|
four dimensional parameterization of the space of three dimensional
|
|
rotations :math:`SO(3)`. However, the :math:`SO(3)` is a three
|
|
dimensional set, and so is the tangent space of a
|
|
Quaternion. Therefore, it is sometimes (not always) beneficial to
|
|
associate a local parameterization with parameter blocks
|
|
representing a Quaternion. Assuming that the order of entries in
|
|
your parameter block is :math:`w,x,y,z`, you can use
|
|
:class:`QuaternionParameterization`.
|
|
|
|
.. NOTE::
|
|
|
|
If you are using `Eigen's Quaternion
|
|
<http://eigen.tuxfamily.org/dox/classEigen_1_1Quaternion.html>`_
|
|
object, whose layout is :math:`x,y,z,w`, then you should use
|
|
:class:`EigenQuaternionParameterization`.
|
|
|
|
|
|
#. How do I solve problems with general linear & non-linear
|
|
**inequality** constraints with Ceres Solver?
|
|
|
|
Currently, Ceres Solver only supports upper and lower bounds
|
|
constraints on the parameter blocks.
|
|
|
|
A crude way of dealing with inequality constraints is have one or
|
|
more of your cost functions check if the inequalities you are
|
|
interested in are satisfied, and if not return false instead of
|
|
true. This will prevent the solver from ever stepping into an
|
|
infeasible region.
|
|
|
|
This requires that the starting point for the optimization be a
|
|
feasible point. You also risk pre-mature convergence using this
|
|
method.
|
|
|
|
#. How do I solve problems with general linear & non-linear **equality**
|
|
constraints with Ceres Solver?
|
|
|
|
There is no built in support in ceres for solving problems with
|
|
equality constraints. Currently, Ceres Solver only supports upper
|
|
and lower bounds constraints on the parameter blocks.
|
|
|
|
The trick described above for dealing with inequality
|
|
constraints will **not** work for equality constraints.
|
|
|
|
#. How do I set one or more components of a parameter block constant?
|
|
|
|
Using :class:`SubsetParameterization`.
|