74 Eigen::Matrix3d rotation_matrix;
75 ceres::AngleAxisToRotationMatrix(pose6.head<3>().data(), rotation_matrix.data());
77 Eigen::Isometry3d transform = Eigen::Isometry3d::Identity();
78 transform.linear() = rotation_matrix;
79 transform.translation() = pose6.tail<3>();
89 ceres::RotationMatrixToAngleAxis(
reinterpret_cast<const double*
>(init_pose.rotation().data()),
91 blocks.
pose6[3] = init_pose.translation().x();
92 blocks.
pose6[4] = init_pose.translation().y();
93 blocks.
pose6[5] = init_pose.translation().z();
96 auto* cost =
new ceres::AutoDiffCostFunction<PlanarPoseVPResidual, ceres::DYNAMIC, 6>(
97 functor,
static_cast<int>(view.size()) * 2);
99 ceres::Problem problem;
100 problem.AddResidualBlock(
101 cost, opts.core.huber_delta > 0 ?
new ceres::HuberLoss(opts.core.huber_delta) :
nullptr,
102 blocks.
pose6.data());
107 const int m =
static_cast<int>(view.size()) * 2;
108 std::vector<double> residuals(m);
109 const std::array<const double*, 1> parameter_blocks = {blocks.
pose6.data()};
110 cost->Evaluate(parameter_blocks.data(), residuals.data(),
nullptr);
112 const double ssr = std::accumulate(residuals.begin(), residuals.end(), 0.0,
113 [](
double sum,
double r) { return sum + r * r; });
116 if (opts.core.compute_covariance) {
118 if (optcov.has_value()) {
124 result.
distortion = functor->solve_distortion_for(Eigen::Map<const Pose6>(blocks.
pose6.data()));
auto fit_distortion(const std::vector< Observation< T > > &observations, const CameraMatrixT< T > &intrinsics, int num_radial=2, std::span< const int > fixed_indices={}, std::span< const T > fixed_values={}) -> std::optional< DistortionWithResiduals< T > >
auto fit_distortion_full(const std::vector< Observation< T > > &observations, const CameraMatrixT< T > &intrinsics, int num_radial=2, std::span< const int > fixed_indices={}, std::span< const T > fixed_values={}) -> std::optional< DistortionWithResiduals< T > >