3#include "projection_jacobians.cuh"
6template <
typename D,
typename M,
typename T>
7__device__
static void bal_reprojection_error(
const D *camera,
const D *point,
8 const M *obs, D *error) {
12 Eigen::Map<const Eigen::Matrix<D, 3, 1>> X(point);
13 Eigen::Map<const Eigen::Matrix<D, 9, 1>> cam(camera);
14 Eigen::Map<const Eigen::Matrix<T, 2, 1>> observation(obs->data());
15 Eigen::Matrix<D, 3, 1> P;
19 Eigen::Matrix<D, 3, 1> rvec = cam.template head<3>();
20 D theta = rvec.norm();
23 Eigen::Matrix<D, 3, 1> axis = rvec / theta;
27 Eigen::Matrix<D, 3, 1> axx = axis.cross(X);
30 P = X * cth + axx * sth + axis * adx * (D(1) - cth);
33 auto rxx = rvec.cross(X);
38 Eigen::Matrix<D, 3, 1> t = cam.template segment<3>(3);
42 Eigen::Matrix<D, 2, 1> p = -P.template head<2>() / P(2);
49 D r2 = p.squaredNorm();
50 D radial_distortion = D(1.0) + k1 * r2 + k2 * r2 * r2;
53 Eigen::Matrix<D, 2, 1> reprojection_error =
54 f * radial_distortion * p - observation.template cast<D>();
57 error[0] = reprojection_error(0);
58 error[1] = reprojection_error(1);
61template <
typename D,
typename M,
typename T>
62__device__
static void bal_reprojection_error_simple(
const D *camera,
64 const M *obs, D *error) {
66 Eigen::Map<const Eigen::Matrix<D, 3, 1>> X(point);
67 Eigen::Map<const Eigen::Matrix<D, 9, 1>> cam(camera);
68 Eigen::Map<const Eigen::Matrix<T, 2, 1>> observation(obs->data());
71 Eigen::Matrix<D, 3, 1> rvec = cam.template head<3>();
72 D theta = rvec.norm();
73 Eigen::Matrix<D, 3, 3> R = Eigen::Matrix<D, 3, 3>::Identity();
76 Eigen::AngleAxis<D> angle_axis(theta, rvec / theta);
77 R = angle_axis.toRotationMatrix();
81 Eigen::Matrix<D, 3, 1> t = cam.template segment<3>(3);
82 Eigen::Matrix<D, 3, 1> P = R * X + t;
85 Eigen::Matrix<D, 2, 1> p = -P.template head<2>() / P(2);
91 D r2 = p.squaredNorm();
92 D radial_distortion = D(1.0) + k1 * r2 + k2 * r2 * r2;
94 Eigen::Matrix<D, 2, 1> reprojection_error =
95 f * radial_distortion * p - observation.template cast<D>();
97 error[0] = reprojection_error(0);
98 error[1] = reprojection_error(1);
101template <
typename T,
typename D,
size_t I>
102__device__
static void bal_jacobian_simple(
const T *camera,
const T *point,
103 const Eigen::Matrix<T, 2, 1> *obs,
105 Eigen::Map<const Eigen::Matrix<D, 3, 1>> X(point);
106 Eigen::Map<const Eigen::Matrix<D, 9, 1>> cam(camera);
108 Eigen::Matrix<T, 2, 9> Jcam;
109 Eigen::Matrix<T, 2, 3> Jpoint;
111 const Eigen::Matrix<T, 3, 1> rvec = cam.template head<3>();
112 const Eigen::Matrix<T, 3, 1> t = cam.template segment<3>(3);
117 projection_simple<T>(rvec, t, f, k1, k2, X, Jcam, Jpoint);
119 if constexpr (I == 0) {
120 Eigen::Map<Eigen::Matrix<D, 2, 9>> Jcam_map(jacobian);
122 }
else if constexpr (I == 1) {
123 Eigen::Map<Eigen::Matrix<D, 2, 3>> Jpoint_map(jacobian);