| .. _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`. |