Hello,
I would like to use Ceres as the optimization backend for SfM that's a small part of a larger VIO engine that I'm building.
Throughout the engine I am using SE3 objects as camera poses that offer suitable log() and exp() functions.
Now, it would be relatively straightforward to build suitable classes derived from ceres::Manifold to make my pose parameterization known to Ceres, were it not for two items:
1. Ceres requires me to implement Plus() and Minus() (ok -- can do that!) as well as PlusJacobian() and MinusJacobian() --> what is this?
I'm also not sure why the Jacobian functions are necessary (for Autodiff? As long as I can provide Jacobians through my CostFunction objects, wouldn't that suffice?).
TBH I'm not even sure what
PlusJacobian() and MinusJacobian()
are exactly.
From the header comment of PlusJacobian():
// jacobian is a row-major AmbientSize() x TangentSize() matrix.
OK, TangentSize() must be is 6 as SE3 has 6 DOF.
What is AmbientSize() though? 3 (3d-space)? 6 (because why not)? 12 (full rotation matrix + translation vector)?
What are we differentiating here?
The matrix elements vs. a delta in tangent space?
The minimal 6-dof log representation vs. a
delta
in tangent space?
I can provide the generator matrices for SE(3) if that helps...
2. I could, in theory, make my life easy and just use the Manifold implementations of the Sophus library (
https://github.com/strasdat/Sophus/blob/main/sophus/ceres_manifold.hpp) however the problem there is that they are using a right-multiply convention throughout the library (i.e. BoxPlus = T * exp(x)) whereas I'm using a left-multiply convention throughout my engine (BoxPlus = exp(x) * T) and I'm not sure how a change from right-multiply to left-multiply would affect the implementations of
PlusJacobian() and MinusJacobian().
Hope someone can help me here. Seems like an issue that might have come up before?
Thanks