gtsam_points
Loading...
Searching...
No Matches
pose3_calib_factor.hpp
1// SPDX-License-Identifier: MIT
2// Copyright (c) 2021 Kenji Koide (k.koide@aist.go.jp)
3
4#pragma once
5
6#include <gtsam/geometry/Pose3.h>
7#include <gtsam/nonlinear/NonlinearFactor.h>
8#include <gtsam_points/util/gtsam_migration.hpp>
9
10namespace gtsam_points {
11
15class Pose3CalibFactor : public gtsam::NoiseModelFactor3<gtsam::Pose3, gtsam::Pose3, gtsam::Pose3> {
16public:
17 Pose3CalibFactor(gtsam::Key xi, gtsam::Key xj, gtsam::Key Tij, const gtsam::SharedNoiseModel& noise_model)
18 : gtsam::NoiseModelFactor3<gtsam::Pose3, gtsam::Pose3, gtsam::Pose3>(noise_model, xi, xj, Tij) {}
19
20 virtual ~Pose3CalibFactor() override {}
21
22 virtual void print(const std::string& s = "", const gtsam::KeyFormatter& keyFormatter = gtsam::DefaultKeyFormatter) const override {
23 std::cout << s << "Pose3CalibFactor";
24 std::cout << "(" << keyFormatter(this->keys()[0]) << ", " << keyFormatter(this->keys()[1]) << ", " << keyFormatter(this->keys()[2]) << ")"
25 << std::endl;
26 }
27
28public:
29 virtual gtsam::Vector evaluateError(
30 const gtsam::Pose3& xi,
31 const gtsam::Pose3& xj,
32 const gtsam::Pose3& Tij,
33 OptionalMatrixType H_xi = NoneValue,
34 OptionalMatrixType H_xj = NoneValue,
35 OptionalMatrixType H_Tij = NoneValue) const override {
36 //
37 if (H_xi && H_xj && H_Tij) {
38 const gtsam::Pose3 delta = xi.between(xj); // (xi^-1 * xj)
39 const gtsam::Pose3 error = delta.between(Tij); // (xj_inv * xi) * Tij;
40 return gtsam::Pose3::Logmap(error);
41 }
42
43 gtsam::Matrix6 H_delta_i;
44 gtsam::Matrix6 H_delta_j;
45 gtsam::Pose3 delta = xi.between(xj, H_delta_i, H_delta_j);
46
47 gtsam::Matrix6 H_error_delta;
48 gtsam::Matrix6 H_error_Tij;
49 gtsam::Pose3 error = delta.between(Tij, H_error_delta, H_error_Tij);
50
51 gtsam::Matrix6 H_log_error;
52 gtsam::Vector6 log = gtsam::Pose3::Logmap(error, H_log_error);
53
54 (*H_xi) = H_log_error * H_error_delta * H_delta_i;
55 (*H_xj) = H_log_error * H_error_delta * H_delta_j;
56 (*H_Tij) = H_log_error * H_error_Tij;
57
58 return log;
59 }
60};
61
62} // namespace gtsam_points
Factor(xi, xj, Tij) that evaluates (xj_inv * xi) * Tij.
Definition pose3_calib_factor.hpp:15