Calibration Library 1.0.0
A C++ library for camera calibration and vision-related geometric transformations
Loading...
Searching...
No Matches
bundleresidual.h
Go to the documentation of this file.
1
3#pragma once
4
5// ceres
6#include <ceres/ceres.h>
7
8#include "../detail/observationutils.h"
11
12namespace calib {
13
14// Computes target -> camera transform
15template <typename T>
16static std::pair<Eigen::Matrix<T, 3, 3>, Eigen::Matrix<T, 3, 1>> get_camera_se3_target(
17 const Eigen::Matrix<T, 3, 3>& b_rot_t, const Eigen::Matrix<T, 3, 1>& b_tra_t,
18 const Eigen::Matrix<T, 3, 3>& g_rot_c, const Eigen::Matrix<T, 3, 1>& g_tra_c,
19 const Eigen::Matrix<T, 3, 3>& b_rot_g, const Eigen::Matrix<T, 3, 1>& b_tra_g) {
20 auto [c_rot_g, c_tra_g] = invert_transform(g_rot_c, g_tra_c); // g_se3_c -> c_se3_g
21 auto [g_rot_b, g_tra_b] = invert_transform(b_rot_g, b_tra_g); // b_se3_g -> g_se3_b
22 auto [c_rot_b, c_tra_b] =
23 product(c_rot_g, c_tra_g, g_rot_b, g_tra_b); // c_se3_b = c_se3_g * g_se3_b
24 auto [c_rot_t, c_tra_t] =
25 product(c_rot_b, c_tra_b, b_rot_t, b_tra_t); // c_se3_t = c_se3_b * b_se3_t
26 return {c_rot_t, c_tra_t};
27}
28
29template <camera_model CameraT>
32 const Eigen::Isometry3d base_se3_gripper;
33 BundleReprojResidual(PlanarView v, Eigen::Isometry3d b_se3_g)
34 : view(std::move(v)), base_se3_gripper(std::move(b_se3_g)) {}
35
36 template <typename T>
37 bool operator()(const T* b_quat_t, const T* b_tra_t, const T* g_quat_c, const T* g_tra_c,
38 const T* intrinsics, T* residuals) const {
39 const Eigen::Matrix<T, 3, 3> b_rot_g = base_se3_gripper.linear().template cast<T>();
40 const Eigen::Matrix<T, 3, 1> b_tra_g = base_se3_gripper.translation().template cast<T>();
41 const auto [c_rot_t, c_tra_t] = get_camera_se3_target(
43 quat_array_to_rotmat(g_quat_c), array_to_translation(g_tra_c), b_rot_g, b_tra_g);
44
45 auto cam = CameraTraits<CameraT>::template from_array<T>(intrinsics);
46
47 size_t idx = 0;
48 for (const auto& ob : view) {
49 auto point = Eigen::Matrix<T, 3, 1>(T(ob.object_xy.x()), T(ob.object_xy.y()), T(0));
50 point = c_rot_t * point + c_tra_t;
51 Eigen::Matrix<T, 2, 1> uv = cam.project(point);
52 residuals[idx++] = uv.x() - T(ob.image_uv.x());
53 residuals[idx++] = uv.y() - T(ob.image_uv.y());
54 }
55 return true;
56 }
57
58 static auto* create(const PlanarView& view, const Eigen::Isometry3d& base_se3_gripper) {
59 if (view.empty()) {
60 throw std::invalid_argument("No observations provided");
61 }
62 auto* functor = new BundleReprojResidual(view, base_se3_gripper);
63 constexpr int intr_size = CameraTraits<CameraT>::param_count;
64 auto* cost = new ceres::AutoDiffCostFunction<BundleReprojResidual, ceres::DYNAMIC, 4, 3, 4,
65 3, intr_size>(
66 functor, static_cast<int>(functor->view.size()) * 2);
67 return cost;
68 }
69};
70
71} // namespace calib
std::vector< Eigen::Isometry3d > cam
Linear multi-camera extrinsics initialisation (DLT)
static Eigen::Matrix< T, 3, 1 > array_to_translation(const T *const arr)
std::pair< Eigen::Matrix< T, 3, 3 >, Eigen::Matrix< T, 3, 1 > > product(const Eigen::Matrix< T, 3, 3 > &rotation1, const Eigen::Matrix< T, 3, 1 > &translation1, const Eigen::Matrix< T, 3, 3 > &rotation2, const Eigen::Matrix< T, 3, 1 > &translation2)
std::pair< Eigen::Matrix< T, 3, 3 >, Eigen::Matrix< T, 3, 1 > > invert_transform(const Eigen::Matrix< T, 3, 3 > &rotation, const Eigen::Matrix< T, 3, 1 > &translation)
static std::pair< Eigen::Matrix< T, 3, 3 >, Eigen::Matrix< T, 3, 1 > > get_camera_se3_target(const Eigen::Matrix< T, 3, 3 > &b_rot_t, const Eigen::Matrix< T, 3, 1 > &b_tra_t, const Eigen::Matrix< T, 3, 3 > &g_rot_c, const Eigen::Matrix< T, 3, 1 > &g_tra_c, const Eigen::Matrix< T, 3, 3 > &b_rot_g, const Eigen::Matrix< T, 3, 1 > &b_tra_g)
static Eigen::Matrix< T, 3, 3 > quat_array_to_rotmat(const T *const arr)
std::vector< PlanarObservation > PlanarView
Definition planarpose.h:26
static auto * create(const PlanarView &view, const Eigen::Isometry3d &base_se3_gripper)
BundleReprojResidual(PlanarView v, Eigen::Isometry3d b_se3_g)
const Eigen::Isometry3d base_se3_gripper
bool operator()(const T *b_quat_t, const T *b_tra_t, const T *g_quat_c, const T *g_tra_c, const T *intrinsics, T *residuals) const
Type traits template for camera model implementations.
Definition cameramodel.h:64