31 #ifndef EXAMPLES_CERES_POSE_GRAPH_3D_ERROR_TERM_H_ 32 #define EXAMPLES_CERES_POSE_GRAPH_3D_ERROR_TERM_H_ 35 #include "ceres/autodiff_cost_function.h" 74 const Eigen::Matrix<double, 6, 6>& sqrt_information)
78 bool operator()(
const T*
const p_a_ptr,
const T*
const q_a_ptr,
79 const T*
const p_b_ptr,
const T*
const q_b_ptr,
80 T* residuals_ptr)
const {
81 Eigen::Map<const Eigen::Matrix<T, 3, 1> > p_a(p_a_ptr);
82 Eigen::Map<const Eigen::Quaternion<T> > q_a(q_a_ptr);
84 Eigen::Map<const Eigen::Matrix<T, 3, 1> > p_b(p_b_ptr);
85 Eigen::Map<const Eigen::Quaternion<T> > q_b(q_b_ptr);
88 Eigen::Quaternion<T> q_a_inverse = q_a.conjugate();
89 Eigen::Quaternion<T> q_ab_estimated = q_a_inverse * q_b;
92 Eigen::Matrix<T, 3, 1> p_ab_estimated = q_a_inverse * (p_b - p_a);
95 Eigen::Quaternion<T> delta_q =
101 Eigen::Map<Eigen::Matrix<T, 6, 1> > residuals(residuals_ptr);
102 residuals.template block<3, 1>(0, 0) =
104 residuals.template block<3, 1>(3, 0) = T(2.0) * delta_q.vec();
113 const Pose3d& t_ab_measured,
114 const Eigen::Matrix<double, 6, 6>& sqrt_information) {
115 return new ceres::AutoDiffCostFunction<PoseGraph3dErrorTerm, 6, 3, 4, 3, 4>(
119 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
131 #endif // EXAMPLES_CERES_POSE_GRAPH_3D_ERROR_TERM_H_ const Eigen::Matrix< double, 6, 6 > sqrt_information_
PoseGraph3dErrorTerm(const Pose3d &t_ab_measured, const Eigen::Matrix< double, 6, 6 > &sqrt_information)
const Pose3d t_ab_measured_
bool operator()(const T *const p_a_ptr, const T *const q_a_ptr, const T *const p_b_ptr, const T *const q_b_ptr, T *residuals_ptr) const
static ceres::CostFunction * Create(const Pose3d &t_ab_measured, const Eigen::Matrix< double, 6, 6 > &sqrt_information)