141 auto project(
const Eigen::Matrix<T, 3, 1>& x_camera)
const -> Eigen::Matrix<T, 2, 1> {
143 const T tau_x_val = T(
tau_x);
144 const T tau_y_val = T(
tau_y);
145 const T cos_tau_x = ceres::cos(tau_x_val);
146 const T sin_tau_x = ceres::sin(tau_x_val);
147 const T cos_tau_y = ceres::cos(tau_y_val);
148 const T sin_tau_y = ceres::sin(tau_y_val);
150 Eigen::Matrix<T, 3, 3> rot_sensor;
151 rot_sensor << cos_tau_y, sin_tau_x * sin_tau_y, cos_tau_x * sin_tau_y, T(0), cos_tau_x,
152 -sin_tau_x, -sin_tau_y, sin_tau_x * cos_tau_y, cos_tau_x * cos_tau_y;
155 Eigen::Matrix<T, 3, 1> axis_sensor = rot_sensor.col(0);
156 Eigen::Matrix<T, 3, 1> base_sensor = rot_sensor.col(1);
157 Eigen::Matrix<T, 3, 1> normal_sensor = rot_sensor.col(2);
160 T sden = normal_sensor.dot(x_camera);
161 T mx = axis_sensor.dot(x_camera) / sden;
162 T my = base_sensor.dot(x_camera) / sden;
165 const T s0 = normal_sensor.z();
166 const T mx0 = axis_sensor.z() / s0;
167 const T my0 = base_sensor.z() / s0;
170 Eigen::Matrix<T, 2, 1> dxy(mx - mx0, my - my0);
173 Eigen::Matrix<T, 2, 1> px_delta =
174 camera.template project<T>(Eigen::Matrix<T, 3, 1>(dxy.x(), dxy.y(), T(1)));
177 Eigen::Matrix<T, 2, 1> base_shift =
180 return px_delta + base_shift;
198 auto unproject(
const Eigen::Matrix<T, 2, 1>& pixel)
const -> Eigen::Matrix<T, 2, 1> {
199 const T tau_x_val = T(
tau_x);
200 const T tau_y_val = T(
tau_y);
201 const T cos_tau_x = ceres::cos(tau_x_val);
202 const T sin_tau_x = ceres::sin(tau_x_val);
203 const T cos_tau_y = ceres::cos(tau_y_val);
204 const T sin_tau_y = ceres::sin(tau_y_val);
206 Eigen::Matrix<T, 3, 3> rot_x;
207 rot_x << T(1), T(0), T(0), T(0), cos_tau_x, -sin_tau_x, T(0), sin_tau_x, cos_tau_x;
208 Eigen::Matrix<T, 3, 3> rot_y;
209 rot_y << cos_tau_y, T(0), sin_tau_y, T(0), T(1), T(0), -sin_tau_y, T(0), cos_tau_y;
210 Eigen::Matrix<T, 3, 3> rot_sensor = rot_y * rot_x;
212 Eigen::Matrix<T, 3, 1> axis_sensor = rot_sensor.col(0);
213 Eigen::Matrix<T, 3, 1> base_sensor = rot_sensor.col(1);
214 Eigen::Matrix<T, 3, 1> normal_sensor = rot_sensor.col(2);
216 const T s0 = normal_sensor.z();
217 const T mx0 = axis_sensor.z() / s0;
218 const T my0 = base_sensor.z() / s0;
221 Eigen::Matrix<T, 2, 1> base_shift =
226 Eigen::Matrix<T, 2, 1> dxy =
camera.template unproject<T>(pixel - base_shift);
229 return {dxy.x() + mx0, dxy.y() + my0};