Ceres can be built without linking against a sparse linear algebra library
such as SuiteSparse or Eigen-sparse. This can happen if the user does not
have all the dependencies, which normally get installed when following
the Cartographer installation guide. In this case, Cartographer will
work, but without loop closures, because Ceres is not working fast enough
(the loop closure optimization without a sparse linear algebra library
is a few orders of magnitude slower). Another bad side effect of this is
that Cartographer will hang when finalizing the trajectory or on exit,
because all loop closing optimizations will be waiting in a queue which
can take hours to process.
When Ceres is regularly built against a sparse linear algebra library, as it
is supposed to be, it declares a component named SparseLinearAlgebraLibrary.
Because normal functioning of Cartographer seemingly depends on this being
present, it is introduced here in Cartographer as a required Ceres component
dependency.
Colorless points are considered to be black. Creating assets with
intensities will give now brighter X-Rays. I plan to fix this by adding
intensities besides colors into PointBatch and having a PointsProcessor
that converts intensities into colors.
Removes the loss function for intra-submap constraints in 3D SLAM,
as it is already done in 2D. Also removes a duplicate call to the
solver in 2D, and code cleanup.
The Boost include directory was not correctly added, and the
headers of the project where always looked up at the source or
build directory, not where they are installed.
Currently, on xenial/kinetic the transitive dependencies on
libcartographer and its dependencies are not duplicated after
each library that depends on it in the linker command.
Add dependencies via target_link_libraries as PUBLIC.
It seems the new behavior which defaults to PRIVATE was
used implicitly causing transitive dependencies to be
omitted.
When processing offline data determining which trajectory needs more
data before processing can continue is surprisingly tricky. We thus
expose this information at the map builder to avoid duplicating this
logic.
In the multi-trajectory case, other trajectories should not influence which
data gets dropped. This is especially the case if all trajectories are
added before any of their data. In this case, data before the start of the
last trajectory was dropped.
Removes an optimization to improve the bounds computed
via the precomputation grid in 3D that takes the limited
search window into account.
This is to allow reusing the same precomputation grids
for full submap matches.
We drop as much data from each queue as possible without changing the
start time that would be determined if we only saw the dispatched
data, i.e. we retain one piece of data not beyond the common start time.
This makes the process idempotent.
The sensor collator now finds a common starting time for all sensor
data. For example, this prevents us from processing arbitrarily many IMU
packets before our first scan match and makes it possible to auto pause
and resume a trajectory in the event of sensor data interruption.