mirror of
https://github.com/ceres-solver/ceres-solver.git
synced 2026-08-29 08:34:37 +08:00
Use subsections instead of an enumeration for FAQs
Change-Id: I37c1256417240bf7decec1f756df8a8402f5c586
This commit is contained in:
@@ -8,81 +8,76 @@
|
||||
Modeling
|
||||
========
|
||||
|
||||
#. Use analytical/automatic derivatives.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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`.
|
||||
To this end, Ceres has extensive support for mixing analytic, automatic and
|
||||
numeric differentiation. See :class:`CostFunctionToFunctor`.
|
||||
|
||||
#. When using Quaternions, consider using :class:`QuaternionManifold`.
|
||||
When using Quaternions, consider using :class:`QuaternionManifold`
|
||||
==================================================================
|
||||
|
||||
`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:`QuaternionManifold`.
|
||||
`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:`QuaternionManifold`.
|
||||
|
||||
.. NOTE::
|
||||
.. 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:`EigenQuaternionManifold`.
|
||||
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:`EigenQuaternionManifold`.
|
||||
|
||||
|
||||
#. How do I solve problems with general linear & non-linear
|
||||
**inequality** constraints with Ceres Solver?
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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?
|
||||
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.
|
||||
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.
|
||||
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?
|
||||
How do I set one or more components of a parameter block constant?
|
||||
==================================================================
|
||||
|
||||
Using :class:`SubsetManifold`.
|
||||
Using :class:`SubsetManifold`.
|
||||
|
||||
Reference in New Issue
Block a user