mirror of
https://github.com/ceres-solver/ceres-solver.git
synced 2026-08-31 01:20:38 +08:00
Variety of changes to documentation and example code.
1. Update version history. 2. Minor changes to the tutorial to reflect the bounds constrained problem. 3. Added static factory methods to the SnavelyReprojectionError. 4. Removed relative gradient tolerance from types.h as it is not true anymore. Change-Id: I8de386e5278a008c84ef2d3290d2c4351417a9f1
This commit is contained in:
+22
-16
@@ -7,17 +7,21 @@
|
||||
========
|
||||
Tutorial
|
||||
========
|
||||
Ceres solves robustified non-linear least squares problems of the form
|
||||
|
||||
.. math:: \frac{1}{2}\sum_{i} \rho_i\left(\left\|f_i\left(x_{i_1}, ... ,x_{i_k}\right)\right\|^2\right).
|
||||
:label: ceresproblem
|
||||
Ceres solves robustified non-linear bounds constrained least squares
|
||||
problems of the form
|
||||
|
||||
.. math:: :label: ceresproblem
|
||||
|
||||
\min_{\mathbf{x}} &\quad \frac{1}{2}\sum_{i} \rho_i\left(\left\|f_i\left(x_{i_1}, ... ,x_{i_k}\right)\right\|^2\right) \\
|
||||
\text{s.t.} &\quad l_j \le x_j \le u_j
|
||||
|
||||
Problems of this form comes up in a broad range of areas across
|
||||
science and engineering - from `fitting curves`_ in statistics, to
|
||||
constructing `3D models from photographs`_ in computer vision.
|
||||
|
||||
.. _fitting curves: http://en.wikipedia.org/wiki/Nonlinear_regression
|
||||
.. _3D model from photographs: http://en.wikipedia.org/wiki/Bundle_adjustment
|
||||
.. _3D models from photographs: http://en.wikipedia.org/wiki/Bundle_adjustment
|
||||
|
||||
In this chapter we will learn how to solve :eq:`ceresproblem` using
|
||||
Ceres Solver. Full working code for all the examples described in this
|
||||
@@ -34,13 +38,16 @@ problems small groups of scalars occur together. For example the three
|
||||
components of a translation vector and the four components of the
|
||||
quaternion that define the pose of a camera. We refer to such a group
|
||||
of small scalars as a ``ParameterBlock``. Of course a
|
||||
``ParameterBlock`` can just be a single parameter.
|
||||
``ParameterBlock`` can just be a single parameter. :math:`l_j` and
|
||||
:math:`u_j` are bounds on the parameter block :math:`x_j`.
|
||||
|
||||
:math:`\rho_i` is a :class:`LossFunction`. A :class:`LossFunction` is
|
||||
a scalar function that is used to reduce the influence of outliers on
|
||||
the solution of non-linear least squares problems. As a special case,
|
||||
when :math:`\rho_i(x) = x`, i.e., the identity function, we get the
|
||||
more familiar `non-linear least squares problem
|
||||
the solution of non-linear least squares problems.
|
||||
|
||||
As a special case, when :math:`\rho_i(x) = x`, i.e., the identity
|
||||
function, and :math:`l_j = -\infty` and :math:`u_j = \infty` we get
|
||||
the more familiar `non-linear least squares problem
|
||||
<http://en.wikipedia.org/wiki/Non-linear_least_squares>`_.
|
||||
|
||||
.. math:: \frac{1}{2}\sum_{i} \left\|f_i\left(x_{i_1}, ... ,x_{i_k}\right)\right\|^2.
|
||||
@@ -75,10 +82,10 @@ function :math:`f(x) = 10 - x`:
|
||||
|
||||
The important thing to note here is that ``operator()`` is a templated
|
||||
method, which assumes that all its inputs and outputs are of some type
|
||||
``T``. The reason for using templates here is because Ceres will call
|
||||
``CostFunctor::operator<T>()``, with ``T=double`` when just the
|
||||
residual is needed, and with a special type ``T=Jet`` when the
|
||||
Jacobians are needed. In :ref:`section-derivatives` we discuss the
|
||||
``T``. The use of templating here allows Ceres to call
|
||||
``CostFunctor::operator<T>()``, with ``T=double`` when just the value
|
||||
of the residual is needed, and with a special type ``T=Jet`` when the
|
||||
Jacobians are needed. In :ref:`section-derivatives` we will discuss the
|
||||
various ways of supplying derivatives to Ceres in more detail.
|
||||
|
||||
Once we have a way of computing the residual function, it is now time
|
||||
@@ -642,10 +649,9 @@ as follows:
|
||||
ceres::Problem problem;
|
||||
for (int i = 0; i < bal_problem.num_observations(); ++i) {
|
||||
ceres::CostFunction* cost_function =
|
||||
new ceres::AutoDiffCostFunction<SnavelyReprojectionError, 2, 9, 3>(
|
||||
new SnavelyReprojectionError(
|
||||
bal_problem.observations()[2 * i + 0],
|
||||
bal_problem.observations()[2 * i + 1]));
|
||||
SnavelyReprojectionError::Create(
|
||||
bal_problem.observations()[2 * i + 0],
|
||||
bal_problem.observations()[2 * i + 1]);
|
||||
problem.AddResidualBlock(cost_function,
|
||||
NULL /* squared loss */,
|
||||
bal_problem.mutable_camera_for_observation(i),
|
||||
|
||||
Reference in New Issue
Block a user