mirror of
https://github.com/ceres-solver/ceres-solver.git
synced 2026-08-29 16:40:38 +08:00
018bb49e80
Change-Id: I37c1256417240bf7decec1f756df8a8402f5c586
84 lines
3.6 KiB
ReStructuredText
84 lines
3.6 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:`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::
|
|
|
|
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?
|
|
======================================================================================================
|
|
|
|
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:`SubsetManifold`.
|