16 template <
class TScalar,
int kDim>
20 static int const kDof = kDim;
25 using Tangent = Eigen::Vector<Scalar, kDof>;
26 using Params = Eigen::Vector<Scalar, kNumParams>;
27 using Point = Eigen::Vector<Scalar, kPointDim>;
36 template <
class TCompatibleScalar>
38 ScalarBinaryOpTraits<Scalar, TCompatibleScalar>::ReturnType;
40 template <
class TCompatibleScalar>
42 Eigen::Vector<ScalarReturn<TCompatibleScalar>,
kNumParams>;
44 template <
class TCompatibleScalar>
47 template <
class TCompatibleScalar>
54 return Eigen::Vector<Scalar, kDim>::Ones();
58 -> sophus::Expected<Success> {
59 static const Scalar kThr = kEpsilon<Scalar>;
61 if (!(scale_factors.array() > kThr).all()) {
63 "scale factors ({}) too close to zero.\n",
65 scale_factors.transpose(),
68 if (!(scale_factors.array() < 1.0 / kThr).all()) {
70 "inverse of scale factors ({}) too close to zero.\n",
72 scale_factors.transpose(),
75 return sophus::Expected<Success>{};
84 return log_scale_factors.array().exp();
89 return scale_factors.array().log();
93 -> Eigen::Matrix<Scalar, kAmbientDim, kAmbientDim> {
94 Eigen::Matrix<Scalar, kAmbientDim, kAmbientDim> mat;
96 for (
int i = 0; i <
kDof; ++i) {
97 mat.diagonal()[i] = scale_factors[i];
102 static auto vee(Eigen::Matrix<Scalar, kAmbientDim, kAmbientDim>
const& mat)
103 -> Eigen::Matrix<Scalar, kDof, 1> {
104 return mat.diagonal();
110 Eigen::Vector<Scalar, kDim> params;
111 for (
int i = 0; i <
kDof; ++i) {
112 params[i] = 1.0 / scale_factors[i];
117 template <
class TCompatibleScalar>
120 Eigen::Vector<TCompatibleScalar, kPointDim>
const& rhs_params)
122 return lhs_params.array() * rhs_params.array();
127 template <
class TCompatibleScalar>
129 Params const& scale_factors,
130 Eigen::Vector<TCompatibleScalar, kPointDim>
const& point)
132 return scale_factors.array() * point.array();
135 template <
class TCompatibleScalar>
137 Params const& scale_factors,
141 action(scale_factors, direction_vector.params()));
145 -> Eigen::Vector<Scalar, kAmbientDim> {
150 -> Eigen::Matrix<Scalar, kDof, kDof> {
151 return Eigen::Matrix<Scalar, kDof, kDof>::Identity();
157 -> Eigen::Matrix<Scalar, kPointDim, kAmbientDim> {
158 return hat(scale_factors);
162 -> Eigen::Matrix<Scalar, kAmbientDim, kAmbientDim> {
169 -> Eigen::Matrix<Scalar, kPointDim, kPointDim> {
171 Eigen::Matrix<Scalar, kPointDim, kPointDim> mat =
172 Eigen::Matrix<Scalar, kPointDim, kPointDim>::Identity();
173 for (
int i = 0; i <
kDof; ++i) {
175 if (abs(t) < kEpsilon<Scalar>) {
176 mat(i, i) = abs(1.0 - 2.0 * t + 1.5 * t * t);
178 mat(i, i) = abs((params[i] - 1.0) / tangent[i]);
185 -> Eigen::Matrix<Scalar, kPointDim, kPointDim> {
186 Eigen::Matrix<Scalar, kPointDim, kPointDim> mat =
187 Eigen::Matrix<Scalar, kPointDim, kPointDim>::Identity();
189 for (
int i = 0; i <
kDof; ++i) {
191 if (abs(t) < kEpsilon<Scalar>) {
192 mat(i, i) = abs(1.0 + 2.0 * t + 2.5 * t * t);
194 mat(i, i) = abs(tangent[i] / (params[i] - 1.0));
201 -> Eigen::Matrix<Scalar, kPointDim, kDof> {
206 -> Eigen::Matrix<Scalar, kPointDim, kDof> {
212 -> Eigen::Matrix<Scalar, kDof, kDof> {
213 return Eigen::Matrix<Scalar, kDof, kDof>::Zero();
217 -> Eigen::Matrix<Scalar, kNumParams, kDof> {
218 return Eigen::Matrix<Scalar, kNumParams, kDof>::Identity();
221 static auto dxExpXAt0() -> Eigen::Matrix<Scalar, kNumParams, kDof> {
222 return Eigen::Matrix<Scalar, kNumParams, kDof>::Identity();
226 -> Eigen::Matrix<Scalar, kPointDim, kDof> {
227 Eigen::Matrix<Scalar, kPointDim, kDof> j;
229 j.diagonal() = point;
234 -> Eigen::Matrix<Scalar, kNumParams, kDof> {
235 Eigen::Matrix<Scalar, kNumParams, kDof> j;
237 j.diagonal() = unit_quat;
242 -> Eigen::Matrix<Scalar, kDof, kNumParams> {
243 Eigen::Matrix<Scalar, kDof, kNumParams> j;
245 j.diagonal() = 1.0 / unit_quat.array();
253 return std::vector<Tangent>({
254 Tangent({std::exp(1.0), std::exp(1.0)}),
261 return std::vector<Tangent>({
276 return std::vector<Params>(
286 return std::vector<Params>(
297 return std::vector<Params>({
307 template <
class TScalar,
int kDim>
313 template <
class TScalar>
316 template <
class TScalar>