15class Pose3CalibFactor :
public gtsam::NoiseModelFactor3<gtsam::Pose3, gtsam::Pose3, gtsam::Pose3> {
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) {}
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]) <<
")"
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 {
37 if (H_xi && H_xj && H_Tij) {
38 const gtsam::Pose3 delta = xi.between(xj);
39 const gtsam::Pose3 error = delta.between(Tij);
40 return gtsam::Pose3::Logmap(error);
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);
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);
51 gtsam::Matrix6 H_log_error;
52 gtsam::Vector6 log = gtsam::Pose3::Logmap(error, H_log_error);
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;